� ��^c@s{dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlmZddlmZddlmZddlmZdd lmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#dd l$m%Z%dd l&m'Z'dd l(m)Z)m*Z*m+Z+m,Z,dCZ-ej.�Z/idd6dd6Z0ej1dkr�d�Z2d�Znd�Z3d�Z4e5d�Z6d�Z7d�Z8d�Z9d�Z:d�Z;d�Z<e5d�Z=d �Z>d!�Z?d"�Z@d#�ZAd$�ZBd%�ZCd&�ZDd'�ZEeFd(d)�ZGd*�ZHd+�ZId,�ZJd-�ZKd.�ZLd/�ZMejNd0��ZOd1�ZPdd2�ZRd3�ZSd4d5�ZTd6�ZUd7�ZVd8jWd9�ZXeXd:ZYeXd;ZZd<�Z[d=�Z\d>�Z]ej^d?�Z_ej^d?�Z`d@�ZadA�ZbdB�ZcdS(Ds� requests.utils ~~~~~~~~~~~~~~ This module provides utility functions that are used within Requests that are also useful for external consumption. i����N(t OrderedDicti(t __version__(tcerts(tto_native_string(tparse_http_list(tquoteturlparsetbyteststrtunquotet getproxiest proxy_bypasst urlunparset basestringt integer_typestis_py3tproxy_bypass_environmenttgetproxies_environmenttMapping(tcookiejar_from_dict(tCaseInsensitiveDict(t InvalidURLt InvalidHeadertFileModeWarningtUnrewindableBodyErrors.netrct_netrciPthttpi�thttpstwin32cCsAy%trddl}n ddl}Wntk r9tSXyK|j|jd�}t|j|d�d�}|j|d�d}Wnt k r�tSX| s�| r�tS|j d�}x|D]w}|dkr�d|kr�t Sn|j dd �}|j d d �}|j d d�}t j||t j�r�t Sq�WtS( Ni����s;Software\Microsoft\Windows\CurrentVersion\Internet Settingst ProxyEnableit ProxyOverridet;st.s\.t*s.*t?(Rtwinregt_winregt ImportErrortFalsetOpenKeytHKEY_CURRENT_USERtintt QueryValueExtOSErrortsplittTruetreplacetretmatchtI(thostR#tinternetSettingst proxyEnablet proxyOverridettest((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytproxy_bypass_registry0s8         cCs!t�rt|�St|�SdS(s�Return True, if the host should be bypassed. Checks proxy settings gathered from the environment, if specified, or the registry. N(RRR7(R2((s0/tmp/pip-build-1THPZW/requests/requests/utils.pyR Ws  cCs"t|d�r|j�}n|S(s/Returns an internal sequence dictionary update.titems(thasattrR8(td((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytdict_to_sequencecscCs�d}d}t|d�r*t|�}n�t|d�rE|j}nmt|d�r�y|j�}Wntjk rzq�Xtj|�j}d|j kr�t j dt �q�nt|d�rty|j �}Wn,ttfk r�|dk rq|}qqqtXt|d�rt|dkrty3|jdd �|j �}|j|pId�Wqqttfk rmd}qqXqtn|dkr�d}ntd||�S( Nit__len__tlentfilenotbs%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.ttelltseeki(tNoneR9R=R>tiotUnsupportedOperationtostfstattst_sizetmodetwarningstwarnRR@R+tIOErrorRAtmax(tot total_lengthtcurrent_positionR>((s0/tmp/pip-build-1THPZW/requests/requests/utils.pyt super_lenls@       c CseyGddlm}m}d}x^tD]V}ytjjdj|��}Wntk r_dSXtjj |�r&|}Pq&q&W|dkr�dSt |�}d}t |t �r�|j d�}n|jj|�d} yG||�j| �} | r| drdnd} | | | d fSWn#|tfk rE|rF�qFnXWnttfk r`nXdS( s;Returns the Requests tuple auth for a given url from netrc.i����(tnetrctNetrcParseErrors~/{}Nt:tasciiiii(RQRRRBt NETRC_FILESREtpatht expandusertformattKeyErrortexistsRt isinstanceRtdecodetnetlocR,tauthenticatorsRKR%tAttributeError( turlt raise_errorsRQRRt netrc_pathtftloctritsplitstrR2Rtlogin_i((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytget_netrc_auth�s8    cCs[t|dd�}|rWt|t�rW|ddkrW|ddkrWtjj|�SdS(s0Tries to guess the filename of the given object.tnameitN(tgetattrRBR[R RERVtbasename(tobjRi((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytguess_filename�s%cCs tjj|�r|Stjj|�\}}xJ|rztjj|� rztjj|�\}}dj||g�}q1Wtj|�s�|Stj|�}||j�kr�|St j �}tjj||jd��}tjj|�s|j |d|�}n|S(s�Replace 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. t/RV( RERVRZR,tjointzipfilet is_zipfiletZipFiletnamelistttempfilet gettempdirtextract(RVtarchivetmembertprefixtzip_filettmptextracted_path((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytextract_zipped_paths�s  cCsD|dkrdSt|ttttf�r:td��nt|�S(sTake 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 s+cannot encode objects that are not 2-tuplesN(RBR[RRtboolR)t ValueErrorR(tvalue((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytfrom_key_val_lists  cCsb|dkrdSt|ttttf�r:td��nt|t�rX|j�}nt |�S(s�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 s+cannot encode objects that are not 2-tuplesN( RBR[RRR�R)R�RR8tlist(R�((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytto_key_val_lists cCshg}x[t|�D]M}|d |dko8dknrSt|dd!�}n|j|�qW|S(sParse 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 ii����t"(t_parse_list_headertunquote_header_valuetappend(R�tresulttitem((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytparse_list_header=s $cCs�i}x�t|�D]~}d|kr5d||>> 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 t=ii����R�N(R�RBR,R�(R�R�R�Ri((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytparse_dict_header]s  $cCsq|rm|d|dko%dknrm|dd!}| sN|d dkrm|jdd�jdd�Sn|S( s�Unquotes 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 ii����R�iis\\s\s\"(R.(R�t is_filename((s0/tmp/pip-build-1THPZW/requests/requests/utils.pyR��s * cCs+i}x|D]}|j||j]tflagss+]s$^<\?xml.*?encoding=["\']*(.+?)["\'>](RIRJtDeprecationWarningR/tcompileR1tfindall(tcontentt charset_ret pragma_retxml_re((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytget_encodings_from_content�sc Cs�|jd�}|dj�|d}}i}d}x�|D]�}|j�}|r=|t}}|jd�} | dkr�|| j|�}|| dj|�}n|||j�dA}tjtjd|��S(s�Converts mask from /xx format to xxx.xxx.xxx.xxx Example: if mask is 24 function returns 255.255.255.0 :rtype: str I����ii s>I(R�t inet_ntoaR�tpack(tmaskR�((s0/tmp/pip-build-1THPZW/requests/requests/utils.pyR�wscCs-ytj|�Wntjk r(tSXtS(s :rtype: bool (R�R�terrorR&R-(t string_ip((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytis_ipv4_address�s cCs�|jd�dkr�yt|jd�d�}Wntk rFtSX|dks_|dkrctSytj|jd�d�Wq�tjk r�tSXntStS(sV Very simple check of the cidr format in no_proxy variable. :rtype: bool Rpii i( tcountR)R,R�R&R�R�R�R-(tstring_networkR�((s0/tmp/pip-build-1THPZW/requests/requests/utils.pyt is_valid_cidr�s ccst|dk }|r4tjj|�}|tj|}t|�r�t|j|�r�tSq�|j|kr�tSq�Wq3|j}|j r�|dj |j �7}nx6|D]+}|jj |�s(|j |�rtSqWnt d|��;yt |j�}Wn ttjfk rxt}nXWdQX|r�tStS( sL Returns whether we should bypass proxies or not. :rtype: bool cSs(tjj|�p'tjj|j��S(N(RER�R�tupper(tk((s0/tmp/pip-build-1THPZW/requests/requests/utils.pyt�R�tno_proxycss|]}|r|VqdS(N((t.0R2((s0/tmp/pip-build-1THPZW/requests/requests/utils.pys �st R�t,s:{}N(RBRthostnameR-R.R,R�R�R�tportRXtendswithR�R R�R�tgaierrorR&( R`R�t get_proxyt no_proxy_argtparsedtproxy_ipthost_with_portR2tbypass((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytshould_bypass_proxies�s<   %      ! cCs!t|d|�riSt�SdS(sA Return a dict of environment proxies. :rtype: dict R�N(RR (R`R�((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytget_environ_proxies�scCs�|p i}t|�}|jdkrC|j|j|jd��S|jd|j|jd|jdg}d}x(|D] }||krz||}PqzqzW|S(s�Select 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 talls://sall://N(RR�RBR�tscheme(R`tproxiesturlpartst proxy_keystproxyt proxy_key((s0/tmp/pip-build-1THPZW/requests/requests/utils.pyt select_proxys       spython-requestscCsd|tfS(sO Return a string representing the default user agent. :rtype: str s%s/%s(R(Ri((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytdefault_user_agentscCs2tit�d6djd �d6dd6dd 6�S( s9 :rtype: requests.structures.CaseInsensitiveDict s User-Agents, tgziptdeflatesAccept-Encodings*/*tAccepts keep-alivet Connection(R R (RR Rq(((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytdefault_headers's  c Cs g}d}|j|�}|s%|Sx�tjd|�D]�}y|jdd�\}}Wntk rz|d}}nXi|jd�d6}xa|jd�D]P}y|jd�\}}Wntk r�PnX|j|�||j|�; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" :rtype: list s '"s, * '"R`R�(R�R/R,R�R�( R�tlinkst replace_charstvalR`R�tlinkR�R�((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytparse_header_links3s&   sRTiicCs|d }|tjtjfkr&dS|d tjkr=dS|d tjtjfkr]dS|jt�}|dkr|dS|dkr�|d d d�tkr�d S|d d d�tkr�d Sn|dkr�|d t kr�d S|d t kr�dSnd S(s :rtype: str isutf-32is utf-8-sigisutf-16isutf-8Ns utf-16-beis utf-16-les utf-32-bes utf-32-le( R�t BOM_UTF32_LEt BOM_UTF32_BEtBOM_UTF8t BOM_UTF16_LEt BOM_UTF16_BER�t_nullt_null2t_null3RB(tdatatsamplet nullcount((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytguess_json_utf^s*    cCsSt||�\}}}}}}|s7||}}nt||||||f�S(s�Given 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 (RR (R`t new_schemeRR]RVR�tquerytfragment((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytprepend_scheme_if_needed~s!cCsRt|�}y"t|j�t|j�f}Wnttfk rMd}nX|S(s{Given a url with authentication components, extract them into a tuple of username,password. :rtype: (str,str) R�(R�R�(RR tusernametpasswordR_R�(R`R�tauth((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytget_auth_from_url�s  " s^\S[^\r\n]*$|^$cCs�|\}}t|t�r$t}nt}y&|j|�sOtd|��nWn0tk r�td||t|�f��nXdS(s�Verifies 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). s7Invalid return character or leading space in header: %ss>Value for header {%s: %s} must be of type str or bytes, not %sN(R[Rt_CLEAN_HEADER_REGEX_BYTEt_CLEAN_HEADER_REGEX_STRR0RR�ttype(R�RiR�tpat((s0/tmp/pip-build-1THPZW/requests/requests/utils.pytcheck_header_validity�s   cCsft|�\}}}}}}|s4||}}n|jdd�d}t|||||df�S(sW Given a url remove the fragment and the authentication part. :rtype: str t@ii����R�(RtrsplitR (R`RR]RVR�R"R#((s0/tmp/pip-build-1THPZW/requests/requests/utils.pyt urldefragauth�s cCs}t|jdd�}|dk rmt|jt�rmy||j�Wqyttfk ritd��qyXn td��dS(sfMove file pointer back to its recorded starting position so it can be read again on redirect. RAs;An error occurred when rewinding request body for redirect.s+Unable to rewind request body for redirect.N( RltbodyRBR[t_body_positionRRKR+R(tprepared_requestt body_seek((s0/tmp/pip-build-1THPZW/requests/requests/utils.pyt rewind_body�s(s.netrcR(dt__doc__R�t contextlibRCRER/R�R�tsysRvRIRrt collectionsRRR�Rt_internal_utilsRtcompatRR�RRRRR R R R R RRRRRtcookiesRt structuresRt exceptionsRRRRRUtwheretDEFAULT_CA_BUNDLE_PATHt DEFAULT_PORTStplatformR7R;RPR&RhRoRR�R�R�R�R�R�R�R�R�R�R�R�R�t frozensetR�R�R�R�R�R�R�tcontextmanagerR�RRBRR R RRtencodeRRRR R$R(R�R)R*R-R0R5(((s0/tmp/pip-build-1THPZW/requests/requests/utils.pyt s�           ^"  ' = 3    #       %      =  &