� <��g�����ddlmZddlmZmZmZmZddlmZm Z m Z gd�Z Gd�de ��Z Gd�deeef��ZGd �d e ��Ze eeeefeeeefefZd S) �)� annotations)�Iterable�Iterator�Mapping�MutableMapping)�Any�Protocol�Union)�Headers� HeadersLike�MultipleValuesErrorc�$��eZdZdZd�fd� Z�xZS)r zP Exception raised when :class:`Headers` has multiple values for a key. �return�strc���t|j��dkrt|jd��St�����S�N�r)�len�args�repr�super�__str__)�self� __class__s ��i/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/websockets/datastructures.pyrzMultipleValuesError.__str__s>��� �t�y�>�>�Q� � ��� �!� �%�%� %��w�w��� � � ��rr)�__name__� __module__� __qualname__�__doc__r� __classcell__�rs@rr r sG��������� !�!�!�!�!�!�!�!�!�!rr c���eZdZdZddgZd%d �Zd&d �Zd&d �Zd'd �Zd(d�Z d)d�Z d*d�Z d+d�Z d,d�Z d-d�Zd.d�Zd/d�Zd0d�Zd%�fd � Zd1d"�Zd2d$�Z�xZS)3r 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. �_dict�_listrr �kwargsrr�Nonec�<�i|_g|_|j|i|��dS�N)r%r&�update)rrr's r�__init__zHeaders.__init__Ds-��+-�� �,.�� ��� �T�$�V�$�$�$�$�$rc�P�d�d�|jD����dzS)N�c3�,K�|]\}}|�d|�d�V��dS)z: � N�)�.0�key�values r� <genexpr>z"Headers.__str__.<locals>.<genexpr>Js7����J�J���e�#�,�,��,�,�,�J�J�J�J�J�Jrr0)�joinr&�rs rrzHeaders.__str__Is*���w�w�J�J�t�z�J�J�J�J�J�V�S�Src�0�|jj�d|j�d�S)N�(�))rrr&r7s r�__repr__zHeaders.__repr__Ls ���.�)�;�;�D�J�;�;�;�;rc��|���}|j���|_|j���|_|Sr*)rr%�copyr&)rr=s rr=z Headers.copyOs<���~�~�����Z�_�_�&�&�� ��Z�_�_�&�&�� �� r�bytesc�D�t|�����Sr*)r�encoder7s r� serializezHeaders.serializeUs���4�y�y���!�!�!rr3�object�boolc�b�t|t��o|���|jvSr*)� isinstancer�lowerr%�rr3s r� __contains__zHeaders.__contains__[s&���#�s�#�#�A�� � � � �t�z�(A�Ar� Iterator[str]c�*�t|j��Sr*)�iterr%r7s r�__iter__zHeaders.__iter__^s���D�J���r�intc�*�t|j��Sr*)rr%r7s r�__len__zHeaders.__len__as���4�:���rc��|j|���}t|��dkr|dSt|���r)r%rFrr �rr3r4s r� __getitem__zHeaders.__getitem__fs<��� �3�9�9�;�;�'�� �u�:�:��?�?���8�O�%�c�*�*� *rr4c��|j�|���g���|��|j�||f��dSr*)r%� setdefaultrF�appendr&rQs r� __setitem__zHeaders.__setitem__msP�� � ���c�i�i�k�k�2�.�.�5�5�e�<�<�<� � ���3��,�'�'�'�'�'rc���|����|j�����fd�|jD��|_dS)Nc�N��g|]!\}}|����k�||f��"Sr1)rF)r2�k�v� key_lowers �r� <listcomp>z'Headers.__delitem__.<locals>.<listcomp>us3���N�N�N���A�q�w�w�y�y�I�7M�7M�q�!�f�7M�7M�7Mr)rFr%� __delitem__r&)rr3r[s @rr]zHeaders.__delitem__qsG����I�I�K�K� � � ���y�)�)�)�N�N�N�N���N�N�N�� � � r�otherrc�Z�t|t��stS|j|jkSr*)rEr �NotImplementedr%)rr^s r�__eq__zHeaders.__eq__ws)���%��)�)� "�!� !��z�U�[�(�(rc�"�i|_g|_dS)z& Remove all headers. N)r%r&r7s r�clearz Headers.clear|s�� �� ��� � � rc�l��td�|D����}t��j|i|��dS)zT Update from a :class:`Headers` instance and/or keyword arguments. c3�lK�|]/}t|t��r|���n|V��0dSr*)rEr � raw_items)r2�args rr5z!Headers.update.<locals>.<genexpr>�sN���� � �EH�z�#�w�7�7� @�C�M�M�O�O�O�S� � � � � � rN)�tuplerr+)rrr'rs �rr+zHeaders.update�sS��� � � �LP� � � � � �� ������'��'�'�'�'�'r� list[str]c�\�|j�|���g��S)z| Return the (possibly empty) list of all values for a header. Args: key: Header name. )r%�getrFrGs r�get_allzHeaders.get_all�s"���z�~�~�c�i�i�k�k�2�.�.�.r�Iterator[tuple[str, str]]c�*�t|j��S)zO Return an iterator of all values as ``(name, value)`` pairs. )rKr&r7s rrfzHeaders.raw_items�s�� �D�J���r)rr r'rrr(r)rr )rr>)r3rBrrC)rrI)rrM�r3rrr)r3rr4rrr()r3rrr()r^rrrC)rr()r3rrri)rrm)rrr r!� __slots__r,rr;r=rArHrLrOrRrVr]rarcr+rlrfr"r#s@rr r s��������#�#�J�'�"�I�%�%�%�%� T�T�T�T�<�<�<�<����� "�"�"�"� B�B�B�B� � � � ����� +�+�+�+�(�(�(�(�O�O�O�O� )�)�)�)� ����(�(�(�(�(�(�/�/�/�/� � � � � � � � rr c�"�eZdZdZd d�Zd d�ZdS) �SupportsKeysAndGetItemz_ Dict-like types with ``keys() -> str`` and ``__getitem__(key: str) -> str`` methods. r� Iterable[str]c��dSr*r1r7s r�keyszSupportsKeysAndGetItem.keys�����rr3rc��dSr*r1rGs rrRz"SupportsKeysAndGetItem.__getitem__�rvrN)rrsro)rrr r!rurRr1rrrrrr�s4�������� )�(�(�(�/�/�/�/�/�/rrrN)� __future__r�collections.abcrrrr�typingrr r �__all__� LookupErrorr rr rrrhr r1rr�<module>r}s7��"�"�"�"�"�"�G�G�G�G�G�G�G�G�G�G�G�G�'�'�'�'�'�'�'�'�'�'� � � �� !� !� !� !� !�+� !� !� !�D �D �D �D �D �n�S�#�X�&�D �D �D �P0�0�0�0�0�X�0�0�0�� � �C��H�� �U�3��8�_����� � �r
Memory