Home / Function/ encode() — netty Function Reference

encode() — netty Function Reference

Architecture documentation for the encode() function in WebSocket08FrameEncoder.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  974912aa_4a22_65df_0611_a89a6b21c11d["encode()"]
  5ff4696d_a24d_bdd9_df0c_04c894aaa3fa["WebSocket08FrameEncoder"]
  974912aa_4a22_65df_0611_a89a6b21c11d -->|defined in| 5ff4696d_a24d_bdd9_df0c_04c894aaa3fa
  9667bd30_86eb_265f_83fb_d15408b892e2["getOpCode()"]
  974912aa_4a22_65df_0611_a89a6b21c11d -->|calls| 9667bd30_86eb_265f_83fb_d15408b892e2
  e4efdb80_03dd_85a8_c76f_8f8b29711309["addBuffers()"]
  974912aa_4a22_65df_0611_a89a6b21c11d -->|calls| e4efdb80_03dd_85a8_c76f_8f8b29711309
  style 974912aa_4a22_65df_0611_a89a6b21c11d fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameEncoder.java lines 116–224

    @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;
                }
                buf = ctx.alloc().buffer(size);
                buf.writeByte(b0);
                buf.writeByte(maskGenerator != null ? 0xFE : 126);
                buf.writeByte(length >>> 8 & 0xFF);
                buf.writeByte(length & 0xFF);
            } else {
                int size = 10 + maskLength;
                if (maskGenerator != null) {
                    size += length;
                }
                buf = ctx.alloc().buffer(size);
                buf.writeByte(b0);
                buf.writeByte(maskGenerator != null ? 0xFF : 127);
                buf.writeLong(length);
            }

            // Write payload
            if (maskGenerator != null) {
                int mask = maskGenerator.nextMask();
                buf.writeInt(mask);

                // If the mask is 0 we can skip all the XOR operations.
                if (mask != 0) {
                    if (length > 0) {
                        ByteOrder srcOrder = data.order();
                        ByteOrder dstOrder = buf.order();

                        int i = data.readerIndex();
                        int end = data.writerIndex();

                        if (srcOrder == dstOrder) {
                            // Use the optimized path only when byte orders match.
                            // Avoid sign extension on widening primitive conversion
                            long longMask = mask & 0xFFFFFFFFL;
                            longMask |= longMask << 32;

                            // If the byte order of our buffers it little endian we have to bring our mask
                            // into the same format, because getInt() and writeInt() will use a reversed byte order
                            if (srcOrder == ByteOrder.LITTLE_ENDIAN) {
                                longMask = Long.reverseBytes(longMask);
                            }

                            for (int lim = end - 7; i < lim; i += 8) {

Subdomains

Frequently Asked Questions

What does encode() do?
encode() is a function in the netty codebase, defined in codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameEncoder.java.
Where is encode() defined?
encode() is defined in codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocket08FrameEncoder.java at line 116.
What does encode() call?
encode() calls 2 function(s): addBuffers, getOpCode.

Analyze Your Own Codebase

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

Try Supermodel Free