Frage

Sie suchen ein wenig Hilfe, ich habe derzeit einen HTTP-Server geschrieben. Es ist derzeit Griffe GET-Anforderungen in Ordnung. Während jedoch mit POST die gepufferte Leser scheint zu hängen. Wenn die Anforderung, den Rest des Eingangsstroms gestoppt wird über das gepufferten Lesegerät abgelesen. Ich habe ein paar Dinge auf Google gefunden. Ich habe versucht, 1.0 die CRLF und die Protokollversion von 1.1 zu wechseln (Browser automatisch Anfragen in als 1.1) Irgendwelche Ideen oder Hilfe würden geschätzt. Dank

War es hilfreich?

Lösung 3

Das ist nicht sicher! Aber zeigt, wie die POST-Daten während eines Input Stream zu erhalten, nachdem die anfänglichen HTTP-Header.

Dies auch funktioniert nur für die Daten POST kommen in als "Beispiel = true & schlecht = false" etc.

private HashMap hashMap = new HashMap();
private StringBuffer buff = new StringBuffer();
private int c = 0;
private String[] post;    public PostInputStream(InputStream in) {

    try {
        //Initalizes avaliable buff
        if (in.available() != 0) {
            this.buff.appendCodePoint((this.c = in.read()));
            while (0 != in.available()) {
                //Console.output(buff.toString());
                buff.appendCodePoint((this.c = in.read()));
            }

            this.post = buff.toString().split("&");

            for (int i = 0; i < this.post.length; i++) {
                String[] n = this.post[i].split("=");
                if (n.length == 2) {
                    hashMap.put(URLDecoder.decode(n[0], "UTF-8"), URLDecoder.decode(n[1], "UTF-8"));
                } else {
                    Console.error("Malformed Post Request.");
                }
            }
        } else {
            Console.error("No POST Data");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Andere Tipps

ich mit Hans einverstanden, dass Sie einen Standard und gut getestet Bibliothek verwenden sollten, dies zu tun. wenn Sie einen Server jedoch schreiben über HTTP zu lernen, hier einige Informationen zu tun, was Sie tun wollen.

Sie können nicht wirklich einen BufferedReader verwenden, da sie die Eingangspuffer und möglicherweise zu viele Bytes aus der Fassung lesen. Deshalb Code hängt, ist der BufferedReader versucht, mehr Bytes zu lesen, als auf dem Sockel zur Verfügung steht (da die POST-Daten keine Zeilenende haben), und es wird für mehr Bytes warten (die nie verfügbar sein wird) .

Der Prozess einfach eine POST-Anforderung zu analysieren ist die Input direkt verwenden

  
      
  • Für jede Zeile im Header   lesen Sie ein Byte zu einem Zeitpunkt, bis Sie ein '\ r' und dann ein '\ n'

  •   
  • Suchen Sie nach einer Zeile, die beginnt mit "Content-Length". Extrahieren Sie die Nummer am Ende der Zeile

  •   
  • Wenn Sie eine Kopfzeile erhalten, die leer ist, sind Sie mit Header getan.

  •   
  • Jetzt genau die Anzahl der gelesenen Bytes, die aus dem Content-Length-Header kam.

  •   

Jetzt können Sie Ihre Antwort schreiben.

würde meine eigene Implementierung nicht schreiben. Blick auf die folgenden vorhandenen Komponenten, wenn Sie wollen:

Wie karoroberts gesagt, Sie haben die Länge des Inhalts in der POST gesendet zu überprüfen. Aber Sie können noch BufferedReader verwenden.

müssen nur Karo für die Content-Length-Header für die Größe von ihr und nach Fertigstellung all Header Lesen Sie einen char-Array dieser Größe festlegen und das Lesen des POST Inhalts machen:

char [] buffer = new char [ContentLength]; request.read (Puffer);

Wo Anfrage ist der BufferedReader. Wenn Sie den POST-Inhalt in einem String benötigen, können Sie verwenden: String.valueOf (Puffer);

. Hinweis: BufferedReader.read gibt ein int der Charaktere readed, so dass man dort mit den Content-Length-Header auf Inkonsistenzen überprüfen könnte

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top