diff options
author | Koushik Dutta <koushd@gmail.com> | 2014-07-21 14:31:46 -0700 |
---|---|---|
committer | Koushik Dutta <koushd@gmail.com> | 2014-07-21 14:31:46 -0700 |
commit | 6a34fcd2137274579e9a1206839727a3b757bdde (patch) | |
tree | 12e49682647c41fec79c69d75d128d1c21541ffb /AndroidAsync | |
parent | 1d43efe595480565fce5389ebe90a6e961509c73 (diff) | |
download | AndroidAsync-6a34fcd2137274579e9a1206839727a3b757bdde.tar.gz AndroidAsync-6a34fcd2137274579e9a1206839727a3b757bdde.tar.bz2 AndroidAsync-6a34fcd2137274579e9a1206839727a3b757bdde.zip |
refactor our libcore cruft. as much as possible at least.
Diffstat (limited to 'AndroidAsync')
16 files changed, 171 insertions, 81 deletions
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java index 504d5c6..7f66deb 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java @@ -191,9 +191,9 @@ public class AsyncHttpClient { } private static void copyHeader(AsyncHttpRequest from, AsyncHttpRequest to, String header) { - String value = from.getHeaders().getHeaders().get(header); + String value = from.getHeaders().get(header); if (!TextUtils.isEmpty(value)) - to.getHeaders().getHeaders().set(header, value); + to.getHeaders().set(header, value); } private void executeAffinity(final AsyncHttpRequest request, final int redirectCount, final FutureAsyncHttpResponse cancel, final HttpConnectCallback callback) { @@ -283,6 +283,7 @@ public class AsyncHttpClient { @Override public void setDataEmitter(DataEmitter emitter) { + data.response = this; data.bodyEmitter = emitter; synchronized (mMiddleware) { for (AsyncHttpClientMiddleware middleware: mMiddleware) { @@ -293,8 +294,8 @@ public class AsyncHttpClient { super.setDataEmitter(data.bodyEmitter); - RawHeaders headers = mHeaders.getHeaders(); - int responseCode = headers.getResponseCode(); + RawHeaders headers = mHeaders; + int responseCode = code(); if ((responseCode == HttpURLConnection.HTTP_MOVED_PERM || responseCode == HttpURLConnection.HTTP_MOVED_TEMP || responseCode == 307) && request.getFollowRedirect()) { String location = headers.get("Location"); Uri redirect; @@ -326,7 +327,7 @@ public class AsyncHttpClient { return; } - request.logv("Final (post cache response) headers:\n" + mHeaders.getHeaders().toHeaderString()); + request.logv("Final (post cache response) headers:\n" + mHeaders.toHeaderString()); // at this point the headers are done being modified reportConnectedCompleted(cancel, null, this, request, callback); @@ -342,7 +343,7 @@ public class AsyncHttpClient { mServer.removeAllCallbacks(cancel.scheduled); // allow the middleware to massage the headers before the body is decoded - request.logv("Received headers:\n" + mHeaders.getHeaders().toHeaderString()); + request.logv("Received headers:\n" + mHeaders.toHeaderString()); data.headers = mHeaders; synchronized (mMiddleware) { @@ -378,7 +379,7 @@ public class AsyncHttpClient { return; super.report(ex); if (!socket.isOpen() || ex != null) { - if (getHeaders() == null && ex != null) + if (headers() == null && ex != null) reportConnectedCompleted(cancel, ex, null, request, callback); } @@ -546,7 +547,7 @@ public class AsyncHttpClient { } invokeConnect(callback, response); - final long contentLength = response.getHeaders().getContentLength(); + final long contentLength = HttpUtil.contentLength(response.headers()); response.setDataCallback(new OutputStreamDataCallback(fout) { @Override @@ -591,8 +592,6 @@ public class AsyncHttpClient { } invokeConnect(callback, response); - final long contentLength = response.getHeaders().getContentLength(); - Future<T> parsed = parser.parse(response) .setCallback(new FutureCallback<T>() { @Override @@ -626,7 +625,7 @@ public class AsyncHttpClient { } return; } - WebSocket ws = WebSocketImpl.finishHandshake(req.getHeaders().getHeaders(), response); + WebSocket ws = WebSocketImpl.finishHandshake(req.getHeaders(), response); if (ws == null) { if (!ret.setComplete(new WebSocketHandshakeException("Unable to complete websocket handshake"))) return; diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClientMiddleware.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClientMiddleware.java index 135ec69..79deb4c 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClientMiddleware.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClientMiddleware.java @@ -2,13 +2,12 @@ package com.koushikdutta.async.http; import com.koushikdutta.async.AsyncSocket; import com.koushikdutta.async.DataEmitter; +import com.koushikdutta.async.callback.CompletedCallback; import com.koushikdutta.async.callback.ConnectCallback; import com.koushikdutta.async.future.Cancellable; -import com.koushikdutta.async.http.libcore.ResponseHeaders; +import com.koushikdutta.async.http.libcore.RawHeaders; import com.koushikdutta.async.util.UntypedHashtable; -import java.util.Hashtable; - public interface AsyncHttpClientMiddleware { public static class GetSocketData { public UntypedHashtable state = new UntypedHashtable(); @@ -20,12 +19,17 @@ public interface AsyncHttpClientMiddleware { public static class OnSocketData extends GetSocketData { public AsyncSocket socket; } - - public static class OnHeadersReceivedData extends OnSocketData { - public ResponseHeaders headers; + + public static class SendHeaderData extends OnSocketData { + CompletedCallback sendHeadersCallback; } - + + public static class OnHeadersReceivedData extends SendHeaderData { + public RawHeaders headers; + } + public static class OnBodyData extends OnHeadersReceivedData { + public AsyncHttpResponse response; public DataEmitter bodyEmitter; } @@ -35,6 +39,7 @@ public interface AsyncHttpClientMiddleware { public Cancellable getSocket(GetSocketData data); public void onSocket(OnSocketData data); + public boolean sendHeaders(SendHeaderData data); public void onHeadersReceived(OnHeadersReceivedData data); public void onBodyDecoder(OnBodyData data); public void onRequestComplete(OnRequestCompleteData data); diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequest.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequest.java index 22316b5..b3eb45b 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequest.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequest.java @@ -114,25 +114,25 @@ public class AsyncHttpRequest { public AsyncHttpRequest(Uri uri, String method, RawHeaders headers) { assert uri != null; mMethod = method; + this.uri = uri; if (headers == null) mRawHeaders = new RawHeaders(); else mRawHeaders = headers; if (headers == null) setDefaultHeaders(mRawHeaders, uri); - mHeaders = new RequestHeaders(uri, mRawHeaders); mRawHeaders.setStatusLine(getRequestLine().toString()); } + Uri uri; public Uri getUri() { - return mHeaders.getUri(); + return uri; } private RawHeaders mRawHeaders = new RawHeaders(); - private RequestHeaders mHeaders; - public RequestHeaders getHeaders() { - return mHeaders; + public RawHeaders getHeaders() { + return mRawHeaders; } public String getRequestString() { @@ -174,7 +174,7 @@ public class AsyncHttpRequest { public static AsyncHttpRequest create(HttpRequest request) { AsyncHttpRequest ret = new AsyncHttpRequest(Uri.parse(request.getRequestLine().getUri()), request.getRequestLine().getMethod()); for (Header header: request.getAllHeaders()) { - ret.getHeaders().getHeaders().add(header.getName(), header.getValue()); + ret.getHeaders().add(header.getName(), header.getValue()); } return ret; } @@ -194,25 +194,25 @@ public class AsyncHttpRequest { @Override public void addHeader(Header header) { - request.getHeaders().getHeaders().add(header.getName(), header.getValue()); + request.getHeaders().add(header.getName(), header.getValue()); } @Override public void addHeader(String name, String value) { - request.getHeaders().getHeaders().add(name, value); + request.getHeaders().add(name, value); } @Override public boolean containsHeader(String name) { - return request.getHeaders().getHeaders().get(name) != null; + return request.getHeaders().get(name) != null; } @Override public Header[] getAllHeaders() { - Header[] ret = new Header[request.getHeaders().getHeaders().length()]; + Header[] ret = new Header[request.getHeaders().length()]; for (int i = 0; i < ret.length; i++) { - String name = request.getHeaders().getHeaders().getFieldName(i); - String value = request.getHeaders().getHeaders().getValue(i); + String name = request.getHeaders().getFieldName(i); + String value = request.getHeaders().getValue(i); ret[i] = new BasicHeader(name, value); } return ret; @@ -220,7 +220,7 @@ public class AsyncHttpRequest { @Override public Header getFirstHeader(String name) { - String value = request.getHeaders().getHeaders().get(name); + String value = request.getHeaders().get(name); if (value == null) return null; return new BasicHeader(name, value); @@ -228,7 +228,7 @@ public class AsyncHttpRequest { @Override public Header[] getHeaders(String name) { - Map<String, List<String>> map = request.getHeaders().getHeaders().toMultimap(); + Map<String, List<String>> map = request.getHeaders().toMultimap(); List<String> vals = map.get(name); if (vals == null) return new Header[0]; @@ -271,12 +271,12 @@ public class AsyncHttpRequest { @Override public void removeHeader(Header header) { - request.getHeaders().getHeaders().removeAll(header.getName()); + request.getHeaders().removeAll(header.getName()); } @Override public void removeHeaders(String name) { - request.getHeaders().getHeaders().removeAll(name); + request.getHeaders().removeAll(name); } @Override @@ -286,7 +286,7 @@ public class AsyncHttpRequest { @Override public void setHeader(String name, String value) { - request.getHeaders().getHeaders().set(name, value); + request.getHeaders().set(name, value); } @Override @@ -306,12 +306,12 @@ public class AsyncHttpRequest { } public AsyncHttpRequest setHeader(String name, String value) { - getHeaders().getHeaders().set(name, value); + getHeaders().set(name, value); return this; } public AsyncHttpRequest addHeader(String name, String value) { - getHeaders().getHeaders().add(name, value); + getHeaders().add(name, value); return this; } diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java index fcf0dd8..631879c 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java @@ -2,14 +2,15 @@ package com.koushikdutta.async.http; import com.koushikdutta.async.AsyncSocket; import com.koushikdutta.async.DataEmitter; -import com.koushikdutta.async.DataSink; import com.koushikdutta.async.callback.CompletedCallback; -import com.koushikdutta.async.http.libcore.ResponseHeaders; +import com.koushikdutta.async.http.libcore.RawHeaders; public interface AsyncHttpResponse extends DataEmitter { public void setEndCallback(CompletedCallback handler); - public CompletedCallback getEndCallback(); - public ResponseHeaders getHeaders(); + public String protocol(); + public String message(); + public int code(); + public RawHeaders headers(); public void end(); public AsyncSocket detachSocket(); public AsyncHttpRequest getRequest(); diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java index 1bbf46c..a3e4189 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java @@ -40,14 +40,14 @@ abstract class AsyncHttpResponseImpl extends FilteredDataEmitter implements Asyn mWriter = mRequest.getBody(); if (mWriter != null) { - if (mRequest.getHeaders().getContentType() == null) - mRequest.getHeaders().setContentType(mWriter.getContentType()); + if (mRequest.getHeaders().get("Content-Type") == null) + mRequest.getHeaders().set("Content-Type", mWriter.getContentType()); if (mWriter.length() >= 0) { - mRequest.getHeaders().setContentLength(mWriter.length()); + mRequest.getHeaders().set("Content-Length", String.valueOf(mWriter.length())); mSink = mSocket; } else { - mRequest.getHeaders().getHeaders().set("Transfer-Encoding", "Chunked"); + mRequest.getHeaders().set("Transfer-Encoding", "Chunked"); mSink = new ChunkedOutputFilter(mSocket); } } @@ -116,7 +116,7 @@ abstract class AsyncHttpResponseImpl extends FilteredDataEmitter implements Asyn mRawHeaders.addLine(s); } else { - mHeaders = new ResponseHeaders(mRequest.getUri(), mRawHeaders); + mHeaders = mRawHeaders; onHeadersReceived(); // socket may get detached after headers (websocket) if (mSocket == null) @@ -161,7 +161,7 @@ abstract class AsyncHttpResponseImpl extends FilteredDataEmitter implements Asyn private AsyncHttpRequest mRequest; private AsyncSocket mSocket; - ResponseHeaders mHeaders; + protected RawHeaders mHeaders; public AsyncHttpResponseImpl(AsyncHttpRequest request) { mRequest = request; } @@ -169,17 +169,32 @@ abstract class AsyncHttpResponseImpl extends FilteredDataEmitter implements Asyn boolean mCompleted = false; @Override - public ResponseHeaders getHeaders() { + public RawHeaders headers() { return mHeaders; } + @Override + public int code() { + return headers().getResponseCode(); + } + + @Override + public String protocol() { + return "HTTP/1." + headers().getHttpMinorVersion(); + } + + @Override + public String message() { + return headers().getResponseMessage(); + } + private boolean mFirstWrite = true; private void assertContent() { if (!mFirstWrite) return; mFirstWrite = false; - assert null != mRequest.getHeaders().getHeaders().get("Content-Type"); - assert mRequest.getHeaders().getHeaders().get("Transfer-Encoding") != null || mRequest.getHeaders().getContentLength() != -1; + assert null != mRequest.getHeaders().get("Content-Type"); + assert mRequest.getHeaders().get("Transfer-Encoding") != null || HttpUtil.contentLength(mRequest.getHeaders()) != -1; } DataSink mSink; @@ -228,7 +243,7 @@ abstract class AsyncHttpResponseImpl extends FilteredDataEmitter implements Asyn @Override public String charset() { - Multimap mm = Multimap.parseHeader(getHeaders().getHeaders(), "Content-Type"); + Multimap mm = Multimap.parseHeader(headers(), "Content-Type"); String cs; if (mm != null && null != (cs = mm.getString("charset")) && Charset.isSupported(cs)) { return cs; diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncSocketMiddleware.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncSocketMiddleware.java index 8e8a36e..a50ff9a 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncSocketMiddleware.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncSocketMiddleware.java @@ -171,14 +171,14 @@ public class AsyncSocketMiddleware extends SimpleMiddleware { unresolvedHost = data.request.getProxyHost(); unresolvedPort = data.request.getProxyPort(); // set the host and port explicitly for proxied connections - data.request.getHeaders().getHeaders().setStatusLine(data.request.getProxyRequestLine().toString()); + data.request.getHeaders().setStatusLine(data.request.getProxyRequestLine().toString()); proxied = true; } else if (proxyHost != null) { unresolvedHost = proxyHost; unresolvedPort = proxyPort; // set the host and port explicitly for proxied connections - data.request.getHeaders().getHeaders().setStatusLine(data.request.getProxyRequestLine().toString()); + data.request.getHeaders().setStatusLine(data.request.getProxyRequestLine().toString()); proxied = true; } else { @@ -360,7 +360,7 @@ public class AsyncSocketMiddleware extends SimpleMiddleware { data.socket.close(); return; } - if (!HttpUtil.isKeepAlive(data.headers.getHeaders()) || !HttpUtil.isKeepAlive(data.request.getHeaders().getHeaders())) { + if (!HttpUtil.isKeepAlive(data.headers) || !HttpUtil.isKeepAlive(data.request.getHeaders())) { data.request.logv("closing out socket (not keep alive)"); data.socket.close(); return; diff --git a/AndroidAsync/src/com/koushikdutta/async/http/HttpUtil.java b/AndroidAsync/src/com/koushikdutta/async/http/HttpUtil.java index 9b08241..c30e42b 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/HttpUtil.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/HttpUtil.java @@ -14,7 +14,13 @@ import com.koushikdutta.async.http.filter.ContentLengthFilter; import com.koushikdutta.async.http.filter.GZIPInputFilter; import com.koushikdutta.async.http.filter.InflaterInputFilter; import com.koushikdutta.async.http.libcore.RawHeaders; -import com.koushikdutta.async.http.server.UnknownRequestBody; +import com.koushikdutta.async.http.libcore.RequestHeaders; +import com.koushikdutta.async.http.libcore.ResponseHeaders; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; public class HttpUtil { public static AsyncHttpRequestBody getBody(DataEmitter emitter, CompletedCallback reporter, RawHeaders headers) { @@ -130,4 +136,36 @@ public class HttpUtil { return keepAlive; } + + public static int contentLength(RawHeaders headers) { + String cl = headers.get("Content-Length"); + if (cl == null) + return -1; + try { + return Integer.parseInt(cl); + } + catch (NumberFormatException e) { + return -1; + } + } + + public static Set<String> varyFields(RawHeaders headers) { + HashSet<String> ret = new HashSet<String>(); + String value = headers.get("Vary"); + if (value == null) + return ret; + for (String varyField : value.split(",")) { + ret.add(varyField.trim()); + } + return ret; + } + + public static boolean isCacheable(RawHeaders requestHeaders, RawHeaders responseHeaders) { + ResponseHeaders r = new ResponseHeaders(null, responseHeaders); + return r.isCacheable(new RequestHeaders(null, requestHeaders)); + } + + public static boolean isNoCache(RawHeaders headers) { + return new RequestHeaders(null, headers).isNoCache(); + } } diff --git a/AndroidAsync/src/com/koushikdutta/async/http/ResponseCacheMiddleware.java b/AndroidAsync/src/com/koushikdutta/async/http/ResponseCacheMiddleware.java index b20099b..a811679 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/ResponseCacheMiddleware.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/ResponseCacheMiddleware.java @@ -14,6 +14,7 @@ import com.koushikdutta.async.callback.CompletedCallback; import com.koushikdutta.async.callback.WritableCallback; import com.koushikdutta.async.future.Cancellable; import com.koushikdutta.async.future.SimpleCancellable; +import com.koushikdutta.async.http.libcore.RequestHeaders; import com.koushikdutta.async.util.Charsets; import com.koushikdutta.async.http.libcore.RawHeaders; import com.koushikdutta.async.http.libcore.ResponseHeaders; @@ -94,7 +95,7 @@ public class ResponseCacheMiddleware extends SimpleMiddleware { // also see if this can be turned into a conditional cache request. @Override public Cancellable getSocket(final GetSocketData data) { - if (cache == null || !caching || data.request.getHeaders().isNoCache()) { + if (cache == null || !caching || HttpUtil.isNoCache(data.request.getHeaders())) { networkCount++; return null; } @@ -120,7 +121,7 @@ public class ResponseCacheMiddleware extends SimpleMiddleware { } // verify the entry matches - if (!entry.matches(data.request.getUri(), data.request.getMethod(), data.request.getHeaders().getHeaders().toMultimap())) { + if (!entry.matches(data.request.getUri(), data.request.getMethod(), data.request.getHeaders().toMultimap())) { networkCount++; StreamUtility.closeQuietly(snapshot); return null; @@ -153,7 +154,8 @@ public class ResponseCacheMiddleware extends SimpleMiddleware { cachedResponseHeaders.setLocalTimestamps(System.currentTimeMillis(), System.currentTimeMillis()); long now = System.currentTimeMillis(); - ResponseSource responseSource = cachedResponseHeaders.chooseResponseSource(now, data.request.getHeaders()); + RequestHeaders requestHeaders = new RequestHeaders(null, data.request.getHeaders()); + ResponseSource responseSource = cachedResponseHeaders.chooseResponseSource(now, requestHeaders); if (responseSource == ResponseSource.CACHE) { data.request.logi("Response retrieved from cache"); @@ -211,19 +213,20 @@ public class ResponseCacheMiddleware extends SimpleMiddleware { public void onBodyDecoder(OnBodyData data) { CachedSocket cached = com.koushikdutta.async.Util.getWrappedSocket(data.socket, CachedSocket.class); if (cached != null) { - data.headers.getHeaders().set(SERVED_FROM, CACHE); + data.headers.set(SERVED_FROM, CACHE); return; } CacheData cacheData = data.state.get("cache-data"); if (cacheData != null) { - if (cacheData.cachedResponseHeaders.validate(data.headers)) { + ResponseHeaders networkResponse = new ResponseHeaders(null, data.headers); + if (cacheData.cachedResponseHeaders.validate(networkResponse)) { data.request.logi("Serving response from conditional cache"); - data.headers.getHeaders().removeAll("Content-Length"); - data.headers = cacheData.cachedResponseHeaders.combine(data.headers); - data.headers.getHeaders().setStatusLine(cacheData.cachedResponseHeaders.getHeaders().getStatusLine()); + data.headers.removeAll("Content-Length"); + data.headers = cacheData.cachedResponseHeaders.combine(networkResponse).getHeaders(); + data.headers.setStatusLine(cacheData.cachedResponseHeaders.getHeaders().getStatusLine()); - data.headers.getHeaders().set(SERVED_FROM, CONDITIONAL_CACHE); + data.headers.set(SERVED_FROM, CONDITIONAL_CACHE); conditionalCacheHitCount++; CachedBodyEmitter bodySpewer = new CachedBodyEmitter(cacheData.candidate, cacheData.contentLength); @@ -241,7 +244,7 @@ public class ResponseCacheMiddleware extends SimpleMiddleware { if (!caching) return; - if (!data.headers.isCacheable(data.request.getHeaders()) || !data.request.getMethod().equals(AsyncHttpGet.METHOD)) { + if (!HttpUtil.isCacheable(data.request.getHeaders(), data.headers) || !data.request.getMethod().equals(AsyncHttpGet.METHOD)) { /* * Don't cache non-GET responses. We're technically allowed to cache * HEAD requests and some POST requests, but the complexity of doing @@ -253,7 +256,7 @@ public class ResponseCacheMiddleware extends SimpleMiddleware { } String key = FileCache.toKeyString(data.request.getUri()); - RawHeaders varyHeaders = data.request.getHeaders().getHeaders().getAll(data.headers.getVaryFields()); + RawHeaders varyHeaders = data.request.getHeaders().getAll(HttpUtil.varyFields(data.headers)); Entry entry = new Entry(data.request.getUri(), varyHeaders, data.request, data.headers); BodyCacher cacher = new BodyCacher(); EntryEditor editor = new EntryEditor(key); @@ -554,11 +557,11 @@ public class ResponseCacheMiddleware extends SimpleMiddleware { } } - public Entry(Uri uri, RawHeaders varyHeaders, AsyncHttpRequest request, ResponseHeaders responseHeaders) { + public Entry(Uri uri, RawHeaders varyHeaders, AsyncHttpRequest request, RawHeaders responseHeaders) { this.uri = uri.toString(); this.varyHeaders = varyHeaders; this.requestMethod = request.getMethod(); - this.responseHeaders = responseHeaders.getHeaders(); + this.responseHeaders = responseHeaders; // if (isHttps()) { // HttpsURLConnection httpsConnection = (HttpsURLConnection) httpConnection; diff --git a/AndroidAsync/src/com/koushikdutta/async/http/SimpleMiddleware.java b/AndroidAsync/src/com/koushikdutta/async/http/SimpleMiddleware.java index 7e07706..dba645a 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/SimpleMiddleware.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/SimpleMiddleware.java @@ -11,22 +11,22 @@ public class SimpleMiddleware implements AsyncHttpClientMiddleware { @Override public void onSocket(OnSocketData data) { - } @Override public void onHeadersReceived(OnHeadersReceivedData data) { - } @Override public void onBodyDecoder(OnBodyData data) { - } @Override public void onRequestComplete(OnRequestCompleteData data) { - } + @Override + public boolean sendHeaders(SendHeaderData data) { + return false; + } } diff --git a/AndroidAsync/src/com/koushikdutta/async/http/WebSocketImpl.java b/AndroidAsync/src/com/koushikdutta/async/http/WebSocketImpl.java index eda5556..dd38e5e 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/WebSocketImpl.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/WebSocketImpl.java @@ -131,7 +131,7 @@ public class WebSocketImpl implements WebSocket { } public static void addWebSocketUpgradeHeaders(AsyncHttpRequest req, String protocol) { - RawHeaders headers = req.getHeaders().getHeaders(); + RawHeaders headers = req.getHeaders(); final String key = Base64.encodeToString(toByteArray(UUID.randomUUID()),Base64.NO_WRAP); headers.set("Sec-WebSocket-Version", "13"); headers.set("Sec-WebSocket-Key", key); @@ -142,8 +142,8 @@ public class WebSocketImpl implements WebSocket { headers.set("Sec-WebSocket-Protocol", protocol); headers.set("Pragma", "no-cache"); headers.set("Cache-Control", "no-cache"); - if (TextUtils.isEmpty(req.getHeaders().getUserAgent())) - req.getHeaders().setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.15 Safari/537.36"); + if (TextUtils.isEmpty(req.getHeaders().get("User-Agent"))) + req.getHeaders().set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.15 Safari/537.36"); } public WebSocketImpl(AsyncSocket socket) { @@ -154,12 +154,12 @@ public class WebSocketImpl implements WebSocket { public static WebSocket finishHandshake(RawHeaders requestHeaders, AsyncHttpResponse response) { if (response == null) return null; - if (response.getHeaders().getHeaders().getResponseCode() != 101) + if (response.headers().getResponseCode() != 101) return null; - if (!"websocket".equalsIgnoreCase(response.getHeaders().getHeaders().get("Upgrade"))) + if (!"websocket".equalsIgnoreCase(response.headers().get("Upgrade"))) return null; - String sha1 = response.getHeaders().getHeaders().get("Sec-WebSocket-Accept"); + String sha1 = response.headers().get("Sec-WebSocket-Accept"); if (sha1 == null) return null; String key = requestHeaders.get("Sec-WebSocket-Key"); diff --git a/AndroidAsync/src/com/koushikdutta/async/http/callback/HeadersCallback.java b/AndroidAsync/src/com/koushikdutta/async/http/callback/HeadersCallback.java new file mode 100644 index 0000000..80f1be6 --- /dev/null +++ b/AndroidAsync/src/com/koushikdutta/async/http/callback/HeadersCallback.java @@ -0,0 +1,10 @@ +package com.koushikdutta.async.http.callback; + +import com.koushikdutta.async.http.libcore.RawHeaders; + +/** + * Created by koush on 6/30/13. + */ +public interface HeadersCallback { + public void onHeaders(RawHeaders headers); +} diff --git a/AndroidAsync/src/com/koushikdutta/async/http/libcore/HeaderParser.java b/AndroidAsync/src/com/koushikdutta/async/http/libcore/HeaderParser.java index a91be67..4b9c9ea 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/libcore/HeaderParser.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/libcore/HeaderParser.java @@ -26,6 +26,8 @@ final class HeaderParser { * Parse a comma-separated list of cache control header values. */ public static void parseCacheControl(String value, CacheControlHandler handler) { + if (value == null) + return; int pos = 0; while (pos < value.length()) { int tokenStart = pos; diff --git a/AndroidAsync/src/com/koushikdutta/async/http/libcore/HttpDate.java b/AndroidAsync/src/com/koushikdutta/async/http/libcore/HttpDate.java index 59e4929..3ac9da1 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/libcore/HttpDate.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/libcore/HttpDate.java @@ -69,6 +69,8 @@ public final class HttpDate { * parsed. */ public static Date parse(String value) { + if (value == null) + return null; try { return STANDARD_DATE_FORMAT.get().parse(value); } catch (ParseException ignore) { diff --git a/AndroidAsync/src/com/koushikdutta/async/http/spdy/HttpTransport.java b/AndroidAsync/src/com/koushikdutta/async/http/spdy/HttpTransport.java new file mode 100644 index 0000000..0d017bb --- /dev/null +++ b/AndroidAsync/src/com/koushikdutta/async/http/spdy/HttpTransport.java @@ -0,0 +1,15 @@ +package com.koushikdutta.async.http.spdy; + +import com.koushikdutta.async.http.AsyncHttpClientMiddleware; +import com.koushikdutta.async.http.SimpleMiddleware; + +/** + * Created by koush on 7/19/14. + */ +public class HttpTransport extends SimpleMiddleware { + @Override + public boolean sendHeaders(SendHeaderData data) { + return super.sendHeaders(data); + } + +} diff --git a/AndroidAsync/test/src/com/koushikdutta/async/test/HttpClientTests.java b/AndroidAsync/test/src/com/koushikdutta/async/test/HttpClientTests.java index 6809880..ea98329 100644 --- a/AndroidAsync/test/src/com/koushikdutta/async/test/HttpClientTests.java +++ b/AndroidAsync/test/src/com/koushikdutta/async/test/HttpClientTests.java @@ -115,7 +115,7 @@ public class HttpClientTests extends TestCase { @Override public void onConnectCompleted(Exception ex, AsyncHttpResponse response) { // make sure gzip decoding works, as that is generally what github sends. - Assert.assertEquals("gzip", response.getHeaders().getContentEncoding()); + Assert.assertEquals("gzip", response.headers().get("Content-Encoding")); response.setDataCallback(new DataCallback() { @Override public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) { diff --git a/AndroidAsync/test/src/com/koushikdutta/async/test/Issue59.java b/AndroidAsync/test/src/com/koushikdutta/async/test/Issue59.java index ebaae9d..ac44713 100644 --- a/AndroidAsync/test/src/com/koushikdutta/async/test/Issue59.java +++ b/AndroidAsync/test/src/com/koushikdutta/async/test/Issue59.java @@ -43,8 +43,8 @@ public class Issue59 extends TestCase { AsyncHttpGet get = new AsyncHttpGet("http://localhost:5959/"); get.setLogging("issue59", Log.VERBOSE); - get.getHeaders().getHeaders().removeAll("Connection"); - get.getHeaders().getHeaders().removeAll("Accept-Encoding"); + get.getHeaders().removeAll("Connection"); + get.getHeaders().removeAll("Accept-Encoding"); assertEquals("foobarbeepboop", AsyncHttpClient.getDefaultInstance().executeString(get, null).get(1000, TimeUnit.MILLISECONDS)); } |