Package io.undertow.websockets.core

Examples of io.undertow.websockets.core.StreamSourceFrameChannel


        }

        @Override
        public void handleEvent(final WebSocketChannel webSocketChannel) {
            try {
                StreamSourceFrameChannel frame = webSocketChannel.receive();
                if (frame == null) {
                    webSocketChannel.resumeReceives();
                    return;
                }
                if (closeFrameReceived) {
                    frame.discard();
                    return;
                }

                long maxSize = maxMessageSize(session, frame.getType());

                if (maxSize > 0 && frame.getPayloadSize() > maxSize) {
                    if (executeInIoThread) {
                        session.sendClose(new CloseReason(CloseReason.MSG_TOO_BIG, null), null);
                    } else {
                        session.getFrameHandlerExecutor().execute(new Runnable() {
                            @Override
                            public void run() {
                                session.sendClose(new CloseReason(CloseReason.MSG_TOO_BIG, null), null);
                            }
                        });
                    }
                    return;
                }

                // suspend the receives we will resume once we are ready
                webSocketChannel.suspendReceives();

                ChannelListener<StreamSourceChannel> listener;
                FrameHandler handler = session.getFrameHandler();
                if (handler == null) {
                    // no handler defined by the user use the default listener which takes care
                    // of echo back PING and CLOSE Frame to be RFC compliant
                    listener = defaultListener;
                } else if (handler instanceof AssembledFrameHandler) {
                    listener = new AssembleFrameChannelListener(session, (AssembledFrameHandler) handler, this, frame, executeInIoThread);
                else if (handler instanceof FragmentedFrameHandler) {
                    listener = new FragmentedFrameChannelListener(session, (FragmentedFrameHandler) handler, this);
                } else {
                    listener = new FrameHandlerListener(session,  handler, this);
                }

                frame.getReadSetter().set(listener);
                // wake up reads to trigger a read operation now
                // TODO: Think about if this a really good idea
                frame.wakeupReads();

            } catch (IOException e) {
                handleError(session, e);
            }
        }
View Full Code Here


        @Override
        public void handleEvent(StreamSourceChannel ch) {
            if(!ch.isOpen()) {
                return;
            }
            StreamSourceFrameChannel streamSourceFrameChannel = (StreamSourceFrameChannel) ch;
            WebSocketFrameType type = streamSourceFrameChannel.getType();

            switch (type) {
                case TEXT:
                case BINARY:
                case CONTINUATION:
                    if (type == WebSocketFrameType.CONTINUATION) {
                        assert this.type != null;
                        type = this.type;
                    }
                    this.type = type;
                    boolean free = true;
                    if (pooled == null) {
                        pooled = pool.allocate();
                    }
                    try {
                        for (;;) {
                            ByteBuffer buffer = pooled.getResource();

                            int r = streamSourceFrameChannel.read(buffer);
                            if (r == 0) {
                                free = false;
                                streamSourceFrameChannel.resumeReads();
                                return;
                            }
                            if (r == -1) {
                                streamSourceFrameChannel.getReadSetter().set(null);
                                streamSourceFrameChannel.close();
                                buffer.flip();

                                if (!streamSourceFrameChannel.isFinalFragment()) {
                                    // not the final fragement contine to handle it with this handler
                                    session.getChannel().getReceiveSetter().set(new ChannelListener<WebSocketChannel>() {
                                        @Override
                                        public void handleEvent(WebSocketChannel webSocketChannel) {
                                            boolean free = true;
                                            try {
                                                if(FragmentedFrameChannelListener.this.pooled != null) {
                                                    throw new IllegalStateException();
                                                }
                                                StreamSourceFrameChannel frame = webSocketChannel.receive();
                                                if (frame != null) {
                                                    // suspend receives we will resume once ready
                                                    webSocketChannel.suspendReceives();

                                                    frame.getReadSetter().set(FragmentedFrameChannelListener.this);

                                                    // wake up reads to trigger a read operation now
                                                    frame.wakeupReads();
                                                }
                                                free = false;

                                            } catch (IOException e) {
                                                handleError(session, e);
View Full Code Here

            this.delegateListener = delegateListener;
        }

        @Override
        public void handleEvent(StreamSourceChannel ch) {
            final StreamSourceFrameChannel streamSourceFrameChannel = (StreamSourceFrameChannel) ch;
            try {
                switch (streamSourceFrameChannel.getType()) {
                    case PING:
                    case CLOSE:
                        delegateListener.closeFrameReceived = true;
                        if (session.executeInIoThread) {
                            WebSocketUtils.echoFrame(session.getChannel(), streamSourceFrameChannel);
                            session.getChannel().resumeReceives();
                        } else {
                            session.getFrameHandlerExecutor().execute(new Runnable() {
                                @Override
                                public void run() {
                                    try {
                                        WebSocketUtils.echoFrame(session.getChannel(), streamSourceFrameChannel);
                                        session.getChannel().resumeReceives();
                                    } catch (IOException e) {
                                        handleError(session, e);
                                        streamSourceFrameChannel.getReadSetter().set(null);
                                    }
                                }
                            });
                        }
                        break;
                    default:
                        // discard the frame as we are not interested in it.
                        streamSourceFrameChannel.discard();
                        streamSourceFrameChannel.getCloseSetter().set(new ChannelListener<StreamSourceChannel>() {
                            @Override
                            public void handleEvent(StreamSourceChannel channel) {
                                session.getChannel().resumeReceives();
                            }
                        });

                }
            } catch (IOException e) {
                handleError(session, e);
                streamSourceFrameChannel.getReadSetter().set(null);
            }
        }
View Full Code Here

            this.delegateListener = delegateListener;
        }

        @Override
        public void handleEvent(StreamSourceChannel streamSourceChannel) {
            StreamSourceFrameChannel streamSourceFrameChannel = (StreamSourceFrameChannel) streamSourceChannel;
            if (pooled == null) {
                pooled = session.getChannel().getBufferPool().allocate();
            }
            boolean free = true;
            try {
                for (;;) {
                    ByteBuffer buffer = pooled.getResource();

                    int r = streamSourceChannel.read(buffer);
                    if (r == 0) {
                        streamSourceChannel.resumeReads();
                        free = false;
                        return;
                    }
                    if (r == -1) {
                        buffer.flip();
                        streamSourceChannel.close();
                        streamSourceChannel.getReadSetter().set(null);

                        final ByteBuffer[] buffers;
                        if (pooledList != null) {
                            pooledList.add(pooled);
                            buffers = new ByteBuffer[pooledList.size()];
                            for (int i = 0; i < pooledList.size(); i++) {
                                buffers[i] = pooledList.get(i).getResource();
                            }
                        } else {
                           buffers = new ByteBuffer[] {buffer};
                        }

                        switch (streamSourceFrameChannel.getType()) {
                            case PING:
                                final ByteBuffer[] payload = new ByteBuffer[buffers.length];
                                for (int i = 0; i < buffers.length; i++) {
                                    ByteBuffer buf = buffers[i];
                                    payload[i] = buf.slice();
View Full Code Here

            maxSize = maxMessageSize(session, source.getType());
        }

        @Override
        public void handleEvent(StreamSourceChannel ch) {
            StreamSourceFrameChannel streamSourceFrameChannel = (StreamSourceFrameChannel) ch;
            switch (streamSourceFrameChannel.getType()) {
                case TEXT:
                case BINARY:
                case CONTINUATION:
                    boolean free = true;

                    if (!frameInProgress) {
                        header = new DefaultWebSocketFrameHeader(streamSourceFrameChannel.getType(), streamSourceFrameChannel.getRsv(), true);
                        frameInProgress = true;
                        size += streamSourceFrameChannel.getPayloadSize();

                        // this also match for TEXT frames
                        if (maxSize > 0 && size > maxSize) {
                            if (executeInIoThread) {
                                session.sendClose(new CloseReason(CloseReason.MSG_TOO_BIG, null), null);
                            } else {
                                session.getFrameHandlerExecutor().execute(new Runnable() {
                                    @Override
                                    public void run() {
                                        session.sendClose(new CloseReason(CloseReason.MSG_TOO_BIG, null), null);
                                    }
                                });
                            }
                            return;
                        }

                    }
                    try {
                        for (;;) {
                            ByteBuffer buffer = pooled.getResource();

                            int r = streamSourceFrameChannel.read(buffer);
                            if (r == 0) {
                                free = false;
                                streamSourceFrameChannel.resumeReads();
                                return;
                            }
                            if (r == -1) {
                                frameInProgress = false;
                                streamSourceFrameChannel.close();
                                streamSourceFrameChannel.getReadSetter().set(null);
                                buffer.flip();
                                if (pooledList != null) {
                                    pooledList.add(pooled);
                                }

                                if (streamSourceFrameChannel.isFinalFragment()) {
                                    session.getChannel().getReceiveSetter().set(delegateListener);

                                    // final fragement notify the handler now
                                    if (pooledList != null) {
                                        notifyHandler(session, handler, header, pooledList.toArray(new Pooled[0]));
                                        free = false;
                                    } else {
                                        notifyHandler(session, handler, header, pooled);
                                        free = false;
                                    }
                                } else {
                                    // not the final fragement keep buffer the payload
                                    session.getChannel().getReceiveSetter().set(new ChannelListener<WebSocketChannel>() {
                                        @Override
                                        public void handleEvent(WebSocketChannel webSocketChannel) {
                                            boolean free = true;
                                            try {
                                                StreamSourceFrameChannel frame = webSocketChannel.receive();
                                                if (frame != null) {
                                                    frame.getReadSetter().set(AssembleFrameChannelListener.this);
                                                    // wake up reads to trigger a read operation now
                                                    // TODO: Think about if this a really good idea
                                                    frame.wakeupReads();
                                                } else {
                                                    webSocketChannel.resumeReceives();
                                                }
                                                free = false;
                                            } catch (IOException e) {
View Full Code Here

        private int framePayloadLen1;
        private boolean done = false;

        @Override
        public StreamSourceFrameChannel getChannel(Pooled<ByteBuffer> pooled) {
            StreamSourceFrameChannel channel = createChannel(pooled);
            if (frameFinalFlag) {
                channel.finalFrame();
            } else {
                fragmentedChannel = channel;
            }
            return channel;
        }
View Full Code Here

        }

        @Override
        public AbstractFramedStreamSourceChannel<?, ?, ?> getExistingChannel() {
            if (frameOpcode == OPCODE_CONT) {
                StreamSourceFrameChannel ret = fragmentedChannel;
                if(frameFinalFlag) {
                    fragmentedChannel = null;
                    ret.finalFrame(); //TODO: should  be in handle header data, maybe
                }
                return ret;
            }
            return null;
        }
View Full Code Here

        private int framePayloadLen1;
        private boolean done = false;

        @Override
        public StreamSourceFrameChannel getChannel(Pooled<ByteBuffer> pooled) {
            StreamSourceFrameChannel channel = createChannel(pooled);
            if (frameFinalFlag) {
                channel.finalFrame();
            } else {
                fragmentedChannel = channel;
            }
            return channel;
        }
View Full Code Here

        }

        @Override
        public AbstractFramedStreamSourceChannel<?, ?, ?> getExistingChannel() {
            if (frameOpcode == OPCODE_CONT) {
                StreamSourceFrameChannel ret = fragmentedChannel;
                if(frameFinalFlag) {
                    fragmentedChannel = null;
                    ret.finalFrame(); //TODO: should  be in handle header data, maybe
                }
                return ret;
            }
            return null;
        }
View Full Code Here

    private static final class Receiver implements ChannelListener<WebSocketChannel> {

        @Override
        public void handleEvent(final WebSocketChannel channel) {
            try {
                final StreamSourceFrameChannel ws = channel.receive();
                if (ws != null) {
                    StreamSinkFrameChannel target;
                    if (ws.getType() == WebSocketFrameType.PING ||
                            ws.getType() == WebSocketFrameType.CLOSE) {
                        target = channel.send(ws.getType() == WebSocketFrameType.PING ? WebSocketFrameType.PONG : WebSocketFrameType.CLOSE);
                    } else if (ws.getType() == WebSocketFrameType.PONG) {
                        ws.getReadSetter().set(ChannelListeners.drainListener(Long.MAX_VALUE, null, null));
                        ws.wakeupReads();
                        return;
                    } else {
                        target = channel.send(ws.getType());
                    }
                    ChannelListeners.initiateTransfer(Long.MAX_VALUE, ws, target, null, ChannelListeners.writeShutdownChannelListener(new ChannelListener<StreamSinkFrameChannel>() {
                        @Override
                        public void handleEvent(StreamSinkFrameChannel c) {
                            channel.resumeReceives();
View Full Code Here

TOP

Related Classes of io.undertow.websockets.core.StreamSourceFrameChannel

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.