diff options
author | Koushik Dutta <koushd@gmail.com> | 2013-08-25 19:47:27 -0700 |
---|---|---|
committer | Koushik Dutta <koushd@gmail.com> | 2013-08-25 19:48:40 -0700 |
commit | a40a87bead5706ec47d047a43ec85e4fdf595d72 (patch) | |
tree | 53a5f02eb7406d35a3af53362aeda17d07b35500 | |
parent | 04f2040603fe0e5398e267f27c5c74ccb4c5cee1 (diff) | |
download | AndroidAsync-a40a87bead5706ec47d047a43ec85e4fdf595d72.tar.gz AndroidAsync-a40a87bead5706ec47d047a43ec85e4fdf595d72.tar.bz2 AndroidAsync-a40a87bead5706ec47d047a43ec85e4fdf595d72.zip |
HEAD request bug:
Fix bug where HEAD requests would erroneously expect a content body.
HEAD requests will return the same headers as a GET request, including
Content-Length. Sans the body.
Change-Id: I49f873a95486ee3a136b6652d85734d45871bf44
4 files changed, 39 insertions, 3 deletions
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpHead.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpHead.java new file mode 100644 index 0000000..52fb349 --- /dev/null +++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpHead.java @@ -0,0 +1,14 @@ +package com.koushikdutta.async.http; + +import java.net.URI; + +/** + * Created by koush on 8/25/13. + */ +public class AsyncHttpHead extends AsyncHttpRequest { + public AsyncHttpHead(URI uri) { + super(uri, METHOD); + } + + public static final String METHOD = "HEAD"; +} diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java index 24ca849..21515ee 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java @@ -1,7 +1,14 @@ package com.koushikdutta.async.http; -import com.koushikdutta.async.*; +import com.koushikdutta.async.AsyncServer; +import com.koushikdutta.async.AsyncSocket; +import com.koushikdutta.async.ByteBufferList; +import com.koushikdutta.async.DataEmitter; +import com.koushikdutta.async.DataSink; +import com.koushikdutta.async.FilteredDataEmitter; +import com.koushikdutta.async.LineEmitter; import com.koushikdutta.async.LineEmitter.StringCallback; +import com.koushikdutta.async.NullDataCallback; import com.koushikdutta.async.callback.CompletedCallback; import com.koushikdutta.async.callback.WritableCallback; import com.koushikdutta.async.http.filter.ChunkedOutputFilter; @@ -110,7 +117,15 @@ abstract class AsyncHttpResponseImpl extends FilteredDataEmitter implements Asyn // socket may get detached after headers (websocket) if (mSocket == null) return; - DataEmitter emitter = HttpUtil.getBodyDecoder(mSocket, mRawHeaders, false); + DataEmitter emitter; + // HEAD requests must not return any data. They still may + // return content length, etc, which will confuse the body decoder + if (AsyncHttpHead.METHOD.equalsIgnoreCase(mRequest.getMethod())) { + emitter = HttpUtil.EndEmitter.create(getServer(), null); + } + else { + emitter = HttpUtil.getBodyDecoder(mSocket, mRawHeaders, false); + } setDataEmitter(emitter); } } diff --git a/AndroidAsync/src/com/koushikdutta/async/http/HttpUtil.java b/AndroidAsync/src/com/koushikdutta/async/http/HttpUtil.java index a11bbc3..a9e79ff 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/HttpUtil.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/HttpUtil.java @@ -38,7 +38,7 @@ public class HttpUtil { return new UnknownRequestBody(contentType); } - private static class EndEmitter extends FilteredDataEmitter { + static class EndEmitter extends FilteredDataEmitter { private EndEmitter() { } diff --git a/AndroidAsyncTest/src/com/koushikdutta/async/test/HttpClientTests.java b/AndroidAsyncTest/src/com/koushikdutta/async/test/HttpClientTests.java index f39246a..8c969d1 100644 --- a/AndroidAsyncTest/src/com/koushikdutta/async/test/HttpClientTests.java +++ b/AndroidAsyncTest/src/com/koushikdutta/async/test/HttpClientTests.java @@ -1,6 +1,7 @@ package com.koushikdutta.async.test; import android.os.Environment; +import android.text.TextUtils; import android.util.Log; import com.koushikdutta.async.AsyncServer; @@ -334,4 +335,10 @@ public class HttpClientTests extends TestCase { String requestLine = request.getRequestLine().toString(); assertEquals("GET /ds/ds2/Course%20lecture/chapter%2010.pdf HTTP/1.1", requestLine); } + + public void testHEAD() throws Exception { + AsyncHttpHead req = new AsyncHttpHead(URI.create("http://31.media.tumblr.com/9606dcaa33b6877b7c485040393b9392/tumblr_mrtnysMonE1r4vl1yo1_500.jpg")); + Future<String> str = AsyncHttpClient.getDefaultInstance().execute(req, (StringCallback)null); + assertTrue(TextUtils.isEmpty(str.get(TIMEOUT, TimeUnit.MILLISECONDS))); + } } |