From 08400a5dec412266c3f44b4409fe39b035ad6405 Mon Sep 17 00:00:00 2001 From: John Zhang Date: Mon, 5 Sep 2022 17:13:16 +1000 Subject: [PATCH] KTOR-3854 Fix: separate HttpCookie rendered cookie pairs with space (#2938) * separate cookies by space --- .../ktor/client/plugins/cookies/HttpCookies.kt | 2 +- .../ktor-client-core/common/test/CookiesTest.kt | 17 +++++++++++++++-- .../client/tests/plugins/CookiesMockTest.kt | 2 +- .../io/ktor/client/tests/plugins/CookiesTest.kt | 2 +- .../tests/CookiesAndRedirectMockedTest.kt | 2 +- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/ktor-client/ktor-client-core/common/src/io/ktor/client/plugins/cookies/HttpCookies.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/plugins/cookies/HttpCookies.kt index 1f9d577b5e..28f6bdc785 100644 --- a/ktor-client/ktor-client-core/common/src/io/ktor/client/plugins/cookies/HttpCookies.kt +++ b/ktor-client/ktor-client-core/common/src/io/ktor/client/plugins/cookies/HttpCookies.kt @@ -119,7 +119,7 @@ public class HttpCookies internal constructor( } private fun renderClientCookies(cookies: List): String = - cookies.joinToString(";", transform = ::renderCookieHeader) + cookies.joinToString("; ", transform = ::renderCookieHeader) /** * Gets all the cookies for the specified [url] for this [HttpClient]. diff --git a/ktor-client/ktor-client-core/common/test/CookiesTest.kt b/ktor-client/ktor-client-core/common/test/CookiesTest.kt index 701936901c..6883ac6a62 100644 --- a/ktor-client/ktor-client-core/common/test/CookiesTest.kt +++ b/ktor-client/ktor-client-core/common/test/CookiesTest.kt @@ -42,10 +42,23 @@ class CookiesTest { assertEquals("test=value", builder.headers[HttpHeaders.Cookie]) } + @Test + fun testCookiesAreRenderedWithSpaceInBetween() = testSuspend{ + var storage = AcceptAllCookiesStorage() + storage.addCookie("http://localhost/", Cookie("name1", "value1")) + storage.addCookie("http://localhost/", Cookie("name2", "value2")) + val feature = HttpCookies(storage, emptyList()) + var builder = HttpRequestBuilder() + + feature.sendCookiesWith(builder) + + assertContains(builder.headers[HttpHeaders.Cookie]!!, "; ") + } + @Test fun testRequestCookiesArePreservedWhenAddingCookiesFromStorage() = testSuspend { val storage = AcceptAllCookiesStorage() - storage.addCookie("http://localhost/", parseServerSetCookieHeader("SOMECOOKIE=somevalue;")) + storage.addCookie("http://localhost/", Cookie("SOMECOOKIE", "somevalue")) val feature = HttpCookies(storage, emptyList()) val builder = HttpRequestBuilder() @@ -53,7 +66,7 @@ class CookiesTest { feature.captureHeaderCookies(builder) feature.sendCookiesWith(builder) - val renderedCookies = builder.headers[HttpHeaders.Cookie]!!.split(";") + val renderedCookies = builder.headers[HttpHeaders.Cookie]!!.split("; ") assertContains(renderedCookies, "test=value") assertContains(renderedCookies, "SOMECOOKIE=somevalue") } diff --git a/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/plugins/CookiesMockTest.kt b/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/plugins/CookiesMockTest.kt index e52f29c2a3..4d442d35bc 100644 --- a/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/plugins/CookiesMockTest.kt +++ b/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/plugins/CookiesMockTest.kt @@ -22,7 +22,7 @@ class CookiesMockTest { assertEquals("*/*", request.headers[HttpHeaders.Accept]) val rawCookies = request.headers[HttpHeaders.Cookie]!! assertEquals(1, request.headers.getAll(HttpHeaders.Cookie)?.size!!) - assertEquals("first=\"1,2,3,4\";second=abc", rawCookies) + assertEquals("first=\"1,2,3,4\"; second=abc", rawCookies) respondOk() } diff --git a/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/plugins/CookiesTest.kt b/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/plugins/CookiesTest.kt index 6e7b1f0ddb..152886f432 100644 --- a/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/plugins/CookiesTest.kt +++ b/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/plugins/CookiesTest.kt @@ -192,7 +192,7 @@ class CookiesTest : ClientLoader() { test { client -> client.prepareGet("$TEST_HOST/encoded").execute { httpResponse -> val response = httpResponse.bodyAsText() - val cookieStrings = response.split(";").filter { it.isNotBlank() } + val cookieStrings = response.split("; ").filter { it.isNotBlank() } assertEquals(4, cookieStrings.size) assertEquals("uri=first%2C+cookie", cookieStrings[0]) assertEquals("raw=first%2C+cookie", cookieStrings[1]) diff --git a/ktor-client/ktor-client-tests/jvm/test/io/ktor/client/tests/CookiesAndRedirectMockedTest.kt b/ktor-client/ktor-client-tests/jvm/test/io/ktor/client/tests/CookiesAndRedirectMockedTest.kt index d38b90b58d..c81fee3ee9 100644 --- a/ktor-client/ktor-client-tests/jvm/test/io/ktor/client/tests/CookiesAndRedirectMockedTest.kt +++ b/ktor-client/ktor-client-tests/jvm/test/io/ktor/client/tests/CookiesAndRedirectMockedTest.kt @@ -76,7 +76,7 @@ class CookiesAndRedirectMockedTest { val storage = AcceptAllCookiesStorage() config { server { request -> - val cookies = request.headers[HttpHeaders.Cookie]!!.split(";") + val cookies = request.headers[HttpHeaders.Cookie]!!.split("; ") assertContains(cookies, "test=value") assertContains(cookies, "other=abc") respondOk()