SILENT KILLERPanel

Current Path: > > opt > cloudlinux > venv > lib64 > python3.11 > > > site-packages > aiohttp


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: //opt/cloudlinux/venv/lib64/python3.11///site-packages/aiohttp

NameTypeSizeLast ModifiedActions
.hash Directory - -
__pycache__ Directory - -
__init__.py File 7762 bytes April 17 2025 13:10:59.
_cparser.pxd File 4318 bytes April 17 2025 13:10:59.
_find_header.pxd File 68 bytes April 17 2025 13:10:59.
_headers.pxi File 2007 bytes April 17 2025 13:10:59.
_helpers.cpython-311-x86_64-linux-gnu.so File 88072 bytes April 17 2025 13:11:30.
_helpers.pyi File 202 bytes April 17 2025 13:10:59.
_helpers.pyx File 1049 bytes April 17 2025 13:10:59.
_http_parser.cpython-311-x86_64-linux-gnu.so File 583264 bytes April 17 2025 13:11:30.
_http_parser.pyx File 28058 bytes April 17 2025 13:10:59.
_http_writer.cpython-311-x86_64-linux-gnu.so File 76808 bytes April 17 2025 13:11:30.
_http_writer.pyx File 4575 bytes April 17 2025 13:10:59.
_websocket.cpython-311-x86_64-linux-gnu.so File 54648 bytes April 17 2025 13:11:30.
_websocket.pyx File 1561 bytes April 17 2025 13:10:59.
abc.py File 5500 bytes April 17 2025 13:10:59.
base_protocol.py File 2741 bytes April 17 2025 13:10:59.
client.py File 47276 bytes April 17 2025 13:10:59.
client_exceptions.py File 9411 bytes April 17 2025 13:10:59.
client_proto.py File 8651 bytes April 17 2025 13:10:59.
client_reqrep.py File 39680 bytes April 17 2025 13:10:59.
client_ws.py File 11010 bytes April 17 2025 13:10:59.
compression_utils.py File 5015 bytes April 17 2025 13:10:59.
connector.py File 52798 bytes April 17 2025 13:10:59.
cookiejar.py File 14015 bytes April 17 2025 13:10:59.
formdata.py File 6106 bytes April 17 2025 13:10:59.
hdrs.py File 4613 bytes April 17 2025 13:10:59.
helpers.py File 30255 bytes April 17 2025 13:10:59.
http.py File 1842 bytes April 17 2025 13:10:59.
http_exceptions.py File 2716 bytes April 17 2025 13:10:59.
http_parser.py File 35496 bytes April 17 2025 13:10:59.
http_websocket.py File 26716 bytes April 17 2025 13:10:59.
http_writer.py File 5933 bytes April 17 2025 13:10:59.
locks.py File 1136 bytes April 17 2025 13:10:59.
log.py File 325 bytes April 17 2025 13:10:59.
multipart.py File 32472 bytes April 17 2025 13:10:59.
payload.py File 13542 bytes April 17 2025 13:10:59.
payload_streamer.py File 2087 bytes April 17 2025 13:10:59.
py.typed File 7 bytes April 17 2025 13:10:59.
pytest_plugin.py File 11605 bytes April 17 2025 13:10:59.
resolver.py File 5070 bytes April 17 2025 13:10:59.
streams.py File 20836 bytes April 17 2025 13:10:59.
tcp_helpers.py File 961 bytes April 17 2025 13:10:59.
test_utils.py File 20185 bytes April 17 2025 13:10:59.
tracing.py File 15132 bytes April 17 2025 13:10:59.
typedefs.py File 1471 bytes April 17 2025 13:10:59.
web.py File 19263 bytes April 17 2025 13:10:59.
web_app.py File 18311 bytes April 17 2025 13:10:59.
web_exceptions.py File 10360 bytes April 17 2025 13:10:59.
web_fileresponse.py File 11416 bytes April 17 2025 13:10:59.
web_log.py File 7801 bytes April 17 2025 13:10:59.
web_middlewares.py File 4032 bytes April 17 2025 13:10:59.
web_protocol.py File 23044 bytes April 17 2025 13:10:59.
web_request.py File 28756 bytes April 17 2025 13:10:59.
web_response.py File 27729 bytes April 17 2025 13:10:59.
web_routedef.py File 6132 bytes April 17 2025 13:10:59.
web_runner.py File 11736 bytes April 17 2025 13:10:59.
web_server.py File 2587 bytes April 17 2025 13:10:59.
web_urldispatcher.py File 40057 bytes April 17 2025 13:10:59.
web_ws.py File 18647 bytes April 17 2025 13:10:59.
worker.py File 7965 bytes April 17 2025 13:10:59.

Reading File: //opt/cloudlinux/venv/lib64/python3.11///site-packages/aiohttp/worker.py

"""Async gunicorn worker for aiohttp.web"""

import asyncio
import os
import re
import signal
import sys
from types import FrameType
from typing import Any, Awaitable, Callable, Optional, Union  # noqa

from gunicorn.config import AccessLogFormat as GunicornAccessLogFormat
from gunicorn.workers import base

from aiohttp import web

from .helpers import set_result
from .web_app import Application
from .web_log import AccessLogger

try:
    import ssl

    SSLContext = ssl.SSLContext
except ImportError:  # pragma: no cover
    ssl = None  # type: ignore[assignment]
    SSLContext = object  # type: ignore[misc,assignment]


__all__ = ("GunicornWebWorker", "GunicornUVLoopWebWorker")


class GunicornWebWorker(base.Worker):  # type: ignore[misc,no-any-unimported]

    DEFAULT_AIOHTTP_LOG_FORMAT = AccessLogger.LOG_FORMAT
    DEFAULT_GUNICORN_LOG_FORMAT = GunicornAccessLogFormat.default

    def __init__(self, *args: Any, **kw: Any) -> None:  # pragma: no cover
        super().__init__(*args, **kw)

        self._task: Optional[asyncio.Task[None]] = None
        self.exit_code = 0
        self._notify_waiter: Optional[asyncio.Future[bool]] = None

    def init_process(self) -> None:
        # create new event_loop after fork
        asyncio.get_event_loop().close()

        self.loop = asyncio.new_event_loop()
        asyncio.set_event_loop(self.loop)

        super().init_process()

    def run(self) -> None:
        self._task = self.loop.create_task(self._run())

        try:  # ignore all finalization problems
            self.loop.run_until_complete(self._task)
        except Exception:
            self.log.exception("Exception in gunicorn worker")
        self.loop.run_until_complete(self.loop.shutdown_asyncgens())
        self.loop.close()

        sys.exit(self.exit_code)

    async def _run(self) -> None:
        runner = None
        if isinstance(self.wsgi, Application):
            app = self.wsgi
        elif asyncio.iscoroutinefunction(self.wsgi):
            wsgi = await self.wsgi()
            if isinstance(wsgi, web.AppRunner):
                runner = wsgi
                app = runner.app
            else:
                app = wsgi
        else:
            raise RuntimeError(
                "wsgi app should be either Application or "
                "async function returning Application, got {}".format(self.wsgi)
            )

        if runner is None:
            access_log = self.log.access_log if self.cfg.accesslog else None
            runner = web.AppRunner(
                app,
                logger=self.log,
                keepalive_timeout=self.cfg.keepalive,
                access_log=access_log,
                access_log_format=self._get_valid_log_format(
                    self.cfg.access_log_format
                ),
                shutdown_timeout=self.cfg.graceful_timeout / 100 * 95,
            )
        await runner.setup()

        ctx = self._create_ssl_context(self.cfg) if self.cfg.is_ssl else None

        runner = runner
        assert runner is not None
        server = runner.server
        assert server is not None
        for sock in self.sockets:
            site = web.SockSite(
                runner,
                sock,
                ssl_context=ctx,
            )
            await site.start()

        # If our parent changed then we shut down.
        pid = os.getpid()
        try:
            while self.alive:  # type: ignore[has-type]
                self.notify()

                cnt = server.requests_count
                if self.max_requests and cnt > self.max_requests:
                    self.alive = False
                    self.log.info("Max requests, shutting down: %s", self)

                elif pid == os.getpid() and self.ppid != os.getppid():
                    self.alive = False
                    self.log.info("Parent changed, shutting down: %s", self)
                else:
                    await self._wait_next_notify()
        except BaseException:
            pass

        await runner.cleanup()

    def _wait_next_notify(self) -> "asyncio.Future[bool]":
        self._notify_waiter_done()

        loop = self.loop
        assert loop is not None
        self._notify_waiter = waiter = loop.create_future()
        self.loop.call_later(1.0, self._notify_waiter_done, waiter)

        return waiter

    def _notify_waiter_done(
        self, waiter: Optional["asyncio.Future[bool]"] = None
    ) -> None:
        if waiter is None:
            waiter = self._notify_waiter
        if waiter is not None:
            set_result(waiter, True)

        if waiter is self._notify_waiter:
            self._notify_waiter = None

    def init_signals(self) -> None:
        # Set up signals through the event loop API.

        self.loop.add_signal_handler(
            signal.SIGQUIT, self.handle_quit, signal.SIGQUIT, None
        )

        self.loop.add_signal_handler(
            signal.SIGTERM, self.handle_exit, signal.SIGTERM, None
        )

        self.loop.add_signal_handler(
            signal.SIGINT, self.handle_quit, signal.SIGINT, None
        )

        self.loop.add_signal_handler(
            signal.SIGWINCH, self.handle_winch, signal.SIGWINCH, None
        )

        self.loop.add_signal_handler(
            signal.SIGUSR1, self.handle_usr1, signal.SIGUSR1, None
        )

        self.loop.add_signal_handler(
            signal.SIGABRT, self.handle_abort, signal.SIGABRT, None
        )

        # Don't let SIGTERM and SIGUSR1 disturb active requests
        # by interrupting system calls
        signal.siginterrupt(signal.SIGTERM, False)
        signal.siginterrupt(signal.SIGUSR1, False)
        # Reset signals so Gunicorn doesn't swallow subprocess return codes
        # See: https://github.com/aio-libs/aiohttp/issues/6130

    def handle_quit(self, sig: int, frame: Optional[FrameType]) -> None:
        self.alive = False

        # worker_int callback
        self.cfg.worker_int(self)

        # wakeup closing process
        self._notify_waiter_done()

    def handle_abort(self, sig: int, frame: Optional[FrameType]) -> None:
        self.alive = False
        self.exit_code = 1
        self.cfg.worker_abort(self)
        sys.exit(1)

    @staticmethod
    def _create_ssl_context(cfg: Any) -> "SSLContext":
        """Creates SSLContext instance for usage in asyncio.create_server.

        See ssl.SSLSocket.__init__ for more details.
        """
        if ssl is None:  # pragma: no cover
            raise RuntimeError("SSL is not supported.")

        ctx = ssl.SSLContext(cfg.ssl_version)
        ctx.load_cert_chain(cfg.certfile, cfg.keyfile)
        ctx.verify_mode = cfg.cert_reqs
        if cfg.ca_certs:
            ctx.load_verify_locations(cfg.ca_certs)
        if cfg.ciphers:
            ctx.set_ciphers(cfg.ciphers)
        return ctx

    def _get_valid_log_format(self, source_format: str) -> str:
        if source_format == self.DEFAULT_GUNICORN_LOG_FORMAT:
            return self.DEFAULT_AIOHTTP_LOG_FORMAT
        elif re.search(r"%\([^\)]+\)", source_format):
            raise ValueError(
                "Gunicorn's style options in form of `%(name)s` are not "
                "supported for the log formatting. Please use aiohttp's "
                "format specification to configure access log formatting: "
                "http://docs.aiohttp.org/en/stable/logging.html"
                "#format-specification"
            )
        else:
            return source_format


class GunicornUVLoopWebWorker(GunicornWebWorker):
    def init_process(self) -> None:
        import uvloop

        # Close any existing event loop before setting a
        # new policy.
        asyncio.get_event_loop().close()

        # Setup uvloop policy, so that every
        # asyncio.get_event_loop() will create an instance
        # of uvloop event loop.
        asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

        super().init_process()

SILENT KILLER Tool