Skip to content

Commit

Permalink
Add optional contentType to formDsl (#910)
Browse files Browse the repository at this point in the history
* Add optional contentType to formDsl

* Tests for contentType in formDsl
  • Loading branch information
wollnyst authored and e5l committed Feb 26, 2019
1 parent 91d42d7 commit 3fa3b42
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,15 +80,18 @@ inline fun FormBuilder.append(key: String, headers: Headers = Headers.Empty, bod
}

/**
* Append a form part with the specified [key] and [filename] using [bodyBuilder] for it's body
* Append a form part with the specified [key], [filename] and optional [contentType] using [bodyBuilder] for it's body
*/
@UseExperimental(ExperimentalContracts::class)
fun FormBuilder.append(key: String, filename: String, bodyBuilder: BytePacketBuilder.() -> Unit) {
fun FormBuilder.append(key: String, filename: String, contentType: ContentType? = null, bodyBuilder: BytePacketBuilder.() -> Unit) {
contract {
callsInPlace(bodyBuilder, InvocationKind.EXACTLY_ONCE)
}
val filenameHeader: Headers = headersOf(
HttpHeaders.ContentDisposition, "filename=$filename"
)
append(key, filenameHeader, bodyBuilder)

val headersBuilder = HeadersBuilder()
headersBuilder[HttpHeaders.ContentDisposition] ="filename=$filename"
contentType?.run { headersBuilder[HttpHeaders.ContentType] = this.toString() }
val headers = headersBuilder.build()

append(key, headers, bodyBuilder)
}
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,11 @@ abstract class ContentTest(private val factory: HttpClientEngineFactory<*>) : Te
writeByte(i.toByte())
}
}
append("file2", "urlencoded_name2.jpg", ContentType.Application.OctetStream) {
for (i in 1..4096) {
writeByte(i.toByte())
}
}
append("hello", 5)
}
}
Expand All @@ -191,22 +196,23 @@ abstract class ContentTest(private val factory: HttpClientEngineFactory<*>) : Te
}
}

private fun filenameAndContentString(provider: () -> Input, headers: Headers): String {
private fun filenameContentTypeAndContentString(provider: () -> Input, headers: Headers): String {
val dispHeader: String = headers.getAll(HttpHeaders.ContentDisposition)!!.joinToString(";")
val disposition: ContentDisposition = ContentDisposition.parse(dispHeader)
val filename: String = disposition.parameter("filename") ?: ""
val contentType = headers[HttpHeaders.ContentType]?.let { ContentType.parse(it) } ?: ""
val content: String = provider().readText(Charsets.ISO_8859_1)
return "$filename$content"
return "$filename$contentType$content"
}

private fun List<PartData>.makeString(): String = buildString {
val list = this@makeString
list.forEach {
appendln(it.name!!)
val content = when (it) {
is PartData.FileItem -> filenameAndContentString(it.provider, it.headers)
is PartData.FileItem -> filenameContentTypeAndContentString(it.provider, it.headers)
is PartData.FormItem -> it.value
is PartData.BinaryItem -> filenameAndContentString(it.provider, it.headers)
is PartData.BinaryItem -> filenameContentTypeAndContentString(it.provider, it.headers)
}

appendln(content)
Expand Down

0 comments on commit 3fa3b42

Please sign in to comment.