Skip to content

Commit

Permalink
KTOR-2788 Add support for X-Forwarded-Port (#2518)
Browse files Browse the repository at this point in the history
  • Loading branch information
rsinukov authored Jun 17, 2021
1 parent 3cf7ab7 commit 0821569
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
3 changes: 3 additions & 0 deletions ktor-http/common/src/io/ktor/http/HttpHeaders.kt
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ public object HttpHeaders {
public val XForwardedProto: String = "X-Forwarded-Proto"
public val XForwardedFor: String = "X-Forwarded-For"

@PublicAPICandidate("2.0.0")
internal val XForwardedPort: String = "X-Forwarded-Port"

public val XRequestId: String = "X-Request-ID"
public val XCorrelationId: String = "X-Correlation-ID"
public val XTotalCount: String = "X-Total-Count"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,11 @@ public object XForwardedHeaderSupport :
}
}

call.forEachHeader(config.portHeaders) { value ->
val port = value.toInt()
call.mutableOriginConnectionPoint.port = port
}

call.forEachHeader(config.forHeaders) { xForwardedFor ->
val remoteHost = xForwardedFor.split(",").first().trim()
if (remoteHost.isNotBlank()) {
Expand Down Expand Up @@ -167,6 +172,12 @@ public object XForwardedHeaderSupport :
* HTTPS/TLS flag header names. Default are `X-Forwarded-SSL` and `Front-End-Https`
*/
public val httpsFlagHeaders: ArrayList<String> = arrayListOf("X-Forwarded-SSL", "Front-End-Https")

/**
* Port X-header names. Default is `X-Forwarded-Port`
*/
@PublicAPICandidate("2.0.0")
internal val portHeaders: ArrayList<String> = arrayListOf("X-Forwarded-Port")
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,47 @@ class OriginConnectionPointTest {
}
}

@Test
fun testProxyXForwardedPort() {
withTestApplication {
application.install(XForwardedHeaderSupport)
application.routing {
get("/") {
with(call.request.origin) {
assertEquals(91, port)
}

call.respond("OK")
}
}

handleRequest(HttpMethod.Get, "/") {
addHeader("X-Forwarded-Port", "91")
}
}
}

@Test
fun testProxyXForwardedSchemeWithPortAndXForwardedPort() {
withTestApplication {
application.install(XForwardedHeaderSupport)
application.routing {
get("/") {
with(call.request.origin) {
assertEquals(91, port)
}

call.respond("OK")
}
}

handleRequest(HttpMethod.Get, "/") {
addHeader(HttpHeaders.XForwardedHost, "host:90")
addHeader("X-Forwarded-Port", "91")
}
}
}

@Test
fun testProxyXForwardedHttpsFlagOn() {
withTestApplication {
Expand Down

0 comments on commit 0821569

Please sign in to comment.