def server(port): print 'Server starting port: %s' % port sock = Socket(AF_INET, SOCK_STREAM) sock.bind(('', port)) sock.listen(10) try: while True: # yield ReadWait(sock) # client, addr = sock.accept() client, addr = yield sock.accept() clients.append(client) yield NewTask(handle_client(client, addr)) finally: sock.close()
class HTTPServer(object): """HTTP server.""" def __init__(self, handle_target, no_keep_alive=False, xheaders=False, ssl_options=None): self.handle_target = handle_target self.no_keep_alive = no_keep_alive self.xheaders = xheaders self.ssl_options = ssl_options self._socket = None def listen(self, port, address=""): assert not self._socket self._socket = Socket() if os.name != 'nt': # Make a file descriptor close-on-exec. import fcntl flags = fcntl.fcntl(self._socket.fileno(), fcntl.F_GETFD) flags |= fcntl.FD_CLOEXEC fcntl.fcntl(self._socket.fileno(), fcntl.F_SETFD, flags) # reuse address self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # set non blocking self._socket.setblocking(0) self._socket.bind((address, port)) self._socket.listen(65535) def start(self): while True: try: connection, address = yield self._socket.accept() except socket.error, e: if e[0] in (errno.EWOULDBLOCK, errno.EAGAIN): # omit Operation would block and Try again error return raise # print 'new', connection, address, connection.fileno() yield NewTask(HTTPConnection(connection, address, self.handle_target, xheaders=self.xheaders).handler(), 'httphandler')