Chunked transfer encoding

un mécanisme de transfert de données de la version 1.1 du protocole HTTP, qui permet à un serveur ou à un client de commencer à transmettre des données par blocs sans avoir à connaître à l'avance la taille totale des données qui seront transmise

Chunked transfer encoding (ou Encodage de transfert en bloc[1]) est un mécanisme de transfert de données de la version 1.1 du protocole Hypertext Transfer Protocol (HTTP), qui permet à un serveur ou à un client de commencer à transmettre des données par blocs sans avoir à connaître à l'avance la taille totale des données qui seront transmises. Elle est définie dans la RFC 7230[2] - Section 4.1.

Dans le protocole HTTP, l'en-tête "Content-Length: [nombre correspondant au poids en octets du corps de message transmis]" peut remplacer la directive "Chunked transfer encoding" décrite ici.

La taille en octets de chaque bloc est envoyée, sous forme de texte en hexadecimal, juste avant le bloc lui-même afin que le serveur puisse dire au client quand il a fini de recevoir les données de ce bloc. Le transfert total d'un fichier encodé par blocs se termine par un bloc final au contenu nul.

DescriptionModifier

L'introduction de l'encodage de transfert en bloc du protocole HTTP 1.1 a fourni un certain nombre d'avantages :

  • Permettre à un serveur de maintenir une connexion HTTP persistante pour un contenu généré dynamiquement.
  • Permettre à l'expéditeur d'envoyer des en-têtes supplémentaires après le corps du message. Sans l'encodage de transfert en bloc, l'expéditeur devrait tamponner le contenu jusqu'à ce qu'il soit complété afin de calculer une valeur et l'envoyer avant le contenu.

ExempleModifier

Réponse encodéeModifier

HTTP/1.1 200 OK\r\n
Content-Type: text/plain\r\n
Transfer-Encoding: chunked\r\n
\r\n
27\r\n
Voici les données du premier morceau\r\n\r\n
1C\r\n
et voici un second morceau\r\n\r\n
20\r\n
et voici deux derniers morceaux \r\n
12\r\n
sans saut de ligne\r\n
0\r\n
\r\n

Détail de l'encodage de la réponseModifier

Les deux premiers morceaux dans l'exemple ci-dessus contiennent les caractères \r\n de sauts de lignes au format Microsoft (\n est utilisé pour le format Unix et généralement pour les protocoles TCP/IP, \r pour le format Mac). Ces derniers n'ont absolument aucune utilité au niveau du découpage des morceaux… ils font partie des données transmises.

"Voici les données du premier morceau\r\n"     (39 chars => hex: 0x27)
"et voici un second morceau\r\n"               (28 chars => hex: 0x1C)
"et voici deux derniers morceaux "             (32 chars => hex: 0x20)
"sans saut de ligne"                           (18 chars => hex: 0x12)

La réponse se termine par un morceau de longueur zéro "0\r\n" suivi par "\r\n".

Données décodéesModifier

Voici les données du premier morceau
et voici un second morceau
et voici deux derniers morceaux sans saut de ligne

RéférencesModifier