Estoy utilizando el Jakarta Commons HttpClient 3.1 de la escritura una herramienta de prueba de carga que debe apuntar a diferentes servidores y pretender como objetivo la correcta virtual host en el servidor HTTP. Para que necesito para ser capaz de establecer el «Host» encabezado HTTP en la solicitud para un nombre de host diferente, a continuación, el nombre de host real que me estoy conectando.

Parecía bastante obvio que debo utilizar Method.setRequestHeader("Host","fakehostname"), pero HttpClient sólo hace caso omiso de esto y siempre envía el verdadero nombre de host que me estoy conectando en el «Host» de cabecera (he habilitado el registro de depuración para «httpclient.alambre» y yo puede que no este específicamente).

¿Cómo puedo reemplazar el encabezado para que HttpClient preste atención?

OriginalEl autor Guss | 2011-05-18

4 Comentarios

  1. 14

    Después de buscar un poco más, y tomando una pista de Oleg respuesta, he encontrado el método HttpMethodParams::setVirtualHost().

    cuando HttpClient formatos de solicitud, siempre crea el «Host» encabezado de sí mismo justo antes de enviar la solicitud, por lo que no puede ser reemplazado como un encabezado estándar. Pero antes de que el nombre de host para el «Host» de cabecera se genera a partir de la URL, HttpClient comprueba la HttpMethodParams objeto para ver si el usuario desea reemplazar el nombre de host. Esto sólo reemplaza el nombre de host y no el puerto, y así sería más fácil, aunque no tan intuitivo como me gustaría.

    El código para utilizar este puede tener este aspecto:

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

    Porque me gustan los trazadores de líneas uno, esto también puede ser escrito como:

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

    OriginalEl autor Guss

  2. 4

    Siguientes obras en 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) {}

    para la dirección url https:

    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) {}
    Esta solución es usar el Java integrado en el cliente HTTP (véase el sun.net.http de espacio de nombre de la propiedad) y me gustaría esperar a que funcione en todas las implementaciones de Java, aunque no es útil para mí como yo lo estoy usando Apache commons cliente HTTP.

    OriginalEl autor diyism

  3. 3

    Creo que desea http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/HttpHost.html: te permite configurar el host para una conexión específica. Si lo entiendo correctamente, usted puede utilizar el execute método (ver 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)) y pasar una costumbre HttpHost objeto, o hacer esto:

    1. La construcción de un HttpHost instancia, pasando su encabezado de Host.
    2. Utilizar para crear un HttpRoute instancia (ver http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/conn/routing/HttpRoute.html)
    3. Que pase a la conexión de administrador cuando se solicita una conexión (ver 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. Utilizar la conexión con el método: ver http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html para obtener más detalles.

    Hágamelo saber cómo funciona.

    EDICIÓN: principio sigue siendo el mismo.
    1. La construcción de un HttpHost instancia, pasando su encabezado de Host (ver http://hc.apache.org/httpclient-legacy/apidocs/index.html?org/apache/commons/httpclient/HttpHost.html).
    2. Crear un HttpConfiguration instancia y, a continuación, pase el HttpHost que ha creado (ver http://hc.apache.org/httpclient-legacy/apidocs/index.html?org/apache/commons/httpclient/HostConfiguration.html).
    3. El uso de la execute método de HttpClient con esa configuración (ver http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpClient.html#executeMethod(org.apache.commons.httpclient.HostConfiguration,%20org.apache.commons.httpclient.HttpMethod))

    Estoy usando HttpClient 3.1, no HttpComponents. Lo siento, no mencionó que antes. He editado mi pregunta para hacerla más clara.

    OriginalEl autor Femi

  4. 2

    Uno puede usar el 'http.virtual-host' parámetro con el fin de forzar a un arbitrario (virtual) de nombre de host y el puerto como un valor de la Host encabezado de solicitud en lugar de los que se derivan de la real URI de la solicitud. Esto funciona con el 4.x API solo, sin embargo.

    La vergüenza, estoy usando 3.1.

    OriginalEl autor oleg

Dejar respuesta

Please enter your comment!
Please enter your name here