
0c@_u                 @   s  d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l	 Z	 d d l
 Z
 d d l Z d d l m Z d d l m Z d d l m Z d d l m Z d d l m Z d d	 l m Z m Z m Z m Z m Z m Z m Z m Z m Z m Z m  Z  m! Z! m" Z" m# Z# d d
 l$ m% Z% d d l& m' Z' d d l( m) Z) m* Z* m+ Z+ m, Z, dl Z- e j.   Z/ d d d d i Z0 e j1 d k rd d   Z2 d d   Z d d   Z3 d d   Z4 d d d  Z5 d d    Z6 d! d"   Z7 d# d$   Z8 d% d&   Z9 d' d(   Z: d) d*   Z; d d+ d,  Z< d- d.   Z= d/ d0   Z> d1 d2   Z? d3 d4   Z@ d5 d6   ZA d7 d8   ZB d9 d:   ZC d; d<   ZD eE d= d>  ZF d? d@   ZG dA dB   ZH dC dD   ZI dE dF   ZJ dG dH   ZK dI dJ   ZL e jM dK dL    ZN dM dN   ZO d dO dP  ZP dQ dR   ZQ dS dT dU  ZR dV dW   ZS dX dY   ZT dZ jU d[  ZV eV d\ ZW eV d] ZX d^ d_   ZY d` da   ZZ db dc   Z[ e j\ dd  Z] e j\ de  Z^ df dg   Z_ dh di   Z` dj dk   Za d S)mz
requests.utils
~~~~~~~~~~~~~~

This module provides utility functions that are used within Requests
that are also useful for external consumption.
    N)OrderedDict   )__version__)certs)to_native_string)parse_http_list)quoteurlparsebytesstrunquote
getproxiesproxy_bypass
urlunparse
basestringinteger_typesis_py3proxy_bypass_environmentgetproxies_environmentMapping)cookiejar_from_dict)CaseInsensitiveDict)
InvalidURLInvalidHeaderFileModeWarningUnrewindableBodyError.netrc_netrchttpP   httpsi  win32c             C   sF  y% t  r d d  l } n d d  l } Wn t k
 r= d SYn XyK | j | j d  } t | j | d  d  } | j | d  d } Wn t k
 r d SYn X| s | r d S| j	 d  } x| | D]t } | d k r d |  k r d	 S| j
 d d
  } | j
 d d  } | j
 d d  } t j | |  t j  r d	 Sq Wd S)Nr   Fz;Software\Microsoft\Windows\CurrentVersion\Internet SettingsZProxyEnableZProxyOverride;z<local>.Tz\.*z.*?)r   winreg_winregImportErrorOpenKeyHKEY_CURRENT_USERintQueryValueExOSErrorsplitreplacerematchI)hostr&   ZinternetSettingsZproxyEnableZproxyOverridetest r5   9/tmp/pip-build-jynh7p1z/pip/pip/_vendor/requests/utils.pyproxy_bypass_registry0   s8    				r7   c             C   s!   t    r t |   St |   Sd S)zReturn True, if the host should be bypassed.

        Checks proxy settings gathered from the environment, if specified,
        or the registry.
        N)r   r   r7   )r3   r5   r5   r6   r   W   s    	
r   c             C   s   t  |  d  r |  j   }  |  S)z/Returns an internal sequence dictionary update.items)hasattrr8   )dr5   r5   r6   dict_to_sequencec   s    r;   c             C   s  d  } d } t  |  d  r* t |   } n t  |  d  rE |  j } nh t  |  d  r y |  j   } Wn t j k
 r{ Yn2 Xt j |  j } d |  j k r t	 j
 d t  t  |  d  rhy |  j   } Wn* t t f k
 r | d  k	 r | } Ynp Xt  |  d  rh| d  k rhy3 |  j d d	  |  j   } |  j | pBd  Wn t t f k
 rgd } Yn X| d  k rzd } t d | |  S)
Nr   __len__lenfilenoba%  Requests has determined the content-length for this request using the binary size of the file: however, the file has been opened in text mode (i.e. without the 'b' flag in the mode). This may lead to an incorrect content-length. In Requests 3.0, support will be removed for files in text mode.tellseek   )r9   r=   r>   ioUnsupportedOperationosfstatst_sizemodewarningswarnr   r@   r-   IOErrorrA   max)ototal_lengthcurrent_positionr>   r5   r5   r6   	super_lenl   s@    rP   Fc             C   sb  yCd d l  m  } m } d } x_ t D]W } y t j j d j |   } Wn t k
 rc d SYn Xt j j |  r& | } Pq& W| d k r d St	 |   } d } t
 |  t  r | j d  } | j j |  d }	 yG | |  j |	  }
 |
 r|
 d rd n d } |
 | |
 d f SWn! | t f k
 rA| r=  Yn XWn t t f k
 r]Yn Xd S)	z;Returns the Requests tuple auth for a given url from netrc.r   )netrcNetrcParseErrorNz~/{}   :asciir   rB   )rQ   rR   NETRC_FILESrE   path
expanduserformatKeyErrorexistsr	   
isinstancer   decodenetlocr.   authenticatorsrK   r(   AttributeError)urlraise_errorsrQ   rR   
netrc_pathflocrisplitstrr3   r   login_ir5   r5   r6   get_netrc_auth   s8    	rh   c             C   s[   t  |  d d  } | rW t | t  rW | d d k rW | d d k rW t j j |  Sd S)z0Tries to guess the filename of the given object.nameNr   <r   >)getattrr[   r   rE   rV   basename)objri   r5   r5   r6   guess_filename   s    %rp   c             C   s  t  j j |   r |  St  j j |   \ } } xJ | rz t  j j |  rz t  j j |  \ } } d j | | g  } q1 Wt j |  s |  St j |  } | | j   k r |  St	 j
   } t  j j | | j d   } t  j j |  s| j | d | } | S)zReplace nonexistent paths that look like they refer to a member of a zip
    archive with the location of an extracted copy of the target, or else
    just return the provided path unchanged.
    /rV   )rE   rV   rZ   r.   joinzipfile
is_zipfileZipFilenamelisttempfile
gettempdirextract)rV   archivememberprefixZzip_filetmpZextracted_pathr5   r5   r6   extract_zipped_paths   s     r~   c             C   sA   |  d k r d St  |  t t t t f  r7 t d   t |   S)a  Take an object and test to see if it can be represented as a
    dictionary. Unless it can not be represented as such, return an
    OrderedDict, e.g.,

    ::

        >>> from_key_val_list([('key', 'val')])
        OrderedDict([('key', 'val')])
        >>> from_key_val_list('string')
        Traceback (most recent call last):
        ...
        ValueError: cannot encode objects that are not 2-tuples
        >>> from_key_val_list({'key': 'val'})
        OrderedDict([('key', 'val')])

    :rtype: OrderedDict
    Nz+cannot encode objects that are not 2-tuples)r[   r   r
   boolr+   
ValueErrorr   )valuer5   r5   r6   from_key_val_list  s
    r   c             C   s\   |  d k r d St  |  t t t t f  r7 t d   t  |  t  rR |  j   }  t |   S)a  Take an object and test to see if it can be represented as a
    dictionary. If it can be, return a list of tuples, e.g.,

    ::

        >>> to_key_val_list([('key', 'val')])
        [('key', 'val')]
        >>> to_key_val_list({'key': 'val'})
        [('key', 'val')]
        >>> to_key_val_list('string')
        Traceback (most recent call last):
        ...
        ValueError: cannot encode objects that are not 2-tuples

    :rtype: list
    Nz+cannot encode objects that are not 2-tuples)	r[   r   r
   r   r+   r   r   r8   list)r   r5   r5   r6   to_key_val_list  s    r   c             C   st   g  } xg t  |   D]Y } | d d  | d d  k oD d k n r_ t | d d   } | j |  q W| S)a  Parse lists as described by RFC 2068 Section 2.

    In particular, parse comma-separated lists where the elements of
    the list may include quoted-strings.  A quoted-string could
    contain a comma.  A non-quoted string could have quotes in the
    middle.  Quotes are removed automatically after parsing.

    It basically works like :func:`parse_set_header` just that items
    may appear multiple times and case sensitivity is preserved.

    The return value is a standard :class:`list`:

    >>> parse_list_header('token, "quoted value"')
    ['token', 'quoted value']

    To create a header from the :class:`list` again, use the
    :func:`dump_header` function.

    :param value: a string with a list header.
    :return: :class:`list`
    :rtype: list
    Nr   "rl   rl   )_parse_list_headerunquote_header_valueappend)r   resultitemr5   r5   r6   parse_list_header=  s    0r   c             C   s   i  } x t  |   D] } d | k r2 d | | <q | j d d  \ } }  |  d d  |  d d  k ou d k n r t |  d d   }  |  | | <q W| S)a^  Parse lists of key, value pairs as described by RFC 2068 Section 2 and
    convert them into a python dict:

    >>> d = parse_dict_header('foo="is a fish", bar="as well"')
    >>> type(d) is dict
    True
    >>> sorted(d.items())
    [('bar', 'as well'), ('foo', 'is a fish')]

    If there is no value for a key it will be `None`:

    >>> parse_dict_header('key_without_value')
    {'key_without_value': None}

    To create a header from the :class:`dict` again, use the
    :func:`dump_header` function.

    :param value: a string with a dict header.
    :return: :class:`dict`
    :rtype: dict
    =Nr   r   rl   rl   )r   r.   r   )r   r   r   ri   r5   r5   r6   parse_dict_header]  s    
0r   c             C   sw   |  rs |  d |  d	 k o% d k n rs |  d d
  }  | sW |  d d  d k rs |  j  d d  j  d d  S|  S)zUnquotes a header value.  (Reversal of :func:`quote_header_value`).
    This does not use the real unquoting but what browsers are actually
    using for quoting.

    :param value: the header value to unquote.
    :rtype: str
    r   r   r   NrB   z\\\z\"rl   rl   )r/   )r   is_filenamer5   r5   r6   r     s
    *r   c             C   s+   i  } x |  D] } | j  | | j <q W| S)zReturns a key/value dictionary from a CookieJar.

    :param cj: CookieJar object to extract cookies from.
    :rtype: dict
    )r   ri   )cjcookie_dictcookier5   r5   r6   dict_from_cookiejar  s    r   c             C   s   t  | |   S)zReturns a CookieJar from a key/value dictionary.

    :param cj: CookieJar to insert cookies into.
    :param cookie_dict: Dict of key/values to insert into CookieJar.
    :rtype: CookieJar
    )r   )r   r   r5   r5   r6   add_dict_to_cookiejar  s    r   c             C   sv   t  j d t  t j d d t j } t j d d t j } t j d  } | j |   | j |   | j |   S)zlReturns encodings from given content string.

    :param content: bytestring to extract encodings from.
    zIn requests 3.0, get_encodings_from_content will be removed. For more information, please see the discussion on issue #2266. (This warning should only appear once.)z!<meta.*?charset=["\']*(.+?)["\'>]flagsz+<meta.*?content=["\']*;?charset=(.+?)["\'>]z$^<\?xml.*?encoding=["\']*(.+?)["\'>])rI   rJ   DeprecationWarningr0   compiler2   findall)content
charset_re	pragma_rexml_rer5   r5   r6   get_encodings_from_content  s    r   c       
      C   s   |  j  d  } | d j   | d d  } } i  } d } x | D] } | j   } | rC | d } } | j d  }	 |	 d k r | d |	  j |  } | |	 d d  j |  } | | | j   <qC W| | f S)	zReturns content type and parameters from given header

    :param header: string
    :return: tuple containing content type and dictionary of
         parameters
    r"   r   r   Nz"' Tr   rl   )r.   stripfindlower)
headertokenscontent_typeparamsZparams_dictZitems_to_stripparamkeyr   Zindex_of_equalsr5   r5   r6   _parse_content_type_header  s    !r   c             C   s\   |  j  d  } | s d St |  \ } } d | k rH | d j d  Sd | k rX d Sd S)z}Returns encodings from given HTTP Header Dict.

    :param headers: dictionary to extract encoding from.
    :rtype: str
    zcontent-typeNcharsetz'"textz
ISO-8859-1)getr   r   )headersr   r   r5   r5   r6   get_encoding_from_headers  s    r   c             c   s   | j  d k r) x |  D] } | Vq Wd St j | j   d d  } x( |  D]  } | j |  } | rK | VqK W| j d d d } | r | Vd S)zStream decodes a iterator.Nerrorsr/       finalT)encodingcodecsgetincrementaldecoderr\   )iteratorrr   decoderchunkrvr5   r5   r6   stream_decode_response_unicode  s    		r   c             c   sd   d } | d k s | d k r* t  |   } x3 | t  |   k  r_ |  | | |  V| | 7} q- Wd S)z Iterate over slices of a string.r   N)r=   )stringslice_lengthposr5   r5   r6   iter_slices  s    r   c             C   s   t  j d t  g  } t |  j  } | ra y t |  j |  SWn t k
 r` | j |  Yn Xy t |  j | d d SWn t	 k
 r |  j SYn Xd S)zReturns the requested content back in unicode.

    :param r: Response object to get unicode content from.

    Tried:

    1. charset from content-type
    2. fall back and replace all unicode characters

    :rtype: str
    zIn requests 3.0, get_unicode_from_response will be removed. For more information, please see the discussion on issue #2266. (This warning should only appear once.)r   r/   N)
rI   rJ   r   r   r   r   r   UnicodeErrorr   	TypeError)r   tried_encodingsr   r5   r5   r6   get_unicode_from_response  s    r   Z4ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzz0123456789-._~c             C   s   |  j  d  } x t d t |   D] } | | d d  } t |  d k r | j   r y t t | d   } Wn" t k
 r t d |   Yn X| t k r | | | d d  | | <q d | | | | <q% d | | | | <q% Wd j	 |  S)	zUn-escape any percent-escape sequences in a URI that are unreserved
    characters. This leaves all reserved, illegal and non-ASCII bytes encoded.

    :rtype: str
    %r   r   rB      z%Invalid percent-escape sequence: '%s'N )
r.   ranger=   isalnumchrr+   r   r   UNRESERVED_SETrr   )uripartsihcr5   r5   r6   unquote_unreserved:  s    r   c             C   sO   d } d } y t  t |   d | SWn" t k
 rJ t  |  d | SYn Xd S)zRe-quote the given URI.

    This function passes the given URI through an unquote/quote cycle to
    ensure that it is fully and consistently quoted.

    :rtype: str
    z!#$%&'()*+,/:;=?@[]~z!#$&'()*+,/:;=?@[]~safeN)r   r   r   )r   safe_with_percentsafe_without_percentr5   r5   r6   requote_uriR  s    r   c             C   s   t  j d t j |    d } | j d  \ } } t  j d t j t t |     d } t  j d t j |   d | @} | | @| | @k S)zThis function allows you to check if an IP belongs to a network subnet

    Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24
             returns False if ip = 192.168.1.1 and net = 192.168.100.0/24

    :rtype: bool
    z=Lr   rq   )structunpacksocket	inet_atonr.   dotted_netmaskr+   )ipnetipaddrnetaddrbitsnetmasknetworkr5   r5   r6   address_in_networkh  s
    +#r   c             C   s/   d d d |  >d A} t  j t j d |   S)zConverts mask from /xx format to xxx.xxx.xxx.xxx

    Example: if mask is 24 function returns 255.255.255.0

    :rtype: str
    l    r       z>I)r   	inet_ntoar   pack)maskr   r5   r5   r6   r   w  s    r   c             C   s1   y t  j |   Wn t  j k
 r, d SYn Xd S)z
    :rtype: bool
    FT)r   r   error)	string_ipr5   r5   r6   is_ipv4_address  s
    	r   c             C   s   |  j  d  d k r y t |  j d  d  } Wn t k
 rJ d SYn X| d k  sc | d k rg d Sy t j |  j d  d  Wq t j k
 r d SYq Xn d Sd S)zV
    Very simple check of the cidr format in no_proxy variable.

    :rtype: bool
    rq   r   Fr   r   T)countr+   r.   r   r   r   r   )string_networkr   r5   r5   r6   is_valid_cidr  s    	r   c             c   sn   | d k	 } | r1 t  j j |   } | t  j |  <z	 d VWd | ri | d k r\ t  j |  =n | t  j |  <Xd S)zSet the environment variable 'env_name' to 'value'

    Save previous value, yield, and then restore the previous value stored in
    the environment variable 'env_name'.

    If 'value' is None, do nothingN)rE   environr   )Zenv_namer   Zvalue_changed	old_valuer5   r5   r6   set_environ  s    	r   c       	      C   s  d d   } | } | d k r* | d  } t  |   } | j d k rI d S| r0d d   | j d d	  j d
  D } t | j  r x | D]> } t |  r t | j |  r d Sq | j | k r d Sq Wn^ | j } | j r | d j | j  7} x3 | D]+ } | j j	 |  s(| j	 |  rd SqWt
 d |  < y t | j  } Wn! t t j f k
 rvd } Yn XWd QRX| rd Sd S)zL
    Returns whether we should bypass proxies or not.

    :rtype: bool
    c             S   s(   t  j j |   p' t  j j |  j    S)N)rE   r   r   upper)kr5   r5   r6   <lambda>  s    z'should_bypass_proxies.<locals>.<lambda>Nno_proxyTc             s   s   |  ] } | r | Vq d  S)Nr5   ).0r3   r5   r5   r6   	<genexpr>  s    z(should_bypass_proxies.<locals>.<genexpr> r   ,z:{}F)r	   hostnamer/   r.   r   r   r   portrX   endswithr   r   r   r   gaierror)	r`   r   	get_proxyZno_proxy_argparsedproxy_ipZhost_with_portr3   bypassr5   r5   r6   should_bypass_proxies  s<    (		!r   c             C   s!   t  |  d | r i  St   Sd S)zA
    Return a dict of environment proxies.

    :rtype: dict
    r   N)r   r   )r`   r   r5   r5   r6   get_environ_proxies  s    r   c             C   s   | p	 i  } t  |   } | j d k rC | j | j | j d   S| j d | j | j d | j d g } d } x% | D] } | | k rz | | } Pqz W| S)zSelect a proxy for the url, if applicable.

    :param url: The url being for the request
    :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs
    Nallz://zall://)r	   r   r   scheme)r`   proxiesurlpartsZ
proxy_keysproxyZ	proxy_keyr5   r5   r6   select_proxy  s    
	
r  zpython-requestsc             C   s   d |  t  f S)zO
    Return a string representing the default user agent.

    :rtype: str
    z%s/%s)r   )ri   r5   r5   r6   default_user_agent  s    r  c            	   C   s.   t  d t   d d j d
  d d d d	 i  S)z9
    :rtype: requests.structures.CaseInsensitiveDict
    z
User-AgentzAccept-Encodingz, gzipdeflateAcceptz*/*
Connectionz
keep-alive)zgzipzdeflate)r   r  rr   r5   r5   r5   r6   default_headers'  s
    	r	  c       	      C   s  g  } d } |  j  |  }  |  s% | Sx t j d |   D] } y | j d d  \ } } Wn t k
 r{ | d } } Yn Xd | j  d  i } xb | j d  D]Q } y | j d  \ } }  Wn t k
 r PYn X|  j  |  | | j  |  <q W| j |  q8 W| S)	zReturn a list of parsed link headers proxies.

    i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg"

    :rtype: list
    z '"z, *<r"   r   r   r`   z<> '"r   )r   r0   r.   r   r   )	r   linksreplace_charsvalr`   r   linkr   r   r5   r5   r6   parse_header_links3  s&     r   rT   rB      c             C   s  |  d d  } | t  j t  j f k r, d S| d d  t  j k rI d S| d d  t  j t  j f k ro d S| j t  } | d k r d	 S| d k r | d d d  t k r d
 S| d d d  t k r d S| d k r| d d  t	 k r d S| d d  t	 k rd Sd S)z
    :rtype: str
    N   zutf-32r  z	utf-8-sigrB   zutf-16r   zutf-8z	utf-16-ber   z	utf-16-lez	utf-32-bez	utf-32-le)
r   BOM_UTF32_LEBOM_UTF32_BEBOM_UTF8BOM_UTF16_LEBOM_UTF16_BEr   _null_null2_null3)datasample	nullcountr5   r5   r6   guess_json_utf^  s*    "r  c             C   sP   t  |  |  \ } } } } } } | s4 | | } } t | | | | | | f  S)zGiven a URL that may or may not have a scheme, prepend the given scheme.
    Does not replace a present scheme with the one provided as an argument.

    :rtype: str
    )r	   r   )r`   
new_schemer   r]   rV   r   queryfragmentr5   r5   r6   prepend_scheme_if_needed~  s    !r!  c             C   sS   t  |   } y" t | j  t | j  f } Wn t t f k
 rN d } Yn X| S)z{Given a url with authentication components, extract them into a tuple of
    username,password.

    :rtype: (str,str)
    r   )r   r   )r	   r   usernamepasswordr_   r   )r`   r   authr5   r5   r6   get_auth_from_url  s    "r%  s   ^\S[^\r\n]*$|^$z^\S[^\r\n]*$|^$c             C   s   |  \ } } t  | t  r$ t } n t } y# | j |  sL t d |   Wn1 t k
 r t d | | t |  f   Yn Xd S)zVerifies that header value is a string which doesn't contain
    leading whitespace or return characters. This prevents unintended
    header injection.

    :param header: tuple, in the format (name, value).
    z7Invalid return character or leading space in header: %sz>Value for header {%s: %s} must be of type str or bytes, not %sN)r[   r
   _CLEAN_HEADER_REGEX_BYTE_CLEAN_HEADER_REGEX_STRr1   r   r   type)r   ri   r   patr5   r5   r6   check_header_validity  s    	r*  c             C   sc   t  |   \ } } } } } } | s1 | | } } | j d d  d } t | | | | | d f  S)zW
    Given a url remove the fragment and the authentication part.

    :rtype: str
    @r   r   rl   )r	   rsplitr   )r`   r   r]   rV   r   r  r   r5   r5   r6   urldefragauth  s
    r-  c             C   s~   t  |  j d d  } | d k	 rn t |  j t  rn y | |  j  Wqz t t f k
 rj t d   Yqz Xn t d   d S)zfMove file pointer back to its recorded starting position
    so it can be read again on redirect.
    rA   Nz;An error occurred when rewinding request body for redirect.z+Unable to rewind request body for redirect.)rm   bodyr[   Z_body_positionr   rK   r-   r   )prepared_requestZ	body_seekr5   r5   r6   rewind_body  s    r0  )r   z_netrc)b__doc__r   
contextlibrC   rE   r0   r   r   sysrw   rI   rs   collectionsr   r   r   r   Z_internal_utilsr   compatr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   cookiesr   
structuresr   
exceptionsr   r   r   r   rU   whereDEFAULT_CA_BUNDLE_PATHZDEFAULT_PORTSplatformr7   r;   rP   rh   rp   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   	frozensetr   r   r   r   r   r   r   contextmanagerr   r   r   r  r  r	  r  encoder  r  r  r  r!  r%  r   r&  r'  r*  r-  r0  r5   r5   r5   r6   <module>	   s   ^"'	=3  #
%=	&

 