2012-04-17 9 views
2

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を持つ必要があります)?

答えて

1

私はそれを試していませんでしたが、あなたはHexDumpProxyInboundHandlerを拡張し、代わりにあなたはmessageReceivedが行う最後のことは、電子、CTX(super.messageReceivedを呼び出していることに直接HexDumpProxyInboundHandlerを変更することができ

super.messageReceived(ctx, e); 
ctx.sendUpstream(e); 

ようなものでmessageReceivedをオーバーライドすることができます)。

これは、クライアントからの着信データに対してのみ機能します。プロキシを送信しているサービスのデータは、コードを見ずにそのまま渡されます。

+0

私はそれを試みました、そして、私が望むものにはるかに近いですが、まだ問題があります。ほとんどの要求は正しくプロキシされていますが、最初の数百バイトが切り捨てられ、バックエンドサーバーへの無効なリクエストが発生します(ページがレンダリングされない、またはまったく返されません)。それは、HttpRequestDecoderがプロキシがそれを送る前にいくつかのリクエストを消費しているようです。 – user1229043

+0

バッファをネットワークに書き込むコードとHttpRequestDecoderが同じバッファオブジェクトを操作するため、競合状態が発生する可能性があります。ラップされたバージョンまたは元のバッファーのコピーを上流に送信してみてください。 – johnstlr

+0

outboundChannel.write(msg.copy())またはoutboundChannel.write(msg.duplicate())を実行するためにHexDumpProxyInboundHandlerを変更すると動作しますが、どちらを使用するかを知ることがわかりません。質問:http://stackoverflow.com/questions/10215001/whats-the-difference-between-channelbuffer-copy-and-channelbuffer-duplicate – user1229043

関連する問題