![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про принцип работы HTTP
Суслик © (2006-11-11 01:11:00)Здравствуйте!
1. Вводная.
Принимая на *стороне сервера* запрос TCP нужно быть готовым, что он прийдет не весь сразу, а частями. Это факт. Когда когда-то я писал свои тестовые сервера (в целях изучения) я применял следующий протокол:
а) мой сервер ждал 4 байта - длина сообщения.
б) после получения четырех байт - сервер читал сообщения, с учетом того, что сообщение может прийти не сразу.
2. Вопрос.
Сейчас я начал разбираться с HTTP.
Это вроде текстовый протокол. Делаю я это так - с помощью TIdTCPServer ловлю все, что мне посылает браузер.
Насколько я понял, HTTP - это чисто протокол. Я не смог заметить, что каким-то образом передается длина сообщения.
Вопрос
Как сервер HTTP понимает сколько же ему читать из сокета?
PS. Прошу прощения за ламерский вопрос :)
Орион (2006-11-11 01:29:00) [41]> почему бы не использовать TIdHTTPServer?
Лучше изобрести велосипед на основе TIdTCPServer.
И в HTTP поможет разобраться и... И ну их нафиг "высокоуровневые" компоненты Indy :)
Орион (2006-11-11 01:28:00) [42]> Здравствуйте!
Вечер добрый.
> Насколько я понял, HTTP - это чисто протокол.
А есть не "чисто" протокол?
> Как сервер HTTP понимает сколько же ему читать из сокета?
Ну не путем же медитаций, верно.
По заголовкам, которые ему клиент, то бишь, браузер отсылает.
Короче говоря http://www.w3.org/Protocols/rfc2616/rfc2616.html
Eraser (2006-11-11 01:26:00) [43]> [1] Суслик © (11.11.06 01:15)
RFC надо было смотреть )
так как текста много, то можно и русскую версию http://www.lib.ru/WEBMASTER/rfc2068/
> [0] Суслик © (11.11.06 01:11)
тут почти один и тот же ответ на 1 и 2 вопросы.
4.4 Длина сообщения.
1. Когда тело сообщения (message-body) присутствует в сообщении, длина этого тела определяется одним из следующих методов (в порядке старшинства):
Любое сообщение ответа, которое НЕ ДОЛЖНО включать тело сообщения (message-body) (например ответы с кодами состояния 1xx, 204, 304 и все ответы на запрос HEAD) всегда завершается пустой строкой после полей заголовка, независимо от полей заголовка объекта (entity-header fields), представленных в сообщении.
2. Если поле заголовка Transfer-Encoding (раздел 14.40) присутствует и указывает на применение кодирования передачи "chunked", то длина определяется кодированием по кускам (chunked encoding) (раздел 3.6).
3. Если поле заголовка Content-Length (раздел 14.14) присутствует, то его значение представляет длину тела сообщения (message-body) в байтах.
4. Если сообщение использует медиа тип "multipart/byteranges", который саморазграничен, то он и определяет длину. Этот медиа тип НЕ ДОЛЖЕН использоваться, если отправитель не знает, что получатель может его обработать; присутствие в запросе заголовка Range с несколькими спецификаторами диапазонов байтов (byte-range) подразумевает, что клиент может анализировать multipart/byteranges ответы.
5. Длина определяется закрытием соединения сервером. (Закрытие соединения не может использоваться для указания конца тела запроса, так как в этом случае у сервера не остается никакой возможности послать обратно ответ).
(c) http://www.lib.ru/WEBMASTER/rfc2068/section-4.html
imho чаще всего используется 5 вариант.
> Делаю я это так - с помощью TIdTCPServer ловлю все, что
> мне посылает браузер
почему бы не использовать TIdHTTPServer?
Суслик (2006-11-11 01:15:00) [44]PS.
Я посмотрел Таненбаума - он про HTTP просто говорит - это текстовый протокол (что такое текстовый протокол я у него в книге не нашел).
Смотрел также Стивенса - он вообще мало говорит про HTTP, т.к. книги похоже старая достаточно.
Так что, если можно, то объясните новичку в сетях :)