Chunked transfer encoding

Un article de Wikipédia, l'encyclopédie libre.

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.

Description[modifier | modifier le code]

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.

Exemple[modifier | modifier le code]

Réponse encodée[modifier | modifier le code]

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éponse[modifier | modifier le code]

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ées[modifier | modifier le code]

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

Références[modifier | modifier le code]