about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/h2/config.py
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/h2/config.py')
-rw-r--r--.venv/lib/python3.12/site-packages/h2/config.py212
1 files changed, 212 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/h2/config.py b/.venv/lib/python3.12/site-packages/h2/config.py
new file mode 100644
index 00000000..cbc3b1ea
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/h2/config.py
@@ -0,0 +1,212 @@
+"""
+h2/config
+~~~~~~~~~
+
+Objects for controlling the configuration of the HTTP/2 stack.
+"""
+from __future__ import annotations
+
+import sys
+from typing import Any
+
+
+class _BooleanConfigOption:
+    """
+    Descriptor for handling a boolean config option.  This will block
+    attempts to set boolean config options to non-bools.
+    """
+
+    def __init__(self, name: str) -> None:
+        self.name = name
+        self.attr_name = f"_{self.name}"
+
+    def __get__(self, instance: Any, owner: Any) -> bool:
+        return getattr(instance, self.attr_name)  # type: ignore
+
+    def __set__(self, instance: Any, value: bool) -> None:
+        if not isinstance(value, bool):
+            msg = f"{self.name} must be a bool"
+            raise ValueError(msg)  # noqa: TRY004
+        setattr(instance, self.attr_name, value)
+
+
+class DummyLogger:
+    """
+    A Logger object that does not actual logging, hence a DummyLogger.
+
+    For the class the log operation is merely a no-op. The intent is to avoid
+    conditionals being sprinkled throughout the h2 code for calls to
+    logging functions when no logger is passed into the corresponding object.
+    """
+
+    def __init__(self, *vargs) -> None:  # type: ignore
+        pass
+
+    def debug(self, *vargs, **kwargs) -> None:  # type: ignore
+        """
+        No-op logging. Only level needed for now.
+        """
+
+    def trace(self, *vargs, **kwargs) -> None:  # type: ignore
+        """
+        No-op logging. Only level needed for now.
+        """
+
+
+class OutputLogger:
+    """
+    A Logger object that prints to stderr or any other file-like object.
+
+    This class is provided for convenience and not part of the stable API.
+
+    :param file: A file-like object passed to the print function.
+        Defaults to ``sys.stderr``.
+    :param trace: Enables trace-level output. Defaults to ``False``.
+    """
+
+    def __init__(self, file=None, trace_level=False) -> None:  # type: ignore
+        super().__init__()
+        self.file = file or sys.stderr
+        self.trace_level = trace_level
+
+    def debug(self, fmtstr, *args) -> None:  # type: ignore
+        print(f"h2 (debug): {fmtstr % args}", file=self.file)
+
+    def trace(self, fmtstr, *args) -> None:  # type: ignore
+        if self.trace_level:
+            print(f"h2 (trace): {fmtstr % args}", file=self.file)
+
+
+class H2Configuration:
+    """
+    An object that controls the way a single HTTP/2 connection behaves.
+
+    This object allows the users to customize behaviour. In particular, it
+    allows users to enable or disable optional features, or to otherwise handle
+    various unusual behaviours.
+
+    This object has very little behaviour of its own: it mostly just ensures
+    that configuration is self-consistent.
+
+    :param client_side: Whether this object is to be used on the client side of
+        a connection, or on the server side. Affects the logic used by the
+        state machine, the default settings values, the allowable stream IDs,
+        and several other properties. Defaults to ``True``.
+    :type client_side: ``bool``
+
+    :param header_encoding: Controls whether the headers emitted by this object
+        in events are transparently decoded to ``unicode`` strings, and what
+        encoding is used to do that decoding. This defaults to ``None``,
+        meaning that headers will be returned as bytes. To automatically
+        decode headers (that is, to return them as unicode strings), this can
+        be set to the string name of any encoding, e.g. ``'utf-8'``.
+
+        .. versionchanged:: 3.0.0
+           Changed default value from ``'utf-8'`` to ``None``
+
+    :type header_encoding: ``str``, ``False``, or ``None``
+
+    :param validate_outbound_headers: Controls whether the headers emitted
+        by this object are validated against the rules in RFC 7540.
+        Disabling this setting will cause outbound header validation to
+        be skipped, and allow the object to emit headers that may be illegal
+        according to RFC 7540. Defaults to ``True``.
+    :type validate_outbound_headers: ``bool``
+
+    :param normalize_outbound_headers: Controls whether the headers emitted
+        by this object are normalized before sending.  Disabling this setting
+        will cause outbound header normalization to be skipped, and allow
+        the object to emit headers that may be illegal according to
+        RFC 7540. Defaults to ``True``.
+    :type normalize_outbound_headers: ``bool``
+
+    :param split_outbound_cookies: Controls whether the outbound cookie
+        headers are split before sending or not. According to RFC 7540
+        - 8.1.2.5 the outbound header cookie headers may be split to improve
+        headers compression. Default is ``False``.
+    :type split_outbound_cookies: ``bool``
+
+    :param validate_inbound_headers: Controls whether the headers received
+        by this object are validated against the rules in RFC 7540.
+        Disabling this setting will cause inbound header validation to
+        be skipped, and allow the object to receive headers that may be illegal
+        according to RFC 7540. Defaults to ``True``.
+    :type validate_inbound_headers: ``bool``
+
+    :param normalize_inbound_headers: Controls whether the headers received by
+        this object are normalized according to the rules of RFC 7540.
+        Disabling this setting may lead to h2 emitting header blocks that
+        some RFCs forbid, e.g. with multiple cookie fields.
+
+        .. versionadded:: 3.0.0
+
+    :type normalize_inbound_headers: ``bool``
+
+    :param logger: A logger that conforms to the requirements for this module,
+        those being no I/O and no context switches, which is needed in order
+        to run in asynchronous operation.
+
+        .. versionadded:: 2.6.0
+
+    :type logger: ``logging.Logger``
+    """
+
+    client_side = _BooleanConfigOption("client_side")
+    validate_outbound_headers = _BooleanConfigOption(
+        "validate_outbound_headers",
+    )
+    normalize_outbound_headers = _BooleanConfigOption(
+        "normalize_outbound_headers",
+    )
+    split_outbound_cookies = _BooleanConfigOption(
+        "split_outbound_cookies",
+    )
+    validate_inbound_headers = _BooleanConfigOption(
+        "validate_inbound_headers",
+    )
+    normalize_inbound_headers = _BooleanConfigOption(
+        "normalize_inbound_headers",
+    )
+
+    def __init__(self,
+                 client_side: bool = True,
+                 header_encoding: bool | str | None = None,
+                 validate_outbound_headers: bool = True,
+                 normalize_outbound_headers: bool = True,
+                 split_outbound_cookies: bool = False,
+                 validate_inbound_headers: bool = True,
+                 normalize_inbound_headers: bool = True,
+                 logger: DummyLogger | OutputLogger | None = None) -> None:
+        self.client_side = client_side
+        self.header_encoding = header_encoding
+        self.validate_outbound_headers = validate_outbound_headers
+        self.normalize_outbound_headers = normalize_outbound_headers
+        self.split_outbound_cookies = split_outbound_cookies
+        self.validate_inbound_headers = validate_inbound_headers
+        self.normalize_inbound_headers = normalize_inbound_headers
+        self.logger = logger or DummyLogger(__name__)
+
+    @property
+    def header_encoding(self) -> bool | str | None:
+        """
+        Controls whether the headers emitted by this object in events are
+        transparently decoded to ``unicode`` strings, and what encoding is used
+        to do that decoding. This defaults to ``None``, meaning that headers
+        will be returned as bytes. To automatically decode headers (that is, to
+        return them as unicode strings), this can be set to the string name of
+        any encoding, e.g. ``'utf-8'``.
+        """
+        return self._header_encoding
+
+    @header_encoding.setter
+    def header_encoding(self, value: bool | str | None) -> None:
+        """
+        Enforces constraints on the value of header encoding.
+        """
+        if not isinstance(value, (bool, str, type(None))):
+            msg = "header_encoding must be bool, string, or None"
+            raise ValueError(msg)  # noqa: TRY004
+        if value is True:
+            msg = "header_encoding cannot be True"
+            raise ValueError(msg)
+        self._header_encoding = value