package org.jboss.resteasy.plugins.server.netty;
import org.jboss.netty.buffer.ChannelBufferInputStream;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandler.Sharable;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.oneone.OneToOneDecoder;
import org.jboss.resteasy.core.SynchronousDispatcher;
import org.jboss.resteasy.plugins.server.netty.i18n.LogMessages;
import org.jboss.resteasy.plugins.server.netty.i18n.Messages;
import org.jboss.resteasy.specimpl.ResteasyHttpHeaders;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.ResteasyUriInfo;
/**
* This {@link OneToOneDecoder} is responsible for decode {@link org.jboss.netty.handler.codec.http.HttpRequest}
* to {@link NettyHttpRequest}'s
*
* This implementation is {@link Sharable}
*
* @author Norman Maurer
*
*/
@Sharable
public class RestEasyHttpRequestDecoder extends OneToOneDecoder
{
private final SynchronousDispatcher dispatcher;
private final String servletMappingPrefix;
private final String proto;
private final boolean isKeepAlive;
public enum Protocol
{
HTTPS,
HTTP
}
public RestEasyHttpRequestDecoder(SynchronousDispatcher dispatcher, String servletMappingPrefix, Protocol protocol, boolean isKeepAlive)
{
this.dispatcher = dispatcher;
this.servletMappingPrefix = servletMappingPrefix;
if (protocol == Protocol.HTTP)
{
proto = "http";
}
else
{
proto = "https";
}
this.isKeepAlive = isKeepAlive;
}
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception
{
if (!(msg instanceof org.jboss.netty.handler.codec.http.HttpRequest))
{
return msg;
}
org.jboss.netty.handler.codec.http.HttpRequest request = (org.jboss.netty.handler.codec.http.HttpRequest) msg;
boolean keepAlive = org.jboss.netty.handler.codec.http.HttpHeaders.isKeepAlive(request) & isKeepAlive;
NettyHttpResponse response = new NettyHttpResponse(channel, keepAlive, request.getMethod());
ResteasyHttpHeaders headers = null;
ResteasyUriInfo uriInfo = null;
try
{
headers = NettyUtil.extractHttpHeaders(request);
uriInfo = NettyUtil.extractUriInfo(request, servletMappingPrefix, proto);
HttpRequest nettyRequest = new NettyHttpRequest(headers, uriInfo, request.getMethod().getName(), dispatcher, response, org.jboss.netty.handler.codec.http.HttpHeaders.is100ContinueExpected(request) );
ChannelBufferInputStream is = new ChannelBufferInputStream(request.getContent());
nettyRequest.setInputStream(is);
return nettyRequest;
}
catch (Exception e)
{
response.sendError(400);
// made it warn so that people can filter this.
LogMessages.LOGGER.warn(Messages.MESSAGES.failedToParseRequest(), e);
return null;
}
}
}