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в свойствах приложения.

Другие вопросы по тегам