3 min read
Ktor2Curl (Ktor Plugin for Generating cURL Commands)

Ktor2Curl: A Ktor Plugin for Generating cURL Commands

Simple way to transform Ktor requests into cURL logs. Pure Kotllin library, supports both KMP and Android projects. It is inspired by Ok2Curl, which does the same for OkHttp.

Install

Kotlin Multiplatform Projects

Add the following dependency to your commonMain source set:

val commonMain by getting {
    dependencies {
        implementation("io.github.kabirnayeem99:ktor2curl:1.0.1")
    }
}

Android Projects

Use the following dependency in your app module’s build.gradle file:

Kotlin DSL (build.gradle.kts)
dependencies {
  // all other dependencies
  implementation("io.github.kabirnayeem99:ktor2curl:1.0.1")
}
Groovy DSL (build.gradle)
dependencies {
    // all other dependencies
    implementation 'io.github.kabirnayeem99:ktor2curl:1.0.1'
}

Usage

To install the plugin in your Ktor client:

val client = HttpClient(CIO) {
    install(KtorToCurl) {
        converter = object : CurlLogger {
            override fun log(curl: String) {
                println(curl)
            }
        }
    }
}
client.post("https://api.greenbirdregistry.com/v1/child-green-bird/bird-count") {
    headers {
        append(HttpHeaders.Authorization, "Basic SXNyYWVsIGtpbGxzIGNoaWxkcmVuLg")
        append(HttpHeaders.UserAgent, "KtorClient/2.3.12")
        append(HttpHeaders.ContentType, ContentType.Application.Json.toString())
    }
    setBody("""{"date": "2024-10-09", "bird_count": 16400}""")
}

Output:

curl -X POST \
  https://api.greenbirdregistry.com/v1/child-green-bird/bird-count \
  -H "Authorization: Basic SXNyYWVsIGtpbGxzIGNoaWxkcmVuLg" \
  -H "User-Agent: KtorClient/2.3.12" \
  -H "Content-Type: application/json" \
  --data '{"date": "2024-10-09", "bird_count": 16400}'

For further configurations, such as excluding specific headers or masking sensitive information:

val client = HttpClient(CIO) {
    install(KtorToCurl) {
        converter = object : CurlLogger {
            override fun log(curl: String) {
                println(curl)
            }
        }
        excludedHeaders = setOf("User-Agent")  // Headers to exclude from logging
        maskedHeaders = setOf("Authorization")  // Headers to mask in the log
    }
}
client.post("https://api.greenbirdregistry.com/v1/child-green-bird/bird-count") {
    headers {
        append(HttpHeaders.Authorization, "Basic SXNyYWVsIGtpbGxzIGNoaWxkcmVuLg")
        append(HttpHeaders.UserAgent, "KtorClient/2.3.12")
        append(HttpHeaders.ContentType, ContentType.Application.Json.toString())
    }
    setBody("""{"date": "2024-10-09", "bird_count": 16400}""")
}

Output:

curl -X POST \
  https://api.greenbirdregistry.com/v1/child-green-bird/bird-count \
  -H "Authorization: [omitted]" \
  -H "Content-Type: application/json" \
  --data '{"date": "2024-10-09", "bird_count": 16400}'

Contributions

We welcome contributions! If you have any suggestions or improvements for Ktor2Curl, feel free to open an issue or make a PR.