Сопоставление HTTP-ответов с соответствующими HTTP-конвейерными запросами - PullRequest
1 голос
/ 08 августа 2011

Я пытаюсь написать программу для сопоставления HTTP-запросов с соответствующими ответами.Кажется, что все работает хорошо для большинства сценариев (когда передача идеально упорядочена, и даже если это не так, с использованием порядковых номеров TCP).

Единственная проблема, которую я обнаружил, - это когда у меня есть конвейерные запросы.После этого я получаю несколько ответов, но я не знаю, какие пакеты являются ответом на конкретный запрос, а какие нет.В другом посте я читал, что ответы будут поступать последовательно, и объединение этого свойства с информацией в поле Content-Length кажется решением проблемы.Проблема в том, что Content-length не является обязательным полем, поэтому я не уверен, могу ли я всегда полагаться на это.

Кто-нибудь знает, как веб-браузеры, поддерживающие эту функцию (кстати, не большинствоиз них делают) на самом деле это сделать?

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

Информация о длине тел должна присутствовать в заголовках.Это просто не всегда в содержании длины.Чтобы все это решить, вам нужно изучить соответствующий RFC 2616. Наиболее заметный раздел 4.4 посвящен различным заголовкам

Некоторые более важные правила из RFC 2616 :

При конвейерной передаче:
Сервер ДОЛЖЕН отправлять свои ответы на эти запросы в том же порядке, в котором они были получены.

От 9,2
Если тело ответа не включено, ответ ДОЛЖЕН включать поле Content-Length со значением поля «0».

Из 10.2.7 206 Частичное содержимое
ответ ДОЛЖЕН включать в себя .... либо поле заголовка Content-Range ... либо тип Content-Type с несколькими частями / байтами, включая поля Content-Range для каждой части.

от 14.13 Content-Length
Приложения ДОЛЖНЫ использовать это поле для указания длины передачи тела сообщения, если это не запрещено правилами в разделе 4.4.

1 голос
/ 14 апреля 2017

Текущие ответы устарели. Нужно обновить.

Новый HTTP 1.1 RFC: RFC 7230 . И содержит более точную информацию о разборе размера сообщения.

Определить размер сообщения довольно сложно. Вы можете иметь Content-length, или Transfer-Encoding: chunked, или оба, или ни одного. И некоторые специальные коды, такие как 100 Continue, которые могут изменить все это.

Первая ссылка содержит 7 записей, которые нужно проверить в правильном порядке, чтобы угадать правильный размер.

И, как указано в последней ссылке, невозможность определить правильную длину сообщения может привести к проблемам с HTTP-контрабандой (разбиением, отравлением кэша).

Поддержка конвейеризации является источником большинства проблем с контрабандой. Вы действительно должны позаботиться обо всем документе RFC7230, если хотите его реализовать.

...