nettyにロギングプロキシを作成したいと思います。目標は、WebブラウザがHTTPリクエストをネッティサーバーに送信し、バックエンドWebサーバーに渡すだけでなく、HTTP固有のものに基づいて特定のアクションを実行できるようにすることです。複数のハンドラがネッテイにある
HexDumpProxy(プロトコルには依存しないプロキシの部分を実行します)があり、HttpSnoopServerHandlerからちょっとしたコードを取りました。
私のコードは今、この権利のようになります。 HexDumpProxyInboundHandlerは残念ながらHttpSnoopServerHandlerにmessageReceived http://docs.jboss.org/netty/3.2/xref/org/jboss/netty/example/proxy/HexDumpProxyInboundHandler.html
//in HexDumpProxyPipelineFactory
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline p = pipeline(); // Note the static import.
p.addLast("handler", new HexDumpProxyInboundHandler(cf, remoteHost, remotePort));
p.addLast("decoder", new HttpRequestDecoder());
p.addLast("handler2", new HttpSnoopServerHandler());
return p;
}
//HttpSnoopServerHandler
public class HttpSnoopServerHandler extends SimpleChannelUpstreamHandler {
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
HttpRequest request = (HttpRequest) e.getMessage();
System.out.println(request.getUri());
//going to do things based on the URI
}
}
で見つけることができると呼ばれることは決してありません - HexDumpProxyInboundHandlerは、すべてのイベントを消費ように思えます。
どのように2つのハンドラを持つことができますか?そのうちの1つはデコーダを必要としますが、もう1つはありません(私はむしろHexDumpProxyをそのまま持ちます、HTTPを理解する必要はありません。 、しかし私のHttpSnoopHandlerはそれの前にHttpRequestDecoderを持つ必要があります)?
私はそれを試みました、そして、私が望むものにはるかに近いですが、まだ問題があります。ほとんどの要求は正しくプロキシされていますが、最初の数百バイトが切り捨てられ、バックエンドサーバーへの無効なリクエストが発生します(ページがレンダリングされない、またはまったく返されません)。それは、HttpRequestDecoderがプロキシがそれを送る前にいくつかのリクエストを消費しているようです。 – user1229043
バッファをネットワークに書き込むコードとHttpRequestDecoderが同じバッファオブジェクトを操作するため、競合状態が発生する可能性があります。ラップされたバージョンまたは元のバッファーのコピーを上流に送信してみてください。 – johnstlr
outboundChannel.write(msg.copy())またはoutboundChannel.write(msg.duplicate())を実行するためにHexDumpProxyInboundHandlerを変更すると動作しますが、どちらを使用するかを知ることがわかりません。質問:http://stackoverflow.com/questions/10215001/whats-the-difference-between-channelbuffer-copy-and-channelbuffer-duplicate – user1229043