class HttpServer(object): """Factory that creates a HTTP server listening on port, calling generatorFactory for each new connection. When a client does not send a valid HTTP request, it is disconnected after timeout seconds. The generatorFactory is called with the HTTP Status and Headers as arguments. It is expected to return a generator that produces the response -- including the Status line and Headers -- to be send to the client.""" def __init__(self, reactor, port, generatorFactory, timeout=1, recvSize=RECVSIZE, prio=None, sok=None, maxConnections=None, errorHandler=None, compressResponse=False, bindAddress=None): self._reactor = reactor self._port = port self._bindAddress = bindAddress self._generatorFactory = generatorFactory self._timeout = timeout self._recvSize = recvSize self._prio = prio self._sok = sok self._maxConnections = maxConnections self._errorHandler = errorHandler self._compressResponse = compressResponse def listen(self): self._acceptor = Acceptor(reactor=self._reactor, port=self._port, sinkFactory=lambda sok: HttpHandler( reactor=self._reactor, sok=sok, generatorFactory=self._generatorFactory, timeout=self._timeout, recvSize=self._recvSize, prio=self._prio, maxConnections=self._maxConnections, errorHandler=self._errorHandler, compressResponse=self._compressResponse), prio=self._prio, sok=self._sok, bindAddress=self._bindAddress) def setMaxConnections(self, m): self._maxConnections = m def shutdown(self): self._acceptor.shutdown()
class HttpServer(object): """Factory that creates a HTTP server listening on port, calling generatorFactory for each new connection. When a client does not send a valid HTTP request, it is disconnected after timeout seconds. The generatorFactory is called with the HTTP Status and Headers as arguments. It is expected to return a generator that produces the response -- including the Status line and Headers -- to be send to the client.""" def __init__(self, reactor, port, generatorFactory, timeout=1, recvSize=RECVSIZE, prio=None, sok=None, maxConnections=None, errorHandler=None, compressResponse=False, bindAddress=None): self._reactor = reactor self._port = port self._bindAddress = bindAddress self._generatorFactory = generatorFactory self._timeout = timeout self._recvSize = recvSize self._prio = prio self._sok = sok self._maxConnections = maxConnections self._errorHandler = errorHandler self._compressResponse = compressResponse def listen(self): self._acceptor = Acceptor( reactor=self._reactor, port=self._port, sinkFactory=lambda sok: HttpHandler( reactor=self._reactor, sok=sok, generatorFactory=self._generatorFactory, timeout=self._timeout, recvSize=self._recvSize, prio=self._prio, maxConnections=self._maxConnections, errorHandler=self._errorHandler, compressResponse=self._compressResponse ), prio=self._prio, sok=self._sok, bindAddress=self._bindAddress) def setMaxConnections(self, m): self._maxConnections = m def shutdown(self): self._acceptor.shutdown()
class HttpsServer(object): """Factory that creates a HTTP server listening on port, calling generatorFactory for each new connection. When a client does not send a valid HTTP request, it is disconnected after timeout seconds. The generatorFactory is called with the HTTP Status and Headers as arguments. It is expected to return a generator that produces the response -- including the Status line and Headers -- to be send to the client.""" def __init__(self, reactor, port, generatorFactory, timeout=1, recvSize=RECVSIZE, prio=None, sok=None, certfile='', keyfile='', maxConnections=None, errorHandler=None, compressResponse=False, bindAddress=None): self._reactor = reactor self._port = port self._bindAddress = bindAddress self._generatorFactory = generatorFactory self._timeout = timeout self._recvSize = recvSize self._prio = prio self._sok = sok self._certfile = certfile self._keyfile = keyfile self._maxConnections = maxConnections self._errorHandler = errorHandler self._compressResponse = compressResponse def listen(self): # This should have been a SSLAcceptor ... if self._sok == None: def verify_cb(conn, cert, errnum, depth, ok): # This obviously has to be updated print 'Got certificate: %s' % cert.get_subject() return ok # Initialize context ctx = SSL.Context(SSL.SSLv23_METHOD) ctx.set_session_id('weightless:%s:%s' % (time(), randint(1024, 4096))) ctx.set_options(SSL.OP_NO_SSLv2) ctx.set_verify(SSL.VERIFY_PEER, verify_cb) # Demand a certificate ctx.use_privatekey_file(self._keyfile) ctx.use_certificate_file(self._certfile) # Set up server self._sok = SSL.Connection(ctx, socket()) self._sok.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) self._sok.setsockopt(SOL_SOCKET, SO_LINGER, pack('ii', 0, 0)) self._sok.bind( ('0.0.0.0' if self._bindAddress is None else self._bindAddress, self._port)) self._sok.listen(127) self._acceptor = Acceptor(reactor=self._reactor, port=self._port, sinkFactory=lambda sok: HttpsHandler( reactor=self._reactor, sok=sok, generatorFactory=self._generatorFactory, timeout=self._timeout, recvSize=self._recvSize, prio=self._prio, maxConnections=self._maxConnections, errorHandler=self._errorHandler, compressResponse=self._compressResponse), prio=self._prio, sok=self._sok, bindAddress=self._bindAddress) def setMaxConnections(self, m): self._maxConnections = m def shutdown(self): self._acceptor.shutdown()
class HttpsServer(object): """Factory that creates a HTTP server listening on port, calling generatorFactory for each new connection. When a client does not send a valid HTTP request, it is disconnected after timeout seconds. The generatorFactory is called with the HTTP Status and Headers as arguments. It is expected to return a generator that produces the response -- including the Status line and Headers -- to be send to the client.""" def __init__(self, reactor, port, generatorFactory, timeout=1, recvSize=RECVSIZE, prio=None, sok=None, certfile='', keyfile='', maxConnections=None, errorHandler=None, compressResponse=False, bindAddress=None): self._reactor = reactor self._port = port self._bindAddress = bindAddress self._generatorFactory = generatorFactory self._timeout = timeout self._recvSize = recvSize self._prio = prio self._sok = sok self._certfile = certfile self._keyfile = keyfile self._maxConnections = maxConnections self._errorHandler = errorHandler self._compressResponse = compressResponse def listen(self): # This should have been a SSLAcceptor ... if self._sok == None: def verify_cb(conn, cert, errnum, depth, ok): # This obviously has to be updated print 'Got certificate: %s' % cert.get_subject() return ok # Initialize context ctx = SSL.Context(SSL.SSLv23_METHOD) ctx.set_session_id('weightless:%s:%s' % (time(), randint(1024,4096))) ctx.set_options(SSL.OP_NO_SSLv2) ctx.set_verify(SSL.VERIFY_PEER, verify_cb) # Demand a certificate ctx.use_privatekey_file(self._keyfile) ctx.use_certificate_file(self._certfile) # Set up server self._sok = SSL.Connection(ctx, socket()) self._sok.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) self._sok.setsockopt(SOL_SOCKET, SO_LINGER, pack('ii', 0, 0)) self._sok.bind(('0.0.0.0' if self._bindAddress is None else self._bindAddress, self._port)) self._sok.listen(127) self._acceptor = Acceptor( reactor=self._reactor, port=self._port, sinkFactory=lambda sok: HttpsHandler( reactor=self._reactor, sok=sok, generatorFactory=self._generatorFactory, timeout=self._timeout, recvSize=self._recvSize, prio=self._prio, maxConnections=self._maxConnections, errorHandler=self._errorHandler, compressResponse=self._compressResponse ), prio=self._prio, sok=self._sok, bindAddress=self._bindAddress) def setMaxConnections(self, m): self._maxConnections = m def shutdown(self): self._acceptor.shutdown()