Forward http message as is

Leandro Cruz leandro.saad at gmail.com
Mon Jan 11 12:44:07 EST 2010


Hi Ron.
Do you have the complete source code for your example?

--
Leandro Rodrigo Saad Cruz


On Fri, Jan 8, 2010 at 9:25 PM, rzo <rzo at gmx.de> wrote:

>  Hello,
>
> I tried a few times to create an entry on the jboss wiki.
> But it hangs every time I click the create new entry.
>
> I am therefore including it here:
>
> Netty Example: implementing a simple WAF (Web Application Firewall)
> This example shows how to implement a simple WAF (Web Application Firewall<http://de.wikipedia.org/wiki/Web_Application_Firewall>)
> using netty.
> For this we create a proxy server which receives the http requests. If  the
> request is ok, the "bytes"
> received are forwarded to the web server.
>
> As starting point we use the HexDumpProxy example which comes with the
> netty distribution.
> We adapt the PipelineFactory from the example by adding the InterceptStart,
> HttpDecoder and InterceptStop handlers.
>
>  public class WafPipelineFactory implements ChannelPipelineFactory {         private final ClientSocketChannelFactory cf;
> private final String remoteHost;     private final int remotePort;
>     public WafPipelineFactory(ClientSocketChannelFactory cf, String
> remoteHost, int remotePort) {         this.cf = cf;
> this.remoteHost = remoteHost;         this.remotePort = remotePort;     }
>          public ChannelPipeline getPipeline() throws Exception {
>         ChannelPipeline pipeline = pipeline();            *pipeline.addLast("interceptStart", new InterceptStart());
> *            * pipeline.addLast("decoder", new HttpRequestDecoder());* *            pipeline.addLast("aggregator", new
> HttpChunkAggregator(1048576));* *
> pipeline.addLast("interceptStop", new InterceptStop());*
> pipeline.addLast("handler", new HexDumpProxyInboundHandler(cf, remoteHost,
> remotePort));
>             return pipeline;         }     }
> InterceptStart intercepts all incoming messages and makes a copy into a
> local buffer
>
>  public class InterceptStart extends SimpleChannelUpstreamHandler {
>     ChannelBuffer buf = null;          @Override      public void
> messageReceived(ChannelHandlerContext ctx, MessageEvent evt) throws
> Exception      {          ChannelBuffer m = (ChannelBuffer)
> evt.getMessage();          ChannelBuffer buf = (ChannelBuffer)
> ctx.getAttachment();          if (buf == null)          {              //
> if this is a new connection create a new buffer and attach it to the context
>          buf = dynamicBuffer();              ctx.setAttachment(buf);
>      }          // copy the incoming bytes to the buffer
>  m.markReaderIndex();          buf.writeBytes(m);
>  m.resetReaderIndex();          // send the buffer further upstream to the
> HttpDecoder          super.messageReceived(ctx, evt);         } }
> InterceptStop receives the http request, analyzes it, and if ok gets the
> copy buffer from InterceptStart and forwards it to the http proxy
>
>  public class InterceptStop extends SimpleChannelUpstreamHandler {
>             @Override              public void
> messageReceived(ChannelHandlerContext ctx, MessageEvent evt) {
>      if (evt.getMessage() != null)                  {
>  HttpRequest request = (HttpRequest) evt.getMessage();
>  // make sure that the http request is complete
>                     // this may not be necessary ??
>                      if (request.getContentLength() == 0 ||
> request.getContentLength() == request.getContent().writerIndex())
>              {                      ChannelBuffer buf = (ChannelBuffer)
> ctx.getPipeline().getContext("interceptStart").getAttachment();
>          if (buf == null)                      {
>  System.out.println("this should not happen");                      }
>                  else if (buf.writerIndex() != 0)                      {
>                        // check the request                           if (
> ! wafCheck(request))                           {
>             // bad request -> close the channel
>          cts.getChannel.close();
>  return;                             }
>  // request is ok, remove the copy the interceptor
>      ctx.getPipeline().getContext("interceptStart").setAttachment(null);
>                         // forward the buffer to the proxy
>             ctx.sendUpstream(new UpstreamMessageEvent(evt.getChannel(), buf,
> evt.getRemoteAddress()));                      }                      }
>                  }                 } }
> To check the http request one may use the OWASP Stinger Project<http://www.owasp.org/index.php/Category:OWASP_Stinger_Project>or a similar framework.
> Since these frameworks generally analyze a HttpServletRequest<http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.html>we need an
> adapter <http://en.wikipedia.org/wiki/Adapter_pattern> to adapt to the
> netty HttpRequest.
> Implementing the adapter is straight forward.
>
>
>
>
>
> _______________________________________________
> netty-users mailing list
> netty-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/netty-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/netty-users/attachments/20100111/30750026/attachment.html 


More information about the netty-users mailing list