public static int initialRequestN(final Frame frame) { final FrameType type = frame.getType(); int result; if (!type.isRequestType()) { throw new AssertionError("expected request type, but saw " + type.name()); } switch (frame.getType()) { case REQUEST_RESPONSE: result = 1; break; case REQUEST_FNF: case METADATA_PUSH: result = 0; break; default: result = RequestFrameFlyweight.initialRequestN(frame.content); break; } return result; }
@DisplayName("EXT characteristics") @Test void ext() { assertThat(FrameType.EXT.canHaveData()).isTrue(); assertThat(FrameType.EXT.canHaveMetadata()).isTrue(); assertThat(FrameType.EXT.hasInitialRequestN()).isFalse(); assertThat(FrameType.EXT.getEncodedType()).isEqualTo(0x3F); assertThat(FrameType.EXT.isFragmentable()).isFalse(); assertThat(FrameType.EXT.isRequestType()).isFalse(); }
private static int getMaximumEncodedType() { return Arrays.stream(values()).mapToInt(frameType -> frameType.encodedType).max().orElse(0); }
public static int payloadOffset(final FrameType type, final ByteBuf byteBuf) { int result = FrameHeaderFlyweight.FRAME_HEADER_LENGTH; if (type.hasInitialRequestN()) { result += Integer.BYTES; } return result; } }
private static int getFrameTypeAndFlags(FrameType frameType) { return frameType.getEncodedType() << FRAME_TYPE_SHIFT; } }
private static FrameType getFrameType(ByteBuf byteBuf) { int encodedType = byteBuf.getUnsignedShort(0) >> FRAME_TYPE_SHIFT; return FrameType.fromEncodedType(encodedType); } }
private static Counter counter( Type connectionType, MeterRegistry meterRegistry, FrameType frameType, Tag... tags) { return counter(connectionType, meterRegistry, frameType.name(), tags); }
@Test public void missingMetadataLength() { for (FrameType frameType : FrameType.values()) { switch (frameType) { case RESERVED: break; case CANCEL: case METADATA_PUSH: case LEASE: assertFalse( "!hasMetadataLengthField(): " + frameType, FrameHeaderFlyweight.hasMetadataLengthField(frameType)); break; default: if (frameType.canHaveMetadata()) { assertTrue( "hasMetadataLengthField(): " + frameType, FrameHeaderFlyweight.hasMetadataLengthField(frameType)); } } } }
public static boolean hasMetadataLengthField(FrameType frameType) { return frameType.canHaveData(); }
public static int computeFrameLength( final FrameType type, final @Nullable Integer metadataLength, final int dataLength) { int length = FrameHeaderFlyweight.computeFrameHeaderLength(type, metadataLength, dataLength); if (type.hasInitialRequestN()) { length += Integer.BYTES; } return length; }
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 FrameType getFrameType() { int encodedType = byteBuf.getUnsignedShort(0) >> FRAME_TYPE_SHIFT; return FrameType.fromEncodedType(encodedType); }
private Counter findCounter(Type connectionType, FrameType frameType) { return meterRegistry .get("rsocket.frame") .tag("connection.type", connectionType.name()) .tag("frame.type", frameType.name()) .tag("test-key", "test-value") .counter(); } }
public static boolean hasMetadataLengthField(FrameType frameType) { return frameType.canHaveData(); }
@DisplayName("LEASE characteristics") @Test void lease() { assertThat(FrameType.LEASE.canHaveData()).isFalse(); assertThat(FrameType.LEASE.canHaveMetadata()).isTrue(); assertThat(FrameType.LEASE.getEncodedType()).isEqualTo(0x02); assertThat(FrameType.LEASE.hasInitialRequestN()).isFalse(); assertThat(FrameType.LEASE.isFragmentable()).isFalse(); assertThat(FrameType.LEASE.isRequestType()).isFalse(); }
public static int initialRequestN(final Frame frame) { final FrameType type = frame.getType(); int result; if (!type.isRequestType()) { throw new AssertionError("expected request type, but saw " + type.name()); } switch (frame.getType()) { case REQUEST_RESPONSE: result = 1; break; case REQUEST_FNF: case METADATA_PUSH: result = 0; break; default: result = RequestFrameFlyweight.initialRequestN(frame.content); break; } return result; }
public static int encode( final ByteBuf byteBuf, final int streamId, final int flags, final FrameType type, final @Nullable ByteBuf metadata, final ByteBuf data) { if (Frame.isFlagSet(flags, FrameHeaderFlyweight.FLAGS_M) != (metadata != null)) { throw new IllegalArgumentException("metadata flag set incorrectly"); } if (type.hasInitialRequestN()) { throw new AssertionError(type + " must not be encoded without initial request N"); } final int frameLength = computeFrameLength( type, metadata != null ? metadata.readableBytes() : null, data.readableBytes()); int length = FrameHeaderFlyweight.encodeFrameHeader(byteBuf, frameLength, flags, type, streamId); length += FrameHeaderFlyweight.encodeMetadata(byteBuf, type, length, metadata); length += FrameHeaderFlyweight.encodeData(byteBuf, length, data); return length; }
private static int getFrameTypeAndFlags(FrameType frameType) { return frameType.getEncodedType() << FRAME_TYPE_SHIFT; } }
public static FrameType frameType(final ByteBuf byteBuf) { int typeAndFlags = byteBuf.getShort(FRAME_TYPE_AND_FLAGS_FIELD_OFFSET); FrameType result = FrameType.fromEncodedType(typeAndFlags >> FRAME_TYPE_SHIFT); if (FrameType.PAYLOAD == result) { final int flags = typeAndFlags & FRAME_FLAGS_MASK; boolean complete = FLAGS_C == (flags & FLAGS_C); boolean next = FLAGS_N == (flags & FLAGS_N); if (next && complete) { result = FrameType.NEXT_COMPLETE; } else if (complete) { result = FrameType.COMPLETE; } else if (next) { result = FrameType.NEXT; } else { throw new IllegalArgumentException("Payload must set either or both of NEXT and COMPLETE."); } } return result; }
private static int getMaximumEncodedType() { return Arrays.stream(values()).mapToInt(frameType -> frameType.encodedType).max().orElse(0); }