code: public ChannelFuture respond() throws Exception {
          // For chunked response, this method is only called to respond the 1st chunk,
          // next chunks are responded directly by respondXXX
  
          if (nonChunkedResponseOrFirstChunkSent) throwDoubleResponseError();
  
          // Run after filter
          if (server.after() != null) {
              server.after().run(request, this);
          }
  
          ChannelFuture future = channel.writeAndFlush(response);
  
          // Do not handle keep alive:
          // * If XSendFile or XSendResource is used, because they will handle keep alive in their own way
          // * If the response is chunked, because respondLastChunk will be handle keep alive
          if (//!XSendFile.isHeaderSet(response) &&
              //!XSendResource.isHeaderSet(response) &&
                  !HttpUtil.isTransferEncodingChunked(response)) {
              NoRealPipelining.if_keepAliveRequest_then_resumeReading_else_closeOnComplete(request, channel, future);
          }
  
          nonChunkedResponseOrFirstChunkSent = true;
          if (!HttpUtil.isTransferEncodingChunked(response)) {
              doneResponding = true;
          }
  
          return future;
      }
docs: ----------------------------------------------------------------------------