package fr.leogomes.http;
import static io.netty.handler.codec.http.HttpHeaderNames.CONNECTION;
import static io.netty.handler.codec.http.HttpResponseStatus.CONTINUE;
import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;
import java.util.concurrent.TimeUnit;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpHeaderUtil;
import io.netty.handler.codec.http.HttpHeaderValues;
import fr.leogomes.http2.Http2RequestHandler;
/**
* Handles the requests for the tiled image using HTTP 1.x as a protocol.
*
* @author Leonardo Gomes <http://leogomes.fr>
*/
public class Http1RequestHandler extends Http2RequestHandler {
boolean isKeepAlive;
@Override
protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) throws Exception {
isKeepAlive = HttpHeaderUtil.isKeepAlive(request);
if (HttpHeaderUtil.is100ContinueExpected(request)) {
ctx.write(new DefaultFullHttpResponse(HTTP_1_1, CONTINUE));
}
super.channelRead0(ctx, request);
}
@Override
protected void sendResponse(ChannelHandlerContext ctx, String streamId, int latency, FullHttpResponse response) {
HttpHeaderUtil.setContentLength(response, response.content().readableBytes());
ctx.executor().schedule(new Runnable() {
public void run() {
if (isKeepAlive) {
response.headers().set(CONNECTION, HttpHeaderValues.KEEP_ALIVE);
ctx.writeAndFlush(response);
} else {
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
}
}
}, latency, TimeUnit.MILLISECONDS);
}
}