diff --git a/ktor-client/ktor-client-core/common/src/io/ktor/client/request/forms/formDsl.kt b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/forms/formDsl.kt index dbaf867391f..87a6f3f8d86 100644 --- a/ktor-client/ktor-client-core/common/src/io/ktor/client/request/forms/formDsl.kt +++ b/ktor-client/ktor-client-core/common/src/io/ktor/client/request/forms/formDsl.kt @@ -37,7 +37,7 @@ public fun formData(vararg values: FormPart<*>): List { values.forEach { (key, value, headers) -> val partHeaders = HeadersBuilder().apply { - append(HttpHeaders.ContentDisposition, "form-data; name=${key.escapeIfNeeded()}") + append(HttpHeaders.ContentDisposition, "form-data; name=${key.quote()}") appendAll(headers) } @@ -272,7 +272,7 @@ public fun FormBuilder.append( } val headersBuilder = HeadersBuilder() - headersBuilder[HttpHeaders.ContentDisposition] = "filename=${filename.escapeIfNeeded()}" + headersBuilder[HttpHeaders.ContentDisposition] = "filename=${filename.quote()}" contentType?.run { headersBuilder[HttpHeaders.ContentType] = this.toString() } val headers = headersBuilder.build() diff --git a/ktor-client/ktor-client-core/common/test/MultiPartFormDataContentTest.kt b/ktor-client/ktor-client-core/common/test/MultiPartFormDataContentTest.kt index 1eef14ec38e..75a207ca4a9 100644 --- a/ktor-client/ktor-client-core/common/test/MultiPartFormDataContentTest.kt +++ b/ktor-client/ktor-client-core/common/test/MultiPartFormDataContentTest.kt @@ -49,7 +49,7 @@ class MultiPartFormDataContentTest { assertEquals( listOf( "--boundary", - "Content-Disposition: form-data; name=channel", + "Content-Disposition: form-data; name=\"channel\"", "", "", "--boundary--", @@ -72,7 +72,7 @@ class MultiPartFormDataContentTest { assertEquals( listOf( "--boundary", - "Content-Disposition: form-data; name=channel", + "Content-Disposition: form-data; name=\"channel\"", "Content-Length: 4", "", "body", @@ -95,7 +95,7 @@ class MultiPartFormDataContentTest { assertEquals( listOf( "--boundary", - "Content-Disposition: form-data; name=not_a_forty_two", + "Content-Disposition: form-data; name=\"not_a_forty_two\"", "Content-Length: 4", "", "1337", // note quotes @@ -118,7 +118,7 @@ class MultiPartFormDataContentTest { assertEquals( listOf( "--boundary", - "Content-Disposition: form-data; name=is_forty_two", + "Content-Disposition: form-data; name=\"is_forty_two\"", "Content-Length: 5", "", "false", // note quotes @@ -223,7 +223,7 @@ class MultiPartFormDataContentTest { assertEquals( listOf( "--boundary", - "Content-Disposition: form-data; name=channel", + "Content-Disposition: form-data; name=\"channel\"", "", "k".repeat(4089), "--boundary--", diff --git a/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/ContentTest.kt b/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/ContentTest.kt index ce1c5b65c18..e1f329391e3 100644 --- a/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/ContentTest.kt +++ b/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/ContentTest.kt @@ -280,7 +280,7 @@ class ContentTest : ClientLoader() { } ).body() - assertContains(response, "Content-Disposition: form-data; name=channel") + assertContains(response, "Content-Disposition: form-data; name=\"channel\"") assertContains(response, "from channel") } } diff --git a/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/LoggingMockedTests.kt b/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/LoggingMockedTests.kt index a4161d2e0ff..874442b6214 100644 --- a/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/LoggingMockedTests.kt +++ b/ktor-client/ktor-client-tests/common/test/io/ktor/client/tests/LoggingMockedTests.kt @@ -163,7 +163,7 @@ class LoggingMockedTests { "boundary=41a55fb5-2ae7bc4b-5b124e524086ca1e-6879a99a75b8a0a028a6a7d7-63d38251-5", "BODY START", "!!!--41a55fb5-2ae7bc4b-5b124e524086ca1e-6879a99a75b8a0a028a6a7d7-63d38251-5", - """Content-Disposition: form-data; name=file; file; name=""; filename=""""", + """Content-Disposition: form-data; name="file"; file; name=""; filename=""""", "", "Hello", """!!!--41a55fb5-2ae7bc4b-5b124e524086ca1e-6879a99a75b8a0a028a6a7d7-63d38251-5--""",