Отправка оценки HTTP Content-Length из сервлета и т.д. - PullRequest
4 голосов
/ 12 октября 2009

Мне часто нужно динамически генерировать контент из сервлета / рестлета или чего-то еще, и я не знаю длины заранее. Если клиент - браузер, индикатор выполнения не работает должным образом, потому что я не установил заголовок Content-Length. Есть ли способ установить приблизительную длину контента, чтобы индикатор выполнения работал «более или менее»?

Ответы [ 5 ]

7 голосов
/ 12 октября 2009

Нет, значение Content-Length должно быть точной длиной содержимого :

Когда в сообщении указана длина содержимого, где разрешено тело сообщения, значение его поля ДОЛЖНО точно соответствовать количеству OCTET в теле сообщения. Пользовательские агенты HTTP / 1.1 ДОЛЖНЫ уведомлять пользователя, когда получена и обнаружена неверная длина.

Таким образом, вы не можете отправить только приблизительное значение Content-Length , чтобы получить индикатор выполнения.

3 голосов
/ 14 декабря 2010

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

Я протестировал это в Firefox, IE и Chrome без проблем. Спецификация HTTP гласит, что пользовательские агенты ДОЛЖНЫ уведомлять пользователя, если указанная длина не соответствует фактической длине, но я не наблюдал такого поведения ни в одном из протестированных мной браузеров.

Я исследовал это как вариант, но отказался от него из-за потенциальных непредвиденных конфликтов для игры за пределами спецификации.

1 голос
/ 12 октября 2009

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

0 голосов
/ 12 октября 2009

Если длина вашего контента заранее неизвестна, вы можете использовать «chunked» кодировку контента (согласно HTTP версии 1.1). Это, однако, не решит проблему с индикатором выполнения - и просто невозможно заставить ее работать, если вы не знаете, сколько контента вы собираетесь отправить.

0 голосов
/ 12 октября 2009

Единственный способ сделать это (, как описано в RFC ) - не устанавливать заголовок Content-Length, т.е. заголовок ответа не содержит строку Content-Length. В этом случае браузер не знает, каков размер тела, поэтому сервер «сообщает» браузеру, что все тело было отправлено , закрыв соединение .

Я не уверен, будет ли контейнер Java автоматически закрывать соединение в этом случае, или вы можете сделать это самостоятельно через какой-то фильтр.

Чтобы ответить на ваш вопрос: я не думаю, что можно дать оценку браузеру.

...