2010-01-24 7 views
12

Je ne peux pas sembler obtenir une réponse définitive sur la question suivante (googler la plupart du temps et la lecture HTTP/1.1 spécifications):(Chunked) HTTP corps de message binaire et CRLFs

lors de l'encodage de transfert « morcelées » est utilisé, pourquoi le serveur doit écrire la taille de bloc en octets et avoir les données de bloc suivantes avec CRLF. Cela ne rend-il pas l'envoi de données binaires "CRLF-unclean" et la méthode un peu redondante? Que se passe-t-il si les données ont un 0x0A suivi de 0x0D quelque part (c'est-à-dire qu'elles font en fait partie des données)? Le client est-il censé respecter la taille de segment explicitement indiquée en tête du tronçon ou de l'étranglement sur le premier CRLF qu'il rencontre dans les données? Ma compréhension jusqu'à présent est de simplement prendre la taille de bloc fournie par le serveur, passer à la ligne suivante, puis lire exactement cette quantité d'octets dans les données suivantes (CRLF ou pas CRLF à l'intérieur), puis ignorer ce CRLF qui suit les données et répétez la procédure jusqu'à ce qu'il n'y ait plus de morceaux ... Ai-je raison? Quel est le point de la CRLF après chaque datachunk alors? Lisibilité?

Répondre

21

Un morcelées consommateur ne scanne pas le corps du message pour une paire CRLF . Il lit d'abord le nombre spécifié d'octets, , puis lit deux octets supplémentaires pour confirmer qu'ils sont CR et LF. Si ce n'est pas le cas, le corps du message est mal formé et soit la taille a été spécifiée incorrectement, soit les données ont été corrompues.

Le CRLF est une assurance ceinture et bretelles (par RFC 2616 section 3.6.1, Chunked Transfert de codage), mais il sert également de maintenir la règle constante que les champs commencent au début de la ligne.

+0

Merci pour l'explication. Le prenez-vous dans le document RFC 2616 ou ailleurs? Est-ce que votre explication implique également que le bloc de réponse PEUT NE PAS contenir de combinaison CRLF dans le cadre des données elles-mêmes? – amn

+0

Il résulte de l'EBNF dans le RFC; Notez que 'chunk-data' est constitué de' OCTET', ce qui suggère que ces octets ne doivent pas être interprétés. Un bloc de réponse peut certainement contenir CRLF. J'ai implémenté deux fois un codec en bloc, les deux fois en Java, et dans chaque cas je n'ai fait aucune interprétation du contenu des données de bloc. C'est opaque au cadrage. Le décodeur détermine la longueur attendue, lit autant d'octets, puis s'assure que les deux octets suivants sont CR et LF. – seh

+0

Cela me le rend parfaitement clair. Règle des octets Merci pour votre temps. – amn

4

Le CRLF après chaque tronçon est probablement juste pour une meilleure lisibilité car il n'est pas nécessaire en raison de la taille du tronçon au début de chaque tronçon. Mais le CRLF après la « tête de morceau » est nécessaire car il peut y avoir plus d'informations après la taille de bloc (voir Chunk Transfer Encoding):

 chunk   = chunk-size [ chunk-extension ] CRLF 
         chunk-data CRLF 
+0

Mais, même avec des informations supplémentaires, n'est-il pas redondant de fournir à la fois la taille des données de tronçon ET le CRLF après? C'était en quelque sorte ce que je ne pouvais pas comprendre - pourquoi les deux? Vous prenez la taille du morceau, lisez les N octets spécifiés en avant, et c'est pour les données de morceau réelles, à partir de là pour supposer des en-têtes de remorque ou un CRLF, sans un CRLF précédant les en-têtes facultatifs. – amn

+0

Merci pour votre temps. "seh" a répondu à ma question, mais néanmoins, toutes les informations digestables sont précieuses ;-) – amn

Questions connexes