如何通过nginx创建分块请求

mda*_*man 5 java soap nginx chunked-encoding cloud-foundry

似乎nginx不能很好地支持chunked请求.但我正在努力获得更明确(当前)的答案.我有一个客户端从Java客户端向服务器发出SOAP请求,该客户端设置标头Transfer-Encoding: chunked.当我直接连接到Tomcat上的应用程序时,一切正常.

但是当我把nginx放在它们之间时,事情就会破裂.

添加一些细节:我正在使用CloudFoundry.我正在使用Micro Cloud Foundry确认在没有nginx的情况下,事情按预期工作.但我的要求是使用cloudfoundry.com,所以我没有能力绕过那里的nginx.

这个问题和答案说这可能是我唯一的解决方法:http://wiki.nginx.org/NginxHttpChunkinModule.但是这种解决方法不可用,因为我无法修改cloudfoundry.com上的配置.

这个问题看起来也很相似,但它实际上涵盖了这一要求的相反方向.它涵盖了分块响应而不是分块请求.

那么客户端的任何变化如何解决这个问题呢?是否可以发送两个Transfer-Encoding: chunkedContent-Length: 123作为标题?这个领域对我来说是新的,但似乎像Apache HttpComponents这样的项目可以设置长度或分块但不是两者.分块的重点是您不需要知道请求开始时的长度.我可以告诉我的客户端使用HTTP/1.0并在没有分块的情况下使用nginx很好吗?我还忘记了其他解决方法吗?

mda*_*man 4

我已经收集了这个问题所有部分的答案。

基本 nginx 不支持分块请求(正如 Alexander 所证实的!)。Nginx 可以通过使用NginXHttpCunkinModule支持分块请求(正如我的问题提到的)。更好:该模块在 18 个多月前从测试状态升级到生产质量。Best:我在最近的一次聚会上与 CloudFoundry 工程团队的一些成员进行了交谈;他们确认计划将此模块添加到他们的 nginx 版本中。问题解决了。(嗯,从长远来看,这个问题已经完全解决了。但是我们没有确切的日期来预测这个问题。)

因此,短期解决方案也是不错的。我找到了一个。

回答我向亚历山大提出的问题:不可能用分块消息发送“内容长度”。这确实是分块消息的要点:您在获得完整内容之前就开始发送它们,因此您还不可能知道长度。所以他避免分块请求的想法是正确的。但为了更实际,我会说“使用 HTTP/1.0 而不是 HTTP/1.1”。这具有不发送分块消息的效果。我们能够临时修补我们的客户端来测试这个想法。有效。但我们不打算推出公共补丁。让每个人都使用十年前的协议(以及一个十年前不受支持的客户端库!)来解决这种情况的问题似乎会适得其反。

相反,我会在需要时使用被黑的客户端,如果其他人发现需要它,我会通过电子邮件发送出去,我们将等待 CloudFoundry 更新到 HttpChunkin 和 HTTP/1.1。