diff options
author | Koushik Dutta <koushd@gmail.com> | 2014-12-20 19:10:35 -0800 |
---|---|---|
committer | Koushik Dutta <koushd@gmail.com> | 2014-12-20 19:10:35 -0800 |
commit | 25aa60f130d5a2e96255eeb6d78b9858586ee476 (patch) | |
tree | b55e549c0f6c74d975cb0672c5ff3af9a8b8ef21 /AndroidAsync | |
parent | 8b9c65d5e5382b4feea5b76dc2b61c9858d5a2c9 (diff) | |
download | AndroidAsync-25aa60f130d5a2e96255eeb6d78b9858586ee476.tar.gz AndroidAsync-25aa60f130d5a2e96255eeb6d78b9858586ee476.tar.bz2 AndroidAsync-25aa60f130d5a2e96255eeb6d78b9858586ee476.zip |
Fix SPDY data fin issue being sent with a 0 length packet.
More detailed logging. Note that there is a possible connection termination issue.
Diffstat (limited to 'AndroidAsync')
3 files changed, 20 insertions, 2 deletions
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncSocketMiddleware.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncSocketMiddleware.java index 4a420fb..0f7aa99 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncSocketMiddleware.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncSocketMiddleware.java @@ -213,15 +213,17 @@ public class AsyncSocketMiddleware extends SimpleMiddleware { }); for (final InetAddress address: result) { + final String inetSockAddress = String.format("%s:%s", address, port); keepTrying.add(new ContinuationCallback() { @Override public void onContinue(Continuation continuation, final CompletedCallback next) throws Exception { + data.request.logv("attempting connection to " + inetSockAddress); mClient.getServer().connectSocket(new InetSocketAddress(address, port), wrapCallback(data, uri, port, false, new ConnectCallback() { @Override public void onConnectCompleted(Exception ex, AsyncSocket socket) { if (isDone()) { - lastException = new Exception("internal error during connect"); + lastException = new Exception("internal error during connect to " + inetSockAddress); next.onCompleted(null); return; } diff --git a/AndroidAsync/src/com/koushikdutta/async/http/spdy/Spdy3.java b/AndroidAsync/src/com/koushikdutta/async/http/spdy/Spdy3.java index ddea2f2..51b4890 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/spdy/Spdy3.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/spdy/Spdy3.java @@ -19,6 +19,7 @@ import com.koushikdutta.async.BufferedDataSink; import com.koushikdutta.async.ByteBufferList; import com.koushikdutta.async.DataEmitter; import com.koushikdutta.async.DataEmitterReader; +import com.koushikdutta.async.callback.CompletedCallback; import com.koushikdutta.async.callback.DataCallback; import com.koushikdutta.async.http.Protocol; import com.koushikdutta.async.util.Charsets; @@ -130,6 +131,13 @@ final class Spdy3 implements Variant { this.handler = handler; this.client = client; + emitter.setEndCallback(new CompletedCallback() { + @Override + public void onCompleted(Exception ex) { + // TODO: handle termination + } + }); + reader = new DataEmitterReader(); parseFrameHeader(); } @@ -145,6 +153,7 @@ final class Spdy3 implements Variant { int length; int streamId; boolean inFinished; + private final ByteBufferList emptyList = new ByteBufferList(); private final DataCallback onFrame = new DataCallback() { @Override public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) { @@ -160,6 +169,12 @@ final class Spdy3 implements Variant { streamId = w1 & 0x7fffffff; inFinished = (flags & FLAG_FIN) != 0; emitter.setDataCallback(onDataFrame); + + if (length == 0) { + // zero length packet, immediately trigger the data parsing + // fixes the hanging response portion of https://github.com/koush/ion/issues/443#issuecomment-67729152 + onDataFrame.onDataAvailable(emitter, emptyList); + } } else { reader.read(length, onFullFrame); diff --git a/AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyMiddleware.java b/AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyMiddleware.java index b45f16a..6f6c629 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyMiddleware.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyMiddleware.java @@ -186,6 +186,7 @@ public class SpdyMiddleware extends AsyncSSLSocketMiddleware { connections.put(data.request.getUri().getHost(), connection); + data.request.logv("using new spdy connection for host: " + data.request.getUri().getHost()); newSocket(data, connection, callback); } catch (Exception ex) { @@ -198,7 +199,6 @@ public class SpdyMiddleware extends AsyncSSLSocketMiddleware { private void newSocket(GetSocketData data, final AsyncSpdyConnection connection, final ConnectCallback callback) { final AsyncHttpRequest request = data.request; - request.logv("using spdy connection"); data.protocol = connection.protocol.toString(); @@ -272,6 +272,7 @@ public class SpdyMiddleware extends AsyncSSLSocketMiddleware { return super.getSocket(data); } + data.request.logv("using existing spdy connection for host: " + data.request.getUri().getHost()); newSocket(data, conn, data.connectCallback); SimpleCancellable ret = new SimpleCancellable(); |