
    =Xcj                        d dl mZ d dlZd dlmZmZmZmZmZm	Z	m
Z
mZmZ ej                  dd dk\  rd dlmZ neZg dZ G d d	e      Z G d
 de
eef         Z G d de      Zeee	eef   eeeef      ef   Zy)    )annotationsN)	AnyDictIterableIteratorListMappingMutableMappingTupleUnion   )      )Protocol)HeadersHeadersLikeMultipleValuesErrorc                  $     e Zd ZdZd fdZ xZS )r   zT
    Exception raised when :class:`Headers` has more than one value 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    ;/usr/lib/python3/dist-packages/websockets/datastructures.pyr   zMultipleValuesError.__str__    s3    tyy>Q		!%%w      returnstr)__name__
__module____qualname____doc__r   __classcell__r   s   @r   r   r      s    
! !r    r   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 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.

    _dict_listc                D    i | _         g | _         | j                  |i | y N)r+   r,   update)r   r   kwargss      r   __init__zHeaders.__init__P   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>V   s!     Je#bt,Js   r5   )joinr,   r   s    r   r   zHeaders.__str__U   s     wwJtzzJJVSSr    c                N    | j                   j                   d| j                  dS )N())r   r$   r,   r<   s    r   __repr__zHeaders.__repr__X   s$    ..))*!DJJ>;;r    c                    | j                         }| j                  j                         |_        | j                  j                         |_        |S r.   )r   r+   copyr,   )r   rB   s     r   rB   zHeaders.copy[   s7    ~~ZZ__&
ZZ__&
r    c                4    t        |       j                         S r.   )r#   encoder<   s    r   	serializezHeaders.serializea   s    4y!!r    c                ^    t        |t              xr |j                         | j                  v S r.   )
isinstancer#   lowerr+   r   r8   s     r   __contains__zHeaders.__contains__g   s#    #s#A		tzz(AAr    c                ,    t        | j                        S r.   )iterr+   r<   s    r   __iter__zHeaders.__iter__j   s    DJJr    c                ,    t        | j                        S r.   )r   r+   r<   s    r   __len__zHeaders.__len__m   s    4::r    c                x    | j                   |j                            }t        |      dk(  r|d   S t        |      r   )r+   rH   r   r   r   r8   r9   s      r   __getitem__zHeaders.__getitem__r   s5    

399;'u:?8O%c**r    c                    | j                   j                  |j                         g       j                  |       | j                  j                  ||f       y r.   )r+   
setdefaultrH   appendr,   rQ   s      r   __setitem__zHeaders.__setitem__y   s=    

ciik2.55e<

3,'r    c                    |j                         }| j                  j                  |       | j                  D cg c]  \  }}|j                         |k7  s||f c}}| _        y c c}}w r.   )rH   r+   __delitem__r,   )r   r8   	key_lowerkvs        r   rX   zHeaders.__delitem__}   sM    IIK	

y))-NAqwwyI7Mq!fN
Ns   A'A'c                `    t        |t              st        S | j                  |j                  k(  S r.   )rG   r   NotImplementedr+   )r   others     r   __eq__zHeaders.__eq__   s%    %)!!zzU[[((r    c                     i | _         g | _        y)z&
        Remove all headers.

        N)r+   r,   r<   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.   )rG   r   	raw_items)r7   args     r   r:   z!Headers.update.<locals>.<genexpr>   s)      
EHz#w7CMMOS@
s   ,.N)tupler   r/   )r   r   r0   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+   getrH   rI   s     r   get_allzHeaders.get_all   s     zz~~ciik2..r    c                ,    t        | j                        S )zO
        Return an iterator of all values as ``(name, value)`` pairs.

        )rL   r,   r<   s    r   rd   zHeaders.raw_items   s    
 DJJr    )r   r   r0   r#   r"   Noner!   )r"   r   )r"   bytes)r8   objectr"   bool)r"   zIterator[str])r"   intr8   r#   r"   r#   )r8   r#   r9   r#   r"   rk   )r8   r#   r"   rk   )r^   r   r"   rn   )r"   rk   )r8   r#   r"   z	List[str])r"   zIterator[Tuple[str, str]])r$   r%   r&   r'   	__slots__r1   r   r@   rB   rE   rJ   rM   rO   rR   rV   rX   r_   ra   r/   ri   rd   r(   r)   s   @r   r   r   '   sh    #J '"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.   r6   r<   s    r   keyszSupportsKeysAndGetItem.keys       r    c                     y r.   r6   rI   s     r   rR   z"SupportsKeysAndGetItem.__getitem__   rv   r    N)r"   zIterable[str]rp   )r$   r%   r&   r'   ru   rR   r6   r    r   rs   rs      s    
r    rs   )
__future__r   systypingr   r   r   r   r   r	   r
   r   r   version_infor   rm   __all__LookupErrorr   r#   r   rs   r   r6   r    r   <module>r~      s    " 

 
 
 BQ6!H <
!+ 
!D nS#X& D P
X 
 CHU38_r    