Я пишу простой обратный прокси с помощью Ktor, но возникает ошибка: io.ktor.http.UnsafeHeaderException - PullRequest
1 голос
/ 09 июля 2020

Я учусь писать обратный прокси из Обратный прокси и асинхронная потоковая передача с использованием клиента и сервера 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

Кто-нибудь может помочь? Большое спасибо.

...