2013-09-24 2 views
2

"일반"html 페이지뿐 아니라 큰 파일도 제공하는 HTTP-Server (Netty 사용)를 구현하려고합니다. 따라서, 내 파이프 라인 내에 HttpContentCompressor뿐만 아니라 ChunkedWriteHandler을 사용하고 싶습니다.Netty - ChunkedWriteHandler와 HttpContentCompressor를 결합하는 방법

pipeline.addLast("decoder", new HttpRequestDecoder()); 
pipeline.addLast("aggregator", new HttpObjectAggregator(1048576)); 
pipeline.addLast("encoder", new HttpResponseEncoder()); 
pipeline.addLast("chunkedWriter", new ChunkedWriteHandler()); 
pipeline.addLast("deflater", new HttpContentCompressor()); 
pipeline.addLast(new NettyHandler()); 

NettyHandler는이 계획 다음 : 다음과 같이

현재,이 파이프 라인이 초기화 나는/요청 (내 테스트 파일은 약 500 바이트입니다) 작은 파일을 보낼 경우

@Override 
public void channelRead(final ChannelHandlerContext context, final Object message) throws Exception { 
    try { 
     if (message instanceof HttpRequest) { 
      final HttpRequest request = (HttpRequest) message; 
      final HttpContext httpContext = new HttpContext(request, context); 
      final ChannelFuture future = handleHttpMessage(httpContext); 
      httpContext.closeOn(future); 
     } 
    } finally { 
     ReferenceCountUtil.release(message); 
    } 
} 


private ChannelFuture handleHttpMessage(final HttpContext context) { 
    //writing to the wire via ChannelHandlerContext.write(...) 
    return context.getChannelContext().writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT); 
} 

을, 모든 것이 잘 작동합니다. 그러나 요청한 파일이 커질수록 (350MB 정도의 테스트 파일) 브라우저는 크롬과 파이어 폭스로 테스트 한 결과받은 신체의 인코딩 된 부분에 관한 문제를보고합니다. 크롬 ERR_CONTENT_DECODING_FAILED라고, 파이어 폭스는 source file could not be read 같은 것을 말한다.

나는 근본적으로 잘못된 것을하고 있습니까? 실시간으로 파이프 라인을 조작해야합니까? 어떤 도움을 주셔서 미리 감사드립니다!

답변

3

HttpContentCompressor가 ByteBuf 인스턴스를 인식하지 못하기 때문에 작성된 청크를 DefaultHttpContent로 래핑해야합니다.

ByteBuf 인스턴스를 처리하는 방법을 알고있는 ChannelPipeline에 특별한 HttpContentCompressor를 배치하면됩니다. 이런 식으로 뭔가 :

https://github.com/eclipse/vert.x/blob/compress/vertx-core/src/main/java/org/vertx/java/core/http/impl/HttpChunkContentCompressor.java

당신이 ChunkedWriteHandler 앞에 배치해야합니다.

+0

up2date를 자원 : https://github.com/eclipse/이 매우 간단하다 vert.x/blob/master/src/main/java/io/vertx/core/http/impl/HttpChunkContentCompressor.java –

1

위의 답변은 완전히 정확합니다. 링크가 죽은 것 같다 그러나, 여기에 또 다른 방법은 다음과 같습니다

대신 다운 스트림 ByteBuf 유형 의 ChunkedInput을 보내는 입력 HttpContent의 ChunkedInput에 어댑터와 함께 포장.

구현 : 내가 깊이 좀 더 솔루션을 설명하는 짧은 블로그 포스트를 작성 https://github.com/scireum/sirius/blob/develop/web/src/sirius/web/http/ChunkedInputAdapter.java

: http://andreas.haufler.info/2014/01/making-http-content-compression-work-in.html