2012-03-25 59 views
1

我正在使用Grizzly HTTP服務器(grizzly-comet-server-2.2.1.jar)。 HTTP請求由org.glassfish.grizzly.http.server.HttpHandler的後裔處理。有時(它似乎是隨機的)的方法service(Request request, Response response)調用與request參數爲哪些內容長度報頭值,從接收到的POST體的真實長度不同:爲什麼POST請求到Grizzly HTTP服務器的身體不完整?

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

Client是谷歌瀏覽器在本地主機上時,Windows 7 SP1。在谷歌瀏覽器開發工具網絡標籤中,我可以看到請求的主體已完全發送。所以我認爲問題的原因是服務器。

這對於大型請求(40Kb)或小型(150b)都會發生。

我試過了等待(線程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(""); 
    } 
} 

回答

相關問題