diff --git a/ktor-server/ktor-server-core/common/src/io/ktor/server/routing/RouteSelector.kt b/ktor-server/ktor-server-core/common/src/io/ktor/server/routing/RouteSelector.kt index f2f8ef02e4..c46d53afa4 100644 --- a/ktor-server/ktor-server-core/common/src/io/ktor/server/routing/RouteSelector.kt +++ b/ktor-server/ktor-server-core/common/src/io/ktor/server/routing/RouteSelector.kt @@ -599,7 +599,9 @@ public data class HttpMultiAcceptRouteSelector( return RouteSelectorEvaluation.Missing } - val header = parsedHeaders.firstOrNull { header -> contentTypes.any { it.match(header.value) } } + val header = parsedHeaders.firstOrNull { header -> + contentTypes.any { ContentType.parse(header.value).match(it) } + } if (header != null) { return RouteSelectorEvaluation.Success(header.quality) } diff --git a/ktor-server/ktor-server-tests/common/test/io/ktor/tests/server/routing/RoutingProcessingTest.kt b/ktor-server/ktor-server-tests/common/test/io/ktor/tests/server/routing/RoutingProcessingTest.kt index d27b2080e7..46d3168a78 100644 --- a/ktor-server/ktor-server-tests/common/test/io/ktor/tests/server/routing/RoutingProcessingTest.kt +++ b/ktor-server/ktor-server-tests/common/test/io/ktor/tests/server/routing/RoutingProcessingTest.kt @@ -191,6 +191,28 @@ class RoutingProcessingTest { } } + @Test + fun testRoutingAcceptContentSubtypeWildcard() = testApplication { + + routing { + route("getImage") { + accept(ContentType.Image.Any) { + get { call.respondText { "Image" } } + } + } + } + + on("making request to /getImage with Accept image/png") { + client.get("/getImage") { + header(HttpHeaders.Accept, "image/png") + } + .let { + assertEquals(HttpStatusCode.OK, it.status) + assertEquals("Image", it.bodyAsText()) + } + } + } + @Test fun testMostSpecificSelected() = testApplication { var path = ""