1
0
mirror of https://github.com/square/okhttp.git synced 2026-01-18 20:40:58 +03:00

Merge pull request #838 from square/jwilson_0518_cache_request

Expose Vary headers in the cache request.
This commit is contained in:
Jake Wharton
2014-05-19 08:40:52 -07:00
2 changed files with 99 additions and 10 deletions

View File

@@ -597,7 +597,55 @@ public final class CallTest {
assertEquals(0, post2.getSequenceNumber());
}
@Ignore // Cache requests not populated properly. https://github.com/square/okhttp/issues/805
@Test public void cacheHit() throws Exception {
server.enqueue(new MockResponse()
.addHeader("ETag: v1")
.addHeader("Cache-Control: max-age=60")
.addHeader("Vary: Accept-Charset")
.setBody("A"));
server.play();
client.setCache(cache);
// Store a response in the cache.
URL url = server.getUrl("/");
Request cacheStoreRequest = new Request.Builder()
.url(url)
.addHeader("Accept-Language", "fr-CA")
.addHeader("Accept-Charset", "UTF-8")
.build();
executeSynchronously(cacheStoreRequest)
.assertCode(200)
.assertBody("A");
assertNull(server.takeRequest().getHeader("If-None-Match"));
// Hit that stored response.
Request cacheHitRequest = new Request.Builder()
.url(url)
.addHeader("Accept-Language", "en-US") // Different, but Vary says it doesn't matter.
.addHeader("Accept-Charset", "UTF-8")
.build();
RecordedResponse cacheHit = executeSynchronously(cacheHitRequest);
// Check the merged response. The request is the application's original request.
cacheHit.assertCode(200)
.assertBody("A")
.assertHeader("ETag", "v1")
.assertRequestUrl(cacheStoreRequest.url())
.assertRequestHeader("Accept-Language", "en-US")
.assertRequestHeader("Accept-Charset", "UTF-8");
// Check the cached response. Its request contains only the saved Vary headers.
cacheHit.cacheResponse()
.assertCode(200)
.assertHeader("ETag", "v1")
.assertRequestUrl(cacheStoreRequest.url())
.assertRequestHeader("Accept-Language")
.assertRequestHeader("Accept-Charset", "UTF-8");
cacheHit.assertNoNetworkResponse();
}
@Test public void conditionalCacheHit() throws Exception {
server.enqueue(new MockResponse()
.addHeader("ETag: v1")
@@ -641,7 +689,7 @@ public final class CallTest {
.assertRequestUrl(cacheStoreRequest.url())
.assertRequestHeader("Accept-Language", "en-US")
.assertRequestHeader("Accept-Charset", "UTF-8")
.assertRequestHeader("If-None-Match"); // No If-None-Match on the cache hit's request.
.assertRequestHeader("If-None-Match"); // No If-None-Match on the user's request.
// Check the cached response. Its request contains only the saved Vary headers.
cacheHit.cacheResponse()
@@ -653,7 +701,7 @@ public final class CallTest {
.assertRequestHeader("Accept-Charset", "UTF-8") // Because of Vary on Accept-Charset.
.assertRequestHeader("If-None-Match"); // This wasn't present in the original request.
// Check the network response. Its has the caller's request, plus some caching headers.
// Check the network response. It has the caller's request, plus some caching headers.
cacheHit.networkResponse()
.assertCode(304)
.assertHeader("Donut", "b")
@@ -687,19 +735,55 @@ public final class CallTest {
}
@Test public void conditionalCacheMiss() throws Exception {
server.enqueue(new MockResponse().setBody("A").addHeader("ETag: v1"));
server.enqueue(new MockResponse().setBody("B"));
server.enqueue(new MockResponse()
.addHeader("ETag: v1")
.addHeader("Vary: Accept-Charset")
.addHeader("Donut: a")
.setBody("A"));
server.enqueue(new MockResponse()
.addHeader("Donut: b")
.setBody("B"));
server.play();
client.setCache(cache);
executeSynchronously(new Request.Builder().url(server.getUrl("/")).build())
.assertCode(200).assertBody("A");
Request cacheStoreRequest = new Request.Builder()
.url(server.getUrl("/"))
.addHeader("Accept-Language", "fr-CA")
.addHeader("Accept-Charset", "UTF-8")
.build();
executeSynchronously(cacheStoreRequest)
.assertCode(200)
.assertBody("A");
assertNull(server.takeRequest().getHeader("If-None-Match"));
executeSynchronously(new Request.Builder().url(server.getUrl("/")).build())
.assertCode(200).assertBody("B");
Request cacheMissRequest = new Request.Builder()
.url(server.getUrl("/"))
.addHeader("Accept-Language", "en-US") // Different, but Vary says it doesn't matter.
.addHeader("Accept-Charset", "UTF-8")
.build();
RecordedResponse cacheHit = executeSynchronously(cacheMissRequest);
assertEquals("v1", server.takeRequest().getHeader("If-None-Match"));
// Check the user response. It has the application's original request.
cacheHit.assertCode(200)
.assertBody("B")
.assertHeader("Donut", "b")
.assertRequestUrl(cacheStoreRequest.url());
// Check the cache response. Even though it's a miss, we used the cache.
cacheHit.cacheResponse()
.assertCode(200)
.assertHeader("Donut", "a")
.assertHeader("ETag", "v1")
.assertRequestUrl(cacheStoreRequest.url());
// Check the network response. It has the network request, plus caching headers.
cacheHit.networkResponse()
.assertCode(200)
.assertHeader("Donut", "b")
.assertRequestHeader("If-None-Match", "v1") // If-None-Match in the validation request.
.assertRequestUrl(cacheStoreRequest.url());
}
@Test public void conditionalCacheMiss_Async() throws Exception {

View File

@@ -561,8 +561,13 @@ public final class Cache {
public Response response(Request request, DiskLruCache.Snapshot snapshot) {
String contentType = responseHeaders.get("Content-Type");
String contentLength = responseHeaders.get("Content-Length");
Request cacheRequest = new Request.Builder()
.url(url)
.method(message, null)
.headers(varyHeaders)
.build();
return new Response.Builder()
.request(request)
.request(cacheRequest)
.protocol(protocol)
.code(code)
.message(message)