Problem beim Lesen in der servlet-request-body

Ich bin das schreiben eines HTTP-proxy, der Teil einer Prüfung/überprüfung
system. Der proxy filtert alle Anfragen von dem client-Gerät
und lenkt Sie in die Richtung der verschiedenen Systeme unter test.

Den proxy ist als ein servlet implementiert, wo jeder Anfrage weitergeleitet wird
an das target-system, es behandelt beide GET und POST. Manchmal dem
Antwort vom Zielsystem geändert, um zu passen, verschiedene test
Bedingungen, aber das ist nicht ein Teil des Problems.

Beim weiterleiten einer Anfrage-Header kopiert werden, außer für diejenigen, die
das ist ein Teil des eigentlichen HTTP-transfer, wie Content-Length und
Verbindungs-Header.

Wenn die Anforderung eine HTTP-POST, dann der entity-body der Anfrage ist
weitergeleitet als auch, und hier ist, wo es nicht funktioniert, manchmal.

Den code Lesen den einheitentext von der servlet-Anfrage ist die folgende:

URL url = new URL(targetURL);
HttpURLConnection conn  = (HttpURLConnection)url.openConnection();
String method = request.getMethod();

java.util.Enumeration headers = request.getHeaderNames();
while(headers.hasMoreElements()) {

    String headerName = (String)headers.nextElement();
    String headerValue = request.getHeader(headerName);

    if (...) { //do various adaptive stuff based on header 

    }

    conn.setRequestProperty(headerName, headerValue);
}

//hier ist der Teil, der fehlschlägt

char postBody[] = new char[1024];
int len;

if(method.equals("POST")) {
    logger.debug("guiProxy, handle post, read request body");
    conn.setDoOutput(true);

    BufferedReader br = request.getReader();
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));

    do {
        logger.debug("Read request into buffer of size: " + postBody.length);

        len = br.read(postBody, 0, postBody.length);
        logger.debug("guiProxy, send request body, got " + len + " bytes from request");

        if(len != -1) {
            bw.write(postBody, 0, len);
        }
    } while(len != -1);
    bw.close();
}

Also, was happends, ist, dass das erste mal ein POST eingegangen ist, -1
Zeichen gelesen werden, von der Anfrage-reader, ein wireshark-trace zeigt
dass die Entität Körper mit URL-encoded post-Parameter gibt es
und es ist in einem TCP-segment, so ist es kein Netzwerk verbunden
Unterschiede.

Zweiten mal, br.Lesen erfolgreich gibt die 232 bytes in der
POST-request entity body und jede kommende Anfrage so gut funktioniert.

Der einzige Unterschied zwischen der ersten und der anstehenden POST-requests ist
dass in den ersten ein, keine cookies vorhanden sind, aber in der zweiten,
ein cookie vorhanden ist, die Karten auf den JSESSION.

Kann es eine Nebenwirkung von entity-Körper nicht vorhanden, da der
request-Verarbeitung im servlet-container schon hat Lesen Sie den BEITRAG
Parameter, aber warum funktioniert es auf anstehende Anforderungen.

Ich glaube, die Lösung ist natürlich zu ignorieren, die Einheit Körper auf
POST-requests mit URL-kodierte Daten und abrufen aller Parameter
von der servlet-Anfrage statt mit getParameter und legen Sie Sie erneut ein
int die ausgehende Anfrage.

Obwohl, das ist schwierig, da die POST-Anforderung enthalten könnte, BEKOMMEN
Parameter, die nicht in unsere Anwendung jetzt, aber die Umsetzung ist es
richtig ist einige Arbeit.

Also meine Frage ist im Grunde: warum müssen die Leser aus
Anfrage.getReader() -1 zurück, wenn das Lesen-und ein einheitentext wird
präsentieren in der Anfrage, wenn der entity-body ist nicht verfügbar
Lesen, dann getReader werfen sollte, einen illegalen Zustand Ausnahme. Ich
habe auch versucht mit InputStream mit getInputStream() mit dem gleichen
Ergebnisse.

All dies ist getestet auf apache-tomcat-6.0.18.

InformationsquelleAutor Ernelli | 2010-08-06
Schreibe einen Kommentar