HTTP パイプラインをサポートする netty を使用してHTTP プロキシを構築しています。したがってHttpRequest
、1 つのチャネルで複数のオブジェクトを受け取り、一致するHttpResponse
オブジェクトを取得しました。HttpResponse
書き込みの順序は、私が取得したものと同じですHttpRequest
。a が書き込まれた場合、がイベントを受け取るHttpResponse
と、次のものが書き込まれます。HttpProxyHandler
writeComplete
パイプラインは便利なはずです:
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());
この質問に関しては、書き込み呼び出しの順序のみが重要ですが、応答全体が書き込まれるまでイベントHttpResponseWriteDelayHandler
を抑制する別の Handler ( ) を確実に作成します。writeComplete
これをテストするために、私network.http.proxy.pipelining
は Firefox で有効にして、多くの画像と接続を含むページ (ニュース ページ) にアクセスしました。問題は、プロキシのログが正常に送信されたと見なしているにもかかわらず、ブラウザーが一部の応答を受信しないことです。
いくつかの発見があります:
- この問題は、プロキシからサーバーへの接続がプロキシからブラウザへの接続よりも高速な場合にのみ発生します。
- この問題は、その接続でより大きな画像 (20kB など) を送信した後に、より頻繁に発生します。
304 - Not Modified
応答のみが送信された場合 (ブラウザのキャッシュを考慮してページを更新)、問題は発生しません。- 設定
bootstrap.setOption("sendBufferSize", 1048576);
以上では役に立たない writeComplete
イベントを送信する前に、応答本文のサイズに応じた時間枠をスリープ状態にHttpResponseWriteDelayHandler
することで問題は解決しますが、これは非常に悪い解決策です。