From 413edef50224979d0ae31f4d508897b84fbc6685 Mon Sep 17 00:00:00 2001 From: rsinukov Date: Mon, 17 Oct 2022 17:45:04 +0200 Subject: [PATCH] KTOR-4990 Fix duplication of default headers --- .../plugins/defaultheaders/DefaultHeaders.kt | 7 +++++-- .../io/ktor/tests/plugins/DefaultHeadersTest.kt | 17 +++++++++++++++++ .../ktor/websocket/DefaultWebSocketSession.kt | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/ktor-server/ktor-server-plugins/ktor-server-default-headers/jvm/src/io/ktor/server/plugins/defaultheaders/DefaultHeaders.kt b/ktor-server/ktor-server-plugins/ktor-server-default-headers/jvm/src/io/ktor/server/plugins/defaultheaders/DefaultHeaders.kt index 03912581ac..e1927f14a1 100644 --- a/ktor-server/ktor-server-plugins/ktor-server-default-headers/jvm/src/io/ktor/server/plugins/defaultheaders/DefaultHeaders.kt +++ b/ktor-server/ktor-server-plugins/ktor-server-default-headers/jvm/src/io/ktor/server/plugins/defaultheaders/DefaultHeaders.kt @@ -6,6 +6,7 @@ package io.ktor.server.plugins.defaultheaders import io.ktor.http.* import io.ktor.server.application.* +import io.ktor.server.plugins.defaultheaders.DefaultHeadersConfig.* import io.ktor.server.response.* import io.ktor.util.* import io.ktor.util.date.* @@ -94,13 +95,15 @@ public val DefaultHeaders: RouteScopedPlugin = createRoute val serverHeader = "Ktor/$ktorPackageVersion" onCallRespond { call, _ -> - headers.forEach { name, value -> value.forEach { call.response.header(name, it) } } + headers.forEach { name, value -> + if (!call.response.headers.contains(name)) value.forEach { call.response.header(name, it) } + } if (!call.response.headers.contains(HttpHeaders.Date)) { call.response.header(HttpHeaders.Date, calculateDateHeader()) } if (!call.response.headers.contains(HttpHeaders.Server)) { - call.response.headers.append(HttpHeaders.Server, serverHeader) + call.response.header(HttpHeaders.Server, serverHeader) } } } diff --git a/ktor-server/ktor-server-plugins/ktor-server-default-headers/jvm/test/io/ktor/tests/plugins/DefaultHeadersTest.kt b/ktor-server/ktor-server-plugins/ktor-server-default-headers/jvm/test/io/ktor/tests/plugins/DefaultHeadersTest.kt index 2c45f7ab24..384a35b0bf 100644 --- a/ktor-server/ktor-server-plugins/ktor-server-default-headers/jvm/test/io/ktor/tests/plugins/DefaultHeadersTest.kt +++ b/ktor-server/ktor-server-plugins/ktor-server-default-headers/jvm/test/io/ktor/tests/plugins/DefaultHeadersTest.kt @@ -7,6 +7,7 @@ package io.ktor.tests.plugins import io.ktor.client.request.* import io.ktor.http.* import io.ktor.server.application.* +import io.ktor.server.application.hooks.* import io.ktor.server.plugins.defaultheaders.* import io.ktor.server.response.* import io.ktor.server.routing.* @@ -117,4 +118,20 @@ class DefaultHeadersTest { assertEquals("MyServer", client.get("/").headers[HttpHeaders.Server]) } + + @Test + fun testCustomServerHeaderDoesntDuplicate(): Unit = testApplication { + install( + createApplicationPlugin("test") { + on(CallSetup) { + it.response.header(HttpHeaders.Server, "MyServer") + } + } + ) + install(DefaultHeaders) { + header(HttpHeaders.Server, "MyServer1") + } + + assertEquals(listOf("MyServer"), client.get("/").headers.getAll(HttpHeaders.Server)) + } } diff --git a/ktor-shared/ktor-websockets/common/src/io/ktor/websocket/DefaultWebSocketSession.kt b/ktor-shared/ktor-websockets/common/src/io/ktor/websocket/DefaultWebSocketSession.kt index ef73eb2917..8d16ab3a5a 100644 --- a/ktor-shared/ktor-websockets/common/src/io/ktor/websocket/DefaultWebSocketSession.kt +++ b/ktor-shared/ktor-websockets/common/src/io/ktor/websocket/DefaultWebSocketSession.kt @@ -7,10 +7,10 @@ package io.ktor.websocket import io.ktor.util.* import io.ktor.util.cio.* import io.ktor.utils.io.core.* +import io.ktor.utils.io.errors.* import kotlinx.atomicfu.* import kotlinx.coroutines.* import kotlinx.coroutines.channels.* -import io.ktor.utils.io.errors.* import kotlin.coroutines.* /**