docs: protected void handleParsedMessage() {
  
          InterChannelCallback cb = null;
          // use the read callback for early reads or temp messages requested
          // LI4335 - handle early reads too
          if (this.bEarlyReads || this.bTempResponsesUsed) {
              cb = getAppReadCallback();
          } else {
              cb = getAppWriteCallback();
          }
          VirtualConnection vc = null;
          do {
              this.numResponsesReceived++;
              if (!getResponseImpl().isTemporaryStatusCode()) {
                  // a final response message was received
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Notifying app channel of final response.");
                  }
                  cb.complete(getVC());
                  return;
              }
  
              // received a temporary response
              int code = getResponseImpl().getStatusCodeAsInt();
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Received response (#" + numberResponsesReceived() + "): " + code);
              }
              if (numberResponsesReceived() > getHttpConfig().getLimitOnNumberOfResponses()) {
                  // too many temp responses
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Too many async temp responses received.");
                  }
                  cb.error(getVC(), new IOException("Max temp responses received: " + numberResponsesReceived()));
                  return;
              }
              if (this.bTempResponsesUsed) {
                  // call the app channel with this new response
                  cb.complete(getVC());
                  return;
              }
              if (getRequestImpl().isExpect100Continue()) {
                  if (100 != code) {
                      // if the Expectation failed, then this connection is finished, so
                      // no need to reset any values.
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "Expect 100-continue failed with " + code);
                      }
                      setPersistent(false);
                      cb.error(getVC(), new ExpectationFailedException(code + " " + getResponseImpl().getReasonPhrase()));
                      return;
                  } else if (1 == numberResponsesReceived() && isHeadersSentState()) {
                      // first 100-continue only, return to app channel immed but
                      // only if sendHeaders was used (meaning they want 100-continue)
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "Notifying channel of first 100-continue");
                      }
                      cb.complete(getVC());
                      return;
                  }
              }
              // otherwise, this was a valid temporary response but the app channel
              // doesn't want to see it
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Ignoring temporary response...");
              }
              resetRead();
              if (setupReadBuffers(getHttpConfig().getIncomingHdrBufferSize(), false)) {
                  // data is already available
                  vc = getVC();
              } else {
                  // read for the next bit of data
                  vc = getTSC().getReadInterface().read(1, HttpOSCReadCallback.getRef(), false, getReadTimeout());
              }
              if (null != vc) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Attempting a parse of response data.");
                  }
                  vc = parseResponseMessageAsync();
              }
          } while (null != vc);
      }