【问题标题】:Jetty Proxy servlet not sending all the modified contentJetty Proxy servlet 未发送所有修改后的内容
【发布时间】:2013-02-26 03:44:30
【问题描述】:

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

我使用的是 Jetty 8.1.3 版本,所有请求都是 JSON 请求/响应。我还对ServletInputStream 类和read() 方法进行了子类化,所以我认为这没有任何问题。

【问题讨论】:

    标签: json servlets jetty


    【解决方案1】:

    这是最近在 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)

    【讨论】:

    • Couch DB 收到的请求只有请求的第一部分,其他内容丢失。正如我在 [bug]bugs.eclipse.org/bugs/show_bug.cgi?id=401382 中理解的那样,Jetty 应该只发送请求的最后一块。在我的情况下,它只是发送的前几个片段。对吗?
    • 它比这复杂一点。当下游响应被 HTTP 分块(只发生在 http 分块响应中),然后在 ProxyServlet 上以异步方式接收时,ProxyServlet 会尝试保留分块,但在 100% 的情况下都失败了。在某些情况下,异步块可以相互覆盖。这是错误报告的内容,并且代码中的修复已修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多