docs: def communicate(self):
          """Read each request and respond appropriately."""
          request_seen = False
          try:
              while True:
                  # (re)set req to None so that if something goes wrong in
                  # the RequestHandlerClass constructor, the error doesn't
                  # get written to the previous request.
                  req = None
                  req = self.RequestHandlerClass(self.server, self)
                  
                  # This order of operations should guarantee correct pipelining.
                  req.parse_request()
                  if not req.ready:
                      # Something went wrong in the parsing (and the server has
                      # probably already made a simple_response). Return and
                      # let the conn close.
                      return
                  
                  request_seen = True
                  req.respond()
                  if req.close_connection:
                      return
          except socket.error, e:
              errnum = e.args[0]
              # sadly SSL sockets return a different (longer) time out string
              if errnum == 'timed out' or errnum == 'The read operation timed out':
                  # Don't error if we're between requests; only error
                  # if 1) no request has been started at all, or 2) we're
                  # in the middle of a request.
                  # See http://www.cherrypy.org/ticket/853
                  if (not request_seen) or (req and req.started_request):
                      # Don't bother writing the 408 if the response
                      # has already started being written.
                      if req and not req.sent_headers:
                          try:
                              req.simple_response("408 Request Timeout")
                          except FatalSSLAlert:
                              # Close the connection.
                              return
              elif errnum not in socket_errors_to_ignore:
                  if req and not req.sent_headers:
                      try:
                          req.simple_response("500 Internal Server Error",
                                              format_exc())
                      except FatalSSLAlert:
                          # Close the connection.
                          return
              return
          except (KeyboardInterrupt, SystemExit):
              raise
          except FatalSSLAlert:
              # Close the connection.
              return
          except NoSSLError:
              if req and not req.sent_headers:
                  # Unwrap our wfile
                  self.wfile = CP_fileobject(self.socket._sock, "wb", self.wbufsize)
                  req.simple_response("400 Bad Request",
                      "The client sent a plain HTTP request, but "
                      "this server only speaks HTTPS on this port.")
                  self.linger = True
          except Exception:
              if req and not req.sent_headers:
                  try:
                      req.simple_response("500 Internal Server Error", format_exc())
                  except FatalSSLAlert:
                      # Close the connection.
                      return