aboutsummaryrefslogtreecommitdiffstats
path: root/AndroidAsync
diff options
context:
space:
mode:
authorKoushik Dutta <koushd@gmail.com>2014-12-20 19:10:35 -0800
committerKoushik Dutta <koushd@gmail.com>2014-12-20 19:10:35 -0800
commit25aa60f130d5a2e96255eeb6d78b9858586ee476 (patch)
treeb55e549c0f6c74d975cb0672c5ff3af9a8b8ef21 /AndroidAsync
parent8b9c65d5e5382b4feea5b76dc2b61c9858d5a2c9 (diff)
downloadAndroidAsync-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')
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncSocketMiddleware.java4
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/spdy/Spdy3.java15
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/spdy/SpdyMiddleware.java3
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();