我有一个Jetty的HttpClient的设置,它使用SSL连接到apache http服务器,该服务器将请求作为http路由到web服务器:
HttpClient<--HTTPS-->http服务器<--HTTP-->web服务器。
此设置已经运行了一段时间
我现在正在尝试添加代理:
HttpClient<--HTTPS使用CONNECT方法-->代理<--HTTPS-->http服务器<--HTTP-->web服务器
我正在使用以下代码来设置代理:
httpClient.setProxy(新地址("proxyHost",proxyPort));
代理不需要身份验证。
SSL握手似乎开始得很好,看看TCP转储,我可以看到我得到了"服务器你好"的响应。但是,握手稍后失败,http服务器日志中显示以下错误:
〔2013年6月26日星期三12:49:42〕〔debug〕ssl_engine_io.c(1925):OpenSSL:I/O错误,预计在BIO#7faefe130d00上读取5个字节〔mem:7faefe11f203〕
由于握手失败,因此不会将HTTP请求转发到web服务器。
使用相同的设置,但使用url.openConnection()和HttpsURLConnection配置替换Jetty HttpClient,如中所述https://stackoverflow.com/a/1512268/378060运行良好。
配置代理和证书后从浏览器连接也可以。
版本详细信息:
Jetty HttpClient:已尝试7.4.2、7.6.11、8.1.11(Windows)
代理是squid 2.7(Windows)
apache http服务器2.2.15(linux)
问题与此处描述的问题相同:http://dev.eclipse.org/mhonarc/lists/jetty-users/msg01854.html.
Squid 2.7与Http 1.1不兼容,但与Http 1.0兼容,因此它没有用keep-alive标头响应Jetty的Proxy Connection:keep-aliive标头。Jetty随后被迫根据Http1.0规则关闭连接。