o
    2wi'                     @   sN   d dl mZmZ ejZejZejZ	ej
ZejZejZejZG dd deZdS )    )MappingMutableMappingc                   @   s   e Zd ZdZd5ddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
ejZejZejZe ZefddZdd Zdd Zdd Zdd Zdd Zd5d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/d0 Z eZ!eZ"d1d2 Z#d3d4 Z$dS )6Headersa  
    :param headers:
        An iterable of field-value pairs.

    :param kwargs:
        Additional field-value pairs to pass in to ``Headers.extend``.

    A ``dict`` like container for storing HTTP Headers.

    According to RFC 7230, header field names have to be treated case-insentitive.
    This means `SET-COOKIE` as header field denotes the same field as `set-cookie`.

    In order to implement this behavior efficiently, all header names are lowered
    and used as dictionary key for fast access of certain header lines. The original
    case-sensitive header field is stored alongside the values under the hood.

    Iterating over Header.items() returns all field-value pairs with the original
    cases. The order of the returned items matches the input order, except that
    headers with a matching header field are grouped.

    Use Header.__setitem__() and Header.update() for overwriting the content
    of matching header fields and .add() and .extend() for appending header
    lines instead of overwriting them.

    Note: b"asdf" and "asdf" are separate things. This class tries not to
    enforce the one or the other.

    >>> headers = Headers()
    >>> headers.add('Set-Cookie', 'foo=bar')
    >>> headers.add('set-cookie', 'baz=quxx')
    >>> headers['SET-cookie']
    ['foo=bar', 'baz=quxx']
    >>> headers['content-length'] = '7'
    >>> headers['Content-Length']
    '7'
    >>> headers
    Headers({'Set-Cookie': 'foo=bar, baz=quxx', 'content-length': '7'})
    Nc                 K   sL   t |  |d urt|t| r| | n| | |r$| | d S d S N)dict__init__
isinstancetype
_copy_fromextend)selfheaderskwargs r   T/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/geventhttpclient/header.pyr   4   s   

zHeaders.__init__c                 C   s   t | | ||fS r   )_dict_setitemlower)r   fieldvaluer   r   r   __setitem__>   s   zHeaders.__setitem__c                 C   s.   t | | }t|tr|d S dd |D S )N   c                 S      g | ]}|d  qS r   r   .0valr   r   r   
<listcomp>E       z'Headers.__getitem__.<locals>.<listcomp>)_dict_getitemr   r   tupler   r   valsr   r   r   __getitem__A   s   
zHeaders.__getitem__c                 C      t | | S r   )_dict_delitemr   r   r   r   r   r   __delitem__G      zHeaders.__delitem__c                 C   r#   r   )_dict_containsr   r%   r   r   r   __contains__J   r'   zHeaders.__contains__c                    sV   t  tst dsdS t  tst  fddD  fdd D kS )NkeysFc                       i | ]}| | qS r   r   )r   f1r   r   r   
<dictcomp>R       z"Headers.__eq__.<locals>.<dictcomp>c                    r+   r   r   )r   f2)otherr   r   r.   R   r/   )r   r   hasattrr	   r   r1   r   )r1   r   r   __eq__M   s
   $zHeaders.__eq__c                 C   s   |  | S r   )r4   r3   r   r   r   __ne__T   s   zHeaders.__ne__c                 C   s:   z| | }W n t y   || ju r | Y S w | |= |S )zD.pop(field[,default]) -> value, remove specified field and return the corresponding value.
        If field is not found, d is returned if given, otherwise KeyError is raised.
        )KeyError_Headers__marker)r   r   defaultr   r   r   r   pop]   s   
zHeaders.popc                 C   s"   z| |= W d S  t y   Y d S w r   )r6   r%   r   r   r   discardm   s
   zHeaders.discardc                 C   sf   |  }||f}t| ||}||ur1t|tr!t| |||g dS t|tr-|| dS tddS )zAdd a (field, value) pair without overwriting the value if it already
        exists.

        >>> headers = Headers(foo='bar')
        >>> headers.add('Foo', 'baz')
        >>> headers['foo']
        'bar, baz'
        zinvalid vals storedN)r   _dict_setdefaultr   r   r   listappend	TypeError)r   r   r   field_lowernew_valsr!   r   r   r   adds   s   	

zHeaders.addc                 O   s   t |dkrtdt | dt |dkr|d nd}t|t| r3| D ]
\}}| || q'n5t|trF|D ]
}| |||  q:n"t|dr[| D ]
}| |||  qOn|D ]
\}}| || q]| D ]
\}}| || qldS )zGeneric import function for any type of header-like object.
        Adapted version of MutableMapping.update in order to insert items
        with self.add instead of self.__setitem__
        r   z.extend() takes at most 1 positional argument ( given)r   r   r*   N)	lenr>   r   r	   itemsrA   r   r2   r*   r   argsr   r1   r   r   r   r   r   r      s(   

zHeaders.extendc                 O   s   t |dkrtdt | dt |dkr|d nd}t|t| r1| D ]\}}|| |< q'n/t|trB|D ]}|| | |< q8nt|drU| D ]}|| | |< qKn|D ]\}}|| |< qW| D ]\}}|| |< qddS )zGeneric import function for any type of header-like object.
        Adapted version of MutableMapping.update in order to overwrite items
        while preserving case-sensitive header fields.
        r   z.update() takes at most 1 positional argument (rB   r   r   r*   N)rC   r>   r   r	   rD   r   r2   r*   rE   r   r   r   update   s(   




zHeaders.updatec                 C   sL   z	t | | }W n ty   g  Y S w t|tr|d gS dd |D S )zxReturns a list of all the values for the named field. Returns an
        empty list if the field doesn't exist.
        r   c                 S   r   r   r   r   r   r   r   r      r   z#Headers.getlist.<locals>.<listcomp>)r   r   r6   r   r   r    r   r   r   getlist   s   

zHeaders.getlistc                 C   s   |  |}|s	|S |S r   )rH   )r   r   failobjvaluesr   r   r   get_all   s   
zHeaders.get_allc                 C   s6   |D ]}t ||}t|trt|}t| || qd S r   )r   r   r<   r   )r   r1   r   r!   r   r   r   r
      s   

zHeaders._copy_fromc                 C   s   t |  }||  |S r   )r	   r
   )r   cloner   r   r   copy   s   

zHeaders.copyc                 C   s   t dd t| D S )Nc                 s   s&    | ]}t |trd nt|V  qdS r   N)r   r   rC   )r   r!   r   r   r   	<genexpr>   s   $ z"Headers.__len__.<locals>.<genexpr>)sum_dict_valuesr-   r   r   r   __len__   s   zHeaders.__len__c                 C   s   t | j dt|   dS )N())r	   __name__r   
itermergedr-   r   r   r   __repr__   s   zHeaders.__repr__c                 C   s   d dd |  D S )zReturn a similar string as the original HTTP text received for parsing. Lines with
        matching header fields are grouped.
        
c                 s   s"    | ]\}}| d | V  qdS )z: Nr   )r   r   r   r   r   r   rO      s     z"Headers.__str__.<locals>.<genexpr>)joinrD   r-   r   r   r   __str__   s   zHeaders.__str__c                 c   sf    t | D ]+\}}t|tr|V  qt|d d trdnd}|d d |dd |D fV  qdS )zIterate over all headers, merging lines with duplicate header
        fields together into one item. The case of the first header field
        is preserved.
        r   z, s   , c                 s   s    | ]}|d  V  qdS rN   r   r   r   r   r   rO      s    z%Headers.itermerged.<locals>.<genexpr>N)_dict_itemsr   r   strrY   )r   r   r!   sepr   r   r   rV      s   
$zHeaders.itermergedc                 C   s   t |  S )zCreate a dictionary. Header lines with duplicate field names are
        merged into one line. This can be used for exchange with other
        libraries.
        )r   rV   r-   r   r   r   compatible_dict   s   zHeaders.compatible_dictc                 c   sJ    t | D ]\}}t|tr||d fV  q|D ]	}||d fV  qqdS )zlIterate over all header lines, including duplicate ones.
        The header fields are all lowered.
        r   Nr[   r   r   )r   r   r!   r   r   r   r   	iterlower   s   
zHeaders.iterlowerc                 c   s4    t | D ]\}}t|tr|V  q|E dH  qdS )z8Iterate over all header lines, including duplicate ones.Nr_   r    r   r   r   rD     s   
zHeaders.itemsc                 C   s   dd l }|dtd |  S )Nr   zVThis is deprecated and will be removed in version v2.3.0. Use Headers.items() instead.   )warningswarnDeprecationWarningrD   )r   rb   r   r   r   iteroriginal  s   zHeaders.iteroriginalc                 C   s    dd l }|dtd | |S )Nr   zXThis is deprecated and will be removed in version v2.3.0. Use Headers.getlist() instead.ra   )rb   rc   rd   rH   )r   r   rb   r   r   r   iget  s   
zHeaders.igetr   )%rU   
__module____qualname____doc__r   r   r"   r&   r)   r4   r5   r   rJ   getr*   objectr7   r9   r:   rA   r   rG   rH   rK   r
   rM   rR   rW   rZ   rV   r^   r`   rD   
getheadersgetallmatchingheadersre   rf   r   r   r   r   r      sB    
'

	r   N)collections.abcr   r   r   r   r   r"   r   r&   r$   r)   r(   
setdefaultr;   rD   r[   rJ   rQ   r   r   r   r   r   <module>   s    