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("");
}
}