Skip to content

Commit a7d3c2e

Browse files
committed
KTOR-8343 Fix: Store client header cookies with RAW encoding to prevent value alteration
1 parent ba92e44 commit a7d3c2e

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

ktor-client/ktor-client-core/common/src/io/ktor/client/plugins/cookies/HttpCookies.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ public class HttpCookies internal constructor(
5353
val url = builder.url.clone().build()
5454
val cookies = headers[HttpHeaders.Cookie]?.let { cookieHeader ->
5555
LOGGER.trace("Saving cookie $cookieHeader for ${builder.url}")
56-
parseClientCookiesHeader(cookieHeader).map { (name, encodedValue) -> Cookie(name, encodedValue) }
56+
parseClientCookiesHeader(cookieHeader).map { (name, encodedValue) ->
57+
Cookie(name, encodedValue, encoding = CookieEncoding.RAW)
58+
}
5759
}
5860
cookies?.forEach { storage.addCookie(url, it) }
5961
}

ktor-client/ktor-client-core/common/test/CookiesTest.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,22 @@ class CookiesTest {
9696

9797
assertNull(builder.headers[HttpHeaders.Cookie])
9898
}
99+
100+
@Test
101+
fun testCapturedHeaderCookiesStoredAsRawPreserveOriginalHeader() = testSuspend {
102+
val feature = HttpCookies(AcceptAllCookiesStorage(), emptyList())
103+
val builder = HttpRequestBuilder()
104+
val defaultEncodingCookie = Cookie("default", "&%?#=$")
105+
val rawEncodingCookie = Cookie("raw", "&%?#=$", encoding = CookieEncoding.RAW)
106+
val base64EncodingCookie = Cookie("base64", "&%?#=$", encoding = CookieEncoding.BASE64_ENCODING)
107+
val dquotesEncodingCookie = Cookie("dquotes", "&%?#=$", encoding = CookieEncoding.DQUOTES)
108+
val cookies = listOf(defaultEncodingCookie, rawEncodingCookie, base64EncodingCookie, dquotesEncodingCookie)
109+
.joinToString("; ", transform = ::renderCookieHeader)
110+
111+
builder.header(HttpHeaders.Cookie, cookies)
112+
feature.captureHeaderCookies(builder)
113+
feature.sendCookiesWith(builder)
114+
115+
assertEquals(cookies, builder.headers[HttpHeaders.Cookie])
116+
}
99117
}

0 commit comments

Comments
 (0)