# Ende eines HTTP Response/Request



## Kalkulon (1. Mrz 2010)

Ich will überprüfen, ob ein HTTP Request oder Response schon abgeschlossen wurde. Gibt es ein Zeichen, was das Ende eines HTTP Response/Request markiert?


----------



## ice-breaker (1. Mrz 2010)

\r\n\r\n

bei Post gilt aber meine ich erst das 2. Vorkommen


----------



## Dow Jones (1. Mrz 2010)

Nein, ein einzelnes Zeichen gibt es leider nicht. Du musst erstmal den Header des Request/Response einlesen (endet mit einer Leerzeile, also mit "\r\n\r\n" oder mit "\n\n") und dann austüfteln wie viele Bytes noch für den Body folgen. Wie das bei HTTP/1.1 offiziell funktionieren sollte steht in RFC2616.

Kurz gefasst:
1) prüfen ob überhaupt ein Body vorgesehen ist
2) das Feld Transfer-Encoding prüfen ob chunked-encoding benutzt wird
3) das Feld Content-Length prüfen ob eine Länge in Bytes angegeben ist
4) das Feld Content-Type prüfen ob multipart/byteranges angegeben ist
5) wenn nichts davon zutrifft: Daten einlesen bis die Verbindung geschlossen wird




			
				RFC2616 hat gesagt.:
			
		

> 4.4 Message Length
> 
> The transfer-length of a message is the length of the message-body as it appears in the message; that is, after any transfer-codings have been applied. When a message-body is included with a message, the transfer-length of that body is determined by one of the following (in order of precedence):
> 
> ...


Zitiert aus RFC2616 - HTTP/1.1: HTTP Message - 4.4 Message Length


----------



## Kalkulon (1. Mrz 2010)

Vielen dank!


----------



## Unregestriert (2. Mrz 2010)

Ich greif mal das Thema auf...

Hier mal ein mini bsp.:


```
ServerSocket ss = new ServerSocket(1337);
		Socket s = ss.accept();
		BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
		String line = null;
		while ((line = in.readLine()) != null)
			System.out.println(line);
		System.out.println("done");
```

Das Programm bleibt immer in der while schleife hängen...völlig egal was ich mache.

Auch das abbrechen wenn \n\n oder \r\n\r\n kommt funktioniert, da der Stream einfach so nicht endet.


----------



## SlaterB (2. Mrz 2010)

wenn man sich einfache Beispiele im Netz anschaut,
Google
->
Single File HTTP Server Java code example - Click here to copy ->>>
Http Server : Web ServerTiny ApplicationJava
so haben die oftmals etwas in der Richtung von \r\n

anderenfalls eben warten, ist ja nicht so schlimm, ohne ordentliches Protokoll kann der Client keine saubere Verarbeitung verlangen,
wenn man den Socket in einem separaten Thread nach einer bestimmten Zeit beendet, dürften auch solche Schleifen irgendwann abbrechen


----------



## Dow Jones (2. Mrz 2010)

Prinzipiell sollte deine Methode schon richtig sein. Versuch mal statt !=null ein ! line.isEmpty(), damit müsstest du auf jeden Fall einen Http-Header sauber einlesen können. Null wird von readline nur bei EOF zurückgeliefert, ansonsten blockiert der Aufruf solange bis neue Daten anliegen. Und da die allermeisten Httpserver Keep-Alive unterstützen würde deine Schleife auf einen Timeout der Verbinfung warten (das kann durchaus ein paar Minuten dauern) um dann vermutlich mit einer IOException nach dir zu werfen.

Mit dem "\n\n" bzw. "\r\n\r\n" im obigen Post waren übrigens die letzten _Zeichen_ eines Headers gemeint, nicht die letzten _Zeilen_. Ein Header sähe also beispielsweise so aus:

```
HTTP/1.1 200 OK\r\n
Connection: Keep-Alive\r\n
\r\n
```
Da readline() aber ohnehin eine komplette Textzeile einliest (und dabei die Zeilenende-Kennung \n bzw. \r\n auch gleich abschneidet) müsste dein Code mit ! line.isEmpty() eigentlich klappen.


----------

