# Jakarta HTTPClient



## Johannes.L (6. Mai 2007)

Hi,

wie kann ich denn am besten unterscheiden ob es sich bei einer Resource um Binärdaten oder halt String-Literale handelt, also letztendlich bspw. um (X)HTML, CSS oder was auch immer und Bildern? Muss ich da alle Möglichkeiten im Content-Type Header abklappern oder geht das auch besser?

Viele Grüsse,
Johannes


----------



## kleiner_held (6. Mai 2007)

Den Content-Type Header musst du schon beachten, aber nicht alle Möglichkeiten abklappern. Der Content-Type besteht ja aus Medientype/Subtype. Nur wenn der Medientype text ist, kannst du mit Strings arbeiten (unabhängig vom Subtype), ansonsten immer nur binär.


----------



## Johannes L. (6. Mai 2007)

kleiner_held hat gesagt.:
			
		

> Den Content-Type Header musst du schon beachten, aber nicht alle Möglichkeiten abklappern. Der Content-Type besteht ja aus Medientype/Subtype. Nur wenn der Medientype text ist, kannst du mit Strings arbeiten (unabhängig vom Subtype), ansonsten immer nur binär.



Danke, irgendwie klappt es leider noch nicht. Ich will den Stream an den Client weiterleiten bzw. mache das Byteweise (soll ein Proxy werden):


```
to_client = new PrintWriter(client.getOutputStream(),true);

...

if(getMethod.getResponseHeader("Content-Type").getValue().startsWith("text"))
{
	logger.debug("Content-Type: text");
	to_client.print(getMethod.getResponseBodyAsString());
	to_client.flush();
}
else //if(getMethod.getResponseHeader("Content-Type").getValue().startsWith("image"))
{
	InputStream in = getMethod.getResponseBodyAsStream();
						
	int currentByte;
						
	while((currentByte = in.read()) != -1) 
	{
		to_client.print(currentByte);
		to_client.flush();		
	}
}
```


----------



## kleiner_held (6. Mai 2007)

"Es klappt nicht" ist weder eine Frage noch eine aussagekräftige Fehlermeldung :!:

Abgesehen davon darfst du natürlich beim Senden von binären Daten an den Client nicht in den PrintWriter schreiben, sondern du musst direkt auf dem OutputStream (client.getOutputStream()) arbeiten (outputStream.write(...)).
Ansonsten ist es auch schneller wenn Du nicht jedes Byte einzeln liest und schreibst, sondern einen byte Array als Puffer verwendest.


----------



## Johannes L. (6. Mai 2007)

kleiner_held hat gesagt.:
			
		

> "Es klappt nicht" ist weder eine Frage noch eine aussagekräftige Fehlermeldung :!:
> 
> Abgesehen davon darfst du natürlich beim Senden von binären Daten an den Client nicht in den PrintWriter schreiben, sondern du musst direkt auf dem OutputStream (client.getOutputStream()) arbeiten (outputStream.write(...)).
> Ansonsten ist es auch schneller wenn Du nicht jedes Byte einzeln liest und schreibst, sondern einen byte Array als Puffer verwendest.



Ah danke, jetzt ist lediglich noch die Zeichenkodierung ab und zu falsch. Laut <http://jakarta.apache.org/commons/httpclient/charencodings.html> sollte die getResponseBodyAsString()-Methode die richtige Kodierung aus dem Content-Type Header holen, falls vorhanden. Komisch, dass das im Falle von bspw. dict.leo.org nicht klappt:

```
johannes@antares:~> telnet dict.leo.org 80
Trying 83.220.155.8...
Connected to dict.leo.org.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.0 200 OK
Server: PAWS ElB-1.43
Content-Type: text/html; charset=ISO-8859-15
Date: Sun, 6 May 2007 21:21:47 GMT
Content-Length: 33524

Connection closed by foreign host.
```
Da werden die Umlaute nicht richtig angezeigt, das gleiche bei bspw. iks-jena.de, wobei da per Default iso-8859-1 genutzt werden sollte.


----------



## kleiner_held (7. Mai 2007)

Um das richtige Encoding zu verwenden musst du deinen PrintWriter so initialisieren:

```
String encoding = "ISO-8859-15"; // hier das Encoding aus dem ResponseHeader extrahieren
to_client = new PrintWriter(new OutputStreamWriter(new client.getOutputStream(), encoding),true);
```
Denn da du (nehme ich mal an) dem client dann auch den Encoding ResponseHeader weiterreichts, muss natuerlich auch dein OutputStream entsprechend codierte Strings enthalten. 
Wenn du uebrigens nur einen Proxy bauen willst und dich der Inhalt einer "text/*" Response garnicht interessiert, kannst Du auch in diesem Fall einfach die Binaerdaten durchreichen, also Dir die Unterscheidung in Text- und Binaerdaten komplett sparen.


----------

