docs: def serve(self):
      """Run the server forever."""
      # We don't have to trap KeyboardInterrupt or SystemExit here,
  
      # Select the appropriate socket
      if isinstance(self.bind_addr, basestring):
        # AF_UNIX socket
  
        # So we can reuse the socket...
        try: os.unlink(self.bind_addr)
        except: pass
  
        # So everyone can access the socket...
        try: os.chmod(self.bind_addr, 0777)
        except: pass
  
        info = [(socket.AF_UNIX, socket.SOCK_STREAM, 0, "", self.bind_addr)]
      else:
        # AF_INET or AF_INET6 socket
        # Get the correct address family for our host (allows IPv6 addresses)
        host, port = self.bind_addr
        try:
          info = socket.getaddrinfo(host, port, socket.AF_UNSPEC,
                        socket.SOCK_STREAM, 0, socket.AI_PASSIVE)
        except socket.gaierror:
          # Probably a DNS issue. Assume IPv4.
          info = [(socket.AF_INET, socket.SOCK_STREAM, 0, "", self.bind_addr)]
  
      self.socket = None
      msg = "No socket could be created"
      for res in info:
        af, socktype, proto, canonname, sa = res
        #~ print res
        try:
          self.bind(af, socktype, proto)
        except socket.error, msg:
          if self.socket:
            self.socket.close()
          self.socket = None
          continue
        break
      if not self.socket:
        raise socket.error, msg
  
      self.socket.listen(self.request_queue_size)
      with closing(self.socket):
        while True:
          try:
            s, addr = yield sockets.Accept(self.socket, timeout=-1)
            s.settimeout(self.sockoper_timeout)
          except Exception, exc:
            # make acceptor more robust in the face of weird
            # accept bugs, XXX: but we might get a infinite loop
  
            #~ import warnings
            #~ warnings.warn("Accept thrown an exception: %s" % exc)
  
            import traceback
            traceback.print_exc()
            continue
  
          environ = self.environ.copy()
          environ["SERVER_SOFTWARE"] = self.version
          # set a non-standard environ entry so the WSGI app can know what
          # the *real* server protocol is (and what features to support).
          # See http://www.faqs.org/rfcs/rfc2145.html.
          environ["ACTUAL_SERVER_PROTOCOL"] = self.protocol
          environ["SERVER_NAME"] = self.server_name
  
          if isinstance(self.bind_addr, basestring):
            # AF_UNIX. This isn't really allowed by WSGI, which doesn't
            # address unix domain sockets. But it's better than nothing.
            environ["SERVER_PORT"] = ""
          else:
            environ["SERVER_PORT"] = str(self.bind_addr[1])
            # optional values
            # Until we do DNS lookups, omit REMOTE_HOST
            environ["REMOTE_ADDR"] = addr[0]
            environ["REMOTE_PORT"] = str(addr[1])
  
          conn = self.ConnectionClass(s, self.wsgi_app, environ,
            self.sendfile_timeout)
          yield events.AddCoro(conn.run, prio=priority.LAST if
                                       self.sockaccept_greedy else priority.FIRST)