code: public void readAsyncResponse() {
  
          // if read data is available or sitting on socket, then start the parse
          // now otherwise setup for a socket read
          VirtualConnection vc = null;
          if (!isReadDataAvailable() && null == getNextReadBuffer()) {
              setupReadBuffers(getHttpConfig().getIncomingHdrBufferSize(), false);
              vc = getTSC().getReadInterface().read(1, HttpOSCReadCallback.getRef(), true, getReadTimeout());
          } else {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "readAsyncResponse found existing data");
              }
              vc = getVC();
          }
  
          // if we had data or the read completed already, try to parse it
          if (null != vc) {
              if (null != parseResponseMessageAsync()) {
                  handleParsedMessage();
              }
          }
      }
docs: Method to encapsulate the act of reading, parsing, and deciding whether
  to keep a response message (asynchronously). This will return if a read
  is being performed asynchronously, or if a response was fully parsed and
  handed off to the application channel. The caller of this method should
  perform no more work after this method.