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