Протокол HTTP: конец тела сообщения - PullRequest
2 голосов
/ 26 октября 2010

Я создал программу, которая анализирует заголовок, и я хотел бы прочитать тело сообщения в случае, если я получаю 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» в заголовке.

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

Jary

Ответы [ 2 ]

4 голосов
/ 26 октября 2010

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

  • Для протокола HTTP 1.0 закрытие соединения использовалось для оповещения об окончании данных.

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

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

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

0 голосов
/ 26 октября 2010

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

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

Так что вам нужно поймать больше, чем просто "\ n".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...