Java tutorial
/* * Copyright 2018 Shinya Mochida * * Licensed under the Apache License,Version2.0(the"License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing,software * Distributed under the License is distributed on an"AS IS"BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.http.hello; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.codec.http.*; import lombok.extern.slf4j.Slf4j; import java.nio.charset.StandardCharsets; import java.util.concurrent.atomic.AtomicInteger; @Slf4j public class HttpHelloServerHandler extends ChannelInboundHandlerAdapter { private static final byte[] CONTENT = "Hello ( )?".getBytes(StandardCharsets.UTF_8); private final AtomicInteger counter = new AtomicInteger(0); private final Object hasher = new Object(); private int current = 0; @Override public void channelRead(final ChannelHandlerContext ctx, final Object msg) { log.info("request coming[{}, hash: {}]: {}", current, hasher.hashCode(), msg); current = counter.incrementAndGet(); if (msg instanceof HttpRequest) { final HttpRequest request = (HttpRequest) msg; if (HttpUtil.is100ContinueExpected(request)) { ctx.write(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.CONTINUE)); } final DefaultFullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, Unpooled.wrappedBuffer(CONTENT)); response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain"); response.headers().set(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes()); final boolean keepAlive = HttpUtil.isKeepAlive(request); if (keepAlive) { ctx.write(response).addListener(ChannelFutureListener.CLOSE); } else { response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); ctx.write(response); } } } @Override public void channelReadComplete(final ChannelHandlerContext ctx) { log.info("complete[{}, hash: {}]", current, hasher.hashCode()); ctx.flush(); } @Override public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) throws Exception { super.exceptionCaught(ctx, cause); } }