Est-il possible de me montrer un exemple de session http avec des demandes de plage. Je veux dire quels seraient les en-têtes de demande et de réponse?
Il y a quelques mois, la nouvelle version du standard HTTP / 1.1 a été publiée. Il a une RFC spéciale pour les demandes de plage, c'est beaucoup plus lisible que l'ancienne spécification, y compris des exemples pour de nombreux éléments: tools.ietf.org/html/rfc7233
Thirler
Réponses:
135
L'échange suivant est entre Chrome et un serveur Web statique, récupérant une vidéo MP4.
Demande initiale - pour la vidéo. Notez l'en- Accept-Rangestête de réponse pour indiquer que le serveur prend en charge l'en-tête de plage:
En-tête de plage détecté dans la réponse précédente - demande ultérieure avec plage ouverte pour confirmer la prise en charge. La réponse renvoie un état et un en- Content-Rangetête 206 pour indiquer les octets présents dans le corps de la réponse:
L'utilisateur clique dans la barre de progression de la vidéo au-delà de la plage téléchargée - une demande de plage est émise pour commencer la lecture à partir de la position sélectionnée:
L'en-tête Transfer-Encoding vierge est-il un artefact de la façon dont la communication HTTP a été capturée ou y a-t-il un vrai serveur HTTP qui génère des valeurs vides pour cet en-tête?
swl10
7
Dans le premier cas, il semble que le serveur renvoie 64657027 octets de contenu. Alors que se passe-t-il - le client jette-t-il simplement ce contenu, puis émet-il ensuite une demande de plage pour les pièces qu'il souhaite vraiment? Ou est-ce que le serveur ne renvoie aucun contenu parce que quelque chose dans le message du client dit de ne pas le faire. Si oui, qu'est-ce que c'est?
Morrie
3
@Morrie - il semble que le serveur, sachant qu'il prend lui-même en charge les requêtes de plage, dit au client "J'accepte les requêtes de plage" via l'en- Accept-Ranges: bytestête, mais il envoie également la longueur du contenu de la ressource afin que le client puisse faire des requêtes de plage avec un supérieur lié. Rien dans le message client n'indique de faire cela pour autant que je sache - le serveur peut choisir de répondre par "voici la ressource entière" ou "J'accepte les demandes de plage" - ce qui est là encore l'existence de l'en- Accept-Rangestête. C'est ma compréhension de toute façon.
Simon Whitehead
4
Mais le Content-Length de 64657027 dans la première réponse ne signifie-t-il pas qu'il y a en fait autant d'octets de charge utile après l'en-tête, que le client doit consommer car la connexion est Keep-Alive? Je me demande ce que dit ce message de réponse qu'il n'y a en fait aucune charge utile.
Morrie
1
@Morrie Keep-alive est une demande du client et le client n'a aucune obligation de continuer à utiliser la connexion. Je viens de conclure dans mon propre travail que, au moins pour chrome, la première requête GET avec la plage "0-" est rapidement abandonnée dès que l'en-tête est reçu, au lieu d'utiliser une requête HEAD. Je pense que c'est un moyen d'éviter les problèmes avec tout serveur qui ne peut pas implémenter correctement le verbe HEAD.
Réponses:
L'échange suivant est entre Chrome et un serveur Web statique, récupérant une vidéo MP4.
Demande initiale - pour la vidéo. Notez l'en-
Accept-Ranges
tête de réponse pour indiquer que le serveur prend en charge l'en-tête de plage:En-tête de plage détecté dans la réponse précédente - demande ultérieure avec plage ouverte pour confirmer la prise en charge. La réponse renvoie un état et un en-
Content-Range
tête 206 pour indiquer les octets présents dans le corps de la réponse:Demande de plage ultérieure pour capturer la fin du fichier (probablement pour capturer les métadonnées de fin):
L'utilisateur clique dans la barre de progression de la vidéo au-delà de la plage téléchargée - une demande de plage est émise pour commencer la lecture à partir de la position sélectionnée:
la source
Accept-Ranges: bytes
tête, mais il envoie également la longueur du contenu de la ressource afin que le client puisse faire des requêtes de plage avec un supérieur lié. Rien dans le message client n'indique de faire cela pour autant que je sache - le serveur peut choisir de répondre par "voici la ressource entière" ou "J'accepte les demandes de plage" - ce qui est là encore l'existence de l'en-Accept-Ranges
tête. C'est ma compréhension de toute façon.