Esempio n. 1
0
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
Esempio n. 2
0
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()