Skip to content

Instantly share code, notes, and snippets.

@adevone
Created December 16, 2020 09:21
Show Gist options
  • Save adevone/34e95f20560316a21453a9baaa90c5b6 to your computer and use it in GitHub Desktop.
Save adevone/34e95f20560316a21453a9baaa90c5b6 to your computer and use it in GitHub Desktop.
import io.ktor.client.request.HttpRequest
import io.ktor.content.TextContent
import java.util.*
class CurlBuilder(
request: HttpRequest,
private val ignoreHeaders: List<String> = emptyList()
) {
private val url: String = request.url.toString()
private val method: String = request.method.value
private var contentType: String? = null
private var body: String? = null
private val headers = LinkedList<Header>()
init {
val content = request.content
if (content.contentType != null) {
this.contentType = content.contentType.toString()
this.body = (content as TextContent).text
}
request.headers.forEach { name, values ->
val header = Header(name, values[0])
this.headers.add(header)
}
}
fun build(): String {
val parts = ArrayList<String>()
parts.add("curl")
parts.add(String.format(FORMAT_METHOD, method.toUpperCase()))
parts.add(String.format(FORMAT_URL, url))
for (header in headers) {
if (header.name !in ignoreHeaders) {
val headerPart = String.format(FORMAT_HEADER, header.name, header.value)
parts.add(headerPart)
}
}
if (contentType != null && !containsName(CONTENT_TYPE, headers) && CONTENT_TYPE !in ignoreHeaders) {
parts.add(String.format(FORMAT_HEADER, CONTENT_TYPE, contentType))
}
if (body != null) {
parts.add(String.format(FORMAT_BODY, body))
}
return parts.joinToString(" ")
}
private fun containsName(name: String, headers: List<Header>): Boolean {
for (header in headers) {
if (header.name == name) {
return true
}
}
return false
}
companion object {
private const val FORMAT_HEADER = "-H \"%1\$s:%2\$s\""
private const val FORMAT_METHOD = "-X %1\$s"
private const val FORMAT_BODY = "-d '%1\$s'"
private const val FORMAT_URL = "\"%1\$s\""
private const val CONTENT_TYPE = "Content-Type"
}
}
private data class Header(
val name: String,
val value: String
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment