Home / Class/ SpdyHeaderBlockRawDecoder Class — netty Architecture

SpdyHeaderBlockRawDecoder Class — netty Architecture

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

Entity Profile

Dependency Diagram

graph TD
  77ffda47_df0d_5f3f_1a09_80e71de6135b["SpdyHeaderBlockRawDecoder"]
  69981a23_470b_b9bb_c947_7393dc57e42a["SpdyHeaderBlockRawDecoder.java"]
  77ffda47_df0d_5f3f_1a09_80e71de6135b -->|defined in| 69981a23_470b_b9bb_c947_7393dc57e42a
  16214988_9bdf_bd49_e537_6c2faf75e396["SpdyHeaderBlockRawDecoder()"]
  77ffda47_df0d_5f3f_1a09_80e71de6135b -->|method| 16214988_9bdf_bd49_e537_6c2faf75e396
  7c72b262_15bd_7c52_93f2_ff1a0ef2ebde["readLengthField()"]
  77ffda47_df0d_5f3f_1a09_80e71de6135b -->|method| 7c72b262_15bd_7c52_93f2_ff1a0ef2ebde
  29a55946_3e46_6039_dd0f_cef33fd9b15d["decode()"]
  77ffda47_df0d_5f3f_1a09_80e71de6135b -->|method| 29a55946_3e46_6039_dd0f_cef33fd9b15d
  ba703864_8c4c_a402_0ea4_c1e98dc38154["decodeHeaderBlock()"]
  77ffda47_df0d_5f3f_1a09_80e71de6135b -->|method| ba703864_8c4c_a402_0ea4_c1e98dc38154
  6db69abb_a019_ee35_cad4_303556aaf603["endHeaderBlock()"]
  77ffda47_df0d_5f3f_1a09_80e71de6135b -->|method| 6db69abb_a019_ee35_cad4_303556aaf603
  ad6ca907_f450_8f0e_fe5a_bf99eec38567["end()"]
  77ffda47_df0d_5f3f_1a09_80e71de6135b -->|method| ad6ca907_f450_8f0e_fe5a_bf99eec38567
  611e648f_06b9_6900_5c16_b5fdcac2a6a1["releaseBuffer()"]
  77ffda47_df0d_5f3f_1a09_80e71de6135b -->|method| 611e648f_06b9_6900_5c16_b5fdcac2a6a1

Relationship Graph

Source Code

codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHeaderBlockRawDecoder.java lines 26–308

public class SpdyHeaderBlockRawDecoder extends SpdyHeaderBlockDecoder {

    private static final int LENGTH_FIELD_SIZE = 4;

    private final int maxHeaderSize;

    private State state;

    private ByteBuf cumulation;

    private int headerSize;
    private int numHeaders;
    private int length;
    private String name;

    private enum State {
        READ_NUM_HEADERS,
        READ_NAME_LENGTH,
        READ_NAME,
        SKIP_NAME,
        READ_VALUE_LENGTH,
        READ_VALUE,
        SKIP_VALUE,
        END_HEADER_BLOCK,
        ERROR
    }

    public SpdyHeaderBlockRawDecoder(SpdyVersion spdyVersion, int maxHeaderSize) {
        ObjectUtil.checkNotNull(spdyVersion, "spdyVersion");
        this.maxHeaderSize = maxHeaderSize;
        state = State.READ_NUM_HEADERS;
    }

    private static int readLengthField(ByteBuf buffer) {
        int length = getSignedInt(buffer, buffer.readerIndex());
        buffer.skipBytes(LENGTH_FIELD_SIZE);
        return length;
    }

    @Override
    void decode(ByteBufAllocator alloc, ByteBuf headerBlock, SpdyHeadersFrame frame) throws Exception {
        ObjectUtil.checkNotNull(headerBlock, "headerBlock");
        ObjectUtil.checkNotNull(frame, "frame");

        if (cumulation == null) {
            decodeHeaderBlock(headerBlock, frame);
            if (headerBlock.isReadable()) {
                cumulation = alloc.buffer(headerBlock.readableBytes());
                cumulation.writeBytes(headerBlock);
            }
        } else {
            cumulation.writeBytes(headerBlock);
            decodeHeaderBlock(cumulation, frame);
            if (cumulation.isReadable()) {
                cumulation.discardReadBytes();
            } else {
                releaseBuffer();
            }
        }
    }

    protected void decodeHeaderBlock(ByteBuf headerBlock, SpdyHeadersFrame frame) throws Exception {
        int skipLength;
        while (headerBlock.isReadable()) {
            switch(state) {
                case READ_NUM_HEADERS:
                    if (headerBlock.readableBytes() < LENGTH_FIELD_SIZE) {
                        return;
                    }

                    numHeaders = readLengthField(headerBlock);

                    if (numHeaders < 0) {
                        state = State.ERROR;
                        frame.setInvalid();
                    } else if (numHeaders == 0) {
                        state = State.END_HEADER_BLOCK;
                    } else {
                        state = State.READ_NAME_LENGTH;
                    }
                    break;

Frequently Asked Questions

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

Analyze Your Own Codebase

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

Try Supermodel Free