Разница между заголовком и содержанием ответа http-сервера (сокеты)

я хочу знать, есть ли возможность узнать, где в ответном потоке заканчивается заголовок?

История вопроса следующая: я использую сокеты в c для получения контента с веб-сайта, контент закодирован в gzip. Я хотел бы читать контент прямо из потока и кодировать контент gzip с помощью zlib. Но как мне узнать, что контент gzip запущен и заголовок http закончен.

Я грубо пробовал два способа, которые дают мне, на мой взгляд, странные результаты. Во-первых, я читаю весь поток и распечатываю его в терминале, мой заголовок http заканчивается "\ r \ n \ r \ n", как я и ожидал, но через секунду я просто получаю ответ один раз, чтобы получить заголовок а затем прочитайте содержимое с помощью цикла while, здесь заголовок заканчивается без "\ r \ n \ r \ n".

Почему? И как правильно читать контент?

Я просто дам вам код, чтобы вы могли видеть, как я получаю ответ от сервера.

//first way (gives rnrn)
char *output, *output_header, *output_content, **output_result;
size_t size;
FILE *stream;
stream = open_memstream (&output, &size);
char BUF[BUFSIZ];
while(recv(socket_desc, BUF, (BUFSIZ - 1), 0) > 0)
{
    fprintf (stream, "%s", BUF);
}
fflush(stream);
fclose(stream);

output_result = str_split(output, "\r\n\r\n");
output_header = output_result[0];
output_content = output_result[1];

printf("Header:\n%s\n", output_header);
printf("Content:\n%s\n", output_content);

.

//second way (doesnt give rnrn)
char *content, *output_header;
size_t size;
FILE *stream;
stream = open_memstream (&content, &size);
char BUF[BUFSIZ];

if((recv(socket_desc, BUF, (BUFSIZ - 1), 0) > 0)
{
    output_header = BUF;
}

while(recv(socket_desc, BUF, (BUFSIZ - 1), 0) > 0)
{
    fprintf (stream, "%s", BUF); //i would just use this as input stream to zlib
}
fflush(stream);
fclose(stream);

printf("Header:\n%s\n", output_header);
printf("Content:\n%s\n", content);

Оба дают одинаковый результат, выводя их на терминал, но вторым следует распечатать еще несколько разрывов, по крайней мере, я ожидаю, потому что они теряются, разбивая строку.

Я новичок в c, так что я мог бы просто наблюдать за некоторыми легкими вещами.

Ответы на вопрос(0)

Ваш ответ на вопрос