diff --git a/ktor-client/ktor-client-curl/build.gradle.kts b/ktor-client/ktor-client-curl/build.gradle.kts index b2698f9e8a..296f24d614 100644 --- a/ktor-client/ktor-client-curl/build.gradle.kts +++ b/ktor-client/ktor-client-curl/build.gradle.kts @@ -57,6 +57,7 @@ kotlin { dependencies { api(project(":ktor-client:ktor-client-plugins:ktor-client-logging")) api(project(":ktor-client:ktor-client-plugins:ktor-client-json")) + api(project(":ktor-server:ktor-server-cio")) } } } diff --git a/ktor-client/ktor-client-curl/desktop/src/io/ktor/client/engine/curl/internal/CurlMultiApiHandler.kt b/ktor-client/ktor-client-curl/desktop/src/io/ktor/client/engine/curl/internal/CurlMultiApiHandler.kt index ba7410e661..aefdca9238 100644 --- a/ktor-client/ktor-client-curl/desktop/src/io/ktor/client/engine/curl/internal/CurlMultiApiHandler.kt +++ b/ktor-client/ktor-client-curl/desktop/src/io/ktor/client/engine/curl/internal/CurlMultiApiHandler.kt @@ -155,15 +155,16 @@ internal class CurlMultiApiHandler : Closeable { easyHandle.apply { when (method) { "GET" -> option(CURLOPT_HTTPGET, 1L) - "PUT" -> { - option(CURLOPT_PUT, 1L) - } + "PUT" -> option(CURLOPT_PUT, 1L) "POST" -> { option(CURLOPT_POST, 1L) option(CURLOPT_POSTFIELDSIZE, size) } "HEAD" -> option(CURLOPT_NOBODY, 1L) - else -> option(CURLOPT_CUSTOMREQUEST, method) + else -> { + if (size > 0) option(CURLOPT_POST, 1L) + option(CURLOPT_CUSTOMREQUEST, method) + } } } } diff --git a/ktor-client/ktor-client-curl/desktop/test/io/ktor/client/engine/curl/test/CurlNativeTests.kt b/ktor-client/ktor-client-curl/desktop/test/io/ktor/client/engine/curl/test/CurlNativeTests.kt index be2285cb0d..51781bb63b 100644 --- a/ktor-client/ktor-client-curl/desktop/test/io/ktor/client/engine/curl/test/CurlNativeTests.kt +++ b/ktor-client/ktor-client-curl/desktop/test/io/ktor/client/engine/curl/test/CurlNativeTests.kt @@ -8,6 +8,14 @@ import io.ktor.client.* import io.ktor.client.call.* import io.ktor.client.engine.curl.* import io.ktor.client.request.* +import io.ktor.client.statement.* +import io.ktor.server.application.* +import io.ktor.server.cio.* +import io.ktor.server.engine.* +import io.ktor.server.request.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import io.ktor.utils.io.core.* import kotlinx.coroutines.* import kotlin.native.concurrent.* import kotlin.test.* @@ -21,18 +29,42 @@ class CurlNativeTests { fun testDownloadInBackground() { backgroundWorker.execute(TransferMode.SAFE, { Unit }) { runBlocking { - val client = HttpClient(Curl) - client.get("http://google.com").body() + HttpClient(Curl).use { + it.get("http://google.com").body() + } } }.consume { assert(it.isNotEmpty()) } } @Test - fun testDownload() { - runBlocking { - val client = HttpClient(Curl) - val res = client.get("http://google.com").body() + fun testDownload() = runBlocking { + HttpClient(Curl).use { + val res = it.get("http://google.com").body() assert(res.isNotEmpty()) } } + + @Test + fun testDelete(): Unit = runBlocking { + val server = embeddedServer(CIO, 0) { + routing { + delete("/delete") { + call.respondText("OK ${call.receiveText()}") + } + } + }.start() + val port = server.resolvedConnectors().first().port + + HttpClient(Curl).use { + val response = it.delete("http://localhost:$port/delete") + assertEquals("OK ", response.bodyAsText()) + + val responseWithBody = it.delete("http://localhost:$port/delete") { + setBody("1") + } + assertEquals("OK 1", responseWithBody.bodyAsText()) + } + + server.stop(0, 500) + } }