public ByteBuf encodePushPromiseFrame()

in src/main/java/com/twitter/http2/HttpFrameEncoder.java [164:189]


    public ByteBuf encodePushPromiseFrame(int streamId, int promisedStreamId, ByteBuf headerBlock) {
        boolean needsContinuations = headerBlock.readableBytes() > HTTP_MAX_LENGTH - 4;
        int length = needsContinuations ? HTTP_MAX_LENGTH - 4 : headerBlock.readableBytes();
        byte flags = needsContinuations ? 0 : HTTP_FLAG_END_HEADERS;
        ByteBuf header = Unpooled.buffer(HTTP_FRAME_HEADER_SIZE + 4);
        writeFrameHeader(header, length + 4, HTTP_PUSH_PROMISE_FRAME, flags, streamId);
        header.writeInt(promisedStreamId);
        ByteBuf frame = Unpooled.wrappedBuffer(header, headerBlock.readSlice(length));
        if (needsContinuations) {
            while (headerBlock.readableBytes() > HTTP_MAX_LENGTH) {
                header = Unpooled.buffer(HTTP_FRAME_HEADER_SIZE);
                writeFrameHeader(header, HTTP_MAX_LENGTH, HTTP_CONTINUATION_FRAME, (byte) 0, streamId);
                frame = Unpooled.wrappedBuffer(frame, header, headerBlock.readSlice(HTTP_MAX_LENGTH));
            }
            header = Unpooled.buffer(HTTP_FRAME_HEADER_SIZE);
            writeFrameHeader(
                    header,
                    headerBlock.readableBytes(),
                    HTTP_CONTINUATION_FRAME,
                    HTTP_FLAG_END_HEADERS,
                    streamId
            );
            frame = Unpooled.wrappedBuffer(frame, header, headerBlock);
        }
        return frame;
    }