Frame? tryDefragmentFrame()

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;
  }