web-dev-qa-db-fra.com

Obtenir la réponse de la demande HTTP sans la longueur de contenu?

J'ai un petit programme envoie une demande HTTP et obtient une réponse avec TCP Protocole.

Mon format de demande;

GET / HTTP/1.0
Host: somewebsite.com
{two new line}

Je lis la ligne de réponse par ligne à partir de la prise (à l'aide de NetworkStream et de StreamReader en C #) jusqu'à ce que je trouve un en-tête de longueur de contenu. Je stocke la longueur, puis continuez à lire jusqu'à trouver une ligne vide. Créez ensuite un tampon avec la longueur et recevez le reste de la réponse.

Mais certaines réponses n'ont pas d'en-tête de longueur de contenu. Donc, mon approche échoue. Si je ne sais pas combien d'octets je devrais recevoir, quand je devrais arrêter?

20
previous_developer

Dans http/1.0? Lorsque le flux se ferme.

Dans http/1.1? Avec codage en morceaux .

22
Julian Reschke

Voir partie pertinente de la spécification HTTP . Dans votre cas particulier, si le serveur ne donne pas de longueur de contenu en arrière, il doit rappeler le flux lors de la fin de la réponse. Il n'y a pas d'autre manière fiable pour vous (en tant que client) de savoir. Quelle que soit la version HTTP. @ Julian Encodage en chunded est en effet une mise à niveau intelligente de http/1.1 mais est plutôt spécifique au streaming et il n'y a aucune raison pour que un serveur Web "plain" puisse la mettre en œuvre. C'est un serveur qui connaît la longueur du contenu avant d'initier la réponse. Et je suppose que l'OP n'a pas le serveur sous contrôle, sinon il ne s'opposera pas aux en-têtes HTTP manquants.

Mais même si vous obtenez l'en-tête de longueur de contenu, vous ne doit pas y faire confiance sans réserve . Les implémentations du serveur ne sont également que des humains faillibles. Prenez-le comme une réponse "la plus probable", la valeur initiale à un tampon redimensionnable. Vous devez toujours être prêt à gérer moins aussi bien que davantage (le pire cas).

7
Pavel Zdenek