use of com.webpieces.http2parser.api.dto.lib.Http2Frame in project webpieces by deanhiller.
the class HeaderEncoding method translateToFrames.
public List<Http2Frame> translateToFrames(long maxFrameSize, Encoder encoder, Http2Push p) {
PushPromiseFrame frame = new PushPromiseFrame();
frame.setStreamId(p.getStreamId());
frame.setPromisedStreamId(p.getPromisedStreamId());
List<Http2Header> headerList = p.getHeaders();
List<Http2Frame> headerFrames = toHeaderFrames(maxFrameSize, encoder, frame, headerList);
return headerFrames;
}
use of com.webpieces.http2parser.api.dto.lib.Http2Frame in project webpieces by deanhiller.
the class HpackParserImpl method unmarshal.
@Override
public UnmarshalState unmarshal(UnmarshalState memento, DataWrapper newData) {
UnmarshalStateImpl state = (UnmarshalStateImpl) memento;
//reset any parsed frames
state.clearParsedFrames();
Http2Memento result = parser.parse(state.getLowLevelState(), newData);
List<Http2Frame> parsedFrames = result.getParsedFrames();
for (Http2Frame frame : parsedFrames) {
processFrame(state, frame);
}
return state;
}
use of com.webpieces.http2parser.api.dto.lib.Http2Frame in project webpieces by deanhiller.
the class TestS4FrameSizeAndHeaders method testSection4_3InterleavedFrames.
/**
* Each header block is processed as a discrete unit. Header blocks
* MUST be transmitted as a contiguous sequence of frames, with no interleaved
* frames of any other type or from any other stream. The last frame in a
* sequence of HEADERS or CONTINUATION frames has the END_HEADERS flag set. The
* last frame in a sequence of PUSH_PROMISE or CONTINUATION frames has the
* END_HEADERS flag set. This allows a header block to be logically equivalent to a single frame.
*
* Header block fragments can only be sent as the payload of HEADERS, PUSH_PROMISE, or
* CONTINUATION frames because these frames carry data that can modify the
* compression context maintained by a receiver. An endpoint receiving
* HEADERS, PUSH_PROMISE, or CONTINUATION frames needs to reassemble header
* blocks and perform decompression even if the frames are to be discarded. A receiver
* MUST terminate the connection with a connection error (Section 5.4.1) of
* type COMPRESSION_ERROR if it does not decompress a header block.
*/
@Test
public void testSection4_3InterleavedFrames() {
List<Http2Frame> frames = createInterleavedFrames();
//for this test, need interleaved
Assert.assertTrue(frames.size() >= 3);
mockChannel.sendFrame(frames.get(0));
mockChannel.sendFrame(frames.get(1));
//no request comes in
Assert.assertEquals(0, mockListener.getNumRequestsThatCameIn());
//no cancels
Assert.assertEquals(0, mockListener.getNumCancelsThatCameIn());
//remote receives goAway
GoAwayFrame goAway = (GoAwayFrame) mockChannel.getFrameAndClear();
Assert.assertEquals(Http2ErrorCode.PROTOCOL_ERROR, goAway.getKnownErrorCode());
DataWrapper debugData = goAway.getDebugData();
String msg = debugData.createStringFromUtf8(0, debugData.getReadableSize());
Assert.assertTrue(msg.contains("Headers/continuations from two different streams per spec cannot be interleaved. "));
Assert.assertTrue(mockChannel.isClosed());
}
use of com.webpieces.http2parser.api.dto.lib.Http2Frame in project webpieces by deanhiller.
the class HeaderEncoding method createHeaderFrames.
private List<Http2Frame> createHeaderFrames(HasHeaderFragment initialFrame, List<Http2Header> headers, Encoder encoder, long maxFrameSize) {
int maxSize = (int) maxFrameSize;
if (maxFrameSize > Integer.MAX_VALUE)
throw new IllegalStateException("max frame size too large for this hpack library");
List<Http2Frame> headerFrames = new LinkedList<>();
DataWrapper serializedHeaders = serializeHeaders(encoder, headers);
HasHeaderFragment currentFrame = initialFrame;
HasHeaderFragment lastFrame = currentFrame;
DataWrapper dataLeftOver = serializedHeaders;
while (dataLeftOver.getReadableSize() > 0) {
lastFrame = currentFrame;
int splitSize = Math.min(dataLeftOver.getReadableSize(), maxSize);
List<? extends DataWrapper> split = dataGen.split(dataLeftOver, splitSize);
DataWrapper fragment = split.get(0);
currentFrame.setHeaderFragment(fragment);
headerFrames.add(currentFrame);
currentFrame = new ContinuationFrame();
currentFrame.setStreamId(initialFrame.getStreamId());
dataLeftOver = split.get(1);
}
//last frame is currentFrame so set end header
lastFrame.setEndHeaders(true);
return headerFrames;
}
use of com.webpieces.http2parser.api.dto.lib.Http2Frame in project webpieces by deanhiller.
the class HpackParserImpl method translate.
private DataWrapper translate(List<Http2Frame> headerFrames) {
DataWrapper allData = DataWrapperGeneratorFactory.EMPTY;
for (Http2Frame f : headerFrames) {
DataWrapper frameData = parser.marshal(f);
allData = dataGen.chainDataWrappers(allData, frameData);
}
return allData;
}
Aggregations