Protocole HTTP: fin du corps du message

J’ai construit un programme qui parsing l’en-tête et je voudrais lire le corps du message au cas où je recevrais un POST.

Pour les en-têtes, j’ai pu chercher à déterminer quand l’en-tête se termine. J’ai plus de problèmes pour le corps du message. Dois-je regarder le champ “Content-Length” pour savoir quand arrêter de lire les entrées? Dans mon code actuel (ci-dessous), cela ne s’arrêtera pas tant que je n’aurai pas frappé la croix rouge (arrêter le chargement de la page) dans Firefox.

Voici le code:

size_t n; unsigned char newChar; int index = 0; int capacity = 50; char *option = (char *) malloc(sizeof(char) * capacity); while ( ( n = read( req->socket, &newChar, sizeof(newChar) ) ) > 0 ) { if (newChar == '\0' || newChar == '\n') break; // This is not working if (index == capacity) { capacity *= 2; option = (char *) realloc(option, sizeof(char) * capacity); assert(option != NULL); } option[index++] = newChar; fprintf(stderr, "%c", newChar); } if (index == capacity) { capacity *= 2; option = (char *) realloc(option, sizeof(char) * capacity); assert(option != NULL); } option[index] = '\0'; 

La bonne entrée est imprimée, mais je me demande pourquoi elle ne s’arrêtera pas tant que le bouton d’arrêt du chargement n’aura pas été enfoncé. J’aimerais savoir s’il existe une autre solution ou si je dois utiliser le champ “Longueur du contenu” dans l’en-tête.

Merci beaucoup,

Jary

Il y a quelques choses à considérer. Vous voudrez peut-être réfléchir à la manière dont vous voulez gérer tous ces cas?

  • Pour le protocole HTTP 1.0, la fermeture de la connexion était utilisée pour signaler la fin des données.

  • Cela a été amélioré dans HTTP 1.1 qui prend en charge les connexions persistantes. Pour HTTP 1.1, vous devez généralement définir ou lire l’en-tête Content-Length pour connaître le volume de données attendu.

  • Enfin, avec HTTP 1.1, il est également possible de passer en mode “Chunked”. Vous obtenez la taille à l’arrivée et vous savez que vous avez atteint la fin quand une taille de chunk == 0 est trouvée.

Aussi, connaissez-vous libcurl ? Cela vous aidera certainement à avoir à ré-implémenter la roue.

Ce code bloque sur le read () en attente d’un autre caractère qui ne vient jamais.

De plus, RFC2616, 3.7.1 stipule que “les applications HTTP DOIVENT accepter CRLF, nu CR et nu LF comme étant représentatives d’un saut de ligne dans un média texte reçu via HTTP. De plus, si le texte est représenté dans un jeu de caractères qui ne utilisez les octets 13 et 10 pour CR et LF respectivement, comme c’est le cas pour certains jeux de caractères multi-octets, HTTP permet d’utiliser les séquences d’octets quelconques définies par ce jeu de caractères pour représenter l’équivalent de CR et LF pour les sauts de ligne. ”

Donc, vous allez avoir besoin d’attraper plus que simplement “\ n”.