先决条件
问题
我尝试通过http4组件调用https加密站点。 位于我的服务器和Internet(目标服务器)之间的代理检查标头“User-Agent”,如果请求为空,则拒绝该请求。
connect-Request不包含http标头“User-Agent”。
在方法private boolean createTunnelToTarget(AuthState proxyAuthState, HttpClientConnection managedConn, HttpRoute route, HttpRequest request, HttpClientContext context) throws HttpException, IOException
中的org.apache.http.impl.execchain.MainClientExec中调用以下内容:
BasicHttpRequest connect = new BasicHttpRequest("CONNECT", authority, request.getProtocolVersion());
this.requestExecutor.preProcess(connect, this.proxyHttpProcessor, context);
this.requestExecutor.preProcess
将标题“Host”和“Proxy-Connection”添加到HTTP CONNECT请求,但不添加“User-Agent”。
如何将标题“User-Agent”添加到HTTP CONNECT请求?
此致
最高
答案 0 :(得分:2)
httpclient 4.4.1解决了这个问题。
在org.apache.http.impl.client.HttpClientBuilder类中,使用用户代理的HttpRequestInterceptor初始化httpprocessor:
ClientExecChain execChain = createMainExec(
requestExecCopy,
connManagerCopy,
reuseStrategyCopy,
keepAliveStrategyCopy,
new ImmutableHttpProcessor(new RequestTargetHost(), new RequestUserAgent(userAgentCopy)),
targetAuthStrategyCopy,
proxyAuthStrategyCopy,
userTokenHandlerCopy);
解决方案是将httpclient版本从4.3.3更新到4.4.1。 在maven中,我必须定义依赖关系,以便不选择骆驼使用的版本。