package org.jboss.resteasy.plugins.server.netty;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder;
import io.netty.handler.codec.http.HttpHeaders.Names;
import io.netty.handler.codec.http.HttpHeaders.Values;
import io.netty.handler.codec.http.HttpResponse;
import io.netty.handler.codec.http.LastHttpContent;
import java.util.List;
import java.util.Map;
import javax.ws.rs.ext.RuntimeDelegate;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
/**
* {@link MessageToMessageEncoder} implementation which encodes {@link org.jboss.resteasy.spi.HttpResponse}'s to
* {@link HttpResponse}'s
*
* This implementation is {@link Sharable}
*
* @author Norman Maurer
*
*/
@Sharable
public class RestEasyHttpResponseEncoder extends MessageToMessageEncoder<NettyHttpResponse>
{
@Override
protected void encode(ChannelHandlerContext ctx, NettyHttpResponse nettyResponse, List<Object> out) throws Exception
{
nettyResponse.getOutputStream().flush();
if (nettyResponse.isCommitted()) {
out.add(LastHttpContent.EMPTY_LAST_CONTENT);
} else {
HttpResponse response = nettyResponse.getDefaultHttpResponse();
out.add(response);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void transformHeaders(NettyHttpResponse nettyResponse, HttpResponse response, ResteasyProviderFactory factory)
{
if(nettyResponse.isKeepAlive())
{
response.headers().set(Names.CONNECTION, Values.KEEP_ALIVE);
}
else
{
response.headers().set(Names.CONNECTION, Values.CLOSE);
}
for (Map.Entry<String, List<Object>> entry : nettyResponse.getOutputHeaders().entrySet())
{
String key = entry.getKey();
for (Object value : entry.getValue())
{
RuntimeDelegate.HeaderDelegate delegate = factory.getHeaderDelegate(value.getClass());
if (delegate != null)
{
response.headers().add(key, delegate.toString(value));
}
else
{
response.headers().set(key, value.toString());
}
}
}
}
}