2012-04-17 1 views
2

Я хотел бы сделать своего рода прокси-сервер в netty. Цель состоит в том, чтобы иметь возможность веб-браузера делать HTTP-запросы на нетто-сервере, передавать их на серверный сервер, а также принимать определенные действия на основе конкретных HTTP-запросов.Несколько обработчиков в netty

Существует несколько полезных нетто-изображений, HexDumpProxy (который выполняет прокси-часть, агностик для протокола), и я взял всего лишь код из HttpSnoopServerHandler.

Мой код выглядит это прямо сейчас: HexDumpProxyInboundHandler можно найти на 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 
    } 
} 

К сожалению messageReceived в HttpSnoopServerHandler никогда не вызывается - похоже HexDumpProxyInboundHandler потребляет все события.

Как я могу использовать два обработчика, в которых один из них требует декодера, а другой нет (я бы предпочел использовать HexDumpProxy, где он не нуждается в понимании HTTP, он просто проксирует все соединения , но перед моим HttpSnoopHandler должен быть HttpRequestDecoder)?

ответ

1

Я не пробовал, но вы можете расширить HexDumpProxyInboundHandler и переопределить messageReceived с чем-то вроде

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

В качестве альтернативы можно изменить HexDumpProxyInboundHandler непосредственно к тому, что последняя вещь messageReceived делает это вызов super.messageReceived (CTX, е).

Это будет работать только для входящих данных от клиента. Данные из службы, которой вы являетесь прокси-сервером, все равно будут переданы без вашего просмотра кода.

+0

Я пробовал это, и это намного ближе к тому, что я хочу, но все еще есть проблема. Большинство запросов проксированы правильно, но некоторые из них заканчивают отменой первых нескольких сотен байт, что приводит к недействительному запросу на серверный сервер (и страница не отображает или не возвращается вообще). Похоже, HttpRequestDecoder потребляет часть запроса, прежде чем прокси-сервер сможет его отправить. – user1229043

+0

Между кодом, который записывает буфер в сеть и HttpRequestDecoder, может быть условие гонки, поскольку оба они будут манипулировать одним и тем же объектом буфера. Попробуйте отправить либо завернутую версию, либо копию исходного буфера вверх по течению. – johnstlr

+0

Он работает, когда я изменяю HexDumpProxyInboundHandler для выполнения outboundChannel.write (msg.copy()) или outboundChannel.write (msg.duplicate()), я не уверен, в чем разница, чтобы знать, какой из них использовать, я опубликовал другое вопрос по адресу http://stackoverflow.com/questions/10215001/whats-the-difference-between-channelbuffer-copy-and-channelbuffer-duplicate – user1229043