Wie kann ich den Header "Host" in der Anfrage überschreiben, wenn Apache commons HttpClient verwendet wird?

7

Ich benutze Jakarta Commons HttpClient 3.1, schreibe ein Lasttest-Tool, das auf verschiedene Server abzielen muss und tue so, als ob es den richtigen virtuellen Host im HTTP-Server als Ziel hat. Dazu muss ich den HTTP-Header "Host" in der Anfrage auf einen anderen Hostnamen als den tatsächlichen Hostnamen einstellen können, mit dem ich mich verbinde.

Es schien ziemlich offensichtlich, dass ich Method.setRequestHeader("Host","fakehostname") verwenden sollte, aber HttpClient ignoriert dies und sendet immer den echten Host-Namen, mit dem ich mich verbinde, in den "Host" -Header (Ich habe Debug-Logging für "httpclient.wire" aktiviert "und ich kann es genau tun."

Wie kann ich den Header überschreiben, so dass HttpClient beachtet?

    
Guss 18.05.2011, 13:57
quelle

4 Antworten

12

Nachdem ich etwas mehr gesucht und einen Hinweis aus Olegs Antwort genommen habe, habe ich die Methode HttpMethodParams :: setVirtualHost () .

Wenn HttpClient eine Anfrage formatiert, erstellt er immer unmittelbar vor dem Senden der Anfrage den Header "Host" selbst - und kann daher nicht als Standard-Header überschrieben werden. Bevor jedoch der Hostname für den Header "Host" aus der URL generiert wird, überprüft HttpClient das HttpMethodParams-Objekt, um festzustellen, ob der Benutzer den Hostnamen überschreiben möchte. Dies überschreibt nur den Hostnamen und nicht den Port, so dass es einfacher zu verwenden wäre, wenn auch nicht so intuitiv, wie ich es möchte.

Der Code zur Verwendung kann folgendermaßen aussehen:

%Vor%     
Guss 20.05.2011, 18:29
quelle
3

Ich glaube, Sie wollen Ссылка : das Ermöglicht Ihnen, den Host für eine bestimmte Verbindung zu konfigurieren. Wenn ich es richtig verstanden habe, können Sie entweder die Methode execute verwenden (siehe Ссылка )) und übergeben Sie ein benutzerdefiniertes HttpHost -Objekt, oder tun Sie dies:

  1. Konstruieren Sie eine HttpHost-Instanz und übergeben Sie ihr den Host-Header.
  2. Verwenden Sie das, um eine HttpRoute-Instanz zu erstellen (siehe Ссылка )
  3. Übergeben Sie das an den Verbindungsmanager, wenn Sie eine Verbindung anfordern (siehe Ссылка )).
  4. Verwenden Sie die Verbindung mit Ihrer Methode: Weitere Informationen finden Sie unter Ссылка .

Lass mich wissen, wie das funktioniert.

EDIT: Prinzip bleibt gleich. 1. Erstellen Sie eine HttpHost-Instanz und übergeben Sie ihr den Host-Header (siehe Ссылка ). 2. Erstellen Sie eine HttpConfiguration-Instanz, und übergeben Sie ihr den von Ihnen erstellten HttpHost (siehe Ссылка ). 3. Verwenden Sie die Methode execute auf HttpClient mit dieser Konfiguration (siehe Ссылка ))

    
Femi 18.05.2011 14:38
quelle
3

Folgendes funktioniert auf Android:

%Vor%

für https URL:

%Vor%     
diyism 21.08.2013 05:59
quelle
2

Man kann den Parameter 'http.virtual-host' verwenden, um einen beliebigen (virtuellen) Hostnamen und Port als Wert des Headers Host request anstelle der vom tatsächlichen Anforderungs-URI abgeleiteten Werte zu erzwingen. Dies funktioniert jedoch nur mit der 4.x-API.

    
oleg 18.05.2011 15:09
quelle