public RawFrame createResetStream(final int streamId, final int code) { Args.positive(streamId, "Stream id"); final ByteBuffer payload = ByteBuffer.allocate(4); payload.putInt(code); payload.flip(); return new RawFrame(FrameType.RST_STREAM.getValue(), 0, streamId, payload); }
public RawFrame createGoAway(final int lastStream, final H2Error error, final String message) { Args.notNegative(lastStream, "Last stream id"); final byte[] debugData = message != null ? message.getBytes(StandardCharsets.US_ASCII) : null; final ByteBuffer payload = ByteBuffer.allocate(8 + (debugData != null ? debugData.length : 0)); payload.putInt(lastStream); payload.putInt(error.getCode()); if (debugData != null) { payload.put(debugData); } payload.flip(); return new RawFrame(FrameType.GOAWAY.getValue(), 0, 0, payload); }
public RawFrame createSettings(final H2Setting... settings) { final ByteBuffer payload = ByteBuffer.allocate(settings.length * 12); for (final H2Setting setting: settings) { payload.putShort((short) setting.getCode()); payload.putInt(setting.getValue()); } payload.flip(); return new RawFrame(FrameType.SETTINGS.getValue(), 0, 0, payload); }
public RawFrame createWindowUpdate(final int streamId, final int increment) { Args.notNegative(streamId, "Stream id"); Args.positive(increment, "Increment"); final ByteBuffer payload = ByteBuffer.allocate(4); payload.putInt(increment); payload.flip(); return new RawFrame(FrameType.WINDOW_UPDATE.getValue(), 0, streamId, payload); }
@Override public RawFrame createPushPromise(final int streamId, final ByteBuffer payload, final boolean endHeaders) { Args.positive(streamId, "Stream id"); final int flags = (endHeaders ? FrameFlag.END_HEADERS.value : 0); return new RawFrame(FrameType.PUSH_PROMISE.getValue(), flags, streamId, payload); }
@Override public RawFrame createHeaders(final int streamId, final ByteBuffer payload, final boolean endHeaders, final boolean endStream) { Args.positive(streamId, "Stream id"); final int flags = (endHeaders ? FrameFlag.END_HEADERS.value : 0) | (endStream ? FrameFlag.END_STREAM.value : 0); return new RawFrame(FrameType.HEADERS.getValue(), flags, streamId, payload); }
@Override public RawFrame createContinuation(final int streamId, final ByteBuffer payload, final boolean endHeaders) { Args.positive(streamId, "Stream id"); final int flags = (endHeaders ? FrameFlag.END_HEADERS.value : 0); return new RawFrame(FrameType.CONTINUATION.getValue(), flags, streamId, payload); }
public RawFrame createSettingsAck() { return new RawFrame(FrameType.SETTINGS.getValue(), FrameFlag.ACK.getValue(), 0, null); }
@Override public RawFrame createData(final int streamId, final ByteBuffer payload, final boolean endStream) { Args.positive(streamId, "Stream id"); final int flags = (endStream ? FrameFlag.END_STREAM.value : 0); return new RawFrame(FrameType.DATA.getValue(), flags, streamId, payload); }
public RawFrame createPingAck(final ByteBuffer opaqueData) { Args.notNull(opaqueData, "Opaque data"); Args.check(opaqueData.remaining() == 8, "Opaque data length must be equal 8"); return new RawFrame(FrameType.PING.getValue(), FrameFlag.ACK.value, 0, opaqueData); }
public RawFrame createPing(final ByteBuffer opaqueData) { Args.notNull(opaqueData, "Opaque data"); Args.check(opaqueData.remaining() == 8, "Opaque data length must be equal 8"); return new RawFrame(FrameType.PING.getValue(), 0, 0, opaqueData); }
state = State.HEAD_EXPECTED; metrics.incrementFramesTransferred(); return new RawFrame(type, flags, streamId, payload);
public RawFrame read(final InputStream inStream) throws IOException { fillBuffer(inStream, FrameConsts.HEAD_LEN); final int payloadOff = FrameConsts.HEAD_LEN; final int payloadLen = (buffer[off] & 0xff) << 16 | (buffer[off + 1] & 0xff) << 8 | (buffer[off + 2] & 0xff); final int type = buffer[off + 3] & 0xff; final int flags = buffer[off + 4] & 0xff; final int streamId = Math.abs(buffer[off + 5] & 0xff) << 24 | (buffer[off + 6] & 0xff << 16) | (buffer[off + 7] & 0xff) << 8 | (buffer[off + 8] & 0xff); if (payloadLen > maxFramePayloadSize) { throw new H2ConnectionException(H2Error.FRAME_SIZE_ERROR, "Frame size exceeds maximum"); } final int frameLen = payloadOff + payloadLen; fillBuffer(inStream, frameLen); if ((flags & FrameFlag.PADDED.getValue()) > 0) { if (payloadLen == 0) { throw new H2ConnectionException(H2Error.PROTOCOL_ERROR, "Inconsistent padding"); } final int padding = buffer[off + FrameConsts.HEAD_LEN] & 0xff; if (payloadLen < padding + 1) { throw new H2ConnectionException(H2Error.PROTOCOL_ERROR, "Inconsistent padding"); } } final ByteBuffer payload = payloadLen > 0 ? ByteBuffer.wrap(buffer, off + payloadOff, payloadLen) : null; final RawFrame frame = new RawFrame(type, flags, streamId, payload); off += frameLen; dataLen -= frameLen; this.metrics.incrementFramesTransferred(); return frame; }