2012-03-25 3 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(). 

클라이언트는 로컬 호스트에 구글 크롬, 윈도우 7 SP1입니다 : 때때로 방법 service(Request request, Response response)는 내용 길이 헤더의 값이 수신 POST 본문의 실제 길이 차이가있는 request 매개 변수를 사용하여 호출한다 (무작위 것 같다). Google 크롬 개발 도구의 Network 탭에서 요청 본문이 완전히 전송 된 것을 볼 수 있습니다. 그래서 나는 문제의 원인이 서버라고 생각한다.

작은 요청 (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(""); 
    } 
} 

답변