Skip to content

Commit 2ae6e02

Browse files
authored
Trim trailing whitespace in cookie value: JavaNetCookieJar to avoid crash (#9374)
* Trim cookie value in JavaNetCookieJar to avoid crash (#9373) * Add receiveAndSendUntrimmedCookie regression test
1 parent 2c7e2f9 commit 2ae6e02

2 files changed

Lines changed: 59 additions & 0 deletions

File tree

okhttp-java-net-cookiejar/src/main/kotlin/okhttp3/java/net/cookiejar/JavaNetCookieJar.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ class JavaNetCookieJar(
112112
value = value.substring(1, value.length - 1)
113113
}
114114

115+
// Minimal normalisation so Cookie.Builder doesn't crash on values like "abc123 ".
116+
value = value.trim()
117+
115118
result.add(
116119
Cookie
117120
.Builder()

okhttp/src/jvmTest/kotlin/okhttp3/CookiesTest.kt

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,62 @@ class CookiesTest {
378378
assertThat(request.headers["Quux"]).isNull()
379379
}
380380

381+
@Test
382+
fun cookieHandlerWithQuotedValueAndTrailingSpace() {
383+
server.enqueue(MockResponse())
384+
val serverUrl = urlWithIpAddress(server, "/")
385+
val androidCookieHandler: CookieHandler =
386+
object : CookieHandler() {
387+
override fun get(
388+
uri: URI,
389+
map: Map<String, List<String>>,
390+
) = mapOf(
391+
"Cookie" to
392+
listOf(
393+
"a=\"android \"",
394+
),
395+
)
396+
397+
override fun put(
398+
uri: URI,
399+
map: Map<String, List<String>>,
400+
) {
401+
}
402+
}
403+
client =
404+
client
405+
.newBuilder()
406+
.cookieJar(JavaNetCookieJar(androidCookieHandler))
407+
.build()
408+
get(serverUrl)
409+
val request = server.takeRequest()
410+
assertThat(request.headers["Cookie"]).isEqualTo("a=android")
411+
assertThat(request.headers["Quux"]).isNull()
412+
}
413+
414+
@Test
415+
fun receiveAndSendUntrimmedCookie() {
416+
server.enqueue(
417+
MockResponse
418+
.Builder()
419+
.addHeader("Set-Cookie", "a=\"android \"")
420+
.build(),
421+
)
422+
server.enqueue(MockResponse())
423+
val cookieManager = CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER)
424+
client =
425+
client
426+
.newBuilder()
427+
.cookieJar(JavaNetCookieJar(cookieManager))
428+
.build()
429+
get(urlWithIpAddress(server, "/"))
430+
val request1 = server.takeRequest()
431+
assertThat(request1.headers["Cookie"]).isNull()
432+
get(urlWithIpAddress(server, "/"))
433+
val request2 = server.takeRequest()
434+
assertThat(request2.headers["Cookie"]).isEqualTo("a=android")
435+
}
436+
381437
private fun urlWithIpAddress(
382438
server: MockWebServer,
383439
path: String,

0 commit comments

Comments
 (0)