Протокол HTTP: конец тела сообщения

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

Для заголовков я смог найти, когда закончится заголовок. У меня больше проблем для тела сообщения. Должен ли я смотреть в поле «Content-Length», чтобы узнать, когда прекратить чтение ввода? В моем текущем коде (ниже), это не остановится, пока я не удалю красным крестом (остановка страницы загрузки) в Firefox.

Вот код:

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'; 

Правильный ввод печатается, но мне интересно, почему он не остановится, пока не будет нажата кнопка останова загрузки. Я хотел бы знать, есть ли какое-либо другое решение или мне нужно использовать поле Content-Length в заголовке.

Большое спасибо,

Яры

Есть несколько вещей, которые следует учитывать. Возможно, вам захочется рассмотреть, как вы хотите справиться со всеми этими случаями?

  • Для HTTP-протокола 1.0 закрытие соединения использовалось для сигнализации конца данных.

  • Это было улучшено в HTTP 1.1, который поддерживает постоянные соединения. Для HTTP 1.1 обычно вы устанавливаете или читаете заголовок Content-Length, чтобы узнать, сколько данных ожидать.

  • Наконец, с HTTP 1.1 существует также возможность «Chunked» mode, вы получаете размер по мере их поступления, и вы знаете, что достигли конца, когда найден fragment размером == 0.

Также вы знаете о libcurl ? Это, безусловно, поможет вам переделать колесо.

Этот код блокирует чтение (), ожидая появления другого символа, который никогда не появляется.

Кроме того, в RFC2616, 3 .7.1 говорится, что «HTTP-приложения ДОЛЖНЫ принимать CRLF, bare CR и bare LF как репрезентативные для разрыва строки в текстовом носителе, полученном по HTTP. Кроме того, если текст представлен в наборе символов, используйте октеты 13 и 10 для CR и LF соответственно, как это имеет место для некоторых многобайтовых наборов символов, HTTP позволяет использовать любые последовательности октетов, определенные этим набором символов, чтобы представлять эквивалент CR и LF для разрывов строк ».

Поэтому вам нужно поймать больше, чем просто «\ n».