我正在用netty構建一個HTTP proxy,它支持HTTP流水線。因此,我在單個通道上收到多個HttpRequest
對象並獲得匹配的對象。 HttpResponse
寫入的順序與我得到HttpRequest
的順序相同。如果編寫了HttpResponse
,則在HttpProxyHandler
收到writeComplete
事件時將寫入下一個。寫入多個http響應是否有任何限制?
管道應方便:
final ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("writer", new HttpResponseWriteDelayHandler());
pipeline.addLast("deflater", new HttpContentCompressor(9));
pipeline.addLast("handler", new HttpProxyHandler());
關於this question只寫調用的順序應該是重要的,但可以肯定我建一個處理程序(HttpResponseWriteDelayHandler
)這抑制了writeComplete
事件,直到整個響應被寫了。
爲了測試這個功能,我在Firefox中啓用了network.http.proxy.pipelining
,並訪問了一個包含許多圖像和連接的頁面(a news page)。問題是,儘管代理的日誌認爲它們已成功發送,但瀏覽器仍未收到一些響應。
我有一些研究結果:
- 只有從代理到服務器的連接比從代理到瀏覽器連接速度更快,會出現問題。
- 在該連接上發送較大圖像後,該問題發生得更多,例如, 20KB
- 的問題不會發生,如果只是
304 - Not Modified
反應被送往(清爽考慮瀏覽器緩存的頁面) - 設置
bootstrap.setOption("sendBufferSize", 1048576);
以上沒有幫助 - 睡依賴於反應機身尺寸爲一個時間段中發送
writeComplete
前在HttpResponseWriteDelayHandler
事件解決了這個問題,但是是一個非常糟糕的解決方案。