2014-12-19 57 views
3

我正在使用Netty編寫一個簡單的反向代理。因爲我不想處理的原始字節自己,我已經添加了一個請求解碼器和目標聚集到處理管道,以及一個響應編碼器,最後我自己的處理程序,像這樣如何在netty中處理大於1024字節的http請求?

ChannelPipeline p = ch.pipeline(); 
p.addLast(new HttpRequestDecoder()); 
p.addLast(new HttpObjectAggregator(MAX_CONTENT_LENGTH)); 
p.addLast(new HttpResponseEncoder()); 
p.addLast(new FrontendHandler(...)); 

FrontendHandler延伸SimpleChannelInboundHandler<HttpRequest>,所以它有一個

// Start reading as soon as a request comes in... 
public void channelActive(ChannelHandlerContext ctx) { 
    ctx.read(); 
} 

protected void channelRead0(ChannelHandlerContext ctx, HttpRequest request) { 
    // copy request, fix headers, forward to backend server 
} 

會發生什麼情況是,服務器掛起,如果收到請求時瓦亭大於1024字節(例如,它有一些餅乾)。通過一些試驗和錯誤,我發現如果我在處理程序上設置ChannelOption.AUTO_READ一切正常,所以它看起來像我的舊代碼丟失了ctx.read()調用某處,但我不知道在哪裏。如果我這樣做

@Override 
public void channelReadComplete(ChannelHandlerContext ctx) { 
    ctx.read(); 
} 

然後我得到了channelRead0內部異常,似乎被處理的是一個仍然是不完整的HTTP請求,哪一種違背了使用請求解碼器/對象聚合的目的是原因。我錯過了什麼?

+0

查收這可能有幫助... http://stackoverflow.com/questions/10170564/in-netty-we-can-only-write -and-接收數據低於1024bytes知識,我們燦WRI/11373405#11373405 –

回答

0

我不知道HttpObjectAggregator是否可以處理分塊消息。你可以嘗試使用HttpChunkAggregator,是這樣的:

pipeline.addLast("decoder", new HttpRequestDecoder(4096, 4096, 100*1024*1024)); 
    pipeline.addLast("aggregator", new HttpChunkAggregator(100*1024*1024)); 
    pipeline.addLast("encoder", new HttpResponseEncoder()); 
    pipeline.addLast("hndlr", new FrontendHandler(...));