@Override protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer, VoidEnum state) throws Exception { // Discard all data received if closing handshake was received before. if (receivedClosingHandshake) { buffer.skipBytes(actualReadableBytes()); return null; } // Decode a frame otherwise. byte type = buffer.readByte(); if ((type & 0x80) == 0x80) { // If the MSB on type is set, decode the frame length return decodeBinaryFrame(type, buffer); } else { // Decode a 0xff terminated UTF-8 string return decodeTextFrame(buffer); } }
replaceDecoder(channel, new WebSocket00FrameDecoder(getMaxFramePayloadLength()));
private WebSocketFrame decodeTextFrame(ChannelBuffer buffer) throws TooLongFrameException { int ridx = buffer.readerIndex(); int rbytes = actualReadableBytes(); int delimPos = buffer.indexOf(ridx, ridx + rbytes, (byte) 0xFF); if (delimPos == -1) {
channel, res, new WebSocket00FrameEncoder(), new WebSocket00FrameDecoder(getMaxFramePayloadLength()));
@Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent event) throws Exception { if (!handshakeCompleted) { HttpResponse response = (HttpResponse) event.getMessage(); final HttpResponseStatus status = new HttpResponseStatus(101, "Web Socket Protocol Handshake"); final boolean validStatus = response.getStatus().equals(status); final boolean validUpgrade = response.headers().get(Names.UPGRADE).equals(Values.WEBSOCKET); final boolean validConnection = response.headers().get(Names.CONNECTION).equals(Values.UPGRADE); if (!validStatus || !validUpgrade || !validConnection) { throw new NettyWebSocketException("Invalid handshake response"); } handshakeCompleted = true; ctx.getPipeline().replace("decoder", "ws-decoder", new WebSocket00FrameDecoder()); listener.onConnect(this); return; } if (event.getMessage() instanceof HttpResponse) { HttpResponse response = (HttpResponse) event.getMessage(); throw new NettyWebSocketException("Unexpected HttpResponse (status=" + response.getStatus() + ", content=" + response.getContent().toString(CharsetUtil.UTF_8) + ")"); } WebSocketFrame frame = (WebSocketFrame) event.getMessage(); listener.onMessage(this, frame); }
@SuppressWarnings("rawtypes") private void replaceListeners(ChannelHandlerContext context) { int maxFrameSize = engine.getEngineConfiguration().getMaxFrameSize(); boolean maskClientMessagePayload = true; boolean maskServerMessagePayload = false; WebsocketConnector connector = (WebsocketConnector) context.getAttachment(); String wsVersion = connector.getWebsocketVersion(); ReplayingDecoder decoder = null; OneToOneEncoder encoder = null; if (wsVersion.equals(WebsocketVersions.HYBI_13.getVersionCode())) { decoder = new WebSocket13FrameDecoder(maskClientMessagePayload, true, maxFrameSize); encoder = new WebSocket13FrameEncoder(maskServerMessagePayload); } else if (wsVersion.equals(WebsocketVersions.HYBI_10.getVersionCode())) { decoder = new WebSocket08FrameDecoder(maskClientMessagePayload, true, maxFrameSize); encoder = new WebSocket08FrameEncoder(maskServerMessagePayload); } else if (wsVersion.equals(WebsocketVersions.HIXIE_76.getVersionCode())) { decoder = new WebSocket00FrameDecoder((long) maxFrameSize); encoder = new WebSocket00FrameEncoder(); } ChannelPipeline pipeline = context.getChannel().getPipeline(); pipeline.replace("decoder", "wsDecoder", decoder); pipeline.replace("encoder", "wsEncoder", encoder); pipeline.remove("aggregator"); }