Kotlin/Java Отправляет ответ потоковой передачи Gzip
Я пытаюсь отправить ответ, содержащий сжатый (gzip) streamingOutput. Мой текущий код:
@Path("/")
@Get
@Produces(MediaType.APPLICATION_JSON)
fun testRessource() : Response {
val streamingOutput = TestOutputStream()
val gzipStreamingOutput = CompressedHttpOutputStream(streamingOutput)
val response = Response.ok(gzipStreamingOutput)
response.setHeader("Content-Encoding", "gzip")
return response
}
class TestOutputStream() : StreamingOutput {
override fun write(outputStream: OutputStream) {
val writer = BufferedWriter(OutputStreamWriter(outputStream))
writer.write("{ "id" : 5 }")
writer.flush()
}
}
class CompressedHttpOutputStream(private val streamingOutput: StreamingOutput) : StreamingOutput {
override fun write(outputStream: OutputStream) {
val os = GZIPOutputStream(outputStream)
streamingOutput.write(os)
os.finish()
}
}
Когда я запрашиваю эту услугу, я получаю бессвязные данные в своем браузере. Кажется, я что-то упускаю, хотя в моем ответе правильно установлены следующие заголовки:Content-Encoding: gzip и Transfer-encoding: chunked.
В моих модульных тестах с уверенностью, если я извлекаю тело и читаю его через GzipInputStream(), я могу получить тело json.
Когда я заменяю:
val os = GZIPOutputStream(outputStream)
с участием
val os = DeflaterOutputStream(outputStream) and Content-Encoding : deflate
Вывод корректно распаковывается в json.
Я использую Quarkus 2.6.0.Final.
Спасибо за вашу помощь и понимание!
1 ответ
Неважно, нет необходимости
CompressedHttpOutputStream
. Quarkus реализует поддержку gzip для остальных конечных точек.
мне просто нужно добавить
@GZIP
аннотацию к конечной точке и
quarkus.resteasy.gzip.enabled=true
в свойствах приложения.