HTTP协议错误

HTTP protocol error

我们正在 运行 Java 提供由供应商托管的远程 Web 服务,其中涉及几个中间人。我们的 Java 代码(托管在 IBM WebSphere Application Server 上)很简单,类似于:

URLConnection connection = url.openConnection();
...
connection.getOutputStream().write(...);

机器由 Cisco ACE 负载平衡器进行负载平衡,并且网络在通往远程 Web 服务的途中有两个 BlueCoat 代理。

大部分时间它工作正常,但(平均)每天供应商 Web 服务接收一次 HTTP CONNECT 而不是预期的 HTTP POST。这是来自不正确的 HTTP CONNECT 的访问日志的示例,下面是一个典型且正确的 HTTP POST:

Mar 3 05:15:07 lon-vm-lb01/lon-vm-lb01 logger[28882]: aaa.bbb.ccc.ddd - - [03/Mar/2014:05:15:04 +0000] host.com "CONNECT host.com:443 HTTP/1.1" 403 13 "-" "Java/1.7.0" "-" 810 358 331
Mar 3 05:26:05 lon-vm-lb01/lon-vm-lb01 logger[28882]: aaa.bbb.ccc.ddd - - [03/Mar/2014:05:26:03 +0000] host.com "POST /url/path HTTP/1.1" 200 1842 "-" "Java/1.7.0" "-" 875645 1229 2114 

我们怀疑是代理或负载均衡器,有人在 Cisco ACE 或 BlueCoat 上看到过这种情况吗?或者这实际上是我们这一端的问题,连接突然尝试创建隧道? Java SE 或 WAS 上的 运行 是否支持它?

它看起来像一个 HTTP 隧道。

您可以在http://en.wikipedia.org/wiki/HTTP_tunnel

查看

Signature Frantisek 向我发送了一封电子邮件,其中包含此错误的可能原因,一个 JRE bug,谢谢!综上所述,原因似乎是重用了 HTTPS 连接。

(现在只剩下让 IBM 修复 WebSphere,然后让我们的 SP 更新他们的过时软件。)