code: @Override
      public void sendResponseHeaders() throws IOException, MessageSentException {
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(tc, "sendResponseHeaders(sync)");
          }
          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 + ".sendResponseHeaders", "594");
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Attempt to send response without a request msg");
              }
              throw ioe;
          }
  
          if (headersSent()) {
              throw new MessageSentException("Message already sent");
          }
  
          sendHeaders(getResponseImpl());
          if (getResponseImpl().isTemporaryStatusCode()) {
              // allow multiple temporary responses to be sent out
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Temp response sent, resetting send flags.");
              }
              resetWrite();
          }
      }
docs: Send the headers for the outgoing response synchronously.
  
  @throws IOException -- if a socket exception occurs
  @throws MessageSentException -- if a finishMessage API was already used