Я учусь писать обратный прокси из Обратный прокси и асинхронная потоковая передача с использованием клиента и сервера Ktor .
Когда я запускаю сервер и просматриваю любой URL-адрес в браузере, нет ответа и ошибки происходит.
Ошибка:
io.ktor.http.UnsafeHeaderException: Header Content-Type is controlled by the engine and cannot be set explicitly
Мой код:
package com.example
import io.ktor.application.ApplicationCallPipeline
import io.ktor.application.call
import io.ktor.client.HttpClient
import io.ktor.client.request.request
import io.ktor.client.statement.HttpResponse
import io.ktor.http.ContentType
import io.ktor.http.Headers
import io.ktor.http.HttpHeaders
import io.ktor.http.HttpStatusCode
import io.ktor.http.content.OutgoingContent
import io.ktor.response.header
import io.ktor.response.respond
import io.ktor.server.engine.embeddedServer
import io.ktor.server.netty.Netty
import io.ktor.utils.io.ByteWriteChannel
import io.ktor.utils.io.copyAndClose
fun main(args: Array<String>) {
// Creates a Netty server
val server = embeddedServer(Netty, port = 8080) {
val client = HttpClient()
intercept(ApplicationCallPipeline.Call) {
val response = client.request<HttpResponse>("http://localhost:18080/SimpleAp/openApi/env")
val proxiedHeaders = response.headers
val location = proxiedHeaders[HttpHeaders.Location]
val contentType = proxiedHeaders[HttpHeaders.ContentType]
val contentLength = proxiedHeaders[HttpHeaders.ContentLength]
if (location != null) {
call.response.header(HttpHeaders.Location, location)
}
call.respond(object : OutgoingContent.WriteChannelContent() {
override val contentLength: Long? = contentLength?.toLong()
override val contentType: ContentType? = contentType?.let { ContentType.parse(it) }
// override val headers: Headers = proxiedHeaders
override val headers: Headers = Headers.build {
appendAll(proxiedHeaders)
}
override val status: HttpStatusCode? = response.status
override suspend fun writeTo(channel: ByteWriteChannel) {
response.content.copyAndClose(channel)
}
})
}
}
server.start(wait = true)
}
Моя среда:
ktor_version=1.3.2
kotlin.code.style=official
kotlin_version=1.3.70
Кто-нибудь может помочь? Большое спасибо.