aboutsummaryrefslogtreecommitdiffstats
path: root/AndroidAsync
diff options
context:
space:
mode:
authorKoushik Dutta <koushd@gmail.com>2014-11-07 18:49:27 -0800
committerKoushik Dutta <koushd@gmail.com>2014-11-07 18:49:27 -0800
commit255ff987a813acd8002710fa8fee95511d59224c (patch)
treee5f0078fd81655fda5dd0f40afe4ea17c43a8b24 /AndroidAsync
parent02b146297b392fce04642ca9ab3d653cf19c7424 (diff)
downloadAndroidAsync-255ff987a813acd8002710fa8fee95511d59224c.tar.gz
AndroidAsync-255ff987a813acd8002710fa8fee95511d59224c.tar.bz2
AndroidAsync-255ff987a813acd8002710fa8fee95511d59224c.zip
Fix crash bug when cancelling requests being cached.
https://github.com/koush/ion/issues/252#issuecomment-62217371
Diffstat (limited to 'AndroidAsync')
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/FilteredDataEmitter.java11
-rw-r--r--AndroidAsync/src/com/koushikdutta/async/http/cache/ResponseCacheMiddleware.java8
-rw-r--r--AndroidAsync/test/src/com/koushikdutta/async/test/CacheTests.java64
3 files changed, 57 insertions, 26 deletions
diff --git a/AndroidAsync/src/com/koushikdutta/async/FilteredDataEmitter.java b/AndroidAsync/src/com/koushikdutta/async/FilteredDataEmitter.java
index 576b5d6..9309180 100644
--- a/AndroidAsync/src/com/koushikdutta/async/FilteredDataEmitter.java
+++ b/AndroidAsync/src/com/koushikdutta/async/FilteredDataEmitter.java
@@ -45,6 +45,12 @@ public class FilteredDataEmitter extends DataEmitterBase implements DataEmitter,
private int totalRead;
@Override
public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
+ if (closed) {
+ // this emitter was closed but for some reason data is still being spewed...
+ // eat it, nom nom.
+ bb.recycle();
+ return;
+ }
if (bb != null)
totalRead += bb.remaining();
Util.emitAllData(this, bb);
@@ -81,9 +87,12 @@ public class FilteredDataEmitter extends DataEmitterBase implements DataEmitter,
return mEmitter.getServer();
}
+ boolean closed;
@Override
public void close() {
- mEmitter.close();
+ closed = true;
+ if (mEmitter != null)
+ mEmitter.close();
}
@Override
diff --git a/AndroidAsync/src/com/koushikdutta/async/http/cache/ResponseCacheMiddleware.java b/AndroidAsync/src/com/koushikdutta/async/http/cache/ResponseCacheMiddleware.java
index bf0e92c..36e0889 100644
--- a/AndroidAsync/src/com/koushikdutta/async/http/cache/ResponseCacheMiddleware.java
+++ b/AndroidAsync/src/com/koushikdutta/async/http/cache/ResponseCacheMiddleware.java
@@ -340,7 +340,7 @@ public class ResponseCacheMiddleware extends SimpleMiddleware {
@Override
public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
if (cached != null) {
- com.koushikdutta.async.Util.emitAllData(this, cached);
+ super.onDataAvailable(emitter, cached);
// couldn't emit it all, so just wait for another day...
if (cached.remaining() > 0)
return;
@@ -384,6 +384,12 @@ public class ResponseCacheMiddleware extends SimpleMiddleware {
}
}
+ @Override
+ public void close() {
+ abort();
+ super.close();
+ }
+
public void abort() {
if (editor != null) {
editor.abort();
diff --git a/AndroidAsync/test/src/com/koushikdutta/async/test/CacheTests.java b/AndroidAsync/test/src/com/koushikdutta/async/test/CacheTests.java
index 2edd1ae..990d7dd 100644
--- a/AndroidAsync/test/src/com/koushikdutta/async/test/CacheTests.java
+++ b/AndroidAsync/test/src/com/koushikdutta/async/test/CacheTests.java
@@ -4,6 +4,11 @@ import android.test.AndroidTestCase;
import com.koushikdutta.async.AsyncServer;
import com.koushikdutta.async.AsyncServerSocket;
+import com.koushikdutta.async.ByteBufferList;
+import com.koushikdutta.async.DataEmitter;
+import com.koushikdutta.async.FilteredDataEmitter;
+import com.koushikdutta.async.Util;
+import com.koushikdutta.async.callback.DataCallback;
import com.koushikdutta.async.http.AsyncHttpClient;
import com.koushikdutta.async.http.AsyncHttpGet;
import com.koushikdutta.async.http.HttpDate;
@@ -14,7 +19,10 @@ import com.koushikdutta.async.http.server.AsyncHttpServerResponse;
import com.koushikdutta.async.http.server.HttpServerRequestCallback;
import java.io.File;
+import java.nio.ByteBuffer;
import java.util.Date;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
/**
* Created by koush on 6/13/13.
@@ -53,29 +61,37 @@ public class CacheTests extends AndroidTestCase {
}
}
-// static public boolean deleteDirectory(File path) {
-// if (path.exists()) {
-// File[] files = path.listFiles();
-// if (files != null) {
-// for (int i = 0; i < files.length; i++) {
-// if (files[i].isDirectory()) {
-// deleteDirectory(files[i]);
-// } else {
-// files[i].delete();
-// }
-// }
-// }
-// }
-// return (path.delete());
-// }
+ private static final long TIMEOUT = 1000L;
+ public void testFilteredDataEmitter() throws Exception {
+ final Semaphore semaphore = new Semaphore(0);
-// public void testDiskLruCache() throws Exception {
-// File dir = new File(Environment.getExternalStorageDirectory(), "AndroidAsyncTest/cache-test");
-// deleteDirectory(dir);
-// DiskLruCache cache = DiskLruCache.open(dir, 0, 1000, 10000000);
-// DiskLruCache.Editor editor = cache.edit("stuff");
-//
-// DiskLruCache cache2 = DiskLruCache.open(dir, 0, 2, 10000000);
-// DiskLruCache.Snapshot snapshot = cache2.get("stuff");
-// }
+ FilteredDataEmitter f = new FilteredDataEmitter() {
+ @Override
+ public boolean isPaused() {
+ return false;
+ }
+ };
+
+ f.setDataCallback(new DataCallback() {
+ @Override
+ public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
+ assertEquals(bb.readString(), "hello");
+ bb.recycle();
+ semaphore.release();
+ }
+ });
+
+ f.onDataAvailable(f, new ByteBufferList().add(ByteBuffer.wrap("hello".getBytes())));
+ assertTrue("timeout", semaphore.tryAcquire(TIMEOUT, TimeUnit.MILLISECONDS));
+
+ f.setDataCallback(new DataCallback() {
+ @Override
+ public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
+ fail();
+ }
+ });
+ f.close();
+
+ f.onDataAvailable(f, new ByteBufferList().add(ByteBuffer.wrap("hello".getBytes())));
+ }
}