我正在使用 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().
客户端是本地主机上的 Google Chrome,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("");
}
}