From f56bb25261be94a39f5e48f2402d8c8856095822 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 | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 2 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 03912581ac6..e1927f14a15 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 2c45f7ab249..ba9bae4827e 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,18 @@ 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)) + } }