2013-02-26 42 views
1

我使用Jetty的代理servlet将请求从前端客户端路由到Couch数据库。除了代理外,我还向CouchDB使用的传入请求注入了额外的细节。 HTTP请求通过扩展HTTPServletRequestWrapper进行修改。当我覆盖getContentLength方法并重新计算inputStream的大小时,只有原始请求的大小内容被发送到CouchDB,并且由于输入JSON无效Couch DB发出错误请求(400 HTTP)代码。在Jetty记录器中,我看到contentWritten != contentLength消息。一旦我完全删除了Content-Length头部,Jetty会按照预期的方式发送请求,将所有内容复制到代理请求。即使这种方法有效,但我想知道,即使通过覆盖ServletInputStreamgetContentLength方法设置正确的内容长度,Jetty也不会发送修改后的请求内容。Jetty Proxy servlet不发送所有修改的内容

我使用的是Jetty 8.1.3版本,所有请求都是JSON请求/响应。我也分类ServletInputStream类和read()方法,所以我不认为有任何问题。

回答

0

这是最近在Jetty 7.6.10-SNAPSHOT和8.1.10-SNAPSHOT中修复的分块编码错误。 https://bugs.eclipse.org/bugs/show_bug.cgi?id=401382

固定在码头-7(然后合并到码头-8)

可以使用码头7.6.10-快照或8.1.10 -SNAPSHOT从oss.sonatype.org SNAPSHOTS repository

的7.6.10和8.1.10版本很可能会在第一周出现2013年3月的

是,码头-7和Jetty-8是相同的代码库,同时开发的,甚至并行发布,唯一的区别是每个版本都支持servlet规范。 (Jetty-7是Servlet 2.5,Jetty-8是Servlet 3.0)

+0

Couch DB收到的请求只有请求的第一部分,其他内容丢失。正如我在[bug]中所了解的,https://bugs.eclipse.org/bugs/show_bug.cgi?id=401382 Jetty应只发送请求的最后一个块。在我的情况下,它只有前几个部分被发送。是对的吗? – Bunti 2013-02-26 05:17:29

+0

它比这更复杂一点。当下游响应是HTTP分块(仅在发生http分块响应时发生),然后以异步方式在ProxyServlet上接收时,ProxyServlet会尝试保留分块,但在100%的情况下无法完成。在某些情况下,异步块可以相互覆盖。这是错误报告的内容,并修复了代码中的问题。 – 2013-02-26 05:35:31