我正在使用Jetty的代理servlet将请求从前端客户端路由到Couch数据库。除了代理之外,我还要为CouchDB使用的传入请求注入其他详细信息。通过扩展HTTPServletRequestWrapper
来修改HTTP请求。当我覆盖getContentLength
方法并重新计算inputStream
的大小时,只有原始请求的大小内容被发送到CouchDB,并且因为输入JSON无效,Couch DB会发出错误请求(400 HTTP)代码。在Jetty记录器中,我看到contentWritten != contentLength
消息。一旦我完全删除了Content-Length标头,Jetty会按预期发送请求,将所有内容复制到代理请求中。即使这种方法有效,我想知道是什么导致Jetty不发送修改后的请求内容,即使通过覆盖getContentLength
ServletInputStream
方法设置了正确的内容长度。
我正在使用Jetty 8.1.3版本,所有请求都是JSON请求/响应。我还将ServletInputStream
类和read()
方法子类化,因此我认为没有任何问题。
答案 0 :(得分:0)
这是最近在Jetty 7.6.10-SNAPSHOT和8.1.10-SNAPSHOT中修复的分块编码错误。 https://bugs.eclipse.org/bugs/show_bug.cgi?id=401382
在Jetty-7中修复(然后合并到Jetty-8)
您可以使用oss.sonatype.org SNAPSHOTS repository中的Jetty 7.6.10-SNAPSHOT或8.1.10-SNAPSHOT。
7.6.10和8.1.10版本可能会在2013年3月的第一周发布。
是的,Jetty-7和Jetty-8是相同的代码库,并行开发,甚至并行发布,唯一的区别是每个支持的servlet规范。 (Jetty-7是Servlet 2.5,Jetty-8是Servlet 3.0)