in ktor-server/ktor-server-core/jvm/src/io/ktor/features/OriginConnectionPoint.kt [181:220]
override fun install(pipeline: ApplicationCallPipeline, configure: Unit.() -> Unit) {
configure(Unit)
pipeline.intercept(ApplicationCallPipeline.Features) {
val forwarded = call.request.forwarded()
if (forwarded != null) {
call.attributes.put(ForwardedParsedKey, forwarded)
val firstForward = forwarded.firstOrNull()
if (firstForward != null) {
if (firstForward.proto != null) {
call.mutableOriginConnectionPoint.let { route ->
val proto: String = firstForward.proto
route.scheme = proto
URLProtocol.byName[proto]?.let { p ->
route.port = p.defaultPort
}
}
}
if (firstForward.forParam != null) {
val remoteHost = firstForward.forParam.split(",").first().trim()
if (remoteHost.isNotBlank()) {
call.mutableOriginConnectionPoint.remoteHost = remoteHost
}
}
if (firstForward.host != null) {
val host = firstForward.host.substringBefore(':')
val port = firstForward.host.substringAfter(':', "")
call.mutableOriginConnectionPoint.let { route ->
route.host = host
port.tryParseInt()?.let { route.port = it } ?: URLProtocol.byName[route.scheme]?.let {
route.port = it.defaultPort
}
}
}
}
}
}
}