Search in sources :

Example 6 with ConnectionException

use of com.webpieces.http2.api.dto.error.ConnectionException in project webpieces by deanhiller.

the class PingMarshaller method unmarshal.

@Override
public AbstractHttp2Frame unmarshal(Http2MementoImpl state, DataWrapper framePayloadData) {
    FrameHeaderData frameHeaderData = state.getFrameHeaderData();
    int streamId = frameHeaderData.getStreamId();
    if (state.getFrameHeaderData().getPayloadLength() != 8)
        throw new ConnectionException(CancelReasonCode.FRAME_SIZE_INCORRECT, streamId, "ping size not 8 and instead is=" + state.getFrameHeaderData().getPayloadLength());
    else if (streamId != 0)
        throw new ConnectionException(CancelReasonCode.INVALID_STREAM_ID, streamId, "streamId on ping needs to be 0 but was=" + streamId);
    // TODO: Verify this, previous code looks like connectionlevel = false but shouldn't this be true
    PingFrame frame = new PingFrame();
    super.unmarshalFrame(state, frame);
    byte flags = state.getFrameHeaderData().getFlagsByte();
    frame.setIsPingResponse((flags & 0x1) == 0x1);
    ByteBuffer payloadByteBuffer = bufferPool.createWithDataWrapper(framePayloadData);
    frame.setOpaqueData(payloadByteBuffer.getLong());
    bufferPool.releaseBuffer(payloadByteBuffer);
    if (frame.getStreamId() != 0)
        throw new IllegalArgumentException("PingFrame can never be any other stream id except 0 which is already set");
    return frame;
}
Also used : PingFrame(com.webpieces.http2.api.dto.lowlevel.PingFrame) FrameHeaderData(com.webpieces.http2parser.impl.FrameHeaderData) ByteBuffer(java.nio.ByteBuffer) ConnectionException(com.webpieces.http2.api.dto.error.ConnectionException)

Example 7 with ConnectionException

use of com.webpieces.http2.api.dto.error.ConnectionException in project webpieces by deanhiller.

the class RstStreamMarshaller method unmarshal.

@Override
public AbstractHttp2Frame unmarshal(Http2MementoImpl state, DataWrapper framePayloadData) {
    FrameHeaderData frameHeaderData = state.getFrameHeaderData();
    int streamId = frameHeaderData.getStreamId();
    if (state.getFrameHeaderData().getPayloadLength() != 4)
        throw new ConnectionException(CancelReasonCode.FRAME_SIZE_INCORRECT, streamId, "rststream size not 4 and instead is=" + state.getFrameHeaderData().getPayloadLength());
    else if (frameHeaderData.getStreamId() == 0)
        throw new ConnectionException(CancelReasonCode.INVALID_STREAM_ID, frameHeaderData.getStreamId(), "rst stream cannot be streamid 0 and was=" + frameHeaderData.getStreamId());
    RstStreamFrame frame = new RstStreamFrame();
    super.unmarshalFrame(state, frame);
    ByteBuffer payloadByteBuffer = bufferPool.createWithDataWrapper(framePayloadData);
    long errorCode = UnsignedData.getUnsignedInt(payloadByteBuffer);
    frame.setErrorCode(errorCode);
    bufferPool.releaseBuffer(payloadByteBuffer);
    return frame;
}
Also used : RstStreamFrame(com.webpieces.http2.api.dto.lowlevel.RstStreamFrame) FrameHeaderData(com.webpieces.http2parser.impl.FrameHeaderData) ByteBuffer(java.nio.ByteBuffer) ConnectionException(com.webpieces.http2.api.dto.error.ConnectionException)

Example 8 with ConnectionException

use of com.webpieces.http2.api.dto.error.ConnectionException in project webpieces by deanhiller.

the class WindowUpdateMarshaller method unmarshal.

@Override
public AbstractHttp2Frame unmarshal(Http2MementoImpl state, DataWrapper payload) {
    FrameHeaderData frameHeaderData = state.getFrameHeaderData();
    int streamId = frameHeaderData.getStreamId();
    if (state.getFrameHeaderData().getPayloadLength() != 4)
        throw new ConnectionException(CancelReasonCode.FRAME_SIZE_INCORRECT, streamId, "window update size not 4 and instead is=" + state.getFrameHeaderData().getPayloadLength());
    WindowUpdateFrame frame = new WindowUpdateFrame();
    super.unmarshalFrame(state, frame);
    ByteBuffer payloadByteBuffer = bufferPool.createWithDataWrapper(payload);
    frame.setWindowSizeIncrement(payloadByteBuffer.getInt());
    bufferPool.releaseBuffer(payloadByteBuffer);
    if (frame.getWindowSizeIncrement() == 0)
        throw new ConnectionException(CancelReasonCode.WINDOW_SIZE_INVALID, streamId, "Window size increment cannot be 0 per http/2 spec and was");
    return frame;
}
Also used : WindowUpdateFrame(com.webpieces.http2.api.dto.lowlevel.WindowUpdateFrame) FrameHeaderData(com.webpieces.http2parser.impl.FrameHeaderData) ByteBuffer(java.nio.ByteBuffer) ConnectionException(com.webpieces.http2.api.dto.error.ConnectionException)

Example 9 with ConnectionException

use of com.webpieces.http2.api.dto.error.ConnectionException in project webpieces by deanhiller.

the class Http2ParserImpl method parseFrameHeader.

/**
 * Return true if header was parsed
 * @param maxFrameSize
 */
private boolean parseFrameHeader(Http2MementoImpl state) {
    DataWrapper allData = state.getLeftOverData();
    int lengthOfData = allData.getReadableSize();
    if (lengthOfData < 9) {
        // Not even a frame header
        return false;
    }
    List<? extends DataWrapper> split = dataGen.split(allData, 9);
    DataWrapper frameHeader = split.get(0);
    DataWrapper left = split.get(1);
    int payloadLength = getLength(frameHeader);
    int streamId = getStreamId(frameHeader);
    byte frameTypeId = frameHeader.readByteAt(3);
    byte flagsByte = frameHeader.readByteAt(4);
    long maxFrameSize = state.getIncomingMaxFrameSize();
    if (payloadLength > maxFrameSize)
        throw new ConnectionException(CancelReasonCode.EXCEEDED_MAX_FRAME_SIZE, streamId, "Frame size=" + payloadLength + " was greater than max=" + maxFrameSize);
    state.setFrameHeaderData(new FrameHeaderData(payloadLength, streamId, frameTypeId, flagsByte));
    // this data is still leftover as we do not have full message so add ZERO
    state.setLeftOverData(left, 0);
    return true;
}
Also used : DataWrapper(org.webpieces.data.api.DataWrapper) ConnectionException(com.webpieces.http2.api.dto.error.ConnectionException)

Example 10 with ConnectionException

use of com.webpieces.http2.api.dto.error.ConnectionException in project webpieces by deanhiller.

the class HeadersMarshaller method unmarshal.

@Override
public AbstractHttp2Frame unmarshal(Http2MementoImpl state, DataWrapper framePayloadData) {
    HeadersFrame frame = new HeadersFrame();
    super.unmarshalFrame(state, frame);
    byte flagsByte = state.getFrameHeaderData().getFlagsByte();
    frame.setEndOfStream((flagsByte & 0x1) == 0x1);
    frame.setEndHeaders((flagsByte & 0x4) == 0x4);
    boolean isPadded = (flagsByte & 0x8) == 0x8;
    PriorityDetails priorityDetails = null;
    if ((flagsByte & 0x20) == 0x20) {
        priorityDetails = new PriorityDetails();
        frame.setPriorityDetails(priorityDetails);
    }
    DataSplit padSplit = PaddingUtil.extractPayloadAndPadding(isPadded, framePayloadData, frame.getStreamId());
    frame.setPadding(padSplit.getPadding());
    DataWrapper paddingStripped = padSplit.getPayload();
    if (priorityDetails != null) {
        // 1 bit Exclusive flag, 31 bits stream dependency, and 8 bits weight = 5 bytes....
        List<? extends DataWrapper> split = DATA_GEN.split(paddingStripped, 5);
        ByteBuffer preludeBytes = bufferPool.createWithDataWrapper(split.get(0));
        int firstInt = preludeBytes.getInt();
        priorityDetails.setStreamDependencyIsExclusive((firstInt >>> 31) == 0x1);
        int streamDependency = firstInt & 0x7FFFFFFF;
        if (streamDependency == frame.getStreamId()) {
            // Can't depend on self
            throw new ConnectionException(CancelReasonCode.BAD_STREAM_DEPENDENCY, streamDependency, "stream id=" + streamDependency + " depends on itself");
        }
        priorityDetails.setStreamDependency(streamDependency);
        priorityDetails.setWeight((short) (preludeBytes.get() & 0xFF));
        frame.setHeaderFragment(split.get(1));
        bufferPool.releaseBuffer(preludeBytes);
    } else {
        frame.setHeaderFragment(paddingStripped);
    }
    if (frame.getStreamId() == 0)
        throw new ConnectionException(CancelReasonCode.INVALID_STREAM_ID, frame.getStreamId(), "headers frame had invalid stream id=" + frame.getStreamId());
    return frame;
}
Also used : DataWrapper(org.webpieces.data.api.DataWrapper) PriorityDetails(com.webpieces.http2.api.dto.lowlevel.lib.PriorityDetails) HeadersFrame(com.webpieces.http2.api.dto.lowlevel.HeadersFrame) ByteBuffer(java.nio.ByteBuffer) DataSplit(com.webpieces.http2parser.impl.DataSplit) ConnectionException(com.webpieces.http2.api.dto.error.ConnectionException)

Aggregations

ConnectionException (com.webpieces.http2.api.dto.error.ConnectionException)26 DataWrapper (org.webpieces.data.api.DataWrapper)18 GoAwayFrame (com.webpieces.http2.api.dto.lowlevel.GoAwayFrame)15 Test (org.junit.Test)13 DataFrame (com.webpieces.http2.api.dto.lowlevel.DataFrame)12 Http2Request (com.webpieces.http2.api.dto.highlevel.Http2Request)8 ByteBuffer (java.nio.ByteBuffer)8 StreamWriter (com.webpieces.http2.api.streaming.StreamWriter)6 ConnectionClosedException (com.webpieces.http2engine.api.error.ConnectionClosedException)6 MockResponseListener (org.webpieces.http2client.mock.MockResponseListener)6 ShutdownStream (com.webpieces.http2engine.api.error.ShutdownStream)5 FrameHeaderData (com.webpieces.http2parser.impl.FrameHeaderData)5 StreamRef (com.webpieces.http2.api.streaming.StreamRef)4 MockStreamWriter (org.webpieces.http2client.mock.MockStreamWriter)4 StreamException (com.webpieces.http2.api.dto.error.StreamException)3 HeadersFrame (com.webpieces.http2.api.dto.lowlevel.HeadersFrame)3 Http2Msg (com.webpieces.http2.api.dto.lowlevel.lib.Http2Msg)3 PriorityDetails (com.webpieces.http2.api.dto.lowlevel.lib.PriorityDetails)3 DataSplit (com.webpieces.http2parser.impl.DataSplit)3 Http2Push (com.webpieces.http2.api.dto.highlevel.Http2Push)2