o
    e                     @   sb   d dl Z e jrd dlmZmZ nd dlmZmZ ejZej	Z
ejZejZejZG dd deZdS )    N)MappingMutableMappingc                   @   s  e Zd ZdZd/d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jr3ejZnejZejr<ejZe ZefddZdd Zdd Zdd Zdd ZeZeZeZd/ddZdd Z dd  Z!d!d" Z"d#d$ Z#d%d& Z$d'd( Z%d)d* Z&e&Z'd+d, Z(d-d. Z)dS )0Headersa  
    :param headers:
        An iterable of field-value pairs. Must not contain multiple field names
        when compared case-insensitively.

    :param kwargs:
        Additional field-value pairs to pass in to ``dict.update``.

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

    Field names are stored and compared case-insensitively in compliance with
    RFC 7230. Iteration provides the first case-sensitive key seen for each
    case-insensitive pair.

    Using ``__setitem__`` syntax overwrites fields that compare equal
    case-insensitively in order to maintain ``dict``'s api. For fields that
    compare equal, instead create a new ``Headers`` and use ``.add``
    in a loop.

    If multiple fields that are equal case-insensitively are passed to the
    constructor or ``.update``, the behavior is undefined and some will be
    lost.

    Note: b'asdf' and 'u'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['content-length'] = '7'
    >>> headers['SET-cookie']
    'foo=bar, baz=quxx'
    >>> headers['Content-Length']
    '7'
    Nc                 K   sH   t |  |d urt|tr| | n| | |r"| | d S d S N)dict__init__
isinstancer   
_copy_fromextend)selfheaderskwargs r   GD:\Projects\ConvertPro\env\Lib\site-packages\geventhttpclient/header.pyr   4   s   


zHeaders.__init__c                 C   s   t | | ||fS r   )_dict_setitemlowerr   keyvalr   r   r   __setitem__>   s   zHeaders.__setitem__c                 C   s.   t | | }t|dkr|d S |dd  S )N      )_dict_getitemr   lenr   r   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                    s^   t  tst dsdS t  tst  tfddD t fdd D kS )NkeysFc                 3       | ]	}| | fV  qd S r   r   ).0Zk1r   r   r   	<genexpr>R       z!Headers.__eq__.<locals>.<genexpr>c                 3   r#   r   r   )r$   Zk2)otherr   r   r&   R   r'   )r   r   hasattrtyper   r   r(   r   )r(   r   r   __eq__M   s
   ,zHeaders.__eq__c                 C   s   |  | S r   )r,   r+   r   r   r   __ne__T      zHeaders.__ne__c                 C   s:   z| | }W n t y   || ju r | Y S w | |= |S )zD.pop(k[,d]) -> v, remove specified key and return the corresponding value.
          If key is not found, d is returned if given, otherwise KeyError is raised.
        )KeyError_Headers__marker)r   r   defaultvaluer   r   r   popc   s   
zHeaders.popc                 C   s"   z| |= W d S  t y   Y d S w r   )r/   r   r   r   r   discardt   s
   zHeaders.discardc                 C   s^   |  }||f}t| ||}||ur-t|tr|| dS t| ||d |d |g dS dS )zAdds a (name, value) pair, doesn't overwrite the value if it already
        exists.

        >>> headers = Headers(foo='bar')
        >>> headers.add('Foo', 'baz')
        >>> headers['foo']
        'bar, baz'
        r   r   N)r   _dict_setdefaultr   listappendr   )r   r   r   	key_lowernew_valsvalsr   r   r   addz   s   	
zHeaders.addc                 O   s   t |dkrtdt |t |dkr|d nd}t|tr0| D ]
\}}| || q$n5t|trC|D ]
}| |||  q7n"t|drX|	 D ]
}| |||  qLn|D ]
\}}| || qZ|
 D ]
\}}| || qid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   z8extend() takes at most 1 positional arguments ({} given)r   r   r"   N)r   	TypeErrorformatr   r   	iteritemsr;   r   r)   r"   items)r   argsr   r(   r   r   r2   r   r   r   r
      s,   



zHeaders.extendc                 C   sJ   z	t | | }W n ty   g  Y S w t|tr|d gS |dd S )zmReturns a list of all the values for the named field. Returns an
        empty list if the key doesn't exist.r   N)r   r   r/   r   tuple)r   r   r:   r   r   r   getlist   s   

zHeaders.getlistc                 C   s   |  |}|s	|S |S r   )rB   )r   r   failobjr:   r   r   r   get_all   s   
zHeaders.get_allc                 C   s   dt | jt|  f S )Nz%s(%s))r*   __name__r   
itermergedr%   r   r   r   __repr__   s   zHeaders.__repr__c                 C   s6   |D ]}t ||}t|trt|}t| || qd S r   )r   r   r6   r   )r   r(   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   sN    | D ]!}t | |}t|d tjrdnd}|d ||dd fV  qdS )z:Iterate over all headers, merging duplicate ones together.r   z, s   , r   N)r   r   sixstring_typesjoin)r   r   r   sepr   r   r   rF      s   
zHeaders.itermergedc                    s   t  fdd D S )Nc                 3   s    | ]
}t  |V  qd S r   )r   rB   )r$   r   r%   r   r   r&      s    z"Headers.__len__.<locals>.<genexpr>)sumr%   r   r%   r   __len__   s   zHeaders.__len__c                 C      t |  S r   )r   rF   r%   r   r   r   compatible_dict   r.   zHeaders.compatible_dictc                 c   s6    | D ]}t | |}|dd  D ]}||fV  qqd S )Nr   r   r   r   r:   r   r   r   r   	iterlower   s   
zHeaders.iterlowerc                 C   rP   r   )r6   rT   r%   r   r   r   r?      r.   zHeaders.itemsc                 c   s:    | D ]}t | |}|dd D ]	}|d |fV  qqdS )z8Iterate over all header lines, including duplicate ones.r   Nr   rR   rS   r   r   r   iteroriginal   s   
zHeaders.iteroriginalr   )*rE   
__module____qualname____doc__r   r   r   r   r!   r,   r-   r   valuesgetupdaterJ   PY3r"   iterkeysPY2
itervaluesobjectr0   r3   r4   r;   r
   rB   
getheadersgetallmatchingheadersigetrD   rG   r	   rI   rF   rO   rQ   rT   r>   r?   rU   r   r   r   r   r      sJ    
$

	r   )rJ   r\   collections.abcr   r   collectionsr   r   r   r   r   r   r   r!   r    
setdefaultr5   r   r   r   r   r   <module>   s    