Example usage for io.netty.handler.codec.http.websocketx WebSocketFrame isFinalFragment

List of usage examples for io.netty.handler.codec.http.websocketx WebSocketFrame isFinalFragment

Introduction

In this page you can find the example usage for io.netty.handler.codec.http.websocketx WebSocketFrame isFinalFragment.

Prototype

public boolean isFinalFragment() 

Source Link

Document

Flag to indicate if this frame is the final fragment in a message.

Usage

From source file:com.tc.websocket.server.handler.WebSocketServerHandler.java

License:Apache License

/**
 * Handle web socket frame.//from w ww  . java2s.c  o m
 *
 * @param ctx the ctx
 * @param frame the frame
 */
private void handleWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) {

    try {

        // Check for closing frame
        if (frame instanceof CloseWebSocketFrame) {
            dominoServer.onClose(this.newWrapper(ctx));
            handshaker.close(ctx.channel(), (CloseWebSocketFrame) frame.retain());
            return;

        }
        if (frame instanceof PingWebSocketFrame) {
            ctx.channel().write(new PongWebSocketFrame(frame.content().retain()));
            return;
        }

        if (frame instanceof PongWebSocketFrame) {
            return;//do nothing.

        }

        if (frame instanceof TextWebSocketFrame) {
            String message = ((TextWebSocketFrame) frame).text();
            textBuffer.append(message);
        } else if (frame instanceof ContinuationWebSocketFrame) {
            textBuffer.append(((ContinuationWebSocketFrame) frame).text());
        }

        if (frame.isFinalFragment()) {
            dominoServer.onMessage(this.newWrapper(ctx), textBuffer.toString());
            textBuffer = new StringBuilder();
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

From source file:com.yeetor.androidcontrol.WSSocketHandler.java

License:Open Source License

private void handlerWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) {
    // ?/*w  w  w .  ja  v  a 2 s.c o  m*/
    if (frame instanceof CloseWebSocketFrame) {
        handshaker.close(ctx.channel(), (CloseWebSocketFrame) frame.retain());
        return;
    }
    // ?ping?
    if (frame instanceof PingWebSocketFrame) {
        ctx.channel().write(new PongWebSocketFrame(frame.content().retain()));
        return;
    }

    if (frame instanceof TextWebSocketFrame) {
        if (event != null) {
            event.onTextMessage(ctx, ((TextWebSocketFrame) frame).text());
        }
    } else if (frame instanceof BinaryWebSocketFrame || frame instanceof ContinuationWebSocketFrame) {
        if (event != null) {
            ByteBuf byteBuf = frame.content();
            byte[] bytes = new byte[byteBuf.readableBytes()];
            byteBuf.getBytes(0, bytes);
            binaryCache = ArrayUtils.addAll(binaryCache, bytes);
            if (frame.isFinalFragment()) {
                byte[] b = binaryCache;
                binaryCache = new byte[0];
                event.onBinaryMessage(ctx, b);
            }
        }
    }
}

From source file:com.yeetor.server.handler.WSHandler.java

License:Open Source License

private void handlerWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) {
    // ?//from  w ww .ja  v  a2s  .co  m
    if (frame instanceof CloseWebSocketFrame && handshaker != null) {
        handshaker.close(ctx.channel(), (CloseWebSocketFrame) frame.retain());
        if (eventListener != null) {
            eventListener.onDisconnect(ctx);
        }
        return;
    }
    // ?ping?
    if (frame instanceof PingWebSocketFrame) {
        ctx.channel().write(new PongWebSocketFrame(frame.content().retain()));
        return;
    }

    if (frame instanceof TextWebSocketFrame) {
        if (eventListener != null) {
            eventListener.onTextMessage(ctx, ((TextWebSocketFrame) frame).text());
        }
    } else if (frame instanceof BinaryWebSocketFrame || frame instanceof ContinuationWebSocketFrame) {
        ByteBuf byteBuf = frame.content();
        byte[] bytes = new byte[byteBuf.readableBytes()];
        byteBuf.getBytes(0, bytes);
        binaryCache = ArrayUtils.addAll(binaryCache, bytes);
        if (frame.isFinalFragment()) {
            byte[] b = binaryCache;
            binaryCache = new byte[0];
            if (eventListener != null) {
                eventListener.onBinaryMessage(ctx, b);
            }
        }
    }
}

From source file:de.saxsys.synchronizefx.netty.websockets.ByteBufToWebSocketFrameCodec.java

License:Open Source License

@Override
protected void decode(final ChannelHandlerContext ctx, final WebSocketFrame msg, final List<Object> out)
        throws Exception {
    if (msg instanceof BinaryWebSocketFrame) {
        ByteBuf content = msg.content();
        // the content is passed to other handlers so they need to be retained.
        content.retain();//from   ww  w.j  a va 2s  . c o  m
        fragments.add(content);
        if (msg.isFinalFragment()) {
            if (fragments.size() == 1) {
                out.add(fragments.get(0));
            } else {
                ByteBuf[] array = fragments.toArray(BYTE_BUF_TYPE);
                out.add(Unpooled.wrappedBuffer(array));
            }
            fragments.clear();
        }
    } else if (msg instanceof TextWebSocketFrame) {
        LOG.warn("Recieved a Websocket text frame. This was not expected. Ignoring it.");
    }
}

From source file:io.vertx.core.http.impl.Http1xConnectionBase.java

License:Open Source License

WebSocketFrameInternal decodeFrame(WebSocketFrame msg) {
    ByteBuf payload = safeBuffer(msg, chctx.alloc());
    boolean isFinal = msg.isFinalFragment();
    FrameType frameType;/*from  w w  w.j a va  2  s  .c om*/
    if (msg instanceof BinaryWebSocketFrame) {
        frameType = FrameType.BINARY;
    } else if (msg instanceof CloseWebSocketFrame) {
        frameType = FrameType.CLOSE;
    } else if (msg instanceof PingWebSocketFrame) {
        frameType = FrameType.PING;
    } else if (msg instanceof PongWebSocketFrame) {
        frameType = FrameType.PONG;
    } else if (msg instanceof TextWebSocketFrame) {
        frameType = FrameType.TEXT;
    } else if (msg instanceof ContinuationWebSocketFrame) {
        frameType = FrameType.CONTINUATION;
    } else {
        throw new IllegalStateException("Unsupported websocket msg " + msg);
    }
    return new WebSocketFrameImpl(frameType, payload, isFinal);
}

From source file:nikoladasm.aspark.server.ServerHandler.java

License:Open Source License

private void handleWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception {
    WebSocketContextImpl wctx = ctx.channel().attr(WEBSOCKET_CONTEXT_ATTR_KEY).get();
    WebSocketHandler wsHandler = ctx.channel().attr(WEBSOCKET_HANDLER_ATTR_KEY).get();
    if (frame instanceof CloseWebSocketFrame) {
        WebSocketServerHandshaker handshaker = ctx.channel().attr(HANDSHAKER_ATTR_KEY).get();
        if (handshaker != null) {
            frame.retain();/* w w w. java2 s  . c om*/
            handshaker.close(ctx.channel(), (CloseWebSocketFrame) frame);
            if (wsHandler != null) {
                ctx.channel().attr(WEBSOCKET_HANDLER_ATTR_KEY).remove();
                ctx.channel().attr(WEBSOCKET_CONTEXT_ATTR_KEY).remove();
                String reason = ((CloseWebSocketFrame) frame).reasonText();
                int statusCode = ((CloseWebSocketFrame) frame).statusCode();
                wsHandler.onClose(wctx, statusCode, reason);
            }
        } else {
            ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
        }
        return;
    }
    if (wsHandler == null)
        return;
    if (frame instanceof PingWebSocketFrame) {
        frame.content().retain();
        ctx.channel().writeAndFlush(new PongWebSocketFrame(frame.content()));
        return;
    }
    if (frame instanceof PongWebSocketFrame) {
        return;
    }
    if (frame instanceof TextWebSocketFrame) {
        wctx.textFrameBegin(true);
        String request = ((TextWebSocketFrame) frame).text();
        if (frame.isFinalFragment()) {
            wsHandler.onMessage(wctx, request);
        } else {
            wctx.stringBuilder().append(request);
        }
        return;
    }
    if (frame instanceof BinaryWebSocketFrame) {
        wctx.textFrameBegin(false);
        byte[] request = new byte[((BinaryWebSocketFrame) frame).content().readableBytes()];
        ((BinaryWebSocketFrame) frame).content().readBytes(request);
        if (frame.isFinalFragment()) {
            wsHandler.onMessage(wctx, request);
        } else {
            wctx.frameBuffer().writeBytes(request);
        }
        return;
    }
    if (frame instanceof ContinuationWebSocketFrame) {
        if (wctx.textFrameBegin()) {
            String request = ((ContinuationWebSocketFrame) frame).text();
            wctx.stringBuilder().append(request);
            if (frame.isFinalFragment()) {
                wsHandler.onMessage(wctx, wctx.stringBuilder().toString());
                wctx.stringBuilder(new StringBuilder());
            }
        } else {
            byte[] request = new byte[((BinaryWebSocketFrame) frame).content().readableBytes()];
            ((BinaryWebSocketFrame) frame).content().readBytes(request);
            wctx.frameBuffer().writeBytes(request);
            if (frame.isFinalFragment()) {
                request = new byte[wctx.frameBuffer().readableBytes()];
                wctx.frameBuffer().readBytes(request);
                wsHandler.onMessage(wctx, request);
                wctx.frameBuffer().clear();
            }
        }
        return;
    }
}

From source file:org.asynchttpclient.netty.handler.WebSocketHandler.java

License:Open Source License

private void handleFrame(Channel channel, WebSocketFrame frame, WebSocketUpgradeHandler handler,
        NettyWebSocket webSocket) throws Exception {
    if (frame instanceof CloseWebSocketFrame) {
        Channels.setDiscard(channel);
        CloseWebSocketFrame closeFrame = (CloseWebSocketFrame) frame;
        webSocket.onClose(closeFrame.statusCode(), closeFrame.reasonText());
        Channels.silentlyCloseChannel(channel);
    } else {/*from ww  w. ja v  a 2s. co  m*/
        ByteBuf buf = frame.content();
        if (buf != null && buf.readableBytes() > 0) {
            HttpResponseBodyPart part = config.getResponseBodyPartFactory().newResponseBodyPart(buf,
                    frame.isFinalFragment());
            handler.onBodyPartReceived(part);

            if (frame instanceof BinaryWebSocketFrame) {
                webSocket.onBinaryFragment(part);
            } else if (frame instanceof TextWebSocketFrame) {
                webSocket.onTextFragment(part);
            } else if (frame instanceof PingWebSocketFrame) {
                webSocket.onPing(part);
            } else if (frame instanceof PongWebSocketFrame) {
                webSocket.onPong(part);
            }
        }
    }
}

From source file:org.asynchttpclient.netty.handler.WebSocketProtocol.java

License:Open Source License

@Override
public void handle(Channel channel, NettyResponseFuture<?> future, Object e) throws Exception {

    if (e instanceof HttpResponse) {
        HttpResponse response = (HttpResponse) e;
        Channels.setAttribute(channel, new UpgradeCallback(future, channel, response));

    } else if (e instanceof WebSocketFrame) {

        final WebSocketFrame frame = (WebSocketFrame) e;
        WebSocketUpgradeHandler handler = WebSocketUpgradeHandler.class.cast(future.getAsyncHandler());
        NettyWebSocket webSocket = NettyWebSocket.class.cast(handler.onCompleted());
        invokeOnSucces(channel, handler);

        if (webSocket != null) {
            if (frame instanceof CloseWebSocketFrame) {
                Channels.setDiscard(channel);
                CloseWebSocketFrame closeFrame = CloseWebSocketFrame.class.cast(frame);
                webSocket.onClose(closeFrame.statusCode(), closeFrame.reasonText());
            } else {
                ByteBuf buf = frame.content();
                if (buf != null && buf.readableBytes() > 0) {
                    try {
                        NettyResponseBodyPart part = nettyConfig.getBodyPartFactory().newResponseBodyPart(buf,
                                frame.isFinalFragment());
                        handler.onBodyPartReceived(part);

                        if (frame instanceof BinaryWebSocketFrame) {
                            webSocket.onBinaryFragment(part);
                        } else if (frame instanceof TextWebSocketFrame) {
                            webSocket.onTextFragment(part);
                        } else if (frame instanceof PingWebSocketFrame) {
                            webSocket.onPing(part);
                        } else if (frame instanceof PongWebSocketFrame) {
                            webSocket.onPong(part);
                        }/*from www .  j a  v a  2s .com*/
                    } finally {
                        buf.release();
                    }
                }
            }
        } else {
            logger.debug("UpgradeHandler returned a null NettyWebSocket ");
        }
    } else {
        logger.error("Invalid message {}", e);
    }
}

From source file:org.asynchttpclient.providers.netty.handler.WebSocketProtocol.java

License:Apache License

@Override
public void handle(Channel channel, NettyResponseFuture<?> future, Object e) throws Exception {
    WebSocketUpgradeHandler h = WebSocketUpgradeHandler.class.cast(future.getAsyncHandler());
    Request request = future.getRequest();

    if (e instanceof HttpResponse) {
        HttpResponse response = (HttpResponse) e;
        HttpResponseStatus status = new ResponseStatus(future.getURI(), response, config);
        HttpResponseHeaders responseHeaders = new ResponseHeaders(future.getURI(), response.headers());

        if (handleResponseFiltersReplayRequestAndExit(channel, future, status, responseHeaders)) {
            return;
        }//from w  w w. j a va2  s. c om

        future.setHttpHeaders(response.headers());
        if (handleRedirectAndExit(request, future, response, channel))
            return;

        boolean validStatus = response.getStatus().equals(SWITCHING_PROTOCOLS);
        boolean validUpgrade = response.headers().get(HttpHeaders.Names.UPGRADE) != null;
        String c = response.headers().get(HttpHeaders.Names.CONNECTION);
        if (c == null) {
            c = response.headers().get(HttpHeaders.Names.CONNECTION.toLowerCase(Locale.ENGLISH));
        }

        boolean validConnection = c != null && c.equalsIgnoreCase(HttpHeaders.Values.UPGRADE);

        status = new ResponseStatus(future.getURI(), response, config);
        final boolean statusReceived = h.onStatusReceived(status) == STATE.UPGRADE;

        if (!statusReceived) {
            try {
                h.onCompleted();
            } finally {
                future.done();
            }
            return;
        }

        final boolean headerOK = h.onHeadersReceived(responseHeaders) == STATE.CONTINUE;
        if (!headerOK || !validStatus || !validUpgrade || !validConnection) {
            channels.abort(future, new IOException("Invalid handshake response"));
            return;
        }

        String accept = response.headers().get(HttpHeaders.Names.SEC_WEBSOCKET_ACCEPT);
        String key = WebSocketUtil.getAcceptKey(
                future.getNettyRequest().getHttpRequest().headers().get(HttpHeaders.Names.SEC_WEBSOCKET_KEY));
        if (accept == null || !accept.equals(key)) {
            channels.abort(future,
                    new IOException(String.format("Invalid challenge. Actual: %s. Expected: %s", accept, key)));
        }

        Channels.upgradePipelineForWebSockets(channel);

        invokeOnSucces(channel, h);
        future.done();

    } else if (e instanceof WebSocketFrame) {

        final WebSocketFrame frame = (WebSocketFrame) e;
        NettyWebSocket webSocket = NettyWebSocket.class.cast(h.onCompleted());
        invokeOnSucces(channel, h);

        if (webSocket != null) {
            if (frame instanceof CloseWebSocketFrame) {
                Channels.setDefaultAttribute(channel, DiscardEvent.INSTANCE);
                CloseWebSocketFrame closeFrame = CloseWebSocketFrame.class.cast(frame);
                webSocket.onClose(closeFrame.statusCode(), closeFrame.reasonText());
            } else {
                ByteBuf buf = frame.content();
                if (buf != null && buf.readableBytes() > 0) {
                    try {
                        NettyResponseBodyPart rp = nettyConfig.getBodyPartFactory().newResponseBodyPart(buf,
                                frame.isFinalFragment());
                        h.onBodyPartReceived(rp);

                        if (frame instanceof BinaryWebSocketFrame) {
                            webSocket.onBinaryFragment(rp.getBodyPartBytes(), frame.isFinalFragment());
                        } else {
                            webSocket.onTextFragment(buf.toString(StandardCharsets.UTF_8),
                                    frame.isFinalFragment());
                        }
                    } finally {
                        buf.release();
                    }
                }
            }
        } else {
            LOGGER.debug("UpgradeHandler returned a null NettyWebSocket ");
        }
    } else if (e instanceof LastHttpContent) {
        // FIXME what to do with this kind of messages?
    } else {
        LOGGER.error("Invalid message {}", e);
    }
}

From source file:org.asynchttpclient.providers.netty4.handler.WebSocketProtocol.java

License:Open Source License

@Override
public void handle(Channel channel, NettyResponseFuture<?> future, Object e) throws Exception {
    WebSocketUpgradeHandler handler = WebSocketUpgradeHandler.class.cast(future.getAsyncHandler());
    Request request = future.getRequest();

    if (e instanceof HttpResponse) {
        HttpResponse response = (HttpResponse) e;
        // we buffer the response until we get the LastHttpContent
        future.setPendingResponse(response);

    } else if (e instanceof LastHttpContent) {
        HttpResponse response = future.getPendingResponse();
        future.setPendingResponse(null);
        HttpResponseStatus status = new NettyResponseStatus(future.getUri(), config, response);
        HttpResponseHeaders responseHeaders = new NettyResponseHeaders(response.headers());

        if (exitAfterProcessingFilters(channel, future, handler, status, responseHeaders)) {
            return;
        }//from w w  w . ja  v a 2  s  . c o  m

        future.setHttpHeaders(response.headers());
        if (exitAfterHandlingRedirect(channel, future, response, request, response.getStatus().code()))
            return;

        boolean validStatus = response.getStatus().equals(SWITCHING_PROTOCOLS);
        boolean validUpgrade = response.headers().get(HttpHeaders.Names.UPGRADE) != null;
        String connection = response.headers().get(HttpHeaders.Names.CONNECTION);
        if (connection == null)
            connection = response.headers().get(HttpHeaders.Names.CONNECTION.toLowerCase(Locale.ENGLISH));
        boolean validConnection = HttpHeaders.Values.UPGRADE.equalsIgnoreCase(connection);

        status = new NettyResponseStatus(future.getUri(), config, response);
        final boolean statusReceived = handler.onStatusReceived(status) == STATE.UPGRADE;

        if (!statusReceived) {
            try {
                handler.onCompleted();
            } finally {
                future.done();
            }
            return;
        }

        final boolean headerOK = handler.onHeadersReceived(responseHeaders) == STATE.CONTINUE;
        if (!headerOK || !validStatus || !validUpgrade || !validConnection) {
            requestSender.abort(channel, future, new IOException("Invalid handshake response"));
            return;
        }

        String accept = response.headers().get(HttpHeaders.Names.SEC_WEBSOCKET_ACCEPT);
        String key = getAcceptKey(
                future.getNettyRequest().getHttpRequest().headers().get(HttpHeaders.Names.SEC_WEBSOCKET_KEY));
        if (accept == null || !accept.equals(key)) {
            requestSender.abort(channel, future,
                    new IOException(String.format("Invalid challenge. Actual: %s. Expected: %s", accept, key)));
        }

        channelManager.upgradePipelineForWebSockets(channel.pipeline());

        invokeOnSucces(channel, handler);
        future.done();

    } else if (e instanceof WebSocketFrame) {

        final WebSocketFrame frame = (WebSocketFrame) e;
        NettyWebSocket webSocket = NettyWebSocket.class.cast(handler.onCompleted());
        invokeOnSucces(channel, handler);

        if (webSocket != null) {
            if (frame instanceof CloseWebSocketFrame) {
                Channels.setDiscard(channel);
                CloseWebSocketFrame closeFrame = CloseWebSocketFrame.class.cast(frame);
                webSocket.onClose(closeFrame.statusCode(), closeFrame.reasonText());
            } else {
                ByteBuf buf = frame.content();
                if (buf != null && buf.readableBytes() > 0) {
                    try {
                        NettyResponseBodyPart part = nettyConfig.getBodyPartFactory().newResponseBodyPart(buf,
                                frame.isFinalFragment());
                        handler.onBodyPartReceived(part);

                        if (frame instanceof BinaryWebSocketFrame) {
                            webSocket.onBinaryFragment(part);
                        } else if (frame instanceof TextWebSocketFrame) {
                            webSocket.onTextFragment(part);
                        } else if (frame instanceof PingWebSocketFrame) {
                            webSocket.onPing(part);
                        } else if (frame instanceof PongWebSocketFrame) {
                            webSocket.onPong(part);
                        }
                    } finally {
                        buf.release();
                    }
                }
            }
        } else {
            logger.debug("UpgradeHandler returned a null NettyWebSocket ");
        }
    } else {
        logger.error("Invalid message {}", e);
    }
}