2010-10-26 4 views
2

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

Для заголовков, я смог найти, когда заканчивается заголовок. У меня больше проблем для тела сообщения. Должен ли я смотреть в поле «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

ответ

3

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

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

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

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

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

+1

Спасибо за всю эту информацию, я думаю, что мне нужно только реализовать один или два из этих случаев. Спасибо! – Jary

0

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

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

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

Смежные вопросы