aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/AsyncSSLSocket.java (renamed from AndroidAsync/src/com/koushikdutta/async/SSLDataExchange.java)102
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/AsyncSocket.java2
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/AsyncSocketImpl.java18
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/BufferedDataSink.java4
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/DataExchange.java5
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java11
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java5
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java5
8 files changed, 107 insertions, 45 deletions
diff --git a/AndroidAsync/src/com/koushikdutta/async/SSLDataExchange.java b/AndroidAsync/src/com/koushikdutta/async/AsyncSSLSocket.java
index 3263a44..b86f935 100644
--- a/AndroidAsync/src/com/koushikdutta/async/SSLDataExchange.java
+++ b/AndroidAsync/src/com/koushikdutta/async/AsyncSSLSocket.java
@@ -19,17 +19,19 @@ import junit.framework.Assert;
import org.apache.http.conn.ssl.StrictHostnameVerifier;
+import com.koushikdutta.async.callback.ClosedCallback;
+import com.koushikdutta.async.callback.CompletedCallback;
import com.koushikdutta.async.callback.DataCallback;
import com.koushikdutta.async.callback.WritableCallback;
-public class SSLDataExchange extends FilteredDataCallback implements DataExchange {
- DataExchange mExchange;
+public class AsyncSSLSocket implements AsyncSocket {
+ AsyncSocket mSocket;
BufferedDataEmitter mEmitter = new BufferedDataEmitter();
BufferedDataSink mSink;
ByteBuffer mReadTmp = ByteBuffer.allocate(8192);
boolean mUnwrapping = false;
- public SSLDataExchange(DataExchange exchange, String host, int port) {
- mExchange = exchange;
+ public AsyncSSLSocket(AsyncSocket socket, String host, int port) {
+ mSocket = socket;
if (host != null) {
engine = ctx.createSSLEngine(host, port);
@@ -38,12 +40,13 @@ public class SSLDataExchange extends FilteredDataCallback implements DataExchang
engine = ctx.createSSLEngine();
}
engine.setUseClientMode(true);
- mSink = new BufferedDataSink(exchange);
-
+ mSink = new BufferedDataSink(socket);
+ mSink.setMaxBuffer(0);
+
// SSL needs buffering of data written during handshake.
// aka exhcange.setDatacallback
- exchange.setDataCallback(mEmitter);
-
+ socket.setDataCallback(mEmitter);
+
mEmitter.setDataCallback(new DataCallback() {
@Override
public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
@@ -80,7 +83,7 @@ public class SSLDataExchange extends FilteredDataCallback implements DataExchang
}
addToPending(out);
- Util.emitAllData(SSLDataExchange.this, out);
+ Util.emitAllData(AsyncSSLSocket.this, out);
}
catch (Exception ex) {
ex.printStackTrace();
@@ -216,6 +219,10 @@ public class SSLDataExchange extends FilteredDataCallback implements DataExchang
ByteBuffer mWriteTmp = ByteBuffer.allocate(8192);
@Override
public void write(ByteBuffer bb) {
+ if (mWrapping)
+ return;
+ if (mSink.remaining() > 0)
+ return;
mWrapping = true;
int remaining;
SSLEngineResult res = null;
@@ -234,7 +241,7 @@ public class SSLDataExchange extends FilteredDataCallback implements DataExchang
report(e);
}
}
- while (remaining != bb.remaining() || (res != null && res.getHandshakeStatus() == HandshakeStatus.NEED_WRAP));
+ while ((remaining != bb.remaining() || (res != null && res.getHandshakeStatus() == HandshakeStatus.NEED_WRAP)) && mSink.remaining() == 0);
mWrapping = false;
}
@@ -242,6 +249,8 @@ public class SSLDataExchange extends FilteredDataCallback implements DataExchang
public void write(ByteBufferList bb) {
if (mWrapping)
return;
+ if (mSink.remaining() > 0)
+ return;
mWrapping = true;
int remaining;
SSLEngineResult res = null;
@@ -260,7 +269,7 @@ public class SSLDataExchange extends FilteredDataCallback implements DataExchang
report(e);
}
}
- while (remaining != bb.remaining() || (res != null && res.getHandshakeStatus() == HandshakeStatus.NEED_WRAP));
+ while ((remaining != bb.remaining() || (res != null && res.getHandshakeStatus() == HandshakeStatus.NEED_WRAP)) && mSink.remaining() == 0);
mWrapping = false;
}
@@ -275,8 +284,75 @@ public class SSLDataExchange extends FilteredDataCallback implements DataExchang
return mWriteableCallback;
}
+ private void report(Exception e) {
+ CompletedCallback cb = getCompletedCallback();
+ if (cb != null)
+ cb.onCompleted(e);
+ }
+
+ DataCallback mDataCallback;
+ @Override
+ public void setDataCallback(DataCallback callback) {
+ mDataCallback = callback;
+ }
+
+ @Override
+ public DataCallback getDataCallback() {
+ return mDataCallback;
+ }
+
+ @Override
+ public boolean isChunked() {
+ return mSocket.isChunked();
+ }
+
+ @Override
+ public boolean isOpen() {
+ return mSocket.isOpen();
+ }
+
+ @Override
+ public void close() {
+ mSocket.close();
+ }
+
+ @Override
+ public void setClosedCallback(ClosedCallback handler) {
+ mSocket.setClosedCallback(handler);
+ }
+
+ @Override
+ public ClosedCallback getCloseHandler() {
+ return mSocket.getCloseHandler();
+ }
+
+ @Override
+ public void setCompletedCallback(CompletedCallback callback) {
+ mSocket.setCompletedCallback(callback);
+ }
+
+ @Override
+ public CompletedCallback getCompletedCallback() {
+ return mSocket.getCompletedCallback();
+ }
+
+ @Override
+ public boolean isConnected() {
+ return mSocket.isConnected();
+ }
+
+ @Override
+ public void pause() {
+ mSocket.pause();
+ }
+
+ @Override
+ public void resume() {
+ mSocket.resume();
+ }
+
@Override
- public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
- mEmitter.onDataAvailable(emitter, bb);
+ public boolean isPaused() {
+ return mSocket.isPaused();
}
}
diff --git a/AndroidAsync/src/com/koushikdutta/async/AsyncSocket.java b/AndroidAsync/src/com/koushikdutta/async/AsyncSocket.java
index 48a422e..a225830 100644
--- a/AndroidAsync/src/com/koushikdutta/async/AsyncSocket.java
+++ b/AndroidAsync/src/com/koushikdutta/async/AsyncSocket.java
@@ -1,7 +1,7 @@
package com.koushikdutta.async;
-public interface AsyncSocket extends DataExchange, CloseableData, CompletedEmitter {
+public interface AsyncSocket extends DataEmitter, DataSink, CloseableData, CompletedEmitter {
public boolean isConnected();
public void pause();
public void resume();
diff --git a/AndroidAsync/src/com/koushikdutta/async/AsyncSocketImpl.java b/AndroidAsync/src/com/koushikdutta/async/AsyncSocketImpl.java
index 997f097..2df3e3d 100644
--- a/AndroidAsync/src/com/koushikdutta/async/AsyncSocketImpl.java
+++ b/AndroidAsync/src/com/koushikdutta/async/AsyncSocketImpl.java
@@ -101,16 +101,7 @@ class AsyncSocketImpl implements AsyncSocket {
}
}
- private ByteBuffer pending;
- private void spit(ByteBuffer b) {
- ByteBufferList list = new ByteBufferList();
- list.add(b);
- Util.emitAllData(this, list);
- if (list.remaining() == 0) {
- b.position(0);
- b.limit(0);
- }
- }
+ private ByteBufferList pending;
int mToAlloc = 0;
int onReadable() {
@@ -145,11 +136,12 @@ class AsyncSocketImpl implements AsyncSocket {
mToAlloc = read * 2;
b.limit(b.position());
b.position(0);
- spit(b);
+ ByteBufferList list = new ByteBufferList(b);
+ Util.emitAllData(this, list);
if (b.remaining() != 0) {
Assert.assertTrue(pending == null);
// System.out.println("There was data remaining after this op: " + b.remaining());
- pending = b;
+ pending = list;
}
}
@@ -265,7 +257,7 @@ class AsyncSocketImpl implements AsyncSocket {
private void spitPending() {
if (pending != null) {
// System.out.println("p[ending spit");
- spit(pending);
+ Util.emitAllData(this, pending);
// System.out.println("pending now: " + pending.remaining());
if (pending.remaining() == 0) {
pending = null;
diff --git a/AndroidAsync/src/com/koushikdutta/async/BufferedDataSink.java b/AndroidAsync/src/com/koushikdutta/async/BufferedDataSink.java
index 84679f9..d0635d1 100644
--- a/AndroidAsync/src/com/koushikdutta/async/BufferedDataSink.java
+++ b/AndroidAsync/src/com/koushikdutta/async/BufferedDataSink.java
@@ -46,7 +46,9 @@ public class BufferedDataSink implements DataSink {
public void write(ByteBufferList bb) {
if (mPendingWrites == null)
mDataSink.write(bb);
-
+ else
+ Assert.assertTrue(mPendingWrites.remaining() <= mMaxBuffer);
+
if (bb.remaining() > 0) {
int toRead = Math.min(bb.remaining(), mMaxBuffer);
if (toRead > 0) {
diff --git a/AndroidAsync/src/com/koushikdutta/async/DataExchange.java b/AndroidAsync/src/com/koushikdutta/async/DataExchange.java
deleted file mode 100644
index 3de062d..0000000
--- a/AndroidAsync/src/com/koushikdutta/async/DataExchange.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.koushikdutta.async;
-
-public interface DataExchange extends DataEmitter, DataSink {
-
-}
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java
index 517bf1b..f36a91d 100644
--- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java
+++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java
@@ -17,13 +17,12 @@ import org.json.JSONObject;
import android.os.Handler;
import android.os.Looper;
+import com.koushikdutta.async.AsyncSSLSocket;
import com.koushikdutta.async.AsyncServer;
import com.koushikdutta.async.AsyncSocket;
import com.koushikdutta.async.ByteBufferList;
import com.koushikdutta.async.DataEmitter;
-import com.koushikdutta.async.DataExchange;
import com.koushikdutta.async.NullDataCallback;
-import com.koushikdutta.async.SSLDataExchange;
import com.koushikdutta.async.callback.ClosedCallback;
import com.koushikdutta.async.callback.CompletedCallback;
import com.koushikdutta.async.callback.ConnectCallback;
@@ -34,12 +33,12 @@ import com.koushikdutta.async.stream.OutputStreamDataCallback;
public class AsyncHttpClient {
private static abstract class InternalConnectCallback implements ConnectCallback {
- DataExchange exchange;
+ AsyncSocket exchange;
}
private static class SocketExchange {
AsyncSocket socket;
- DataExchange exchange;
+ AsyncSocket exchange;
}
private static Hashtable<String, HashSet<SocketExchange>> mSockets = new Hashtable<String, HashSet<SocketExchange>>();
@@ -142,9 +141,7 @@ public class AsyncHttpClient {
if (exchange == null) {
exchange = socket;
if (request.getUri().getScheme().equals("https")) {
- SSLDataExchange ssl = new SSLDataExchange(socket, uri.getHost(), finalPort);
- exchange = ssl;
- socket.setDataCallback(ssl);
+ exchange = new AsyncSSLSocket(socket, uri.getHost(), finalPort);
}
}
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java
index 05b184a..7761dcd 100644
--- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java
+++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java
@@ -1,11 +1,12 @@
package com.koushikdutta.async.http;
-import com.koushikdutta.async.DataExchange;
import com.koushikdutta.async.CompletedEmitter;
+import com.koushikdutta.async.DataEmitter;
+import com.koushikdutta.async.DataSink;
import com.koushikdutta.async.callback.CompletedCallback;
import com.koushikdutta.async.http.libcore.ResponseHeaders;
-public interface AsyncHttpResponse extends DataExchange, CompletedEmitter {
+public interface AsyncHttpResponse extends DataEmitter, DataSink, CompletedEmitter {
public void setCompletedCallback(CompletedCallback handler);
public CompletedCallback getCompletedCallback();
public ResponseHeaders getHeaders();
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java
index f77cbce..ed5c5ac 100644
--- a/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java
+++ b/AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java
@@ -7,7 +7,6 @@ import junit.framework.Assert;
import com.koushikdutta.async.AsyncSocket;
import com.koushikdutta.async.ByteBufferList;
import com.koushikdutta.async.DataEmitter;
-import com.koushikdutta.async.DataExchange;
import com.koushikdutta.async.FilteredDataCallback;
import com.koushikdutta.async.LineEmitter;
import com.koushikdutta.async.LineEmitter.StringCallback;
@@ -27,7 +26,7 @@ public class AsyncHttpResponseImpl extends FilteredDataCallback implements Async
}
private AsyncHttpRequestBody mWriter;
- void setSocket(AsyncSocket socket, DataExchange exchange) {
+ void setSocket(AsyncSocket socket, AsyncSocket exchange) {
mSocket = socket;
mExchange = exchange;
@@ -107,7 +106,7 @@ public class AsyncHttpResponseImpl extends FilteredDataCallback implements Async
private AsyncSocket mSocket;
private AsyncHttpRequest mRequest;
- private DataExchange mExchange;
+ private AsyncSocket mExchange;
private ResponseHeaders mHeaders;
public AsyncHttpResponseImpl(AsyncHttpRequest request) {
mRequest = request;