我使用Jetty的代理servlet将请求从前端客户端路由到Couch数据库。除了代理外,我还向CouchDB使用的传入请求注入了额外的细节。 HTTP请求通过扩展HTTPServletRequestWrapper
进行修改。当我覆盖getContentLength
方法并重新计算inputStream
的大小时,只有原始请求的大小内容被发送到CouchDB,并且由于输入JSON无效Couch DB发出错误请求(400 HTTP)代码。在Jetty记录器中,我看到contentWritten != contentLength
消息。一旦我完全删除了Content-Length头部,Jetty会按照预期的方式发送请求,将所有内容复制到代理请求。即使这种方法有效,但我想知道,即使通过覆盖ServletInputStream
的getContentLength
方法设置正确的内容长度,Jetty也不会发送修改后的请求内容。Jetty Proxy servlet不发送所有修改的内容
我使用的是Jetty 8.1.3版本,所有请求都是JSON请求/响应。我也分类ServletInputStream
类和read()
方法,所以我不认为有任何问题。
Couch DB收到的请求只有请求的第一部分,其他内容丢失。正如我在[bug]中所了解的,https://bugs.eclipse.org/bugs/show_bug.cgi?id=401382 Jetty应只发送请求的最后一个块。在我的情况下,它只有前几个部分被发送。是对的吗? – Bunti 2013-02-26 05:17:29
它比这更复杂一点。当下游响应是HTTP分块(仅在发生http分块响应时发生),然后以异步方式在ProxyServlet上接收时,ProxyServlet会尝试保留分块,但在100%的情况下无法完成。在某些情况下,异步块可以相互覆盖。这是错误报告的内容,并修复了代码中的问题。 – 2013-02-26 05:35:31