使用Apache commons HttpClient时,如何覆盖请求中的"Host"标头

Gus*_*uss 10 java apache-commons-httpclient

我正在使用Jakarta Commons HttpClient 3.1编写一个负载测试工具,该工具需要针对不同的服务器,并假装它针对HTTP服务器中的正确虚拟主机.为此,我需要能够将请求中的"主机"HTTP标头设置为不同的主机名,然后是我要连接的实际主机名.

看起来很明显我应该使用Method.setRequestHeader("Host","fakehostname"),但HttpClient只是忽略了这一点,并且总是在"Host"标题中发送我正在连接的真实主机名(我已启用"httpclient.wire"的调试日志记录,我可以这样做具体而言).

如何覆盖标题以便HttpClient注意?

Gus*_*uss 15

在搜索了一些,并从Oleg的答案中得到了一个提示之后,我找到了方法HttpMethodParams :: setVirtualHost().

当HttpClient格式化请求时,它总是在发送请求之前自己创建"主机"标头 - 因此它不能被覆盖为标准标头.但是,在从URL生成"Host"标头的主机名之前,HttpClient会检查HttpMethodParams对象以查看用户是否要覆盖主机名.这只会覆盖主机名而不是端口,所以它更容易使用,虽然不像我想的那样直观.

使用它的代码可能如下所示:

Method m = new GetMethod("http://some-site/some/path");
m.getParams().setVirtualHost("some-other-site");
client.executeMethod(m);
Run Code Online (Sandbox Code Playgroud)

因为我喜欢一个衬垫,所以这也可以写成:

client.executeMethod(new GetMethod("http://some-site/some/path") {{
    getParams().setVirtualHost("some-other-site"); }});
Run Code Online (Sandbox Code Playgroud)