in lib/src/frames/frame_defragmenter.dart [32:90]
Frame? tryDefragmentFrame(Frame? frame) {
if (_headersFrame != null) {
if (frame is ContinuationFrame) {
if (_headersFrame!.header.streamId != frame.header.streamId) {
throw ProtocolException(
'Defragmentation: frames have different stream ids.');
}
_headersFrame = _headersFrame!.addBlockContinuation(frame);
if (frame.hasEndHeadersFlag) {
var frame = _headersFrame;
_headersFrame = null;
return frame;
} else {
return null;
}
} else {
throw ProtocolException(
'Defragmentation: Incomplete frame must be followed by '
'continuation frame.');
}
} else if (_pushPromiseFrame != null) {
if (frame is ContinuationFrame) {
if (_pushPromiseFrame!.header.streamId != frame.header.streamId) {
throw ProtocolException(
'Defragmentation: frames have different stream ids.');
}
_pushPromiseFrame = _pushPromiseFrame!.addBlockContinuation(frame);
if (frame.hasEndHeadersFlag) {
var frame = _pushPromiseFrame;
_pushPromiseFrame = null;
return frame;
} else {
return null;
}
} else {
throw ProtocolException(
'Defragmentation: Incomplete frame must be followed by '
'continuation frame.');
}
} else {
if (frame is HeadersFrame) {
if (!frame.hasEndHeadersFlag) {
_headersFrame = frame;
return null;
}
} else if (frame is PushPromiseFrame) {
if (!frame.hasEndHeadersFlag) {
_pushPromiseFrame = frame;
return null;
}
}
}
// If this frame is not relevant for header defragmentation, we pass it to
// the next stage.
return frame;
}