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 ]
Name | Type | Size | Last Modified | Actions |
---|---|---|---|---|
.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. |
import datetime import functools import logging import os import re import time as time_mod from collections import namedtuple from typing import Any, Callable, Dict, Iterable, List, Tuple # noqa from .abc import AbstractAccessLogger from .web_request import BaseRequest from .web_response import StreamResponse KeyMethod = namedtuple("KeyMethod", "key method") class AccessLogger(AbstractAccessLogger): """Helper object to log access. Usage: log = logging.getLogger("spam") log_format = "%a %{User-Agent}i" access_logger = AccessLogger(log, log_format) access_logger.log(request, response, time) Format: %% The percent sign %a Remote IP-address (IP-address of proxy if using reverse proxy) %t Time when the request was started to process %P The process ID of the child that serviced the request %r First line of request %s Response status code %b Size of response in bytes, including HTTP headers %T Time taken to serve the request, in seconds %Tf Time taken to serve the request, in seconds with floating fraction in .06f format %D Time taken to serve the request, in microseconds %{FOO}i request.headers['FOO'] %{FOO}o response.headers['FOO'] %{FOO}e os.environ['FOO'] """ LOG_FORMAT_MAP = { "a": "remote_address", "t": "request_start_time", "P": "process_id", "r": "first_request_line", "s": "response_status", "b": "response_size", "T": "request_time", "Tf": "request_time_frac", "D": "request_time_micro", "i": "request_header", "o": "response_header", } LOG_FORMAT = '%a %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' FORMAT_RE = re.compile(r"%(\{([A-Za-z0-9\-_]+)\}([ioe])|[atPrsbOD]|Tf?)") CLEANUP_RE = re.compile(r"(%[^s])") _FORMAT_CACHE: Dict[str, Tuple[str, List[KeyMethod]]] = {} def __init__(self, logger: logging.Logger, log_format: str = LOG_FORMAT) -> None: """Initialise the logger. logger is a logger object to be used for logging. log_format is a string with apache compatible log format description. """ super().__init__(logger, log_format=log_format) _compiled_format = AccessLogger._FORMAT_CACHE.get(log_format) if not _compiled_format: _compiled_format = self.compile_format(log_format) AccessLogger._FORMAT_CACHE[log_format] = _compiled_format self._log_format, self._methods = _compiled_format def compile_format(self, log_format: str) -> Tuple[str, List[KeyMethod]]: """Translate log_format into form usable by modulo formatting All known atoms will be replaced with %s Also methods for formatting of those atoms will be added to _methods in appropriate order For example we have log_format = "%a %t" This format will be translated to "%s %s" Also contents of _methods will be [self._format_a, self._format_t] These method will be called and results will be passed to translated string format. Each _format_* method receive 'args' which is list of arguments given to self.log Exceptions are _format_e, _format_i and _format_o methods which also receive key name (by functools.partial) """ # list of (key, method) tuples, we don't use an OrderedDict as users # can repeat the same key more than once methods = list() for atom in self.FORMAT_RE.findall(log_format): if atom[1] == "": format_key1 = self.LOG_FORMAT_MAP[atom[0]] m = getattr(AccessLogger, "_format_%s" % atom[0]) key_method = KeyMethod(format_key1, m) else: format_key2 = (self.LOG_FORMAT_MAP[atom[2]], atom[1]) m = getattr(AccessLogger, "_format_%s" % atom[2]) key_method = KeyMethod(format_key2, functools.partial(m, atom[1])) methods.append(key_method) log_format = self.FORMAT_RE.sub(r"%s", log_format) log_format = self.CLEANUP_RE.sub(r"%\1", log_format) return log_format, methods @staticmethod def _format_i( key: str, request: BaseRequest, response: StreamResponse, time: float ) -> str: if request is None: return "(no headers)" # suboptimal, make istr(key) once return request.headers.get(key, "-") @staticmethod def _format_o( key: str, request: BaseRequest, response: StreamResponse, time: float ) -> str: # suboptimal, make istr(key) once return response.headers.get(key, "-") @staticmethod def _format_a(request: BaseRequest, response: StreamResponse, time: float) -> str: if request is None: return "-" ip = request.remote return ip if ip is not None else "-" @staticmethod def _format_t(request: BaseRequest, response: StreamResponse, time: float) -> str: tz = datetime.timezone(datetime.timedelta(seconds=-time_mod.timezone)) now = datetime.datetime.now(tz) start_time = now - datetime.timedelta(seconds=time) return start_time.strftime("[%d/%b/%Y:%H:%M:%S %z]") @staticmethod def _format_P(request: BaseRequest, response: StreamResponse, time: float) -> str: return "<%s>" % os.getpid() @staticmethod def _format_r(request: BaseRequest, response: StreamResponse, time: float) -> str: if request is None: return "-" return "{} {} HTTP/{}.{}".format( request.method, request.path_qs, request.version.major, request.version.minor, ) @staticmethod def _format_s(request: BaseRequest, response: StreamResponse, time: float) -> int: return response.status @staticmethod def _format_b(request: BaseRequest, response: StreamResponse, time: float) -> int: return response.body_length @staticmethod def _format_T(request: BaseRequest, response: StreamResponse, time: float) -> str: return str(round(time)) @staticmethod def _format_Tf(request: BaseRequest, response: StreamResponse, time: float) -> str: return "%06f" % time @staticmethod def _format_D(request: BaseRequest, response: StreamResponse, time: float) -> str: return str(round(time * 1000000)) def _format_line( self, request: BaseRequest, response: StreamResponse, time: float ) -> Iterable[Tuple[str, Callable[[BaseRequest, StreamResponse, float], str]]]: return [(key, method(request, response, time)) for key, method in self._methods] def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: if not self.logger.isEnabledFor(logging.INFO): # Avoid formatting the log line if it will not be emitted. return try: fmt_info = self._format_line(request, response, time) values = list() extra = dict() for key, value in fmt_info: values.append(value) if key.__class__ is str: extra[key] = value else: k1, k2 = key # type: ignore[misc] dct = extra.get(k1, {}) # type: ignore[var-annotated,has-type] dct[k2] = value # type: ignore[index,has-type] extra[k1] = dct # type: ignore[has-type,assignment] self.logger.info(self._log_format % tuple(values), extra=extra) except Exception: self.logger.exception("Error in logging")
SILENT KILLER Tool