Comment puis-je remplacer le “Host” en-tête de la requête lors de l'utilisation d'Apache commons HttpClient
Je suis à l'aide de Jakarta Commons HttpClient 3.1 l'écriture d'un test de charge de l'outil qui a besoin de cibler différents serveurs et faire semblant comme si elle visait la bonne hôte virtuel dans le serveur HTTP. Pour cela j'ai besoin pour être en mesure de définir le "Host" en-tête HTTP de la requête à un autre nom d'hôte le nom d'hôte que je suis connecté.
Il semble assez évident que je devrais utiliser Method.setRequestHeader("Host","fakehostname")
, mais HttpClient ignore simplement et ce envoie toujours le vrai nom de l'hôte, je me connecte à dans les "hôtes" de l'en-tête (j'ai activé la journalisation du débogage pour "httpclient.fil de" et je il le fait en particulier).
Comment puis-je remplacer l'en-tête de sorte que HttpClient prend garde?
OriginalL'auteur Guss | 2011-05-18
Vous devez vous connecter pour publier un commentaire.
Après une recherche un peu plus, et en prenant un indice d'Oleg réponse, j'ai trouvé la méthode HttpMethodParams::setVirtualHost().
quand HttpClient formats une demande, il crée toujours le "Host" en-tête lui-même juste avant l'envoi de la demande - de sorte qu'il ne peut pas être remplacée comme un en-tête standard. Mais avant que le nom d'hôte pour le "Host" en-tête est généré à partir de l'URL, HttpClient vérifie la HttpMethodParams objet pour voir si l'utilisateur souhaite remplacer le nom de l'hôte. Cela remplace uniquement le nom d'hôte et non pas le port de sorte qu'il serait plus facile à utiliser, mais pas aussi intuitif que je le voudrais.
Le code à utiliser ce qui peut ressembler à ceci:
Parce que j'ai comme l'un des doublures, ce qui peut aussi être écrit comme:
OriginalL'auteur Guss
Suite à des travaux sur android:
pour l'url https:
sun.net.http
de l'espace de nom de la propriété) et je préfère attendre qu'il fonctionne sur toutes les implémentations Java - s'il n'est pas utile pour moi comme je suis à l'aide d'Apache commons client HTTP.OriginalL'auteur diyism
Je crois que vous voulez http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/HttpHost.html: cela vous permet de configurer l'hôte pour une connexion spécifique. Si je comprends bien, vous pouvez soit utiliser le
execute
méthode (voir 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)) et de lui passer une coutumeHttpHost
de l'objet ou de le faire:Laissez-moi savoir comment cela fonctionne.
EDIT: principe reste le même.
1. Construire un HttpHost exemple, en lui transmettant votre en-tête d'Hôte (voir http://hc.apache.org/httpclient-legacy/apidocs/index.html?org/apache/commons/httpclient/HttpHost.html).
2. Créer une instance HttpConfiguration et de le passer à la HttpHost que vous avez créé (voir http://hc.apache.org/httpclient-legacy/apidocs/index.html?org/apache/commons/httpclient/HostConfiguration.html).
3. Utiliser le
execute
méthode sur HttpClient avec cette configuration (voir http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpClient.html#executeMethod(org.apache.commons.httpclient.HostConfiguration,%20org.apache.commons.httpclient.HttpMethod))OriginalL'auteur Femi
On peut utiliser le
'http.virtual-host'
paramètre pour forcer un arbitraire (virtuel) nom d'hôte et le port comme une valeur de laHost
- tête de la requête à la place de ceux issus de l'URI de la requête. Cela fonctionne avec le 4.x API, mais.OriginalL'auteur oleg