2015-07-22 4 views
1

Spring MVC Java 1.8.0_45-b14 Бэкэнд, работающий на Jetty 9.3.0.v20150612, работает хорошо с несжатыми запросами, но не принимает сжатые запросы.Jetty отвечает 400 Bad Request при запросе Content-Type - gzip

Я выполнил инструкции по настройке Gzip Handler here, удостоверился, что они также поддерживаются для запросов POST. Хотя он не говорит, что эта конфигурация вообще не требуется для запросов ... это может быть только для ответов.

и т.д./Причал-gzip.xml -

<Configure id="Server" class="org.eclipse.jetty.server.Server"> 
    <Get id="next" name="handler" /> 
    <Set name="handler"> 
    <New id="GzipHandler" class="org.eclipse.jetty.server.handler.gzip.GzipHandler"> 
     <Set name="handler"><Ref refid="next" /></Set> 
     <Set name="minGzipSize"><Property name="jetty.gzip.minGzipSize" deprecated="gzip.minGzipSize" default="2048"/></Set> 
     <Set name="checkGzExists"><Property name="jetty.gzip.checkGzExists" deprecated="gzip.checkGzExists" default="false"/></Set> 
     <Set name="compressionLevel"><Property name="jetty.gzip.compressionLevel" deprecated="gzip.compressionLevel" default="-1"/></Set> 
     <Set name="excludedAgentPatterns"> 
     <Array type="String"> 
      <Item><Property name="jetty.gzip.excludedUserAgent" deprecated="gzip.excludedUserAgent" default=".*MSIE.6\.0.*"/></Item> 
     </Array> 
     </Set> 

     <Set name="includedMethods"> 
     <Array type="String"> 
      <Item>GET</Item> 
      <Item>POST</Item> 
     </Array> 
     </Set> 

     <Set name="includedPaths"> 
     <Array type="String"> 
      <Item>/*</Item> 
     </Array> 
     </Set> 

    </New> 
    </Set> 
</Configure> 

В web.xml -

<filter> 
    <filter-name>GzipFilter</filter-name> 
    <filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class> 
    <init-param> 
     <param-name>mimeTypes</param-name> 
     <param-value>text/html,text/plain,text/xml,application/xhtml+xml,text/css,application/javascript,image/svg+xml,application/json</param-value> 
    </init-param> 
    <init-param> 
     <param-name>minGzipSize</param-name> 
     <param-value>500</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>GzipFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Это происходит с Android клиента, а также воспроизводит с приложением HTTP Client (Paw), вот пример запроса -

POST /report?v=1 HTTP/1.1 
Content-Encoding: gzip 
Content-Type: application/json 
Host: 10.0.0.1:8080 
Connection: close 
User-Agent: Paw/2.2.2 (Macintosh; OS X/10.10.4) GCDHTTPRequest 
Content-Length: 5845 

xí\MÇuÝûWÔE(É`_¦(<EtD&)%:¦OTè.EôÔU53¬¼ð"ÇYfÆ'®ì­/áÿʽ¯ª 
r(ʲä#èúz÷Ý÷^5èýR;Úå;ÕÎÿöºÊuW«ß«v«ß¿ø³:VÕ)Õ .. BINARY ... 

Response -

HTTP/1.1 400 Bad Request 
Content-Type: text/html;charset=iso-8859-1 
Cache-Control: must-revalidate,no-cache,no-store 
Content-Length: 242 
Connection: close 

Поддерживает ли Jetty сжатые запросы? (не удалось найти для этого четких доказательств)

Что случилось с моей конфигурацией?

+0

Вы уверены, что ваш запрос контента кодируется как GZip? Вы бы не прочитали ни одной строки, если это реальный gzip'ed контент: '.: ¯U lorem.json í \ M .. BINARY ...' Кажется, вы добавили файл gziped или похожий контент, который не является одна и та же. – Konrad

+1

Вы отправляете файл gzip'ed, а не только кодированный контент gzip. – Konrad

+0

@ Konrad верен, я попробовал снова с gzip-кодированным файлом и получил тот же результат. Эта проблема также возникла при использовании приложения для Android-приложений, поэтому я уверен, что это не просто клиент HTTP или конфиг. – Kof

ответ

6

Во-первых, удалить GzipFilter из вашего web.xml it's not relevant anymore (starting with Jetty 9.3.0)

GzipHandler является новой для замены всех старых фильтров GZip фильтров на основе (GzipFilter, AsyncGzipFilter и IncludableGzipFilter).

Он был разработан, чтобы функционировать на уровне, более фундаментальном для потоков соединений, что подходы, основанные на фильтрах, не могли бы сделать в мире Async I/O.

Это, как говорится ... GzipHandler В Jetty 9.3.0 реализована только реализация, предназначенная для содержимого тела ответа. (Как и ранее GzipFilters)

Мы узнали, однако, что некоторые проекты расширили наш GzipFilter, чтобы добавить обработку тела gzip запроса контента. Которое наше изменение от GzipFilter до GzipHandler сломалось.

У нас открытая ошибка о том, что в https://bugs.eclipse.org/471577 (DropWizard продлен GzipFilter для их собственного BiDiGzipFilter)

Мы признаем, что могут быть некоторые полезные функции для Gzip на теле содержимого запроса, но не имеют реализация для этого еще. (подсказка, подсказка, оставьте патч на нас)