2012-09-11 83 views
0

我注意到在Netty 4.0.0 alpha版本中,HTTP響應對象有一個方法來測試分塊(isChunked())。在3.5.7.Final版本中,只有請求對象有一個方法來測試分塊。使用3.5.7.Final我怎樣才能閱讀大塊的迴應?下面的代碼用於4.0.0 alpha測試:Netty,如何閱讀chunked HTTP響應而不使用4.0.0 alpha版本之一?

@Override 
public void messageReceived(ChannelHandlerContext context, MessageEvent event) throws Exception { 

    try { 
     log.trace("Message received"); 

     if (newMessage) { 
      log.trace("New message"); 
      HttpResponse response = (HttpResponse) event.getMessage(); 
      log.trace("STATUS: [{}], VERSION [{}]", response.getStatus(), response.getProtocolVersion()); 

      if (!response.getHeaderNames().isEmpty()) { 
       for (String name: response.getHeaderNames()) { 
        for (String value: response.getHeaders(name)) { 
         log.trace("HEADER: [{}] = [{}]", name, value); 
        } 
       } 
      } 
      newMessage = false; 
      if (response.isChunked()) { 
       requestContentStream = new ByteArrayOutputStream(); 
       readingChunks = true; 
       log.trace("CHUNKED CONTENT {"); 
       return; 
      } else { 
       log.trace("Request not chunked"); 
       writeNonChunkedData(response); 
       responseComplete(event); 
       return; 
      } 
     } else if (readingChunks) { 
      log.trace("Reading chunks"); 
      HttpChunk chunk = (HttpChunk) event.getMessage(); 
      if (chunk.isLast()) { 
       log.trace("Read last chunk"); 
       readingChunks = false; 
       writeChunkedData(); 
       responseComplete(event); 
       return; 
      } else { 
       log.trace("Buffering chunk content to byte buffer"); 
       requestContentStream.write(chunk.getContent().array()); 
       return; 
      } 
     } else { 
      log.error("Error handling of MessageEvent, expecting a new message or a chunk from a previous message"); 
      //setError(context, INTERNAL_SERVER_ERROR); 
      super.messageReceived(context, event); 
     } 
    }catch (Exception ex) { 
     log.error("Exception: [{}]", ex); 
     //setError(context, INTERNAL_SERVER_ERROR); 
     super.messageReceived(context, event); 
    } 
} 

回答