aboutsummaryrefslogtreecommitdiffstats
path: root/AndroidAsync
diff options
context:
space:
mode:
authorKoushik Dutta <koushd@gmail.com>2014-07-21 14:31:46 -0700
committerKoushik Dutta <koushd@gmail.com>2014-07-21 14:31:46 -0700
commit6a34fcd2137274579e9a1206839727a3b757bdde (patch)
tree12e49682647c41fec79c69d75d128d1c21541ffb /AndroidAsync
parent1d43efe595480565fce5389ebe90a6e961509c73 (diff)
downloadAndroidAsync-6a34fcd2137274579e9a1206839727a3b757bdde.tar.gz
AndroidAsync-6a34fcd2137274579e9a1206839727a3b757bdde.tar.bz2
AndroidAsync-6a34fcd2137274579e9a1206839727a3b757bdde.zip
refactor our libcore cruft. as much as possible at least.
Diffstat (limited to 'AndroidAsync')
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java21
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClientMiddleware.java19
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpRequest.java38
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java9
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java35
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncSocketMiddleware.java6
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/HttpUtil.java40
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/ResponseCacheMiddleware.java29
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/SimpleMiddleware.java8
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/WebSocketImpl.java12
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/callback/HeadersCallback.java10
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/libcore/HeaderParser.java2
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/libcore/HttpDate.java2
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/spdy/HttpTransport.java15
-rw-r--r--AndroidAsync/test/src/com/koushikdutta/async/test/HttpClientTests.java2
-rw-r--r--AndroidAsync/test/src/com/koushikdutta/async/test/Issue59.java4
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));
}