aboutsummaryrefslogtreecommitdiffstats
path: root/AndroidAsync
diff options
context:
space:
mode:
authorKoushik Dutta <koushd@gmail.com>2014-08-04 21:00:01 -0700
committerKoushik Dutta <koushd@gmail.com>2014-08-04 21:00:01 -0700
commit64a3b995009f21e42569b46f7f49dd7ee7f48e03 (patch)
treecfe754412a3267ae1890f25772e7cc6ba0c9c107 /AndroidAsync
parent9808e0391b8f9bff7247ee0f7366caeb77230406 (diff)
downloadAndroidAsync-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')
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/spdy/AsyncSpdyConnection.java4
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyMiddleware.java47
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyTransport.java4
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",