Получение заголовков HTTP - PullRequest
3 голосов
/ 10 июля 2011

В образовательных целях я пишу HTTP-сервер на C ++. При получении запроса, как узнать, когда клиент закончил отправку заголовков? Есть ли обязательство, что все заголовки должны быть отправлены одним выстрелом? Что если клиент отправит G, то через 5 секунд E, затем T ..? Должен ли я ждать тайм-аут и просто закрыть соединение, если это занимает слишком много времени? Должен ли я начать синтаксический анализ, как только получу первые байты, чтобы узнать, является ли запрос недействительным?

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

Ответы [ 4 ]

5 голосов
/ 10 июля 2011

Согласно HTTP 1.1 RFC (4.1) :

    generic-message = start-line
                      *(message-header CRLF)
                      CRLF
                      [ message-body ]
    start-line      = Request-Line | Status-Line

Существует дополнительный CRLF после заголовка сообщения.Поэтому, как только вы встретите последовательность CRLF -> CRLF, начнется тело.

Concering timeout: вы можете начать синтаксический анализ после получения символов (дождитесь CRLF, чтобы вы знали, что заголовок завершен), и как только запрос займет больше времени, чем5 секунд или около того, отправьте обратно 408 тайм-аут запроса .

4 голосов
/ 10 июля 2011

Этот ответ состоит из двух частей.

Во-первых, проблема задержки и тайм-аута: вам действительно нужно иметь дело с таймаутами, так как обычно невозможно определить, разорвано ли соединение TCP.В этом вопросе есть еще вопросы по этому вопросу: сокет TCP в Unix - сервер уведомлений Я отправил запрос

Во-вторых, определен формат запроса HTTP (в RFC 2616, раздел 5 ) следующим образом:

    Request       = Request-Line              ; Section 5.1
                    *(( general-header        ; Section 4.5
                     | request-header         ; Section 5.3
                     | entity-header ) CRLF)  ; Section 7.1
                    CRLF
                    [ message-body ]          ; Section 4.3

По сути, вы получаете строку запроса (например, GET /index.html HTTP/1.1), за которой следуют несколько строк заголовка (без пустых строк).Затем список заголовков заканчивается пустой строкой.Все концы строк представлены с помощью CRLF ("\r\n").

В дополнение к этому некоторые запросы также имеют тело (обычно те, которые используют POST или PUT).Если в запросе содержится тело сообщения, его длина будет указана либо в заголовке Content-Length, либо с использованием разделителей через кодировку chunked Transfer .

3 голосов
/ 10 июля 2011

Заголовки HTTP отделяются от тела \r\n\r\n, то есть двойной новой строкой. Это единственное, на что вы можете положиться.

1 голос
/ 10 июля 2011

Предлагаю вам прочитать протокол HTTP . В частности, заголовки ограничены двойным переводом строки.

...