Home / Class/ WebSocket00FrameDecoder Class — netty Architecture

WebSocket00FrameDecoder Class — netty Architecture

Architecture documentation for the WebSocket00FrameDecoder class in WebSocket00FrameDecoder.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  a39accd9_2797_e36f_366c_ec1750db37ba["WebSocket00FrameDecoder"]
  e20ea68c_3fe1_09f6_fbf3_1fbc16f9492e["WebSocket00FrameDecoder.java"]
  a39accd9_2797_e36f_366c_ec1750db37ba -->|defined in| e20ea68c_3fe1_09f6_fbf3_1fbc16f9492e
  0cde36ad_47dc_d98a_54ef_713dba290819["WebSocket00FrameDecoder()"]
  a39accd9_2797_e36f_366c_ec1750db37ba -->|method| 0cde36ad_47dc_d98a_54ef_713dba290819
  7eff65d5_d988_e4f4_da3f_a6e657ac6b15["decode()"]
  a39accd9_2797_e36f_366c_ec1750db37ba -->|method| 7eff65d5_d988_e4f4_da3f_a6e657ac6b15
  59424093_80a3_69f2_2461_8456fff65c41["WebSocketFrame()"]
  a39accd9_2797_e36f_366c_ec1750db37ba -->|method| 59424093_80a3_69f2_2461_8456fff65c41

Relationship Graph

Source Code

codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket00FrameDecoder.java lines 34–148

public class WebSocket00FrameDecoder extends ReplayingDecoder<Void> implements WebSocketFrameDecoder {

    static final int DEFAULT_MAX_FRAME_SIZE = 16384;

    private final long maxFrameSize;
    private boolean receivedClosingHandshake;

    public WebSocket00FrameDecoder() {
        this(DEFAULT_MAX_FRAME_SIZE);
    }

    /**
     * Creates a new instance of {@code WebSocketFrameDecoder} with the specified {@code maxFrameSize}. If the client
     * sends a frame size larger than {@code maxFrameSize}, the channel will be closed.
     *
     * @param maxFrameSize
     *            the maximum frame size to decode
     */
    public WebSocket00FrameDecoder(int maxFrameSize) {
        this.maxFrameSize = maxFrameSize;
    }

    /**
     * Creates a new instance of {@code WebSocketFrameDecoder} with the specified {@code maxFrameSize}. If the client
     * sends a frame size larger than {@code maxFrameSize}, the channel will be closed.
     *
     * @param decoderConfig
     *            Frames decoder configuration.
     */
    public WebSocket00FrameDecoder(WebSocketDecoderConfig decoderConfig) {
        this.maxFrameSize = ObjectUtil.checkNotNull(decoderConfig, "decoderConfig").maxFramePayloadLength();
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // Discard all data received if closing handshake was received before.
        if (receivedClosingHandshake) {
            in.skipBytes(actualReadableBytes());
            return;
        }

        // Decode a frame otherwise.
        byte type = in.readByte();
        WebSocketFrame frame;
        if ((type & 0x80) == 0x80) {
            // If the MSB on type is set, decode the frame length
            frame = decodeBinaryFrame(ctx, type, in);
        } else {
            // Decode a 0xff terminated UTF-8 string
            frame = decodeTextFrame(ctx, in);
        }

        if (frame != null) {
            out.add(frame);
        }
    }

    private WebSocketFrame decodeBinaryFrame(ChannelHandlerContext ctx, byte type, ByteBuf buffer) {
        long frameSize = 0;
        int lengthFieldSize = 0;
        byte b;
        do {
            b = buffer.readByte();
            frameSize <<= 7;
            frameSize |= b & 0x7f;
            if (frameSize > maxFrameSize) {
                throw new TooLongFrameException("frame length exceeds " + maxFrameSize + ": " + frameSize);
            }
            lengthFieldSize++;
            if (lengthFieldSize > 8) {
                // Perhaps a malicious peer?
                throw new TooLongFrameException("frame length field size exceeds 8: " + lengthFieldSize);
            }
        } while ((b & 0x80) == 0x80);

        if (type == (byte) 0xFF && frameSize == 0) {
            receivedClosingHandshake = true;
            return new CloseWebSocketFrame(true, 0, ctx.alloc().buffer(0));
        }
        ByteBuf payload = readBytes(ctx.alloc(), buffer, (int) frameSize);
        return new BinaryWebSocketFrame(payload);

Frequently Asked Questions

What is the WebSocket00FrameDecoder class?
WebSocket00FrameDecoder is a class in the netty codebase, defined in codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket00FrameDecoder.java.
Where is WebSocket00FrameDecoder defined?
WebSocket00FrameDecoder is defined in codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket00FrameDecoder.java at line 34.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free