diff options
author | Koushik Dutta <koushd@gmail.com> | 2014-08-04 21:00:01 -0700 |
---|---|---|
committer | Koushik Dutta <koushd@gmail.com> | 2014-08-04 21:00:01 -0700 |
commit | 64a3b995009f21e42569b46f7f49dd7ee7f48e03 (patch) | |
tree | cfe754412a3267ae1890f25772e7cc6ba0c9c107 /AndroidAsync | |
parent | 9808e0391b8f9bff7247ee0f7366caeb77230406 (diff) | |
download | AndroidAsync-64a3b995009f21e42569b46f7f49dd7ee7f48e03.tar.gz AndroidAsync-64a3b995009f21e42569b46f7f49dd7ee7f48e03.tar.bz2 AndroidAsync-64a3b995009f21e42569b46f7f49dd7ee7f48e03.zip |
Enable Content-Encoding for spdy.
Disable using SPDY if sending a request body.
Diffstat (limited to 'AndroidAsync')
3 files changed, 40 insertions, 15 deletions
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/spdy/AsyncSpdyConnection.java b/AndroidAsync/src/com/koushikdutta/async/http/spdy/AsyncSpdyConnection.java index 29b7fb8..806968b 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/spdy/AsyncSpdyConnection.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/spdy/AsyncSpdyConnection.java @@ -105,6 +105,10 @@ public class AsyncSpdyConnection implements FrameReader.Handler { boolean isOpen = true; int totalWindowRead; + public AsyncSpdyConnection getConnection() { + return AsyncSpdyConnection.this; + } + public SimpleFuture<List<Header>> headers() { return headers; } diff --git a/AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyMiddleware.java b/AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyMiddleware.java index c4bbe52..211f06b 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyMiddleware.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyMiddleware.java @@ -6,15 +6,19 @@ import android.text.TextUtils; import com.koushikdutta.async.AsyncSSLSocket; import com.koushikdutta.async.AsyncSSLSocketWrapper; import com.koushikdutta.async.ByteBufferList; +import com.koushikdutta.async.DataEmitter; import com.koushikdutta.async.callback.ConnectCallback; import com.koushikdutta.async.future.Cancellable; import com.koushikdutta.async.future.FutureCallback; import com.koushikdutta.async.future.SimpleCancellable; import com.koushikdutta.async.future.TransformFuture; import com.koushikdutta.async.http.AsyncHttpClient; +import com.koushikdutta.async.http.AsyncHttpClientMiddleware; +import com.koushikdutta.async.http.AsyncHttpRequest; import com.koushikdutta.async.http.AsyncSSLEngineConfigurator; import com.koushikdutta.async.http.AsyncSSLSocketMiddleware; import com.koushikdutta.async.http.Headers; +import com.koushikdutta.async.http.HttpUtil; import com.koushikdutta.async.http.Multimap; import com.koushikdutta.async.http.Protocol; import com.koushikdutta.async.http.body.AsyncHttpRequestBody; @@ -174,7 +178,6 @@ public class SpdyMiddleware extends AsyncSSLSocketMiddleware { callback.onConnectCompleted(null, socket); return; } - data.protocol = protoString; final AsyncSpdyConnection connection = new AsyncSpdyConnection(socket, Protocol.get(protoString)); connection.sendConnectionPreface(); @@ -191,11 +194,25 @@ public class SpdyMiddleware extends AsyncSSLSocketMiddleware { } private void newSocket(GetSocketData data, final AsyncSpdyConnection connection, final ConnectCallback callback) { - data.request.logv("using spdy connection"); + final AsyncHttpRequest request = data.request; + request.logv("using spdy connection"); + + data.protocol = connection.protocol.toString(); + + final AsyncHttpRequestBody requestBody = data.request.getBody(); + + // this causes app engine to shit a brick, but if it is missing, + // drive shits the bed +// if (requestBody != null) { +// if (requestBody.length() >= 0) { +// request.getHeaders().set("Content-Length", String.valueOf(requestBody.length())); +// } +// } + final ArrayList<Header> headers = new ArrayList<Header>(); - headers.add(new Header(Header.TARGET_METHOD, data.request.getMethod())); - headers.add(new Header(Header.TARGET_PATH, requestPath(data.request.getUri()))); - String host = data.request.getHeaders().get("Host"); + headers.add(new Header(Header.TARGET_METHOD, request.getMethod())); + headers.add(new Header(Header.TARGET_PATH, requestPath(request.getUri()))); + String host = request.getHeaders().get("Host"); if (Protocol.SPDY_3 == connection.protocol) { headers.add(new Header(Header.VERSION, "HTTP/1.1")); headers.add(new Header(Header.TARGET_HOST, host)); @@ -204,9 +221,9 @@ public class SpdyMiddleware extends AsyncSSLSocketMiddleware { } else { throw new AssertionError(); } - headers.add(new Header(Header.TARGET_SCHEME, data.request.getUri().getScheme())); + headers.add(new Header(Header.TARGET_SCHEME, request.getUri().getScheme())); - Multimap mm = data.request.getHeaders().getMultiMap(); + final Multimap mm = request.getHeaders().getMultiMap(); for (String key: mm.keySet()) { if (SpdyTransport.isProhibitedHeader(connection.protocol, key)) continue; @@ -215,8 +232,9 @@ public class SpdyMiddleware extends AsyncSSLSocketMiddleware { } } - data.request.logv("\n" + data.request); - AsyncSpdyConnection.SpdySocket spdy = connection.newStream(headers, data.request.getBody() != null, true); + + request.logv("\n" + request); + final AsyncSpdyConnection.SpdySocket spdy = connection.newStream(headers, requestBody != null, true); callback.onConnectCompleted(null, spdy); } @@ -228,6 +246,12 @@ public class SpdyMiddleware extends AsyncSSLSocketMiddleware { return null; } + // TODO: figure out why POST does not work if sending content-length header + // see above regarding app engine comment as to why: drive requires content-length + // but app engine sends a GO_AWAY if it sees a content-length... + if (data.request.getBody() != null) + return null; + // can we use an existing connection to satisfy this, or do we need a new one? String host = uri.getHost(); AsyncSpdyConnection conn = connections.get(host); @@ -246,7 +270,7 @@ public class SpdyMiddleware extends AsyncSSLSocketMiddleware { @Override public boolean exchangeHeaders(final OnExchangeHeaderData data) { if (!(data.socket instanceof AsyncSpdyConnection.SpdySocket)) - return false; + return super.exchangeHeaders(data); AsyncHttpRequestBody requestBody = data.request.getBody(); if (requestBody != null) { @@ -280,7 +304,8 @@ public class SpdyMiddleware extends AsyncSSLSocketMiddleware { @Override public void onCompleted(Exception e, Headers result) { data.receiveHeadersCallback.onCompleted(e); - data.response.emitter(spdySocket); + DataEmitter emitter = HttpUtil.getBodyDecoder(spdySocket, spdySocket.getConnection().protocol, result, false); + data.response.emitter(emitter); } }); return true; diff --git a/AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyTransport.java b/AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyTransport.java index a2e3029..fe07e78 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyTransport.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyTransport.java @@ -25,10 +25,6 @@ import java.util.List; final class SpdyTransport { /** See http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1#TOC-3.2.1-Request. */ private static final List<String> SPDY_3_PROHIBITED_HEADERS = Util.immutableList( - "accept-encoding", - "user-agent", - "accept", - "connection", "host", "keep-alive", |