async def open_ssl_over_tcp_listeners(port, ssl_context, *, host=None, https_compatible=False, backlog=None): """Start listening for SSL/TLS-encrypted TCP connections to the given port. Args: port (int): The port to listen on. See :func:`open_tcp_listeners`. ssl_context (~ssl.SSLContext): The SSL context to use for all incoming connections. host (str, bytes, or None): The address to bind to; use ``None`` to bind to the wildcard address. See :func:`open_tcp_listeners`. https_compatible (bool): See :class:`~trio.SSLStream` for details. backlog (int or None): See :func:`open_tcp_listeners` for details. """ tcp_listeners = await trio.open_tcp_listeners(port, host=host, backlog=backlog) ssl_listeners = [ trio.SSLListener( tcp_listener, ssl_context, https_compatible=https_compatible, ) for tcp_listener in tcp_listeners ] return ssl_listeners
async def worker_serve( app: ASGIFramework, config: Config, *, sockets: Optional[Sockets] = None, shutdown_trigger: Optional[Callable[..., Awaitable[None]]] = None, task_status: trio._core._run._TaskStatus = trio.TASK_STATUS_IGNORED, ) -> None: config.set_statsd_logger_class(StatsdLogger) lifespan = Lifespan(app, config) reload_ = False async with trio.open_nursery() as lifespan_nursery: await lifespan_nursery.start(lifespan.handle_lifespan) await lifespan.wait_for_startup() try: async with trio.open_nursery() as nursery: if config.use_reloader: nursery.start_soon(observe_changes, trio.sleep) if shutdown_trigger is not None: nursery.start_soon(raise_shutdown, shutdown_trigger) if sockets is None: sockets = config.create_sockets() for sock in sockets.secure_sockets: sock.listen(config.backlog) for sock in sockets.insecure_sockets: sock.listen(config.backlog) ssl_context = config.create_ssl_context() listeners = [] binds = [] for sock in sockets.secure_sockets: listeners.append( trio.SSLListener( trio.SocketListener( trio.socket.from_stdlib_socket(sock)), ssl_context, https_compatible=True, )) bind = repr_socket_addr(sock.family, sock.getsockname()) binds.append(f"https://{bind}") await config.log.info( f"Running on https://{bind} (CTRL + C to quit)") for sock in sockets.insecure_sockets: listeners.append( trio.SocketListener( trio.socket.from_stdlib_socket(sock))) bind = repr_socket_addr(sock.family, sock.getsockname()) binds.append(f"http://{bind}") await config.log.info( f"Running on http://{bind} (CTRL + C to quit)") for sock in sockets.quic_sockets: await nursery.start( UDPServer(app, config, sock, nursery).run) bind = repr_socket_addr(sock.family, sock.getsockname()) await config.log.info( f"Running on https://{bind} (QUIC) (CTRL + C to quit)") task_status.started(binds) await trio.serve_listeners(partial(TCPServer, app, config), listeners, handler_nursery=lifespan_nursery) except MustReloadException: reload_ = True except (Shutdown, KeyboardInterrupt): pass finally: try: await trio.sleep(config.graceful_timeout) except (Shutdown, KeyboardInterrupt): pass await lifespan.wait_for_shutdown() lifespan_nursery.cancel_scope.cancel() if reload_: restart()