# Ende von Stream bei HTTP-Request



## m@nu (16. Mai 2007)

hallo zusammen

zur persönlichen belustigung schreib' ich momentan einen kleinen http server.
nun bin ich auf ein problem gestossen, welches ich bis anhin nicht kannte.

wenn ich einen request per browser (FF2) an meinen server sende, "reisst" der inputstream scheinbar solange nicht ab, bis ich auf "abbrechen" in meinem browser klicke. dementsprechend wird der ganze request von meinem server auch nicht (direkt) verarbeitet.

hier der code meines client-threads:

```
/*
 * Created on 16.05.2007
 */
package net.msites.gate;

import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;


/**
 * @author Manuel Alabor
 * @version 1.0
 */
public class Client extends Thread {

    private Socket client;
    
    public Client(Socket client) {
        super(client.getRemoteSocketAddress().toString());
        this.client = client;
    }
    
    @Override
    public void run() {
        try {
            /* Input: */
            InputStreamReader in = new InputStreamReader(client.getInputStream());
            
            StringBuffer string = new StringBuffer();
            char[] buffer = new char[1];
            int l;
            while((l = in.read(buffer)) != -1) {
                string.append(buffer);
            }
            
            System.out.println(string.toString());
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
}
```

was mache ich in meiner verarbeitung falsch?
irgendwie scheint es mir ja auch logisch, dass der browser die verbindung noch aufrecht erhält (keep-alive hat der auf 300) ...
vor jahren mit VB6 autsch war das aber überhaupt kein problem. konnte trotzdem alles verarbeiten.

kennt jemand diese problematik?

besten dank im voraus & grüsse
m@nu


----------



## m@nu (16. Mai 2007)

hab jetzt mal folgendes am ende der schleife eingebaut:

```
lastChars[0] = lastChars[1];
                lastChars[1] = lastChars[2];
                lastChars[2] = lastChars[3];
                lastChars[3] = buffer[0];
                
                if(lastChars[0] == 13 && lastChars[1] == 10
                   && lastChars[2] == 13 && lastChars[3] == 10) {
                    in.close();
                    break;
                }
```

lastChars ist ein 4-er char-array.

funktioniert soweit... problematisch wird das ganze einfach, wenn von einem browser nicht die entsprechenden escape-zeichen für eine leere zeile verwendet werden (zb. nur \n statt \r\n)

ist dies wirklich die lösung oder gibts da noch was anderes?


----------



## Petroy (17. Aug 2007)

Da wird dann aber nur der Header eingesen. Ich würde gerne das ganze Request einlesen. Ist das auch irgendwie möglich?


----------



## Dante (18. Aug 2007)

hi,

sofern ein request einen body hat, muss die länge dieses bodys imho als content-length-header mitgeliefert werden. damit wüsstest du dann wie lang der ist. kann auch sein, das es da die möglichkeit von zwei leerzeilen gab um das ende zu markieren. am besten schaust du mal etwas in die doku von http/1.1

andere möglichkeit: nur http/1.0 annehmen, da gibts kein keep-alive.

header werden in http immer mittels \r\n getrennt, nur \n gibts nicht.


----------

