为什么对Grizzly HTTP服务器的POST请求主体不完整?

时间:2012-03-25 06:59:34

标签: java http post grizzly

我正在使用Grizzly HTTP服务器(grizzly-comet-server-2.2.1.jar)。 HTTP请求由org.glassfish.grizzly.http.server.HttpHandler的后代处理。有时(似乎是随机的)使用service(Request request, Response response)参数调用方法request,其内容长度标题的值与接收的POST正文的实际长度不同:

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

客户端是localhost,Windows 7 SP1上的Google Chrome。在谷歌浏览器开发工具网络选项卡中,我可以看到请求主体已完全发送。所以我认为问题的原因是服务器。

对于小型(150b),大型请求(40Kb)都会发生。

我尝试在服务方法内等待很长时间(线程sleep),并且在很长一段时间内也没有帮助。我尝试了不同的HTTP服务器设置(例如,IO策略),但也没有成功。

为什么请求被破坏,我该如何解决?

启动服务器的代码:

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;
}

处理程序本身

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

0 个答案:

没有答案