Comment extraire des données d’en-tête HTTP en C?

Aujourd’hui, je demande comment extraire la section de données du tampon reçu dans mon recv() en C (et non en C ++).

J’ai juste besoin de quelques suggestions, comment pourrais-je obtenir

 HTTP/1.1 200 OK\r\n Date: Mon, 23 May 2005 22:38:34 GMT\r\n Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)\r\n Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT\r\n ETag: "3f80f-1b6-3e1cb03b"\r\n Content-Type: text/html; charset=UTF-8\r\n Content-Length: 131\r\n Connection: close\r\n \r\n   An Example Page   Hello World, this is a very simple HTML document.   

La partie de l’en-tête ci-dessus? Il est stocké dans mon tampon, je veux simplement disséquer les données (le code source de la page). Des idées?

L’en-tête se termine par \r\n\r\n . Si la réponse entière se trouve dans la mémoire tampon de réception et que vous insérez un '\0' à la fin de la réponse, vous pouvez utiliser le code suivant pour rechercher le début de la section de données.

 char *data = strstr( buffer, "\r\n\r\n" ); if ( data != NULL ) { data += 4; // do something with the data } 

Vous devez réellement parsingr les données pour savoir où se terminent les en-têtes et les données du message, et où se terminent les données du message. Les en-têtes se terminent par une séquence d’octets \r\n\r\n ( CRLF + CRLF , 0x0D 0x0A 0x0D 0x0A ). Vous devez donc continuer à lire jusqu’à ce que vous renconsortingez ce terminateur. Ensuite, vous devez parsingr les en-têtes pour savoir comment le rest du message est codé et comment il se termine . Reportez-vous à la section 4.4 de la RFC 2616, Longueur du message, pour connaître les règles. Cela vous dira comment lire les données restantes et quand arrêter de les lire. Les données peuvent être fragmentées, compressées ou à terminaison automatique. Les en Content-Type têtes Content-Type et Transfer-Encoding vous expliquent comment interpréter les données du message.

Dans votre exemple particulier, après avoir lu les en-têtes, conformément à la section 4.4, récupérez la valeur de l’en Content-Length tête Content-Length , puis lisez exactement 131 octets, arrêtez la lecture et fermez le socket en raison de l’en-tête Connection: close . Vous devriez alors récupérer la valeur de l’en Content-Type tête Content-Type et savoir que les données sont au format HTML codé UTF-8 et les traiter en conséquence.

Voir le pseudo-code que j’ai posté dans une réponse précédente:

Réception de données HTTP tronquées avec Winsock