diff options
-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.java | 2 | ||||
-rw-r--r-- | AndroidAsync/src/com/koushikdutta/async/AsyncSocketImpl.java | 18 | ||||
-rw-r--r-- | AndroidAsync/src/com/koushikdutta/async/BufferedDataSink.java | 4 | ||||
-rw-r--r-- | AndroidAsync/src/com/koushikdutta/async/DataExchange.java | 5 | ||||
-rw-r--r-- | AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpClient.java | 11 | ||||
-rw-r--r-- | AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponse.java | 5 | ||||
-rw-r--r-- | AndroidAsync/src/com/koushikdutta/async/http/AsyncHttpResponseImpl.java | 5 |
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; |