package net.md_5.bungee.http;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.HttpContent;
import io.netty.handler.codec.http.HttpObject;
import io.netty.handler.codec.http.HttpResponse;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.LastHttpContent;
import java.nio.charset.Charset;
import lombok.RequiredArgsConstructor;
import net.md_5.bungee.api.Callback;
@RequiredArgsConstructor
public class HttpHandler extends SimpleChannelInboundHandler<HttpObject>
{
private final Callback<String> callback;
private final StringBuilder buffer = new StringBuilder();
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception
{
try
{
callback.done( null, cause );
} finally
{
ctx.channel().close();
}
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception
{
if ( msg instanceof HttpResponse )
{
HttpResponse response = (HttpResponse) msg;
int responseCode = response.getStatus().code();
if ( responseCode == HttpResponseStatus.NO_CONTENT.code() )
{
done( ctx );
return;
}
if ( responseCode != HttpResponseStatus.OK.code() )
{
throw new IllegalStateException( "Expected HTTP response 200 OK, got " + response.getStatus() );
}
}
if ( msg instanceof HttpContent )
{
HttpContent content = (HttpContent) msg;
buffer.append( content.content().toString( Charset.forName( "UTF-8" ) ) );
if ( msg instanceof LastHttpContent )
{
done( ctx );
}
}
}
private void done(ChannelHandlerContext ctx)
{
try
{
callback.done( buffer.toString(), null );
} finally
{
ctx.channel().close();
}
}
}