Потоковая передача JSON в браузер с помощью GZIP - PullRequest
0 голосов
/ 10 января 2012

Я пытаюсь преобразовать некоторые потоки JSON для прохождения через GZIPFilter, который я написал.До сих пор я был в состоянии настроить фильтр для очистки, когда я говорю это, и он, вероятно, выводит данные совместимого браузера gzip.Я перенаправил вывод в файл и запустил gzip -cd -v test.gz, который дал ожидаемый результат, а затем «неожиданный конец файла».

Проблема в том, что браузер все еще видит нулевой вывод (firebug), поэтомуМне было интересно, интерпретирует ли браузер частичные сбросы в поток gzip.

Поток содержит в основном инструкции / объекты javascript и должен приниматься и анализироваться на стороне клиента.Сервлет вызывается один раз и остается открытым в течение всей продолжительности сеанса, предоставляя клиенту данные;соединение не закрыто, поэтому поток продолжает работать, передавая данные с сервера.

Моя настройка: WinXP 32bit, GWT 2.4.0, Jetty7.4 .., GzipFilter (с настройками), Firefox8 / Chrome 10

Насколько я знаю по спецификациям RFC, контент декодируется только после окончания потока, поэтому то, что я пытаюсь сделать, может оказаться невозможным.Однако у вас могут быть некоторые предложения, чтобы заставить эту работу работать в основных браузерах.

Позже Редактирование:

  • GzipFilter указывается через web.xml, и это нормально
  • браузер получает Content-Encoding: gzip
  • байт записывается в поток HTTPResponse
  • , протестированный как в скомпилированном, так и в живом режиме GWT
  • , протестированный с кодировками iso-8859-1 илиничего не указано
  • тип содержимого text / html
  • без фильтра, примененного через web.xml, все работает

1 Ответ

0 голосов
/ 11 января 2012

Исправлено. Я использовал пользовательский посредник OutputStream для целей отладки, который записывал выходные данные в файл, а также некоторую статистику, и я думаю, что я оставил некоторые методы без переопределения. Как только я удалил это, оно работает.

Мои параметры, для достаточно любопытных:

  • размер буфера: 8k
  • мин. Размер gzip: 64b
  • для очистки потока gzip, вам необходимо расширить GzipStream, переопределить метод flush, чтобы установить уровень сжатия на ноль, а затем снова вернуться, deflate () - между ними.
  • заменить операцию назначения потока gzOut на ту, которая указывает на этот пользовательский поток Gzip / Deflater

Как я уже говорил, причиной этого является потоковая передача объектов JSON в браузер без закрытия сокета. Это происходит до тех пор, пока все браузеры не будут правильно реализовывать WebSocket. Для выполнения push-данных вам либо нужна реализация WebSocket, либо вам нужно всегда открытое соединение, через которое сервер может передавать данные.

Позднее редактирование: после изобретения колеса: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4255743

...