2011-03-12 18 views
25

Estoy tratando de hacer que mi servidor web gzip correctamente una respuesta http que es la codificación de fragmentos.compresión gzip de la respuesta de codificación fragmentada?

mi comprensión de la respuesta no gzip es que se ve así:

<the response headers> 

y luego para cada trozo,

<chunk length in hex>\r\n<chunk>\r\n 

y, finalmente, un trozo de longitud cero:

0\r\n\r\n 

He intentado hacer funcionar la compresión gzip y podría necesitar ayuda para averiguar qué debería hacer. Tually ser devuelto. Esta documentación, que la totalidad de la respuesta debe ser comprimido con gzip, en contraposición a gzipping cada trozo:

HTTP servers sometimes use compression (gzip) or deflate methods to optimize transmission. 
Chunked transfer encoding can be used to delimit parts of the compressed object. 
In this case the chunks are not individually compressed. Instead, the complete payload 
is compressed and the output of the compression process is chunk encoded. 

Probé a gzip toda la cosa y devolver la respuesta, incluso sin fragmentada, y no funcionó. Intenté configurar el encabezado Content-Encoding para "gzip". ¿Puede alguien explicar qué cambios se deben realizar en el esquema anterior para admitir gzipping de fragmentos? Gracias.

Respuesta

19

Usted gzip el contenido, y sólo entonces se aplica la codificación fragmentada:

"Desde 'fragmentada' es la única transferencia de codificación requerida para ser entendido por HTTP/1.1 destinatarios, que desempeña un papel crucial en la delimitación de los mensajes en una conexión persistente. Siempre que se aplique una codificación de transferencia a un cuerpo de carga útil en una solicitud, la codificación de transferencia final aplicada DEBE ser "fragmentada". Si se aplica una codificación de transferencia a un cuerpo de carga útil de respuesta, entonces la transferencia final La codificación aplicada DEBE estar "fragmentada" o el mensaje DEBE terminarse cerrando la conexión. Cuando se usa la codificación de transferencia "fragmentada", DEBE ser la última codificación de transferencia aplicada para formar el cuerpo del mensaje. la codificación de transferencia NO DEBE aplicarse más de una vez en un cuerpo de mensaje ".

(HTTPbis Part1, Section 6.2.1)

+0

¿Qué es exactamente lo que dijo que estaba haciendo, verdad? – sosiouxme

+1

la primera oración en esto es realmente confusa. Creo que debería cambiarse ... usted gzip el cuerpo de cada trozo (lo acabo de implementar y funcionó como un amuleto). no descomprime todo el contenido y luego aplica la codificación fragmentada. usted descomprime gzip cada cuerpo y marca el tamaño del fragmento como el tamaño del conjunto de bytes comprimido. –

1

Es probable que en realidad no esté enviando una respuesta de gzip adecuada.

Intente configurar el window bits en 31 en zlib. Y use deflateInit2().

+1

Esto hace algunas suposiciones sobre la implementación.¿Qué pasa si, para devolver un archivo comprimido, acaba de utilizar el comando "gzip" para comprimir el archivo y lo devuelve al configurar el Content-Encoding: gzip header? ¿Eso tiene el mismo resultado? – sosiouxme

+0

El estándar HTTP realmente necesita que se use la biblioteca ** zlib **. El comando 'gzip' generará más encabezados, pero DEBERÍA ser compatible con zlib, que se usa en la mayoría de los otros clientes/servidores HTTP. – unixman83

+0

Es más probable que el póster no esté configurando el encabezado 'Content-Length' o que envíe la respuesta de Chunked incorrectamente. o está olvidando algo básico como una línea nueva detrás de los encabezados. – unixman83

24

En el caso de las otras respuestas no eran lo suficientemente claro:

Primero gzip el cuerpo con zlib (esto se puede hacer en una corriente de modo que no es necesario todo el asunto en la memoria de una vez, que es el punto total de la fragmentación).

Luego envía ese cuerpo comprimido en trozos (presumiblemente los proporcionados por la secuencia gzip, con el encabezado del fragmento para declarar cuánto tiempo), con los encabezados Content-Encoding: gzip y Transfer-Encoding: chunked (y sin encabezado Content-Length).

Si está usando gzip o zcat o alguna de estas herramientas para la compresión, probablemente no funcione. Necesita ser zlib. Si está creando los fragmentos y luego los está comprimiendo, eso definitivamente no funcionará. Si crees que lo estás haciendo bien y no funciona, puedes intentar tomar un seguimiento de paquetes y hacer preguntas basadas en eso y en cualquier mensaje de error que recibas.

Cuestiones relacionadas