Skip to content

Commit 8735c94

Browse files
committed
fix responses served entirely from cache
1 parent e47618a commit 8735c94

3 files changed

Lines changed: 57 additions & 1 deletion

File tree

AndroidAsync/src/com/koushikdutta/async/http/ResponseCacheMiddleware.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,11 +283,13 @@ public Cancellable getSocket(final GetSocketData data) {
283283
snapshot = cache.get(key);
284284
if (snapshot == null) {
285285
// Log.i(LOGTAG, "snapshot fail");
286+
networkCount++;
286287
return null;
287288
}
288289
entry = new Entry(snapshot.getInputStream(ENTRY_METADATA));
289290
} catch (IOException e) {
290291
// Give up because the cache cannot be read.
292+
networkCount++;
291293
return null;
292294
}
293295

@@ -318,6 +320,7 @@ public Cancellable getSocket(final GetSocketData data) {
318320

319321
RawHeaders rawResponseHeaders = RawHeaders.fromMultimap(responseHeadersMap);
320322
ResponseHeaders cachedResponseHeaders = new ResponseHeaders(data.request.getUri(), rawResponseHeaders);
323+
cachedResponseHeaders.setLocalTimestamps(System.currentTimeMillis(), System.currentTimeMillis());
321324

322325
long now = System.currentTimeMillis();
323326
ResponseSource responseSource = cachedResponseHeaders.chooseResponseSource(now, data.request.getHeaders());
@@ -326,6 +329,7 @@ public Cancellable getSocket(final GetSocketData data) {
326329
cacheHitCount++;
327330
data.request.logi("Response retrieved from cache");
328331
final CachedSocket socket = entry.isHttps() ? new CachedSSLSocket((EntrySecureCacheResponse)candidate) : new CachedSocket((EntryCacheResponse)candidate);
332+
socket.pending.add(ByteBuffer.wrap(rawResponseHeaders.toHeaderString().getBytes()));
329333

330334
client.getServer().post(new Runnable() {
331335
@Override
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.koushikdutta.async.test;
2+
3+
import android.os.Environment;
4+
import com.koushikdutta.async.AsyncServer;
5+
import com.koushikdutta.async.http.AsyncHttpClient;
6+
import com.koushikdutta.async.http.ResponseCacheMiddleware;
7+
import com.koushikdutta.async.http.libcore.HttpDate;
8+
import com.koushikdutta.async.http.server.AsyncHttpServer;
9+
import com.koushikdutta.async.http.server.AsyncHttpServerRequest;
10+
import com.koushikdutta.async.http.server.AsyncHttpServerResponse;
11+
import com.koushikdutta.async.http.server.HttpServerRequestCallback;
12+
import junit.framework.TestCase;
13+
14+
import java.io.File;
15+
import java.util.Date;
16+
17+
/**
18+
* Created by koush on 6/13/13.
19+
*/
20+
public class CacheTests extends TestCase {
21+
public void testMaxAgePrivate() throws Exception {
22+
AsyncHttpClient client = new AsyncHttpClient(AsyncServer.getDefault());
23+
ResponseCacheMiddleware cache = ResponseCacheMiddleware.addCache(client, new File(Environment.getExternalStorageDirectory(), "AndroidAsyncTest"), 1024 * 1024 * 10);
24+
AsyncHttpServer httpServer = new AsyncHttpServer();
25+
try {
26+
httpServer.get("/uname/(.*)", new HttpServerRequestCallback() {
27+
@Override
28+
public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {
29+
response.getHeaders().getHeaders().set("Date", HttpDate.format(new Date()));
30+
response.getHeaders().getHeaders().set("Cache-Control", "private, max-age=10000");
31+
response.send(request.getMatcher().group(1));
32+
}
33+
});
34+
35+
httpServer.listen(AsyncServer.getDefault(), 5555);
36+
// clear the old cache
37+
cache.clear();
38+
39+
client.getString("http://localhost:5555/uname/43434").get();
40+
41+
client.getString("http://localhost:5555/uname/43434").get();
42+
43+
44+
assertEquals(cache.getCacheHitCount(), 1);
45+
assertEquals(cache.getNetworkCount(), 1);
46+
}
47+
finally {
48+
AsyncServer.getDefault().stop();
49+
client.getMiddleware().remove(cache);
50+
}
51+
}
52+
}

AndroidAsyncTest/src/com/koushikdutta/async/test/HttpClientTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ public void onConnect(AsyncHttpResponse response) {
234234
assertTrue(e.getCause() instanceof CancellationException);
235235
}
236236
}
237-
237+
238238
public void testCache() throws Exception {
239239
ResponseCacheMiddleware cache = ResponseCacheMiddleware.addCache(client, new File(Environment.getExternalStorageDirectory(), "AndroidAsyncTest"), 1024 * 1024 * 10);
240240
try {

0 commit comments

Comments
 (0)