Apache HttpComponents。获取 CONNECT 请求的响应
Apache HttpComponents. Get response for CONNECT request
我正在使用 Apache HtppComponents(版本 - 4.5.2)并且我正在尝试通过代理服务器请求 HTTPS 页面。
编辑:
我的主要问题是我需要知道如何区分代理服务器故障和请求的 URI 故障(对于 HTTP 和 HTTPS)。我有很多代理,它们不是 100% 可靠,所以如果代理失败,我需要用不同的代理服务器重试请求。
例如(在 HTTPS 的情况下),可以在两种情况下返回 NoHttpResponseException
,即当代理失败或目标 URL 失败时。我怎么知道问题的根源? NoHttpResponseException
从哪里来的?来自目标 URI 的代理?
我想我可以尝试读取对代理服务器的 CONNECT
请求的响应,如果它是 200,那么我就意味着代理是好的,下一个 NoHttpResponseException
来自目标 URL。但是如果我立即得到 NoHttpResponseException
(在代理向我返回 200 CONNECT 状态代码之前),这意味着代理本身有问题,我需要用不同的代理服务器重试请求。但是我找不到任何文档如何访问代理服务器返回的 CONNECT
请求的响应。
此外,有时我会收到 HttpHostConnectException
和 ConnectTimeoutException
。我将此异常视为代理问题(对于 HTTP 和 HTTPS)——这是正确的方法吗?或者即使对于目标 URL 也会发生这 2 个异常?
它不会很漂亮,但应该可以解决问题
HttpHost myproxy = new HttpHost("myproxy", 8080)
CloseableHttpClient client = HttpClientBuilder.create()
.setProxy(myproxy)
.setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy() {
@Override
public boolean isAuthenticationRequested(HttpHost authhost, HttpResponse response, HttpContext context) {
if (myproxy.equals(authhost)) {
context.setAttribute("proxy.status", response.getStatusLine());
}
return super.isAuthenticationRequested(authhost, response, context);
}
})
.build();
HttpClientContext context = HttpClientContext.create();
HttpGet get = new HttpGet("https://httpbin.org/");
try (CloseableHttpResponse response = client.execute(get, context)) {
EntityUtils.consume(response.getEntity());
}
StatusLine proxyStatus = context.getAttribute("proxy.status", StatusLine.class);
System.out.println("Proxy said " + proxyStatus);
PS:HttpHostConnectException
和ConnectTimeoutException
异常只能在第一跳抛出,即连接到代理时。如果代理由于某种原因无法连接到目标服务器,它可能会以 5xx 状态响应 CONNECT 方法。
我正在使用 Apache HtppComponents(版本 - 4.5.2)并且我正在尝试通过代理服务器请求 HTTPS 页面。
编辑:
我的主要问题是我需要知道如何区分代理服务器故障和请求的 URI 故障(对于 HTTP 和 HTTPS)。我有很多代理,它们不是 100% 可靠,所以如果代理失败,我需要用不同的代理服务器重试请求。
例如(在 HTTPS 的情况下),可以在两种情况下返回 NoHttpResponseException
,即当代理失败或目标 URL 失败时。我怎么知道问题的根源? NoHttpResponseException
从哪里来的?来自目标 URI 的代理?
我想我可以尝试读取对代理服务器的 CONNECT
请求的响应,如果它是 200,那么我就意味着代理是好的,下一个 NoHttpResponseException
来自目标 URL。但是如果我立即得到 NoHttpResponseException
(在代理向我返回 200 CONNECT 状态代码之前),这意味着代理本身有问题,我需要用不同的代理服务器重试请求。但是我找不到任何文档如何访问代理服务器返回的 CONNECT
请求的响应。
此外,有时我会收到 HttpHostConnectException
和 ConnectTimeoutException
。我将此异常视为代理问题(对于 HTTP 和 HTTPS)——这是正确的方法吗?或者即使对于目标 URL 也会发生这 2 个异常?
它不会很漂亮,但应该可以解决问题
HttpHost myproxy = new HttpHost("myproxy", 8080)
CloseableHttpClient client = HttpClientBuilder.create()
.setProxy(myproxy)
.setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy() {
@Override
public boolean isAuthenticationRequested(HttpHost authhost, HttpResponse response, HttpContext context) {
if (myproxy.equals(authhost)) {
context.setAttribute("proxy.status", response.getStatusLine());
}
return super.isAuthenticationRequested(authhost, response, context);
}
})
.build();
HttpClientContext context = HttpClientContext.create();
HttpGet get = new HttpGet("https://httpbin.org/");
try (CloseableHttpResponse response = client.execute(get, context)) {
EntityUtils.consume(response.getEntity());
}
StatusLine proxyStatus = context.getAttribute("proxy.status", StatusLine.class);
System.out.println("Proxy said " + proxyStatus);
PS:HttpHostConnectException
和ConnectTimeoutException
异常只能在第一跳抛出,即连接到代理时。如果代理由于某种原因无法连接到目标服务器,它可能会以 5xx 状态响应 CONNECT 方法。