2012-03-25 6 views
1

Ich benutze Grizzly HTTP-Server (Grizzly-Comet-Server-2.2.1.jar). HTTP-Anfragen werden von einem Nachkomme von org.glassfish.grizzly.http.server.HttpHandler verarbeitet. Manchmal (es scheint zufällig zu sein) die Methode service(Request request, Response response) mit request Parametern aufgerufen wird, für den Wert von Content Length-Header aus dem wirklichen Länge des empfangenen POST Körpers unterscheidet:Warum ist der Inhalt von POST-Anfragen an den Grizzly-HTTP-Server unvollständig?

request.getInputStream().available() < request.getContentLength(). 

Client ist Google Chrome auf localhost, Windows 7 SP1. In Google Chrome-Entwicklungstools Netzwerk Registerkarte kann ich sehen, dass Körper der Anfrage vollständig gesendet wurde. Also ich denke Ursache des Problems ist Server.

Es passiert sowohl für große Anfragen (40Kb) entweder für kleine (150b).

Ich versuchte warten (Thread sleep) für kleine Zeit in Service-Methode und für eine große Menge an Zeit zu, es hat nicht geholfen. Ich habe verschiedene Einstellungen für HTTP-Server (z. B. IO-Strategie) ohne Erfolg ausprobiert.

Warum eine Anfrage abgebrochen ist und wie kann ich das beheben?

-Code für den Start-Server:

private HttpServer startServer() { 
    final HttpServer server = new HttpServer(); 
    final NetworkListener listener = new NetworkListener("grizzly", "localhost", new PortRange(57777)); 

    server.addListener(listener); 
    listener.setMaxPendingBytes(1); 
    listener.getFileCache().setEnabled(false); 
    listener.setChunkingEnabled(true);   
    listener.registerAddOn(new CometAddOn()); 

    final Transport transport = listener.getTransport(); 
    transport.setReadBufferSize(100000); 

    final MyHttpHandler httpHandler = new MyHttpHandler(); 
    server.getServerConfiguration().addHttpHandler(httpHandler, "/"); 

    try { 
     server.start(); 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 

    return server; 
} 

Handler selbst

public class MyHttpHandler extends HttpHandler { 

    protected static Logger log = Logger.getLogger(MyHttpHandler.class); 

    public void service(Request 
      request, Response 
      response) throws Exception { 

     if (request.getInputStream().available() != request.getContentLength()) { 
      log.error("broken content section: only " + request.getInputStream().available() + " of " + 
        request.getContentLength() + "bytes."); 
     } 
     response.setContentLength(0); 
     response.getWriter().write(""); 
    } 
} 

Antwort

Verwandte Themen