2012-03-25 11 views
1

私はGrizzly HTTPサーバ(grizzly-comet-server-2.2.1.jar)を使用しています。 HTTP要求はorg.glassfish.grizzly.http.server.HttpHandlerの子孫によって処理されます。Grizzly HTTPサーバへのPOSTリクエストの本文が不完全なのはなぜですか?

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

クライアントは、ローカルホスト上のGoogle Chromeの、Windows 7のSP1です:たまに方法service(Request request, Response response)がコンテンツ長ヘッダーの値が受信POST本体の実際の長さが異なっているためrequestパラメータで呼び出される(ランダムのようです)。 Google Chromeの開発ツールの[ネットワーク]タブでは、要求の本文が完全に送信されたことがわかります。だから私は問題の原因がサーバーだと思う。

大きな要求(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(""); 
    } 
} 

答えて

関連する問題