Comment un HTTP multipart “Content-length” valeur d'en-tête est-il calculé?
J'ai lu contradictoires et peu ambiguë réponses à la question "Comment en est un multi-parties de la requête HTTP du contenu de la longueur calculée?". Plus précisément, je me demande:
- Quel est le contenu précis de la gamme pour laquelle le "Content-length" (longueur d'en-tête est-elle calculée?
- Sont CRLF ("\r\n") octet séquences compté comme un ou deux octets?
Quelqu'un peut-il fournir un exemple clair de répondre à ces questions?
OriginalL'auteur Moshe Rubin | 2015-07-14
Vous devez vous connecter pour publier un commentaire.
Live exemple devrait répondre aux questions.
Effectuer plusieurs parties de la requête avec Google OAuth 2.0 aire de Jeux
Google OAuth 2.0 terrain de jeu page web est un excellent moyen d'effectuer un multipart requête HTTP à l'encontre de la " Google Drive cloud. Vous n'avez pas à comprendre quoi que ce soit sur Google Drive pour ce faire -- je vais le faire tout le travail pour vous. Nous sommes seulement intéressés par la demande et la réponse HTTP. À l'aide de l'Aire de jeu, cependant, vous permettra d'expérimenter avec plusieurs parties et de répondre à d'autres questions, au besoin.
Créer un fichier de test pour le téléchargement
J'ai créé un fichier texte local appelé "test-multipart.txt", enregistré quelque part sur mon système de fichiers. Le fichier est de 34 octets grande et ressemble à ceci:
Ouvrir Google OAuth 2.0 aire de Jeux
Nous avons d'abord ouvrir Google OAuth 2.0 terrain de jeu dans un navigateur, en utilisant l'URL https://developers.google.com/oauthplayground/:
Remplir à l'Étape 1
Sélectionnez le Lecteur API v2 et le "https://www.googleapis.com/auth/drive", et appuyez sur "Autoriser Api":
Remplir à l'Étape 2
Cliquez sur le bouton "Change le code d'autorisation pour les jetons":
Remplir à l'Étape 3
Nous donnons ici toutes les multipart demande d'informations:
La demande et la réponse
Google OAuth 2.0 aire de Jeux miraculeusement insère tous les en-têtes, calcule la longueur du contenu, génère une limite de séquence, insère la limite de chaîne à chaque fois que nécessaire, et nous montre la réponse du serveur:
Analyse
Le multipart requête HTTP réussi avec un code d'état 200, de sorte que la requête et la réponse sont bonnes, nous pouvons compter sur. Google de Jeux pour enfants inséré tout ce dont nous avons besoin pour effectuer le multipart de téléchargement HTTP. Vous pouvez voir le "Content-length" est réglé à 352. Regardons chaque ligne après la ligne vide suivante les en-têtes:
Il y a neuf (9) les lignes, et j'ai ajouté manuellement "\r\n" à la fin de chacune des huit (8) premières lignes (pour des raisons de lisibilité). Voici le nombre d'octets (caractères) dans chaque ligne:
La somme des octets est 344, et compte tenu des '\r\n', comme un seul octet de la séquence nous donne le très convoité prix de la longueur du contenu de 344 + 8 = 352.
Résumé
De résumer les résultats:
considering each '\r\n' as a single one-octet
- ce qui est totalement faux.Content-Length
est le nombre d'octets qui suivent les en-têtes. QueOpen Google's OAuth 2.0 Playground
a clairement un bug et peut-être utilise '\n' au lieu de '\r\n' pour les nouvelles lignes.Comme d'autres personnes l'ont dit, l'exemple de la mise en œuvre semble avoir un bug. Le \r\n sont comptés comme deux octets, pas un seul.
Donc la bonne
Content-Length
devrait être360
, droit?J'ai trouvé l'exemple suivant sur MDN: developer.mozilla.org/en-US/docs/Web/HTTP/... Vous pouvez voir que
\r\n
est compté comme deux octets.OriginalL'auteur Moshe Rubin
Comment calculer
Content-Length
ne dépend pas de l'état code ou un type de support de la charge utile; c'est le nombre d'octets sur le fil. Donc, composez votre multipart réponse, compter le nombre d'octets (etCRLF
compte pour deux), et l'utiliser pourContent-Length
.Voir: http://httpwg.org/specs/rfc7230.html#message.body.length
OriginalL'auteur Mark Nottingham
Si un message http a
Content-Length
en-tête, puis cet en-tête indique le nombre exact d'octets qui suivent après les en-têtes HTTP. Si rien décidé librement compter\r\n
un octet puis tout s'effondrerait: keep-alive http connexions d'arrêt de travail, HTTP pile ne serait pas en mesure de voir où le prochain message HTTP commence et serait d'essayer d'analyser des données aléatoires, comme si c'était un message HTTP.OriginalL'auteur Pavel