请求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( GzipFilter
, AsyncGzipFilter
和IncludableGzipFilter
)的新替代品。
它被设计为在连接流的基础上运行,这是基于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,但我们还没有实现。 (提示,提示,在我们身上放一个补丁)