in ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/BaseApplicationResponse.kt [44:96]
protected fun commitHeaders(content: OutgoingContent) {
if (responded)
throw BaseApplicationResponse.ResponseAlreadySentException()
responded = true
var transferEncodingSet = false
content.status?.let { status(it) } ?: status() ?: status(HttpStatusCode.OK)
content.headers.forEach { name, values ->
when (name) {
HttpHeaders.TransferEncoding -> transferEncodingSet = true
HttpHeaders.Upgrade -> {
if (content !is OutgoingContent.ProtocolUpgrade)
throw InvalidHeaderForContent(HttpHeaders.Upgrade, "non-upgrading response")
for (value in values)
headers.append(name, value, safeOnly = false)
return@forEach
}
}
for (value in values) {
headers.append(name, value)
}
}
val contentLength = content.contentLength
when {
contentLength != null -> {
// TODO: What should we do if TransferEncoding was set and length is present?
headers.append(HttpHeaders.ContentLength, contentLength.toStringFast(), safeOnly = false)
}
!transferEncodingSet -> {
when (content) {
is OutgoingContent.ProtocolUpgrade -> {
}
is OutgoingContent.NoContent -> headers.append(HttpHeaders.ContentLength, "0", safeOnly = false)
else -> headers.append(HttpHeaders.TransferEncoding, "chunked", safeOnly = false)
}
}
}
content.contentType?.let {
headers.append(HttpHeaders.ContentType, it.toString(), safeOnly = false)
}
val connection = call.request.headers[HttpHeaders.Connection]
if (connection != null) {
when {
connection.equals("close", true) -> header("Connection", "close")
connection.equals("keep-alive", true) -> header("Connection", "keep-alive")
}
}
}