12

Jakarta Commons HttpClient 3.1を使用して、さまざまなサーバーをターゲットにし、HTTPサーバー内の正しい仮想ホストをターゲットにしているように見せかける必要のある負荷テストツールを作成しています。そのためには、リクエストの「ホスト」HTTPヘッダーを、接続している実際のホスト名とは異なるホスト名に設定できる必要があります。

使用する必要があることは明らかですMethod.setRequestHeader("Host","fakehostname")が、HttpClientはこれを無視し、接続している実際のホスト名を常に「Host」ヘッダーで送信します(「httpclient.wire」のデバッグログを有効にしました。これは具体的に)。

HttpClientが注意を払うように、ヘッダーをオーバーライドするにはどうすればよいですか?

4

4 に答える 4

15

さらに検索し、Olegの回答からヒントを得た後、メソッドHttpMethodParams :: setVirtualHost()を見つけました。

HttpClientがリクエストをフォーマットするとき、リクエストを送信する直前に常に「ホスト」ヘッダー自体を作成するため、標準ヘッダーとしてオーバーライドすることはできません。ただし、「Host」ヘッダーのホスト名がURLから生成される前に、HttpClientはHttpMethodParamsオブジェクトをチェックして、ユーザーがホスト名を上書きするかどうかを確認します。これはホスト名のみを上書きし、ポートは上書きしないため、私が望むほど直感的ではありませんが、使いやすくなります。

これを使用するコードは次のようになります。

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

私はワンライナーが好きなので、これは次のように書くこともできます。

client.executeMethod(new GetMethod("http://some-site/some/path") {{
    getParams().setVirtualHost("some-other-site"); }});
于 2011-05-20T18:29:46.837 に答える
4

http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/HttpHost.htmlが必要だと思います。これにより、特定の接続用にホストを構成できます。execute私が正しく理解している場合は、この方法を使用できます( http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/AbstractHttpClient.html#execute( org.apache.http.HttpHost、%20org.apache.http.HttpRequest))そしてカスタムHttpHostオブジェクトを渡すか、次のようにします。

  1. HttpHostインスタンスを作成し、Hostヘッダーを渡します。
  2. これを使用して、HttpRouteインスタンスを作成します(http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/conn/routing/HttpRoute.htmlを参照)
  3. 接続をリクエストするときに、それを接続マネージャーに渡します(http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/conn/ClientConnectionManager.html#requestConnection(org.apacheを参照) .http.conn.routing.HttpRoute、%20java.lang.Object))。
  4. メソッドとの接続を使用します。詳細については、http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.htmlを参照してください。

それがどのように機能するか教えてください。

編集:原則は同じままです。1. HttpHostインスタンスを作成し、Hostヘッダーを渡します(http://hc.apache.org/httpclient-legacy/apidocs/index.html?org/apache/commons/httpclient/HttpHost.htmlを参照)。2. HttpConfigurationインスタンスを作成し、作成したHttpHostを渡します(http://hc.apache.org/httpclient-legacy/apidocs/index.html?org/apache/commons/httpclient/HostConfiguration.htmlを参照)。3.executeその構成でHttpClientのメソッドを使用します(http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpClient.html#executeMethod(org.apache.commons.httpclientを参照)。 HostConfiguration、%20org.apache.commons.httpclient.HttpMethod))

于 2011-05-18T14:38:39.133 に答える
3

以下はAndroidで動作します:

System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
InputStream stream_content=null;
try
   {URL url=new URL("http://74.125.28.103/");
    HttpURLConnection conn=(HttpURLConnection)url.openConnection();
    conn.setDoOutput(true);
    conn.setRequestMethod("GET");
    conn.setRequestProperty("Host", "www.google.com");
    stream_content=conn.getInputStream();
   }
catch (Exception e) {}

https URLの場合:

System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
InputStream stream_content=null;
try
   {URL url=new URL("https://74.125.28.103/");
    HttpsURLConnection conn=(HttpsURLConnection)url.openConnection();
    conn.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER );
    conn.setDoOutput(true);
    conn.setRequestMethod("GET");
    conn.setRequestProperty("Host", "www.google.com");
    stream_content=conn.getInputStream();
   }
catch (Exception e) {}
于 2013-08-21T05:59:49.520 に答える
2

パラメータを使用して、実際のリクエストURIから派生したものではなく'http.virtual-host'、リクエストヘッダーの値として任意の(仮想)ホスト名とポートを強制することができます。Hostただし、これは4.xAPIでのみ機能します。

于 2011-05-18T15:09:22.090 に答える