请求Content-Type为gzip时,Jetty会响应400 Bad Request

Jetty 9.3.0.v20150612上运行的Spring MVC Java 1.8.0_45-b14后端适用于未压缩的请求,但无法接受压缩的请求。

我在这里遵循了Gzip Handler配置说明,确保它们也支持POST请求。 虽然它没有说这种配置完全适用于请求……但它可能仅用于响应。

etc / jetty-gzip.xml –

                GET POST     /*      

在web.xml中 –

  GzipFilter org.eclipse.jetty.servlets.GzipFilter  mimeTypes text/html,text/plain,text/xml,application/xhtml+xml,text/css,application/javascript,image/svg+xml,application/json   minGzipSize 500    GzipFilter /*  

Android客户端会发生这种情况,并且还会使用HTTP客户端应用程序(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 ... 

回应 –

 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甚至支持压缩请求吗? (找不到明确的证据)

我的配置有什么问题?

首先,从web.xml中删除GzipFilter 它不再相关(从Jetty 9.3.0开始)

GzipHandler是所有旧的基于filter的gzipfilter( GzipFilterAsyncGzipFilterIncludableGzipFilter )的新替代品。

它被设计为在连接流的基础上运行,这是基于filter的方法在异步I / O领域无法做到的。

话虽如此…… Jetty 9.3.0中的GzipHandler只有针对Response主体内容设计的实现。 (就像之前的GzipFilters一样)

然而,我们学到的是,一些项目扩展了我们的GzipFilter以添加Request内容体gzip处理。 我们从GzipFilter到GzipHandler的变化打破了。

我们在https://bugs.eclipse.org/471577(DropWizard扩展GzipFilter为他们自己的BiDiGzipFilter)有一个关于它的漏洞

我们认识到Gzip在请求内容体上可能有一些有用的function,但我们还没有实现。 (提示,提示,在我们身上放一个补丁)