Skip to content

Commit 73a5bef

Browse files
committed
Add a cacheUrlOverride
1 parent 331eabd commit 73a5bef

File tree

4 files changed

+66
-19
lines changed

4 files changed

+66
-19
lines changed

okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DnsOverHttpsTest.kt

+52-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import assertk.assertions.containsExactlyInAnyOrder
2222
import assertk.assertions.hasMessage
2323
import assertk.assertions.isEqualTo
2424
import assertk.assertions.isInstanceOf
25+
import assertk.assertions.isNull
2526
import java.io.EOFException
2627
import java.io.File
2728
import java.io.IOException
@@ -191,7 +192,6 @@ class DnsOverHttpsTest {
191192
// 3. successful network response
192193
// 4. successful stale cached GET response
193194
// 5. unsuccessful response
194-
// TODO how closely to follow POST rules on caching?
195195
@Test
196196
fun usesCache() {
197197
val cache = Cache("cache".toPath(), (100 * 1024).toLong(), cacheFs)
@@ -207,14 +207,33 @@ class DnsOverHttpsTest {
207207
.setHeader("cache-control", "private, max-age=298")
208208
.build(),
209209
)
210+
server.enqueue(
211+
dnsResponse(
212+
"0000818000010003000000000567726170680866616365626f6f6b03636f6d0000010001c00c000500010" +
213+
"0000a6d000603617069c012c0300005000100000cde000c04737461720463313072c012c04200010001000" +
214+
"0003b00049df00112",
215+
)
216+
.newBuilder()
217+
.setHeader("cache-control", "private, max-age=298")
218+
.build(),
219+
)
210220
var result = cachedDns.lookup("google.com")
211221
assertThat(result).containsExactly(address("157.240.1.18"))
212-
val recordedRequest = server.takeRequest()
222+
var recordedRequest = server.takeRequest()
213223
assertThat(recordedRequest.method).isEqualTo("GET")
214224
assertThat(recordedRequest.path)
215225
.isEqualTo("/lookup?ct&dns=AAABAAABAAAAAAAABmdvb2dsZQNjb20AAAEAAQ")
226+
216227
result = cachedDns.lookup("google.com")
228+
assertThat(server.takeRequest(1, TimeUnit.MILLISECONDS)).isNull()
217229
assertThat(result).isEqualTo(listOf(address("157.240.1.18")))
230+
231+
result = cachedDns.lookup("www.google.com")
232+
assertThat(result).containsExactly(address("157.240.1.18"))
233+
recordedRequest = server.takeRequest()
234+
assertThat(recordedRequest.method).isEqualTo("GET")
235+
assertThat(recordedRequest.path)
236+
.isEqualTo("/lookup?ct&dns=AAABAAABAAAAAAAAA3d3dwZnb29nbGUDY29tAAABAAE")
218237
}
219238

220239
@Test
@@ -232,14 +251,44 @@ class DnsOverHttpsTest {
232251
.setHeader("cache-control", "private, max-age=298")
233252
.build(),
234253
)
254+
server.enqueue(
255+
dnsResponse(
256+
"0000818000010003000000000567726170680866616365626f6f6b03636f6d0000010001c00c000500010" +
257+
"0000a6d000603617069c012c0300005000100000cde000c04737461720463313072c012c04200010001000" +
258+
"0003b00049df00112",
259+
)
260+
.newBuilder()
261+
.setHeader("cache-control", "private, max-age=298")
262+
.build(),
263+
)
264+
server.enqueue(
265+
dnsResponse(
266+
"0000818000010003000000000567726170680866616365626f6f6b03636f6d0000010001c00c000500010" +
267+
"0000a6d000603617069c012c0300005000100000cde000c04737461720463313072c012c04200010001000" +
268+
"0003b00049df00112",
269+
)
270+
.newBuilder()
271+
.setHeader("cache-control", "private, max-age=298")
272+
.build(),
273+
)
274+
235275
var result = cachedDns.lookup("google.com")
236276
assertThat(result).containsExactly(address("157.240.1.18"))
237-
val recordedRequest = server.takeRequest()
277+
var recordedRequest = server.takeRequest()
238278
assertThat(recordedRequest.method).isEqualTo("POST")
239279
assertThat(recordedRequest.path)
240280
.isEqualTo("/lookup?ct")
281+
241282
result = cachedDns.lookup("google.com")
283+
assertThat(server.takeRequest(0, TimeUnit.MILLISECONDS)).isNull()
242284
assertThat(result).isEqualTo(listOf(address("157.240.1.18")))
285+
286+
result = cachedDns.lookup("www.google.com")
287+
assertThat(result).containsExactly(address("157.240.1.18"))
288+
recordedRequest = server.takeRequest(0, TimeUnit.MILLISECONDS)!!
289+
assertThat(recordedRequest.method).isEqualTo("POST")
290+
assertThat(recordedRequest.path)
291+
.isEqualTo("/lookup?ct")
243292
}
244293

245294
@Test

okhttp/src/main/kotlin/okhttp3/internal/cache/CacheInterceptor.kt

+7-9
Original file line numberDiff line numberDiff line change
@@ -126,19 +126,18 @@ class CacheInterceptor(internal val cache: Cache?) : Interceptor {
126126
}
127127
}
128128

129-
val cacheNetworkRequest = networkRequest.requestForCache()
130-
131129
val response =
132130
networkResponse!!.newBuilder()
133131
.cacheResponse(cacheResponse?.stripBody())
134132
.networkResponse(networkResponse.stripBody())
135-
.request(cacheNetworkRequest)
136133
.build()
137134

138135
if (cache != null) {
139-
if (response.promisesBody() && CacheStrategy.isCacheable(response)) {
136+
val cacheNetworkRequest = networkRequest.requestForCache()
137+
138+
if (response.promisesBody() && CacheStrategy.isCacheable(response, cacheNetworkRequest)) {
140139
// Offer this request to the cache.
141-
val cacheRequest = cache.put(response)
140+
val cacheRequest = cache.put(response.newBuilder().request(cacheNetworkRequest).build())
142141
return cacheWritingResponse(cacheRequest, response).also {
143142
if (cacheResponse != null) {
144143
// This will log a conditional cache miss only.
@@ -291,12 +290,11 @@ class CacheInterceptor(internal val cache: Cache?) : Interceptor {
291290
}
292291

293292
private fun Request.requestForCache(): Request {
294-
return if (cacheUrlOverride != null) {
293+
return cacheUrlOverride?.let {
295294
newBuilder()
296295
.get()
296+
.url(it)
297297
.cacheUrlOverride(null)
298298
.build()
299-
} else {
300-
this
301-
}
299+
} ?: this
302300
}

okhttp/src/main/kotlin/okhttp3/internal/cache/CacheStrategy.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ class CacheStrategy internal constructor(
152152
// If this response shouldn't have been stored, it should never be used as a response source.
153153
// This check should be redundant as long as the persistence store is well-behaved and the
154154
// rules are constant.
155-
if (!isCacheable(cacheResponse)) {
155+
if (!isCacheable(cacheResponse, request)) {
156156
return CacheStrategy(request, null)
157157
}
158158

@@ -292,6 +292,7 @@ class CacheStrategy internal constructor(
292292
/** Returns true if [response] can be stored to later serve another request. */
293293
fun isCacheable(
294294
response: Response,
295+
request: Request,
295296
): Boolean {
296297
// Always go to network for uncacheable response codes (RFC 7231 section 6.1), This
297298
// implementation doesn't support caching partial content.
@@ -333,7 +334,7 @@ class CacheStrategy internal constructor(
333334
}
334335

335336
// A 'no-store' directive on request or response prevents the response from being cached.
336-
return !response.cacheControl.noStore && !response.request.cacheControl.noStore
337+
return !response.cacheControl.noStore && !request.cacheControl.noStore
337338
}
338339
}
339340
}

okhttp/src/test/java/okhttp3/CacheTest.kt

+4-5
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ import mockwebserver3.RecordedRequest
4343
import mockwebserver3.SocketPolicy.DisconnectAtEnd
4444
import mockwebserver3.junit5.internal.MockWebServerInstance
4545
import okhttp3.Cache.Companion.key
46-
import okhttp3.Cache.Companion.keyUrl
4746
import okhttp3.Headers.Companion.headersOf
4847
import okhttp3.MediaType.Companion.toMediaType
4948
import okhttp3.RequestBody.Companion.toRequestBody
@@ -2708,7 +2707,7 @@ class CacheTest {
27082707
.build(),
27092708
)
27102709
val url = server.url("/")
2711-
val urlKey = keyUrl(url)
2710+
val urlKey = key(url)
27122711
val entryMetadata =
27132712
"""
27142713
$url
@@ -2757,7 +2756,7 @@ CLEAN $urlKey ${entryMetadata.length} ${entryBody.length}
27572756
@Test
27582757
fun testGoldenCacheHttpsResponseOkHttp27() {
27592758
val url = server.url("/")
2760-
val urlKey = keyUrl(url)
2759+
val urlKey = key(url)
27612760
val prefix = get().getPrefix()
27622761
val entryMetadata =
27632762
"""
@@ -2805,7 +2804,7 @@ CLEAN $urlKey ${entryMetadata.length} ${entryBody.length}
28052804
@Test
28062805
fun testGoldenCacheHttpsResponseOkHttp30() {
28072806
val url = server.url("/")
2808-
val urlKey = keyUrl(url)
2807+
val urlKey = key(url)
28092808
val prefix = get().getPrefix()
28102809
val entryMetadata =
28112810
"""
@@ -2857,7 +2856,7 @@ CLEAN $urlKey ${entryMetadata.length} ${entryBody.length}
28572856
@Test
28582857
fun testGoldenCacheHttpResponseOkHttp30() {
28592858
val url = server.url("/")
2860-
val urlKey = keyUrl(url)
2859+
val urlKey = key(url)
28612860
val prefix = get().getPrefix()
28622861
val entryMetadata =
28632862
"""

0 commit comments

Comments
 (0)