web-dev-qa-db-fra.com

compression gzip de la réponse de codage en morceaux?

J'essaie d'obtenir mon serveur Web pour compresser correctement une réponse http qui est un codage en morceaux.

ma compréhension de la réponse non gzip est qu'elle ressemble à ceci:

<the response headers>

puis pour chaque morceau,

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

et enfin, un morceau de longueur nulle:

0\r\n\r\n

J'ai essayé de faire fonctionner la compression gzip et je pourrais utiliser de l'aide pour trouver ce qui devrait être retourné. Cette documentation implique que l'intégralité de la réponse doit être compressée au format gz, au lieu de compresser chaque segment:

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.

J'ai essayé de compresser le tout et de renvoyer la réponse même sans bloc, et cela n'a pas fonctionné. J'ai essayé de définir l'en-tête Content-Encoding sur "gzip". Quelqu'un peut-il expliquer quelles modifications doivent être apportées au schéma ci-dessus pour prendre en charge le décompression des morceaux? Merci.

34

Vous gzipez le contenu, et ensuite seulement appliquez l'encodage en morceaux:

"Étant donné que" fragmenté "est le seul codage de transfert requis pour être compris par les destinataires HTTP/1.1, il joue un rôle crucial dans la délimitation des messages sur une connexion persistante. Chaque fois qu'un codage de transfert est appliqué à un corps de charge utile dans une demande, le Le codage de transfert final appliqué DOIT être "tronqué". Si un codage de transfert est appliqué à un corps de charge utile de réponse, alors le codage de transfert final appliqué DOIT être "tronqué" ou le message DOIT être terminé en fermant la connexion. Le codage de transfert "en morceaux" est utilisé, il DOIT être le dernier codage de transfert appliqué pour former le corps du message. Le codage de transfert "en morceaux" NE DOIT PAS être appliqué plus d'une fois dans un corps de message. "

( HTTPbis partie 1, section 6.2.1 )

23
Julian Reschke

Dans le cas où les autres réponses n'étaient pas assez claires:

D'abord, vous gzipez le corps avec zlib (cela peut être fait dans un flux afin que vous n'ayez pas besoin de tout dans la mémoire à la fois, ce qui est tout l'intérêt de la segmentation).

Ensuite, vous envoyez ce corps compressé en morceaux (vraisemblablement ceux fournis par le flux gzip, avec l'en-tête de bloc pour déclarer sa longueur), avec Content-Encoding: gzip et Transfer-Encoding: en-têtes tronqués (et pas de Content-Length entête).

Si vous utilisez gzip ou zcat ou un tel utilitaire pour la compression, cela ne fonctionnera probablement pas. Doit être zlib. Si vous créez les morceaux puis les compressez, cela ne fonctionnera certainement pas. Si vous pensez que vous faites cela correctement et que cela ne fonctionne pas, vous pouvez essayer de prendre une trace de paquet et de poser des questions en fonction de cela et des messages d'erreur que vous recevez.

33
sosiouxme

Il est probable que vous n'envoyez pas vraiment une réponse correctement compressée.

Essayez de définir window bits Sur 31 Dans zlib. Et utilisez deflateInit2().

1
unixman83