docs: @Override
      public VirtualConnection finishResponseMessage(WsByteBuffer[] body, InterChannelCallback callback, boolean bForce) throws MessageSentException {
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(tc, "finishResponseMessage(body,cb)");
          }
          // H2 doesn't support asych writes, if we got here and this is H2, switch over to sync
          if (isH2Connection()) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "finishResponseMessage: This is H2, calling sync finishResponseMessage(body)");
              }
              // Send the error response synchronously for H2
              try {
                  finishResponseMessage(body);
                  return getVC();
              } catch (IOException e) {
                  return null;
              }
          }
          if (!headersParsed()) {
              // request message must have the headers parsed prior to sending
              // any data out (this is a completely invalid state in the channel
              // above)
              IOException ioe = new IOException("Request not read yet");
              FFDCFilter.processException(ioe, CLASS_NAME + ".finishResponseMessage", "1010");
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Attempt to send response without a request msg");
              }
              callback.error(getVC(), ioe);
              return null;
          }
  
          if (isMessageSent()) {
              throw new MessageSentException("Message already sent");
          }
  
          // if headers haven't been sent and chunked encoding is not explicitly
          // configured, then set this up for Content-Length
          if (!headersSent() && !getResponseImpl().isChunkedEncodingSet()) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "finishMessage(cb) setting partial body false");
              }
              setPartialBody(false);
          }
  
          if (getHttpConfig().runningOnZOS()) {
              // @311734 - add this to notify the xmem channel of our final write
              getVC().getStateMap().put(HttpConstants.FINAL_WRITE_MARK, "true");
          }
          setForceAsync(bForce);
          setAppWriteCallback(callback);
          VirtualConnection vc = sendFullOutgoing(body, getResponseImpl(), HttpISCWriteCallback.getRef());
          if (null != vc) {
              // Note: if forcequeue is true, then we will not get a VC object as
              // the lower layer will use the callback and return null
              logFinalResponse(getNumBytesWritten());
              HttpInvalidMessageException inv = checkResponseValidity();
              if (null != inv) {
                  // invalid response
                  callback.error(vc, inv);
                  return null;
              }
          }
          return vc;
      }