package org.robotninjas.riemann.pubsub; import org.jboss.netty.channel.*; import org.jboss.netty.handler.codec.http.HttpResponse; import org.jboss.netty.handler.codec.http.websocketx.*; import org.jboss.netty.util.CharsetUtil; class WebSocketClientHandler extends SimpleChannelHandler { private final WebSocketClientHandshaker handshaker; private final QueryResultListener listener; public WebSocketClientHandler(WebSocketClientHandshaker handshaker, QueryResultListener listener) { this.handshaker = handshaker; this.listener = listener; } @Override public void channelConnected(final ChannelHandlerContext ctx, final ChannelStateEvent e) throws Exception { final ChannelFuture handshake = handshaker.handshake(e.getChannel()); handshake.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { if (future.isDone() && future.isSuccess()) { Channels.fireChannelConnected(ctx, e.getChannel().getRemoteAddress()); } } }); } @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { Channel ch = ctx.getChannel(); if (!handshaker.isHandshakeComplete()) { handshaker.finishHandshake(ch, (HttpResponse) e.getMessage()); return; } if (e.getMessage() instanceof HttpResponse) { HttpResponse response = (HttpResponse) e.getMessage(); throw new Exception("Unexpected HttpResponse (status=" + response.getStatus() + ", content=" + response.getContent().toString(CharsetUtil.UTF_8) + ')'); } WebSocketFrame frame = (WebSocketFrame) e.getMessage(); if (frame instanceof TextWebSocketFrame) { TextWebSocketFrame textFrame = (TextWebSocketFrame) frame; listener.handleResult(textFrame.getText()); } else if (frame instanceof CloseWebSocketFrame) { ch.close(); } else if (frame instanceof PingWebSocketFrame) { ch.write(new PongWebSocketFrame(frame.getBinaryData())); } } }