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;
}