Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про принцип работы HTTP


Страницы:   1 2 3

Суслик ©   (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, т.к. книги похоже старая достаточно.

Так что, если можно, то объясните новичку в сетях :)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо