Как узнать, когда HTTP-сервер завершил отправку данных - PullRequest
3 голосов
/ 23 февраля 2012

Я работаю над проектом, ориентированным на браузер / прокси, где мне нужно скачать веб-страницы. После отправки пользовательского HTTP-запроса на веб-сервер я начинаю прослушивать ответ сервера.

При чтении ответа я проверяю заголовки ответа для Content-Length: -row. Если я получу один из них, легко определить, когда сервер завершил отправку данных, так как я всегда знаю, сколько байтов данных я получил.

Проблема возникает, когда сервер не включает заголовок Content-Length, а также сохраняет соединение открытым для дальнейших запросов. Например, сервер Google отвечает gzipped-content, но не включает длину контента. Как мне узнать, когда прекратить ждать больше данных и закрыть соединение?

Я рассмотрел вопрос об использовании значения тайм-аута для закрытия соединения, если в течение некоторого времени не было получено данных, но это кажется неправильным способом сделать это. Например, Chrome может загружать те же страницы, что и я, и всегда точно знает, когда закрывать соединение.

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012

Посмотрите на IETF RfC 2616, ищите кусочную кодировку и Content-Range.

HTTP предназначен для возврата содержимого неизвестной длины, например:

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

25
This is the data in the first chunk

1C
and this is the second one

3
con
8
sequence
0

источник Википедия

1 голос
/ 23 февраля 2012

Я хотел бы предложить вам принудительно установить заголовок Connection: close, чтобы вы были уверены, что сервер закрывает соединение после завершения вывода, независимо от того, установлен Content-length или нет. Производительность будет частично зависеть от этого

0 голосов
/ 23 февраля 2012

Есть два случая, которые вы можете ожидать: 1. розетка-закрыть 2. тайм-аут сокета

Обычно сокет закрывается, также имеет смысл объявить время ожидания сокета.

Помните

 int stream.read(byte[],size);

возвращает реальный размер byte [] - размер аргумента, который был прочитан до закрытия сокета или тайм-аута сокета (или достигнут размер аргумента).

Привет.

...