Chunked transfer encoding

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

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.

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 de chaque bloc est envoyé 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
Content-Type: text/plain
Transfer-Encoding: chunked

26
Voici les données du premier morceau

1C
et voici un second morceau

20
et voici deux derniers morceaux 
12
sans saut de ligne
0

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. 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"     (38 chars => hex: 0x26)
"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]