Created
December 16, 2020 09:21
-
-
Save adevone/34e95f20560316a21453a9baaa90c5b6 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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