X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-rest-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fstreams%2Fwebsockets%2FWebSocketServerHandler.java;h=26e4936d3f27d0d20e3875fe051335d79beae3be;hb=0e7b83c0739ac579ca6dbf6a3f7992f70eb3000f;hp=618ee57abab305668d069f7a6031cc0fabc8d8f5;hpb=273a60e4a5c67c9d6dab1889f86e15092ddbefbd;p=controller.git diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/streams/websockets/WebSocketServerHandler.java b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/streams/websockets/WebSocketServerHandler.java index 618ee57aba..26e4936d3f 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/streams/websockets/WebSocketServerHandler.java +++ b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/streams/websockets/WebSocketServerHandler.java @@ -33,14 +33,21 @@ import org.opendaylight.controller.sal.streams.listeners.Notificator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * {@link WebSocketServerHandler} is implementation of + * {@link SimpleChannelInboundHandler} which allow handle + * {@link FullHttpRequest} and {@link WebSocketFrame} messages. + */ public class WebSocketServerHandler extends SimpleChannelInboundHandler { - private static final Logger logger = LoggerFactory.getLogger(WebSocketServerHandler.class); + private static final Logger logger = LoggerFactory + .getLogger(WebSocketServerHandler.class); private WebSocketServerHandshaker handshaker; @Override - protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { + protected void channelRead0(final ChannelHandlerContext ctx, final Object msg) + throws Exception { if (msg instanceof FullHttpRequest) { handleHttpRequest(ctx, (FullHttpRequest) msg); } else if (msg instanceof WebSocketFrame) { @@ -48,17 +55,28 @@ public class WebSocketServerHandler extends SimpleChannelInboundHandler } } - private void handleHttpRequest(ChannelHandlerContext ctx, FullHttpRequest req) - throws Exception { + /** + * Checks if HTTP request method is GET and if is possible to decode HTTP + * result of request. + * + * @param ctx + * ChannelHandlerContext + * @param req + * FullHttpRequest + */ + private void handleHttpRequest(final ChannelHandlerContext ctx, + final FullHttpRequest req) throws Exception { // Handle a bad request. if (!req.getDecoderResult().isSuccess()) { - sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1, BAD_REQUEST)); + sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1, + BAD_REQUEST)); return; } // Allow only GET methods. if (req.getMethod() != GET) { - sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1, FORBIDDEN)); + sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1, + FORBIDDEN)); return; } @@ -68,8 +86,10 @@ public class WebSocketServerHandler extends SimpleChannelInboundHandler listener.addSubscriber(ctx.channel()); logger.debug("Subscriber successfully registered."); } else { - logger.error("Listener for stream with name '{}' was not found.", streamName); - sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1, INTERNAL_SERVER_ERROR)); + logger.error("Listener for stream with name '{}' was not found.", + streamName); + sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HTTP_1_1, + INTERNAL_SERVER_ERROR)); } // Handshake @@ -77,18 +97,29 @@ public class WebSocketServerHandler extends SimpleChannelInboundHandler getWebSocketLocation(req), null, false); handshaker = wsFactory.newHandshaker(req); if (handshaker == null) { - WebSocketServerHandshakerFactory.sendUnsupportedWebSocketVersionResponse(ctx.channel()); + WebSocketServerHandshakerFactory.sendUnsupportedVersionResponse(ctx.channel()); } else { handshaker.handshake(ctx.channel(), req); } } - private static void sendHttpResponse(ChannelHandlerContext ctx, - HttpRequest req, FullHttpResponse res) { + /** + * Checks response status, send response and close connection if necessary + * + * @param ctx + * ChannelHandlerContext + * @param req + * HttpRequest + * @param res + * FullHttpResponse + */ + private static void sendHttpResponse(final ChannelHandlerContext ctx, + final HttpRequest req, final FullHttpResponse res) { // Generate an error page if response getStatus code is not OK (200). if (res.getStatus().code() != 200) { - ByteBuf buf = Unpooled.copiedBuffer(res.getStatus().toString(), CharsetUtil.UTF_8); + ByteBuf buf = Unpooled.copiedBuffer(res.getStatus().toString(), + CharsetUtil.UTF_8); res.content().writeBytes(buf); buf.release(); setContentLength(res, res.content().readableBytes()); @@ -101,10 +132,22 @@ public class WebSocketServerHandler extends SimpleChannelInboundHandler } } - private void handleWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) throws IOException { + /** + * Handles web socket frame. + * + * @param ctx + * {@link ChannelHandlerContext} + * @param frame + * {@link WebSocketFrame} + */ + private void handleWebSocketFrame(final ChannelHandlerContext ctx, + final WebSocketFrame frame) throws IOException { if (frame instanceof CloseWebSocketFrame) { - handshaker.close(ctx.channel(), (CloseWebSocketFrame) frame.retain()); - String streamName = Notificator.createStreamNameFromUri(((CloseWebSocketFrame) frame).reasonText()); + handshaker.close(ctx.channel(), + (CloseWebSocketFrame) frame.retain()); + String streamName = Notificator + .createStreamNameFromUri(((CloseWebSocketFrame) frame) + .reasonText()); ListenerAdapter listener = Notificator.getListenerFor(streamName); if (listener != null) { listener.removeSubscriber(ctx.channel()); @@ -113,21 +156,29 @@ public class WebSocketServerHandler extends SimpleChannelInboundHandler Notificator.removeListenerIfNoSubscriberExists(listener); return; } else if (frame instanceof PingWebSocketFrame) { - ctx.channel().write(new PongWebSocketFrame(frame.content().retain())); + ctx.channel().write( + new PongWebSocketFrame(frame.content().retain())); return; } } @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) + public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) throws Exception { if (cause instanceof java.nio.channels.ClosedChannelException == false) { - //cause.printStackTrace(); + // cause.printStackTrace(); } ctx.close(); } - private static String getWebSocketLocation(HttpRequest req) { + /** + * Get web socket location from HTTP request. + * + * @param req + * HTTP request from which the location will be returned + * @return String representation of web socket location. + */ + private static String getWebSocketLocation(final HttpRequest req) { return "http://" + req.headers().get(HOST) + req.getUri(); }