Ë
    ·�©jF  ã                  ó
  — d dl mZ d dlZd dlmZmZmZmZ d dlm	Z	m
Z
 g d¢Z G d„ de«      Z ej                  d«      j                  Z G d	„ d
eeef   «      Z G d„ de
«      Zeeeef   z  eeeef      z  ez  Z	 ddlmZ y)é    )ÚannotationsN)ÚIterableÚIteratorÚMappingÚMutableMapping)ÚAnyÚProtocol)ÚHeadersÚHeadersLikeÚMultipleValuesErrorc                  ó$   ‡ — e Zd ZdZdˆ fd„Zˆ xZS )r   zP
    Exception raised when :class:`Headers` has multiple values for a key.

    c                ó€   •— t        | j                  «      dk(  rt        | j                  d   «      S t        ‰| �  «       S ©Né   r   )ÚlenÚargsÚreprÚsuperÚ__str__)ÚselfÚ	__class__s    €ú`/var/www/html/streamforge-license/venv/lib/python3.12/site-packages/websockets/datastructures.pyr   zMultipleValuesError.__str__   s3   ø€ äˆt�y‰y‹>˜QÒÜ˜Ÿ	™	 !™Ó%Ð%Ü‰w‰Ó Ð ó    ©ÚreturnÚstr)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__classcell__©r   s   @r   r   r      s   ø„ ñ÷
!ñ !r   r   z[\x09\x20-\x7e\x80-\xff]*c                  ó¬   ‡ — e Zd ZdZddgZdd„Zdd„Zdd„Zdd„Zdd„Z	dd	„Z
dd
„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d„Zdˆ fd„Zd!d„Zd"d„Zdd„Zˆ xZS )#r
   a¢	  
    Efficient data structure for manipulating HTTP headers.

    A :class:`list` of ``(name, values)`` is inefficient for lookups.

    A :class:`dict` doesn't suffice because header names are case-insensitive
    and multiple occurrences of headers with the same name are possible.

    :class:`Headers` stores HTTP headers in a hybrid data structure to provide
    efficient insertions and lookups while preserving the original data.

    In order to account for multiple values with minimal hassle,
    :class:`Headers` follows this logic:

    - When getting a header with ``headers[name]``:
        - if there's no value, :exc:`KeyError` is raised;
        - if there's exactly one value, it's returned;
        - if there's more than one value, :exc:`MultipleValuesError` is raised.

    - When setting a header with ``headers[name] = value``, the value is
      appended to the list of values for that header.

    - When deleting a header with ``del headers[name]``, all values for that
      header are removed (this is slow).

    Other methods for manipulating headers are consistent with this logic.

    As long as no header occurs multiple times, :class:`Headers` behaves like
    :class:`dict`, except keys are lower-cased to provide case-insensitivity.

    Two methods support manipulating multiple values explicitly:

    - :meth:`get_all` returns a list of all values for a header;
    - :meth:`raw_items` returns an iterator of ``(name, values)`` pairs.

    Header names and values are expected to contain only ASCII text. However,
    non-ASCII values happen in practice, even though there is no standard for
    transmitting non-ASCII data in HTTP headers. :class:`Headers` supports it
    by treating it as ISO-8859-1 data. This is a safe and reversible encoding
    to represent arbitrary data in a :class:`str`.

    When reading headers from the network, if the actual encoding isn't
    ISO-8859-1, you must re-encode and decode, e.g.::

        value = headers[key].encode("iso-8859-1").decode("utf-8")

    Conversely, when sending headers to the network, if you need to use a
    different encoding, you can encode and decode, e.g.::

        headers[key] = value.encode("utf-8").decode("iso-8859-1")

    When assigning a value to a header, as a security hardening measure, the
    value is checked for unsafe characters. The name isn't checked because it's
    usually a constant in code, unlikely to be tainted by user input.

    Ú_dictÚ_listc                óD   — i | _         g | _         | j                  |i |¤Ž y ©N)r$   r%   Úupdate)r   r   Úkwargss      r   Ú__init__zHeaders.__init__]   s#   € Ø+-ˆŒ
Ø,.ˆŒ
Øˆ�‰�TÐ$˜VÓ$r   c                óL   — dj                  d„ | j                  D «       «      dz   S )NÚ c              3  ó2   K  — | ]  \  }}|› d |› d�–— Œ y­w)z: ú
N© )Ú.0ÚkeyÚvalues      r   ú	<genexpr>z"Headers.__str__.<locals>.<genexpr>c   s!   è ø€ ÒJ±°°e˜#˜˜b   tÔ,ÑJùs   ‚r.   )Újoinr%   ©r   s    r   r   zHeaders.__str__b   s    € Ø�w‰wÑJ¸t¿z¹zÔJÓJÈVÑSÐSr   c                óN   — | j                   j                  › d| j                  ›d�S )Nú(ú))r   r   r%   r5   s    r   Ú__repr__zHeaders.__repr__e   s$   € Ø—.‘.×)Ñ)Ð*¨!¨D¯J©J¨>¸Ð;Ð;r   c                ó¢   — | j                  «       }| j                  j                  «       |_        | j                  j                  «       |_        |S r'   )r   r$   Úcopyr%   )r   r;   s     r   r;   zHeaders.copyh   s7   € Ø�~‰~ÓˆØ—Z‘Z—_‘_Ó&ˆŒ
Ø—Z‘Z—_‘_Ó&ˆŒ
Øˆr   c                ó6   — t        | «      j                  d«      S )Nz
iso-8859-1)r   Úencoder5   s    r   Ú	serializezHeaders.serializen   s   € ô �4‹y×Ñ Ó-Ð-r   c                ó^   — t        |t        «      xr |j                  «       | j                  v S r'   )Ú
isinstancer   Úlowerr$   ©r   r1   s     r   Ú__contains__zHeaders.__contains__u   s#   € Ü˜#œsÓ#ÒA¨¯	©	«°t·z±zÐ(AÐAr   c                ó,   — t        | j                  «      S r'   )Úiterr$   r5   s    r   Ú__iter__zHeaders.__iter__x   s   € Ü�D—J‘JÓÐr   c                ó,   — t        | j                  «      S r'   )r   r$   r5   s    r   Ú__len__zHeaders.__len__{   s   € Ü�4—:‘:‹Ðr   c                óx   — | j                   |j                  «          }t        |«      dk(  r|d   S t        |«      ‚r   )r$   rA   r   r   ©r   r1   r2   s      r   Ú__getitem__zHeaders.__getitem__€   s5   € Ø—
‘
˜3Ÿ9™9›;Ñ'ˆÜˆu‹:˜Š?Ø˜‘8ˆOä% cÓ*Ð*r   c                óð   — t        t        |«      «      st        ||«      ‚| j                  j	                  |j                  «       g «      j                  |«       | j                  j                  ||f«       y r'   )Úis_valid_header_valuer   ÚInvalidHeaderValuer$   Ú
setdefaultrA   Úappendr%   rJ   s      r   Ú__setitem__zHeaders.__setitem__‡   sV   € Ü$¤S¨£ZÔ0Ü$ S¨%Ó0Ð0Ø�
‰
×Ñ˜cŸi™i›k¨2Ó.×5Ñ5°eÔ<Ø�
‰
×Ñ˜3 ˜,Õ'r   c                óÚ   — |j                  «       }| j                  j                  |«       | j                  D ��cg c]  \  }}|j                  «       |k7  sŒ||f‘Œ c}}| _        y c c}}w r'   )rA   r$   Ú__delitem__r%   )r   r1   Ú	key_lowerÚkÚvs        r   rS   zHeaders.__delitem__�   sM   € Ø—I‘I“Kˆ	Ø�
‰
×Ñ˜yÔ)à)-¯©×N¡  A°q·w±w³yÀIÓ7M�q˜!’fÓNˆ�
ùÓNs   »A'ÁA'c                ó`   — t        |t        «      st        S | j                  |j                  k(  S r'   )r@   r
   ÚNotImplementedr$   )r   Úothers     r   Ú__eq__zHeaders.__eq__“   s%   € Ü˜%¤Ô)Ü!Ð!Ø�z‰z˜UŸ[™[Ñ(Ð(r   c                ó    — i | _         g | _        y)z&
        Remove all headers.

        N)r$   r%   r5   s    r   ÚclearzHeaders.clear˜   s   € ð
 ˆŒ
Øˆ�
r   c                óH   •— t        d„ |D «       «      }t        ‰| �  |i |¤Ž y)zT
        Update from a :class:`Headers` instance and/or keyword arguments.

        c              3  ó`   K  — | ]&  }t        |t        «      r|j                  «       n|–— Œ( y ­wr'   )r@   r
   Ú	raw_items)r0   Úargs     r   r3   z!Headers.update.<locals>.<genexpr>¥   s)   è ø€ ò 
ØEHœz¨#¬wÔ7ˆC�M‰MŒO¸SÓ@ñ
ùs   ‚,.N)Útupler   r(   )r   r   r)   r   s      €r   r(   zHeaders.update    s/   ø€ ô
 ñ 
ØLPô
ó 
ˆô 	‰‰˜Ð' Ó'r   c                óV   — | j                   j                  |j                  «       g «      S )z|
        Return the (possibly empty) list of all values for a header.

        Args:
            key: Header name.

        )r$   ÚgetrA   rB   s     r   Úget_allzHeaders.get_all¬   s   € ð �z‰z�~‰~˜cŸi™i›k¨2Ó.Ð.r   c                ó,   — t        | j                  «      S )zO
        Return an iterator of all values as ``(name, value)`` pairs.

        )rE   r%   r5   s    r   r_   zHeaders.raw_items¶   s   € ô
 �D—J‘JÓÐr   c                ó°   — | j                   j                  |j                  «       g «      j                  |«       | j                  j                  ||f«       y)z=
        Set a header without validating its value.

        N)r$   rO   rA   rP   r%   rJ   s      r   Úset_insecurezHeaders.set_insecure¿   s?   € ð
 	�
‰
×Ñ˜cŸi™i›k¨2Ó.×5Ñ5°eÔ<Ø�
‰
×Ñ˜3 ˜,Õ'r   )r   r   r)   r   r   ÚNoner   )r   r
   )r   Úbytes)r1   Úobjectr   Úbool)r   zIterator[str])r   Úint©r1   r   r   r   )r1   r   r2   r   r   rh   )r1   r   r   rh   )rY   r   r   rk   )r   rh   )r1   r   r   z	list[str])r   zIterator[tuple[str, str]])r   r   r   r    Ú	__slots__r*   r   r9   r;   r>   rC   rF   rH   rK   rQ   rS   rZ   r\   r(   rd   r_   rg   r!   r"   s   @r   r
   r
       sm   ø„ ñ7ðr ˜'Ð"€Ió%ó
Tó<óó.óBó óó
+ó(óOó)ó
õ(ó/ó ÷(r   r
   c                  ó    — e Zd ZdZdd„Zdd„Zy)ÚSupportsKeysAndGetItemz_
    Dict-like types with ``keys() -> str`` and ``__getitem__(key: str) -> str`` methods.

    c                 ó   — y r'   r/   r5   s    r   ÚkeyszSupportsKeysAndGetItem.keysÏ   ó   � r   c                 ó   — y r'   r/   rB   s     r   rK   z"SupportsKeysAndGetItem.__getitem__Ñ   rs   r   N)r   zIterable[str]rm   )r   r   r   r    rr   rK   r/   r   r   rp   rp   É   s   „ ñó
 )ä/r   rp   r   )rN   )Ú
__future__r   ÚreÚcollections.abcr   r   r   r   Útypingr   r	   Ú__all__ÚLookupErrorr   ÚcompileÚ	fullmatchrM   r   r
   rp   ra   r   Ú
exceptionsrN   r/   r   r   ú<module>r~      sŸ   ðÝ "ã 	ß GÓ Gß  ò€ô
!˜+ô 
!ð #˜Ÿ
™
Ð#?Ó@×JÑJÐ ôe(ˆn˜S #˜XÑ&ô e(ôR0˜Xô 0ð ˆg�c˜3�hÑÑ (¨5°°c°©?Ñ";Ñ;Ð>TÑTð ðö +r   