Quel est le champ «Content-Length» dans l'en-tête HTTP?

282

Qu'est-ce que ça veut dire?

  1. Nombre d'octets de la chaîne de contenu codé avec le codage spécifié dans l'en-tête.
  2. Nombre de caractères de la chaîne de contenu.

Surtout en cas de Content-Type: application/x-www-form-urlencoded.

Eonil
la source

Réponses:

239

rfc2616

Le champ d'en-tête d'entité Content-Length indique la taille du corps d'entité, en nombre décimal d'OCTET, envoyé au destinataire ou, dans le cas de la méthode HEAD, la taille du corps d'entité qui aurait été envoyé avait la demande a été un GET.

Peu importe le type de contenu.

Extension au poste ci-dessous .

Tourbillon
la source
14
Combinez cette réponse avec la réponse de Tom Cabanski et vous avez toutes les informations dont vous avez besoin. En cas de texte, vous pouvez compter le nombre de caractères car ASCII est 8 bits.
hcpl
9
@hcpl: mais le texte n'est pas nécessairement toujours ASCII, également ASCII est 7 bits, pas 8.
Lie Ryan
2
Remplacez ASCII par le codage que vous utilisez et recherchez le nombre de bits requis par le codage. Pour la réponse 7 vs 8 bits; À l'origine, c'était 7 bits, donc vous avez à nouveau raison. Mais aujourd'hui, 8 bits sont utilisés dans la plupart (sinon tous) les cas en raison de l'organisation de la mémoire de l'ordinateur. edit: Relisant ma réponse je vois où tu vas. Je devrais reformuler mon commentaire d'origine.
hcpl
6
@hcpl: toute la raison pour laquelle le problème des octets par rapport aux caractères est important est dû aux codages à largeur variable comme UTF-8 et UTF-16 où le "nombre de bits" n'est pas fixe.
StefanKarpinski
2
pourriez-vous forger ce numéro? comme POST un paramètre de chaîne avec une longueur énorme mais définissez votre longueur de contenu à 1?
Shih-Min Lee
260

Il s'agit du nombre d'octets de données dans le corps de la demande ou de la réponse. Le corps est la partie qui vient après la ligne vierge sous les en-têtes.

Tom Cabanski
la source
1
Plutôt que «demande ou réponse», n'est-ce pas «le corps de la réponse» UNIQUEMENT? La demande n'a pas de ligne vide entre l'en-tête et les données.
ajfbiw.s
puis-je changer la longueur du contenu de l'en-tête de réponse HTTP déposé dans un filtre java
KItis
2
@ ajfbiw.s Considérez une demande de publication http. "La présence d'un corps de message dans une demande est signalée par l'inclusion d'un champ d'en-tête Content-Length ou Transfer-Encoding dans les en-têtes de message de la demande." From w3.org/Protocols/rfc2616/rfc2616-sec4.html# sec4.3
Roy Guanyu
68

L'en- Content-Lengthtête est un nombre indiquant la longueur d'octet exacte du corps HTTP. Le corps HTTP démarre immédiatement après la première ligne vide trouvée après la ligne de départ et les en-têtes.

En général, l'en- Content-Lengthtête est utilisé pour HTTP 1.1 afin que le destinataire sache quand la réponse actuelle * est terminée, de sorte que la connexion peut être réutilisée pour une autre demande .

* ... ou demande, dans le cas de méthodes de demande qui ont un corps, comme POST, PUT ou PATCH

Alternativement, l'en- Content-Lengthtête peut être omis et un en- Transfer-Encodingtête fragmenté peut être utilisé.

Si les deux Content-Lengthet les en- Transfer-Encodingtêtes sont manquants, à la fin de la réponse, la connexion doit être fermée.

La ressource suivante est un guide que j'ai trouvé très utile pour en savoir plus sur HTTP:

HTTP rendu vraiment facile .

dépensier
la source
45

Un octet fait 8 bits. Content-length est le nombre d'octets que le corps du message représente.

itsproject
la source
37
Octet = AKA Byte?
ViniciusPires
77
L'octet @ViniciusPires est couramment utilisé pour décrire la plus petite unité de mémoire adressable, qui n'est pas nécessairement 8 bits sur toutes les architectures. C'est pourquoi «octet» est utilisé pour éviter toute ambiguïté
PJK
6
@PJK, Non, pas tout à fait raison. OCTETici a une signification très spécifique qui signifie <toute séquence de données de 8 bits>. Voir la définition sur w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2
Pacerier
28

D'ici :

Le champ d'en-tête d'entité Content-Length indique la taille du corps d'entité, en nombre décimal d'OCTET, envoyé au destinataire ou, dans le cas de la méthode HEAD, la taille du corps d'entité qui aurait été envoyé avait la demande a été un GET.

   Content-Length    = "Content-Length" ":" 1*DIGIT

Un exemple est

   Content-Length: 3495

Les applications DEVRAIENT utiliser ce champ pour indiquer la longueur de transfert du corps du message, sauf si cela est interdit par les règles de la section 4.4 .

Toute longueur de contenu supérieure ou égale à zéro est une valeur valide. La section 4.4 décrit comment déterminer la longueur d'un corps de message si aucune longueur de contenu n'est donnée.

Notez que la signification de ce champ est significativement différente de la définition correspondante dans MIME, où il s'agit d'un champ facultatif utilisé dans le type de contenu "message / corps externe". En HTTP, il DEVRAIT être envoyé chaque fois que la longueur du message peut être déterminée avant d'être transféré, sauf si cela est interdit par les règles de la section 4.4.

Mon interprétation est que cela signifie la longueur "sur le fil", c'est-à-dire la longueur du contenu * encodé "

Daniel Renshaw
la source
7
"Sur le fil", la longueur serait modifiée en fonction de la compression, mais il est correct de dire la longueur avant d'être compressée.
BayssMekanique
Est-ce que Content-Length diffère sur différents types de machines comme Mac / Linux? OU cela différera-t-il en utilisant différents clients comme curl / postman ...?
Kanagavelu Sugumar
1
En supposant que tout le reste reste égal (par exemple, encodage, compression, etc.), la longueur du contenu doit être indépendante de la plateforme. Il s'agit d'un en-tête provenant du serveur, donc, en supposant qu'il ne renifle pas l'agent utilisateur et ne se comporte pas différemment, le client ne devrait faire aucune différence.
Daniel Renshaw
Le tapuscrit lance une erreur à ce sujet. Le type 'numéro' n'est pas attribuable au type 'chaîne | string [] 'donc l'exemple serait"Content-length": "3495"
A. D'Alfonso
8

De cette page

De loin, l'utilisation la plus courante de POST consiste à soumettre des données de formulaire HTML à des scripts CGI. Dans ce cas, l'en-tête Content-Type: est généralement application / x-www-form-urlencoded, et l'en-tête Content-Length: donne la longueur des données de formulaire encodées URL (voici une note sur l'encodage URL). Le script CGI reçoit le corps du message via STDIN et le décode. Voici une soumission de formulaire typique, en utilisant POST:

POST /path/script.cgi HTTP/1.0
From: [email protected]
User-Agent: HTTPTool/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
Il y a un
la source
5

Selon les spécifications :

Le champ d'en-tête d'entité Content-Length indique la taille du corps d'entité, en nombre décimal d'OCTET, envoyé au destinataire ou, dans le cas de la méthode HEAD, la taille du corps d'entité qui aurait été envoyé avait la demande a été un GET.

Content-Length    = "Content-Length" ":" 1*DIGIT

Un exemple est

Content-Length: 3495

Les applications DEVRAIENT utiliser ce champ pour indiquer la longueur de transfert du corps du message, sauf si cela est interdit par les règles de la section 4.4.

Toute longueur de contenu supérieure ou égale à zéro est une valeur valide. La section 4.4 décrit comment déterminer la longueur d'un corps de message si aucune longueur de contenu n'est donnée.

Notez que la signification de ce champ est significativement différente de la définition correspondante dans MIME, où il s'agit d'un champ facultatif utilisé dans le type de contenu "message / corps externe". En HTTP, il DEVRAIT être envoyé chaque fois que la longueur du message peut être déterminée avant d'être transféré, sauf si cela est interdit par les règles de la section 4.4.

Bozhidar Batsov
la source
2

Le champ d'en-tête d'entité Content-Length indique la taille du corps d'entité, en nombre décimal d'OCTET, envoyé au destinataire ou, dans le cas de la méthode HEAD, la taille du corps d'entité qui aurait été envoyé avait la demande a été un GET.

Content-Length = "Content-Length" ":" 1 * CHIFFRE

Un exemple est

Longueur du contenu: 1024

Les applications DEVRAIENT utiliser ce champ pour indiquer la longueur de transfert du corps du message.

En PHP, vous utiliseriez quelque chose comme ça.

header("Content-Length: ".filesize($filename));

Dans le cas de "Content-Type: application / x-www-form-urlencoded", les données codées sont envoyées à l'agent de traitement désigné afin que vous puissiez définir la longueur ou la taille des données que vous allez publier.

Gaurav Jassal
la source
0

Considérez si vous avez des en-têtes tels que:

content-encoding: gzip
content-length: 52098
content-type: text/javascript; charset=UTF-8

La longueur du contenu est la taille du corps du message compressé , en "octets" (c'est-à-dire en unités de 8 bits, qui se trouvent être des "octets" pour tous les ordinateurs modernes).

La taille du corps du message peut être autre chose, peut-être 150280 octets.

Le nombre de caractères peut être à nouveau différent, peut-être 150231 caractères, car certains caractères Unicode utilisent plusieurs octets (notez que l'UTF-8 est un codage standard).

Ainsi, des nombres différents selon que vous vous souciez de la quantité de données transmises, de la quantité de données détenues ou du nombre de symboles visibles. Bien sûr, rien ne garantit que ces en-têtes seront fournis.

benjimin
la source