docs: @Override
      public void finishRequestMessage(WsByteBuffer[] body) throws IOException, MessageSentException {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.entry(tc, "finishRequestMessage(sync)");
          }
  
          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()) {
              if (!getRequestImpl().isChunkedEncodingSet()) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Setting partial body false");
                  }
                  setPartialBody(false);
              }
          }
  
          if (getHttpConfig().runningOnZOS()) {
              // @LIDB3187-27.1
              // add this to notify the xmem channel of our final request write
              getVC().getStateMap().put(HttpConstants.FINAL_WRITE_MARK, "true");
          }
          getLink().setAllowReconnect(true);
          try {
              sendFullOutgoing(body, getRequestImpl());
          } catch (IOException e) {
              // no FFDC required
              reConnect(e);
          }
  
          // LI4335 - if early reads are going, then do not bother with response
          // message information here
          if (this.bEarlyReads) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
                  Tr.exit(tc, "finishRequestMessage(sync): early read is active");
              }
              return;
          }
  
          // if the headers are already parsed, then check to see if we should
          // immediately notify the app channel or start a read for the next
          // response.
          if (headersParsed()) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Response headers already parsed");
              }
              if (this.bTempResponsesUsed || !getResponseImpl().isTemporaryStatusCode()) {
                  // app channel wants to see all the responses
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
                      Tr.exit(tc, "finishRequestMessage(sync): already parsed");
                  }
                  return;
              }
              // the app channel does not want to see the previously parsed msg
              resetRead();
              readSyncResponse();
          } else {
              // read for the first response
              startResponseReadSync();
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.exit(tc, "finishRequestMessage(sync)");
          }
      }