public static int encodeFrameHeader( final ByteBuf byteBuf, final int frameLength, final int flags, final FrameType frameType, final int streamId) { if ((frameLength & ~FRAME_LENGTH_MASK) != 0) { throw new IllegalArgumentException("Frame length is larger than 24 bits"); } // frame length field needs to be excluded from the length encodeLength(byteBuf, FRAME_LENGTH_FIELD_OFFSET, frameLength - FRAME_LENGTH_SIZE); byteBuf.setInt(STREAM_ID_FIELD_OFFSET, streamId); short typeAndFlags = (short) (frameType.getEncodedType() << FRAME_TYPE_SHIFT | (short) flags); byteBuf.setShort(FRAME_TYPE_AND_FLAGS_FIELD_OFFSET, typeAndFlags); return FRAME_HEADER_LENGTH; }
public static int encodeMetadata( final ByteBuf byteBuf, final FrameType frameType, final int metadataOffset, final @Nullable ByteBuf metadata) { int length = 0; if (metadata != null) { final int metadataLength = metadata.readableBytes(); int typeAndFlags = byteBuf.getShort(FRAME_TYPE_AND_FLAGS_FIELD_OFFSET); typeAndFlags |= FLAGS_M; byteBuf.setShort(FRAME_TYPE_AND_FLAGS_FIELD_OFFSET, (short) typeAndFlags); if (hasMetadataLengthField(frameType)) { encodeLength(byteBuf, metadataOffset, metadataLength); length += FRAME_LENGTH_SIZE; } byteBuf.setBytes(metadataOffset + length, metadata, metadata.readerIndex(), metadataLength); length += metadataLength; } return length; }
@Override public Flux<Frame> receive() { return connection .inbound() .receive() .map( buf -> { CompositeByteBuf composite = connection.channel().alloc().compositeBuffer(); ByteBuf length = wrappedBuffer(new byte[FRAME_LENGTH_SIZE]); FrameHeaderFlyweight.encodeLength(length, 0, buf.readableBytes()); composite.addComponents(true, length, buf.retain()); return Frame.from(composite); }); }
public static int encodeFrameHeader( final ByteBuf byteBuf, final int frameLength, final int flags, final FrameType frameType, final int streamId) { if ((frameLength & ~FRAME_LENGTH_MASK) != 0) { throw new IllegalArgumentException("Frame length is larger than 24 bits"); } // frame length field needs to be excluded from the length encodeLength(byteBuf, FRAME_LENGTH_FIELD_OFFSET, frameLength - FRAME_LENGTH_SIZE); byteBuf.setInt(STREAM_ID_FIELD_OFFSET, streamId); short typeAndFlags = (short) (frameType.getEncodedType() << FRAME_TYPE_SHIFT | (short) flags); byteBuf.setShort(FRAME_TYPE_AND_FLAGS_FIELD_OFFSET, typeAndFlags); return FRAME_HEADER_LENGTH; }
public static int encodeMetadata( final ByteBuf byteBuf, final FrameType frameType, final int metadataOffset, final @Nullable ByteBuf metadata) { int length = 0; if (metadata != null) { final int metadataLength = metadata.readableBytes(); int typeAndFlags = byteBuf.getShort(FRAME_TYPE_AND_FLAGS_FIELD_OFFSET); typeAndFlags |= FLAGS_M; byteBuf.setShort(FRAME_TYPE_AND_FLAGS_FIELD_OFFSET, (short) typeAndFlags); if (hasMetadataLengthField(frameType)) { encodeLength(byteBuf, metadataOffset, metadataLength); length += FRAME_LENGTH_SIZE; } byteBuf.setBytes(metadataOffset + length, metadata, metadata.readerIndex(), metadataLength); length += metadataLength; } return length; }
@Override public Flux<Frame> receive() { return connection .inbound() .receive() .map( buf -> { CompositeByteBuf composite = connection.channel().alloc().compositeBuffer(); ByteBuf length = wrappedBuffer(new byte[FRAME_LENGTH_SIZE]); FrameHeaderFlyweight.encodeLength(length, 0, buf.readableBytes()); composite.addComponents(true, length, buf.retain()); return Frame.from(composite); }); }