Как извлечь данные из заголовка HTTP в C?

Сегодня я спрашиваю, как извлечь секцию данных из полученного буфера в моем recv() в C (не C ++).

Мне просто нужны некоторые предложения, как я получу

 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.   

Часть этого заголовка? Он хранится в моем буфере, я просто хочу просто проанализировать данные (исходный код страницы). Есть идеи?

Заголовок заканчивается на \r\n\r\n . Если весь ответ находится в буфере приема, и вы положили '\0' в конце ответа, то вы можете использовать следующий код, чтобы найти начало раздела данных

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

Вам необходимо проанализировать данные, чтобы узнать, где заканчиваются заголовки и данные сообщения, и где заканчиваются данные сообщения. Заголовки заканчиваются байтовой последовательностью \r\n\r\n ( CRLF + CRLF , 0x0D 0x0A 0x0D 0x0A ). Поэтому вы должны продолжать читать, пока не столкнетесь с этим терминатором. Затем вам нужно разобрать заголовки, чтобы узнать, как закодирована остальная часть сообщения и как она завершается . См. RFC 2616 Раздел 4.4 Длина сообщения для правил. Это скажет вам, КАК читать оставшиеся данные, и КОГДА перестать читать его. Данные могут быть помечены или сжаты или самоограничены. Заголовки Content-Type и Transfer-Encoding рассказывают вам, как интерпретировать данные сообщений.

В вашем конкретном примере после чтения заголовков в разделе 4.4 вы получите значение заголовка Content-Length а затем прочитайте ровно 131 байт, прекратите чтение и закройте сокет из-за заголовка Connection: close . Затем вы получите значение заголовка Content-Type и узнаете, что данные кодируются в формате UTF-8 и обрабатывают его соответствующим образом.

См. Псевдокод, который я опубликовал в более раннем ответе:

Получение Chunked HTTP-данных с помощью Winsock