es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Kotlin/Java Enviando una respuesta en streaming Gzip.

Estoy tratando de enviar una respuesta que contenga un streamingOutput comprimido (gzip). Mi código actual es:

@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()
    }
}

Cuando hago una solicitud a este servicio, obtengo datos incomprensibles en mi navegador. Parece que me falta algo a pesar de que mi respuesta tiene los siguientes encabezados configurados correctamente: Content-Encoding: gzip y Transfer-Encoding: chunked.

En mis pruebas de unidad con rest-assured, si extraigo el cuerpo y lo leo a través de un GzipInputStream(), puedo recuperar el cuerpo json.

Cuando reemplazo:

val os = GZIPOutputStream(outputStream)

con

val os = DeflaterOutputStream(outputStream) y Content-Encoding: deflate

La salida se descomprime correctamente en json.

Estoy utilizando Quarkus 2.6.0.Final.

¡Gracias por tu ayuda y conocimientos!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que podría haber un problema al usar GZIPOutputStream en Quarkus 2.6.0.Final. Una solución alternativa que parece funcionar es usar DeflaterOutputStream en su lugar, con Content-Encoding establecido en deflate en el encabezado de la respuesta.

    Mencionas que cuando extraes el cuerpo y lo lees a través de un GzipInputStream() en tus pruebas unitarias, puedes recuperar el cuerpo json. Esto sugiere que el problema podría estar en la descompresión de los datos gzip en el navegador, en lugar de la compresión en el lado del servidor.

    Una cosa que podrías probar es verificar la compresión y descompresión de los datos por separado. Por ejemplo, podrías comprimir tus datos de prueba usando gzip y enviarlos como una respuesta simple, sin usar StreamingOutput o CompressedHttpOutputStream, y luego descomprimirlos manualmente en el lado del cliente usando una herramienta como Postman o un comando curl. Si eso funciona correctamente, entonces puedes estar seguro de que la compresión en el lado del servidor está funcionando correctamente y centrarte en solucionar el problema en el lado del cliente.

    Otra cosa que debes verificar es si el encabezado Accept-Encoding está configurado correctamente en la solicitud. Si el cliente no indica que puede aceptar datos codificados en gzip en el encabezado Accept-Encoding, el servidor no enviará datos codificados en gzip aunque estén disponibles.

    ¡Espero que esto ayude!

Comments are closed.