# Apache HttpClient & Default Headers



## Taneeda (21. Apr 2009)

Hallo zusammen,

Ich benutze nun seit einiger Zeit das HttpClient Framework (HttpClient - HttpComponents HttpClient Overview) von Apache um einen Http Test Tool zu programmieren. Aufgabe des Tools ist es Anfragen über einen Testprobanden, sprich z.B. einen Proxy, an einen Server abzusetzen und die Antworten entgegen zu nehmen und auszuwerten.

Um den Testproband vollständig testen zu können, auch auf Fehler in der Anfrage hin, soll es möglich sein die Anfragen und Antworten vollständig definieren zu können. Soweit klappt das auch, lediglich bei den Header in der Anfrage habe ich ein Problem.

Das Problem ist, dass der DefaultHttpClient des Frameworks, per default, die Header *Host* und *Connection* hinzufügt. Dies würde ich gerne unterbinden um das Fehlen dieser Header im Testproband testen zu können.

Weißt jemand wie ich die Header Host und Connection ausschalten kann, sprich, den Client so einstellen kann, dass er diese Header nicht standardmäßig hinzufügt?

Gruß Taneeda


----------



## maki (21. Apr 2009)

> Ich benutze nun seit einiger Zeit das HttpClient Framework (HttpClient - HttpComponents HttpClient Overview) von Apache um einen Http Test Tool zu programmieren


Wahrscheinlich Off-Topic, aber dir ist klar das es sehr viele fertige Frameworks gibt die das leisten?


----------



## Taneeda (21. Apr 2009)

Eigentlich nicht, das mache ich von der Arbeit aus. Das Ziel ist eine Test-Datenbank mit einer Reihe bestimmter Tests für die Software aufzubauen um die Tests nicht jedesmal von Hand ausführen zu müssen.

Ich hätte natürlich auch mir selbst eine Socket-Verbindung aufbauen können und dann an den Server schicken was ich will. Das Framework habe ich genommen um das Tool gegebenenfalls um HTTPS, Authentifizierung und Cookies, etc. ... erweitern zu können.

Das Programm selbst läuft, nur diese Header müssen weg, die sind das Problem. Man soll einstellen können, ob die Host und Connection standardmäßig mitgesendet werden sollen oder nicht.

Daher auch meine Frage ob das möglich ist und wenn ja, wie man das macht. Ich suche schon eine gefühlte Ewigkeit nach einer Möglichkeit, finde aber einfach nichts.


----------



## maki (21. Apr 2009)

> Eigentlich nicht, das mache ich von der Arbeit aus. Das Ziel ist eine Test-Datenbank mit einer Reihe bestimmter Tests für die Software aufzubauen um die Tests nicht jedesmal von Hand ausführen zu müssen.


Wie gesagt, ist Off-Topic und hilft dir nicht wirklich, aber das gibt es bereits (Maven2, Ant, etc. pp.).


----------



## Taneeda (21. Apr 2009)

Was meinst du mit Off-Topic?

Ist ja schön, wenn es das schon gibt, das ist aber nicht die Antwort auf meine Frage...

Was hat Maven2 und Ant mit meinem Problem mit den Headers der HttpComponents Frameworks zu tun? Das versteh ich nicht...


----------



## Ebenius (21. Apr 2009)

Taneeda hat gesagt.:


> Was meinst du mit Off-Topic?
> 
> Ist ja schön, wenn es das schon gibt, das ist aber nicht die Antwort auf meine Frage...


:lol: Genau *das* bedeutet _off topic_; eine Bemerkung die nicht zum Thema gehört. :lol:

In anderen Worten: maki wollte Dich nur am Rande darauf hinweisen, dass es eine Menge Werkzeuge gibt, die Dich beim Testen / Verteilen / Bauen unterstützen können. Das ist nicht wirklich eine Antwort auf Deine Frage. Deswegen schrieb maki, es sei "off topic".

Ebenius


----------



## Taneeda (21. Apr 2009)

aso, dachte gerade, dass Thema würde in das Forum "Off" gehören... danke für die Erleuchtung ^^


----------



## Taneeda (21. Apr 2009)

weiß niemand eine Lösung für das Problem?


----------



## maki (22. Apr 2009)

Vielleicht hilft dir ja das hier: HttpClient - HttpClient preference architecture and configuration guide

Unter "Host configuration parameters":


> Whenever a parameter is left undefined (no value is explicitly set anywhere in the parameter hierarchy) HttpClient will use its best judgment to pick up a value. This default behavior is likely to provide the best compatibility with widely used HTTP servers.


Würde mal versuchen eiegene Werte festzulegen.


----------



## Taneeda (22. Apr 2009)

Danke für den Tip Maki. Hab mir das angesehen, hat leider auch nicht geholfen.

Mittlerweile, nach einer unendlichen Sucher in der HttpCore/HttpClient API, bin ich nun endlich auf die Ursache gestoßen.

In meiner Implementierung benutze ich den DefaultHttpClient, welcher von AbstractHttpClient erbt. Der Client benutzt nun standardmäßig einen HttpProcessor (BasicHttpProcessor). Über diesen wird das Interface HttpRequestInterceptor angesprochen. Mit dieser Schnittstelle implementiert das Framework Anforderungen des HTTP Protokolls, die verlangen, dass eine minimale HTTP Anfrage einen Host und Connection Header besitzen muss. Diese werden nun über dieses Interface zu jeder Anfrage hinzugefügt.

Um nun diese Header nicht jeder Anfrage hinzuzufügen, müssen diese Interceptors vom Client entfernt werden.


```
HttpClient client = new DefaultHttpClient();
...
/**
* RequestInterceptors adds MUST Headers (defines by the
* RFC2616) to each request/response.
* 
* RequestConnControl:    Connection header
* RequestTargetHost:    Host header
*/
((DefaultHttpClient)client).removeRequestInterceptorByClass(
    RequestConnControl.class);
((DefaultHttpClient)client).removeRequestInterceptorByClass(
    RequestTargetHost.class);
```

RequestConnControl fügt einer Anfrage den Connection Header hinzu, RequestTargetHost den Host Header. Durch entfernen dieser Interceptors werden diese Header nun auch nicht mehr den Anfragen hinzugefügt.

Damit wäre das Problem nun endlich gelöst *freu* 
Ich hoffe, die Beschreibung hilft...


----------

