Home / Class/ WebSocket08FrameEncoder Class — netty Architecture

WebSocket08FrameEncoder Class — netty Architecture

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

Entity Profile

Dependency Diagram

graph TD
  5ff4696d_a24d_bdd9_df0c_04c894aaa3fa["WebSocket08FrameEncoder"]
  284b35c3_d8e1_41b2_a9b5_60d5c66143e6["WebSocket08FrameEncoder.java"]
  5ff4696d_a24d_bdd9_df0c_04c894aaa3fa -->|defined in| 284b35c3_d8e1_41b2_a9b5_60d5c66143e6
  de8b21e3_c8e3_4e06_a4f0_371fe68ee3e4["WebSocket08FrameEncoder()"]
  5ff4696d_a24d_bdd9_df0c_04c894aaa3fa -->|method| de8b21e3_c8e3_4e06_a4f0_371fe68ee3e4
  974912aa_4a22_65df_0611_a89a6b21c11d["encode()"]
  5ff4696d_a24d_bdd9_df0c_04c894aaa3fa -->|method| 974912aa_4a22_65df_0611_a89a6b21c11d
  9667bd30_86eb_265f_83fb_d15408b892e2["getOpCode()"]
  5ff4696d_a24d_bdd9_df0c_04c894aaa3fa -->|method| 9667bd30_86eb_265f_83fb_d15408b892e2
  e4efdb80_03dd_85a8_c76f_8f8b29711309["addBuffers()"]
  5ff4696d_a24d_bdd9_df0c_04c894aaa3fa -->|method| e4efdb80_03dd_85a8_c76f_8f8b29711309

Relationship Graph

Source Code

codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameEncoder.java lines 72–261

public class WebSocket08FrameEncoder extends MessageToMessageEncoder<WebSocketFrame> implements WebSocketFrameEncoder {

    private static final InternalLogger logger = InternalLoggerFactory.getInstance(WebSocket08FrameEncoder.class);

    private static final byte OPCODE_CONT = 0x0;
    private static final byte OPCODE_TEXT = 0x1;
    private static final byte OPCODE_BINARY = 0x2;
    private static final byte OPCODE_CLOSE = 0x8;
    private static final byte OPCODE_PING = 0x9;
    private static final byte OPCODE_PONG = 0xA;

    /**
     * The size threshold for gathering writes. Non-Masked messages bigger than this size will be sent fragmented as
     * a header and a content ByteBuf whereas messages smaller than the size will be merged into a single buffer and
     * sent at once.<br>
     * Masked messages will always be sent at once.
     */
    private static final int GATHERING_WRITE_THRESHOLD = 1024;

    private final WebSocketFrameMaskGenerator maskGenerator;

    /**
     * Constructor
     *
     * @param maskPayload
     *            Web socket clients must set this to true to mask payload. Server implementations must set this to
     *            false.
     */
    public WebSocket08FrameEncoder(boolean maskPayload) {
        this(maskPayload ? RandomWebSocketFrameMaskGenerator.INSTANCE : null);
    }

    /**
     * Constructor
     *
     * @param maskGenerator
     *            Web socket clients must set this to {@code non null} to mask payload.
     *            Server implementations must set this to {@code null}.
     */
    public WebSocket08FrameEncoder(WebSocketFrameMaskGenerator maskGenerator) {
        super(WebSocketFrame.class);
        this.maskGenerator = maskGenerator;
    }

    @Override
    protected void encode(ChannelHandlerContext ctx, WebSocketFrame msg, List<Object> out) throws Exception {
        final ByteBuf data = msg.content();

        byte opcode = getOpCode(msg);

        int length = data.readableBytes();

        if (logger.isTraceEnabled()) {
            logger.trace("Encoding WebSocket Frame opCode={} length={}", opcode, length);
        }

        int b0 = 0;
        if (msg.isFinalFragment()) {
            b0 |= 1 << 7;
        }
        b0 |= (msg.rsv() & 0x07) << 4;
        b0 |= opcode & 0x7F;

        if (opcode == OPCODE_PING && length > 125) {
            throw new TooLongFrameException("invalid payload for PING (payload length must be <= 125, was " + length);
        }

        boolean release = true;
        ByteBuf buf = null;
        try {
            int maskLength = maskGenerator != null ? 4 : 0;
            if (length <= 125) {
                int size = 2 + maskLength + length;
                buf = ctx.alloc().buffer(size);
                buf.writeByte(b0);
                byte b = (byte) (maskGenerator != null ? 0x80 | length : length);
                buf.writeByte(b);
            } else if (length <= 0xFFFF) {
                int size = 4 + maskLength;
                if (maskGenerator != null || length <= GATHERING_WRITE_THRESHOLD) {
                    size += length;

Frequently Asked Questions

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

Analyze Your Own Codebase

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

Try Supermodel Free