ReN@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl m Z ddlmZddlmZmZmZmZmZmZmZmZmZmZmZddlmZmZdd lm Z dd l!m"Z"efZ#dSZ$e j%Z&d dZ'ddZ(ddZ)ddZ*ddZ+ddZ,ddZ-ddZ.dddZ/d d!Z0d"d#Z1d$d%Z2d&d'Z3d(d)Z4d*d+Z5d,d-Z6e7d.d/Z8d0d1Z9d2d3Z:d4d5Z;d6d7Z<d8d9Z=d:d;Z>d<d=Z?d>d?Z@d@dAdBZAdCdDZBdEdFZCdGjDdHZEeEdIZFeEdJZGdKdLZHdMdNZIdOdPZJdHdQdRZKdS)Tz requests.utils ~~~~~~~~~~~~~~ This module provides utility functions that are used within Requests that are also useful for external consumption. N) __version__)certs)parse_http_list) quoteurlparsebytesstr OrderedDictunquoteis_py2 builtin_str getproxies proxy_bypass urlunparse)RequestsCookieJarcookiejar_from_dict)CaseInsensitiveDict) InvalidURL.netrc_netrccCs"t|dr|j}n|S)z/Returns an internal sequence dictionary update.items)hasattrr)dr5/tmp/pip-ztkk0jow-build/pip/_vendor/requests/utils.pydict_to_sequence'src Cst|drt|St|dr/|jSt|dryy|j}Wntjk reYqyXtj|jSnt|drt|jSdS)N__len__lenfilenogetvalue) rrrioUnsupportedOperationosfstatst_sizer )orrrr super_len0s r'c Cs8yddlm}m}d}xbtD]Z}ytjjdj|}Wntk rcdSYnXtjj|r&|}Pq&q&W|dkrdSt |}|j j dd}yG||j |}|r|drdnd} || |dfSWn|t fk rYnXWnttfk r3YnXdS)z;Returns the Requests tuple auth for a given url from netrc.r)netrcNetrcParseErrorNz~/{0}:r)r(r) NETRC_FILESr#path expanduserformatKeyErrorexistsrnetlocsplitauthenticatorsIOError ImportErrorAttributeError) urlr(r) netrc_pathflocrihostrlogin_irrrget_netrc_authDs0      r?cCsLt|dd}|rH|ddkrH|ddkrHtjj|SdS)z0Tries to guess the filename of the given object.nameNr)getattrr#r-basename)objr@rrrguess_filenamers&rGcCsD|dkrdSt|ttttfr:tdnt|S)aTake 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') ValueError: need more than 1 value to unpack >>> from_key_val_list({'key': 'val'}) OrderedDict([('key', 'val')]) Nz+cannot encode objects that are not 2-tuples) isinstancer rboolint ValueErrorr )valuerrrfrom_key_val_listys  rMcCse|dkrdSt|ttttfr:tdnt|tjr[|j}nt |S)azTake 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') ValueError: cannot encode objects that are not 2-tuples. Nz+cannot encode objects that are not 2-tuples) rHr rrIrJrK collectionsMappingrlist)rLrrrto_key_val_lists rQcCswg}xjt|D]\}|dd|ddkoDdknrbt|dd}n|j|qW|S)aParse 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` Nr"rCrC)_parse_list_headerunquote_header_valueappend)rLresultitemrrrparse_list_headers 0rXcCsi}xt|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` =NrrRrCrC)rSr3rT)rLrVrWr@rrrparse_dict_headers  0rZFcCsz|rv|d|d ko%dknrv|dd }| sW|dddkrv|jddjddSn|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. rrrRNr+z\\\z\"rCrC)replace)rL is_filenamerrrrTs *rTcCs+i}x|D]}|j||j]flagsz+]z$^<\?xml.*?encoding=["\']*(.+?)["\'>])recompileIfindall)content charset_re pragma_rexml_rerrrget_encodings_from_contents rncCs_|jd}|sdStj|\}}d|krK|djdSd|kr[dSdS)zmReturns encodings from given HTTP Header Dict. :param headers: dictionary to extract encoding from. z content-typeNcharsetz'"textz ISO-8859-1)getcgi parse_headerstrip)headers content_typeparamsrrrget_encoding_from_headers,s  rxccs|jdkr)x|D] }|VqWdStj|jdd}x+|D]#}|j|}|rK|VqKqKW|jddd}|r|VndS)zStream decodes a iterator.Nerrorsr\finalT)encodingcodecsgetincrementaldecoderdecode)iteratorrrWdecoderchunkrvrrrstream_decode_response_unicode@s    rccs@d}x3|t|kr;||||V||7}q WdS)z Iterate over slices of a string.rN)r)string slice_lengthposrrr iter_slicesRsrcCsg}t|j}|rTyt|j|SWqTtk rP|j|YqTXnyt|j|ddSWntk r|jSYnXdS)a Returns the requested content back in unicode. :param r: Response object to get unicode content from. Tried: 1. charset from content-type 2. every encodings from ```` 3. fall back and replace all unicode characters ryr\N)rxrur rj UnicodeErrorrU TypeError)rtried_encodingsr|rrrget_unicode_from_responseZs  rZ4ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzz0123456789-._~c Cs|jd}xtdt|D]}||dd}t|dkr|jrytt|d}Wn"tk rtd|YnX|tkr|||dd||dA}tjtjd|S)zt Converts mask from /xx format to xxx.xxx.xxx.xxx Example: if mask is 24 function returns 255.255.255.0 lr z>I)r inet_ntoarpack)maskrrrrrsrc Cs1ytj|Wntjk r,dSYnXdS)NFT)rrerror) string_iprrris_ipv4_addresss  rcCs|jddkryt|jdd}Wntk rJdSYnX|dksc|dkrgdSytj|jddWqtjk rdSYqXndSdS)z9Very simple check of the cidr format in no_proxy variablerrFrrT)countrJr3rKrrr)string_networkrrrr is_valid_cidrs   rc Cs"dd}|d}t|j}|r|jddjd}|jdd}t|rxs|D](}t|rnt||rd SqnqnWqx@|D]5}|j|s|jddj|rd SqWnyt|}Wn!t t j fk rd }YnX|rd Sd S) z: Returns whether we should bypass proxies or not. cSs(tjj|p'tjj|jS)N)r#environrqupper)krrrsz'should_bypass_proxies..no_proxy r,r*rTF) rr2r\r3rrrendswithrrrgaierror)r8 get_proxyrr2rproxy_ipr=bypassrrrshould_bypass_proxiess*      +  rcCst|riStSdS)z%Return a dict of environment proxies.N)rr)r8rrrget_environ_proxiess rzpython-requestscCs8tj}|dkr'tj}n|dkrdtjjtjjtjjf}tjjdkrdj |tjjg}qn<|dkrtj}n!|dkrtj}nd}ytj }tj }Wnt k rd}d}YnXd j d |t fd ||fd ||fgS) z4Return a string representing the default user agent.CPythonPyPyz%s.%s.%sr{rJython IronPythonUnknownrz%s/%s)platformpython_implementationpython_versionsyspypy_version_infomajorminormicro releaselevelrsystemreleaser5r)r@_implementation_implementation_versionp_system p_releaserrrdefault_user_agent s.     !      rcCs+titd6djdd6dd6S) Nz User-Agentz, gzipdeflatezAccept-Encodingz*/*Accept)zgzipzdeflate)rrrrrrrdefault_headers)s rc Csg}d}x|jdD]}y|jdd\}}Wntk r_|d}}YnXi}|jd|d; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" z '"r;rrz<> '"r8rY)r3rKrtrU) rLlinks replace_charsvalr8rwlinkparamkeyrrrparse_header_links1s"   rasciir+cCs|dd}|tjtjfkr,dS|ddtjkrIdS|ddtjtjfkrodS|jt}|dkrdS|dkr|dddtkrd S|d ddtkrd Sn|dkr|ddt krd S|d dt krd SndS)Nzutf-32rz utf-8-sigr+zutf-16rzutf-8z utf-16-berz utf-16-lez utf-32-bez utf-32-le) r} BOM_UTF32_LEBOM32_BEBOM_UTF8 BOM_UTF16_LE BOM_UTF16_BEr_null_null2_null3)datasample nullcountrrrguess_json_utfYs*"   rcCsSt||\}}}}}}|s7||}}nt||||||fS)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.)rr)r8 new_schemeschemer2r-rwqueryfragmentrrrprepend_scheme_if_neededvs!rc CsSt|}y"t|jt|jf}Wnttfk rNd}YnX|S)z_Given a url with authentication components, extract them into a tuple of username,password.r)rr)rr usernamepasswordr7r)r8parsedauthrrrget_auth_from_urls  " rcCsId}t|tr|}n'tr6|j|}n|j|}|S)z Given a string object, regardless of type, returns a representation of that string in the native string type, encoding and decoding where necessary. This assumes ASCII unless told otherwise. N)rHr r encoder)rr|outrrrto_native_strings r)rz_netrc)L__doc__rrr}rNr!r#rrfrrrrrrcompatrrSrrrr r r r r rrrcookiesrr structuresr exceptionsr_hush_pyflakesr,whereDEFAULT_CA_BUNDLE_PATHrr'r?rGrMrQrXrZrTrardrnrxrrr frozensetrrrrrrrrrrrrrrrrrrrrrrrr sr          L    .     "      "     -   #