docs: public void processCompleteFrame() throws Http2Exception {
          Frame currentFrame = getCurrentFrame();
  
          boolean frameSizeError = false;
          try {
              currentFrame.processPayload(this);
          } catch (Http2Exception e) {
              // If we get an error here, it should be safe to assume that this frame doesn't have the expected byte count,
              // which must be treated as an error of type FRAME_SIZE_ERROR.  If we're processing a DATA or PRIORITY frame, then
              // we can treat the error as a stream error rather than a connection error.
              if (!e.isConnectionError()) {
                  frameSizeError = true;
              } else {
                  // this is a connection error; we need to send a GOAWAY on the connection
                  throw e;
              }
          } catch (Exception e) {
              throw new ProtocolException("Error processing the payload for " + currentFrame.getFrameType()
                                          + " frame on stream " + currentFrame.getStreamId());
          }
  
          // call the stream processor to process this stream. For now, don't return from here until the
          // frame has been fully processed.
          int streamId = currentFrame.getStreamId();
          H2StreamProcessor stream = muxLink.getStream(streamId);
  
          if (stream == null) {
              if ((streamId != 0) && (streamId % 2 == 0)) {
                  if (currentFrame.getFrameType().equals(FrameTypes.PRIORITY)) {
                      // ignore PRIORITY frames in any state
                      return;
                  } else if (currentFrame.getFrameType().equals(FrameTypes.RST_STREAM) && streamId < muxLink.getHighestClientStreamId()) {
                      // tolerate RST_STREAM frames that are sent on closed push streams
                      return;
                  } else {
                      throw new ProtocolException("Cannot start a stream from the client with an even numbered ID. stream-id: " + streamId);
                  }
              } else {
                  stream = startNewInboundSession(streamId);
              }
          }
          if (frameSizeError) {
              currentFrame = new FrameRstStream(streamId, 4, (byte) 0, false, FrameDirection.READ);
              ((FrameRstStream) currentFrame).setErrorCode(Constants.FRAME_SIZE_ERROR);
          }
  
          stream.processNextFrame(currentFrame, Direction.READ_IN);
      }