Коммит 289f5e74 создал по автору Diego Rocha's avatar Diego Rocha Зафиксировано автором Sergey Mashkov
Просмотр файлов

Compression: preserve HTTP status

Preserve HTTP status of compressed responses by passing the original response status to the new one.
Before this changes, every CompressedResponse and CompressedWriteResponse would return a 200 Ok status because their status was never defined.

A new test case has been added to avoid regressions.
владелец 7f5d9c85
...@@ -144,6 +144,25 @@ class CompressionTest { ...@@ -144,6 +144,25 @@ class CompressionTest {
} }
} }
@Test
fun testStatusCode() {
withTestApplication {
application.install(Compression)
application.routing {
get("/") {
call.respond(TextContent("text to be compressed", status = HttpStatusCode.NotFound))
}
}
val result = handleRequest(HttpMethod.Get, "/") {
addHeader(HttpHeaders.AcceptEncoding, "*")
}
assertTrue(result.requestHandled)
assertEquals(HttpStatusCode.NotFound, result.response.status())
assertEquals("text to be compressed", result.response.byteContent!!.toString(Charsets.UTF_8))
}
}
@Test @Test
fun testMinSize() { fun testMinSize() {
withTestApplication { withTestApplication {
......
...@@ -83,7 +83,7 @@ class Compression(compression: Configuration) { ...@@ -83,7 +83,7 @@ class Compression(compression: Configuration) {
is FinalContent.ReadChannelContent -> ({ message.readFrom() }) is FinalContent.ReadChannelContent -> ({ message.readFrom() })
is FinalContent.WriteChannelContent -> { is FinalContent.WriteChannelContent -> {
if (encoderOptions != null) { if (encoderOptions != null) {
proceedWith(CompressedWriteResponse(message, encoderOptions.name, encoderOptions.encoder)) proceedWith(CompressedWriteResponse(message, message.status, encoderOptions.name, encoderOptions.encoder))
} }
return@intercept return@intercept
} }
...@@ -93,13 +93,13 @@ class Compression(compression: Configuration) { ...@@ -93,13 +93,13 @@ class Compression(compression: Configuration) {
} }
if (encoderOptions != null) { if (encoderOptions != null) {
proceedWith(CompressedResponse(channel, message.headers, encoderOptions.name, encoderOptions.encoder)) proceedWith(CompressedResponse(channel, message.headers, message.status, encoderOptions.name, encoderOptions.encoder))
} }
} }
} }
} }
private class CompressedResponse(val delegateChannel: () -> ReadChannel, val delegateHeaders: ValuesMap, val encoding: String, val encoder: CompressionEncoder) : FinalContent.ReadChannelContent() { private class CompressedResponse(val delegateChannel: () -> ReadChannel, val delegateHeaders: ValuesMap, override val status: HttpStatusCode?, val encoding: String, val encoder: CompressionEncoder) : FinalContent.ReadChannelContent() {
override fun readFrom() = encoder.compress(delegateChannel()) override fun readFrom() = encoder.compress(delegateChannel())
override val headers by lazy { override val headers by lazy {
ValuesMap.build(true) { ValuesMap.build(true) {
...@@ -109,7 +109,7 @@ class Compression(compression: Configuration) { ...@@ -109,7 +109,7 @@ class Compression(compression: Configuration) {
} }
} }
private class CompressedWriteResponse(val delegate: WriteChannelContent, val encoding: String, val encoder: CompressionEncoder) : FinalContent.WriteChannelContent() { private class CompressedWriteResponse(val delegate: WriteChannelContent, override val status: HttpStatusCode?, val encoding: String, val encoder: CompressionEncoder) : FinalContent.WriteChannelContent() {
override val headers by lazy { override val headers by lazy {
ValuesMap.build(true) { ValuesMap.build(true) {
appendFiltered(delegate.headers) { name, _ -> !name.equals(HttpHeaders.ContentLength, true) } appendFiltered(delegate.headers) { name, _ -> !name.equals(HttpHeaders.ContentLength, true) }
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать