ó õ«‰]c @@sÁddlmZddlZddlmZddlmZddlmZddd d d d d gZ dBZ ej dƒZ ej dƒZej dejejBƒZdZdZdjdedeƒZied6ed6Zdddddddd d!g Zd"Zd#d$jgeD]Zee^qƒd%Zd&ed'Zd(ed#ed)Zd*Zej d+ƒZej d,ed-ƒZ ej d,ed-ƒZ!ej d,ed-ƒZ"ej d,edd.!d-ƒZ#ej d/ed0ƒZ$d1eeefZ%ej e%ejejBƒZ&e'd2ƒZ(e(e'd3ƒBZ)e)d4d5hBZ*e*d6hBZ+Z,d7ed7e ƒfd8„ƒYZ-d9„Z.d:d;„Z/d<„Z0d=„Z1d>„Z2d?„Z3d@„Z4dA„Z5dS(Ci(tabsolute_importN(t namedtuplei(tLocationParseError(tsixtschemetauththosttporttpathtquerytfragmentthttpthttpss%[a-fA-F0-9]{2}s^(?:[a-zA-Z][a-zA-Z0-9+-]*:|/)sQ^(?:([a-zA-Z][a-zA-Z0-9+.-]*):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?$s(?:[0-9]{1,3}\.){3}[0-9]{1,3}s[0-9A-Fa-f]{1,4}s(?:{hex}:{hex}|{ipv4})thextipv4tls32s(?:%(hex)s:){6}%(ls32)ss::(?:%(hex)s:){5}%(ls32)ss%(?:%(hex)s)?::(?:%(hex)s:){4}%(ls32)ss2(?:(?:%(hex)s:)?%(hex)s)?::(?:%(hex)s:){3}%(ls32)ss6(?:(?:%(hex)s:){0,2}%(hex)s)?::(?:%(hex)s:){2}%(ls32)ss/(?:(?:%(hex)s:){0,3}%(hex)s)?::%(hex)s:%(ls32)ss'(?:(?:%(hex)s:){0,4}%(hex)s)?::%(ls32)ss&(?:(?:%(hex)s:){0,5}%(hex)s)?::%(hex)ss(?:(?:%(hex)s:){0,6}%(hex)s)?::sCABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._!\-s(?:t|t)s (?:%25|%)(?:[s]|%[a-fA-F0-9]{2})+s\[s)?\]s!(?:[^\[\]%:/?#]|%[a-fA-F0-9]{2})*s"^(/[^?]*)(?:\?([^#]+))?(?:#(.*))?$t^t$iþÿÿÿt(s)\]$u(^(?:(.*)@)?(%s|%s|%s)(?::([0-9]{0,5}))?$sBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._!-s $&'()*+,;=:t@t/t?tUrlcB@sweZdZdZdddddddd„Zed„ƒZed„ƒZed„ƒZ ed„ƒZ d„Z RS( sÍ Data structure for representing an HTTP URL. Used as a return value for :func:`parse_url`. Both the scheme and host are normalized as they are both case-insensitive according to RFC 3986. c C@si|r#|jdƒ r#d|}n|dk r>|jƒ}ntt|ƒj||||||||ƒS(NR(t startswithtNonetlowertsuperRt__new__(tclsRRRRRR R ((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pyRZs   cC@s|jS(s@For backwards-compatibility with urlparse. We're nice like that.(R(tself((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pythostnamelscC@s6|jp d}|jdk r2|d|j7}n|S(s)Absolute path including the query string.RRN(RR R(Rturi((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pyt request_uriqscC@s$|jrd|j|jfS|jS(s(Network location including host and ports%s:%d(RR(R((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pytnetloc{s c C@sî|\}}}}}}}d}|dk r>||d7}n|dk r[||d7}n|dk rt||7}n|dk r—|dt|ƒ7}n|dk r°||7}n|dk rÍ|d|7}n|dk rê|d|7}n|S(sˆ Convert self into a url This function should more or less round-trip with :func:`.parse_url`. The returned url may not be exactly the same as the url inputted to :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls with a blank port will have : removed). Example: :: >>> U = parse_url('http://google.com/mail/') >>> U.url 'http://google.com/mail/' >>> Url('http', 'username:password', 'host.com', 80, ... '/path', 'query', 'fragment').url 'http://username:password@host.com:80/path?query#fragment' uu://u@u:u?u#N(Rtstr( RRRRRRR R turl((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pyR%‚s"         cC@s|jS(N(R%(R((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pyt__str__ªs(N( t__name__t __module__t__doc__t __slots__RRtpropertyR R"R#R%R&(((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pyRQs  (cC@s£d}d}xV|D]N}|j|ƒ}|dkr:qn|dksR||kr|}|}qqW|dks}|dkrŠ|ddfS|| ||d|fS(sì .. deprecated:: 1.25 Given a string and an iterable of delimiters, split on the first found delimiter. Return two split parts and the matched delimiter. If not found, then the first part is the full input string. Example:: >>> split_first('foo/bar?baz', '?/=') ('foo', 'bar?baz', '/') >>> split_first('foo/bar?baz', '123') ('foo/bar?baz', '', None) Scales linearly with number of delims. Not ideal for large number of delims. itiN(Rtfind(tstdelimstmin_idxt min_delimtdtidx((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pyt split_first®s    sutf-8c C@sY|dkr|Stj|ƒ}tj|ƒ}x5|D]-}|jƒs5|j||jƒƒ}q5q5W|jddƒ}t |ƒ|j dƒk}t ƒ}x­t dt |ƒƒD]–}|||d!} t | ƒ} |rç| dks| dkr| jƒ|kr|j| ƒq²n|jdt| ƒdjƒjdƒjƒƒq²W|j|ƒS( sfPercent-encodes a URI component without reapplying onto an already percent-encoded component. sutf-8t surrogatepasst%iii€iN(RRt ensure_textt PERCENT_REtfindalltisuppertreplacetuppertencodetlentcountt bytearraytrangetordtdecodetextendR tzfill( t componentt allowed_charstencodingtpercent_encodingstenct uri_bytestis_percent_encodedtencoded_componenttitbytetbyte_ord((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pyt_encode_invalid_charsÑs&      4cC@sÆ|jdƒ}g}xO|D]G}|dkr4qq|dkrP|j|ƒq|r|jƒqqW|jdƒrš| s‡|drš|jddƒn|jdƒr¹|jdƒndj|ƒS( NRt.s..iR,s/.s/..(s/.s/..(tsplittappendtpopRtinserttendswithtjoin(Rtsegmentstoutputtsegment((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pyt_remove_path_dot_segmentsös    cC@s?|r;t|tjƒr*tj|ƒ}n|tkr;tj|ƒ}|rîtj|ƒ}|rá|j dƒ\}}|||!}|j dƒrª|dkrª|d}n |d}dt |t ƒ}|| j ƒ|||S|j ƒSq8tj|ƒs8tjdjg|jdƒD]}t|ƒ^qƒƒSq;n|S(Nis%25iR6RR(t isinstanceRt binary_typet ensure_strtNORMALIZABLE_SCHEMESt IPV6_ADDRZ_REtmatcht ZONE_ID_REtsearchtspanRRQt ZONE_ID_CHARSRtIPV4_RERXRSt _idna_encode(RRtis_ipv6Rbtstarttendtzone_idtlabel((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pyt_normalize_hosts(     8cC@sÕ|rÂtg|D]}t|ƒdk^qƒrÂyddl}Wn'tk rjtjtdƒdƒnXy#|j|j ƒdt dt ƒSWqÂ|j k r¾tjtd|ƒdƒqÂXn|j ƒjdƒS(Ni€is-Unable to parse URL without the 'idna' moduletstrictt std3_rulesu#Name '%s' is not a valid IDNA labeltascii( tanyRBtidnat ImportErrorRt raise_fromRRR=RtTruet IDNAError(tnametxRs((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pyRh0s1   #cC@sœ|jdƒs|Stj|ƒjƒ\}}}t|tƒ}t|tƒ}t|tƒ}|dk r{|d|7}n|dk r˜|d|7}n|S(sHPercent-encodes a request target so that there are no invalid charactersRRt#N( Rt TARGET_RERbtgroupsRQt PATH_CHARSt QUERY_CHARStFRAGMENT_CHARSR(ttargetRR R ((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pyt_encode_targetBs  c @s–|s tƒS|}tj|ƒs/d|}nytj|ƒjƒ\}}}}}|d kpq|jƒtk}|r‰|jƒ}n|rãt j|ƒjƒ\}} } |rË|rËt |t ƒ}n| dkròd } qònd\}} } | d k r8t | ƒ} d| ko!dkns8t |ƒ‚q8nt| |ƒ} |rq|rqt|ƒ}t |tƒ}n|r|rt |tƒ}n|r­|r­t |tƒ}nWn*ttfk rÚtjt |ƒd ƒSX|s |d k sù|d k rd}q d }nt|tjƒr)tj‰n tj‰‡fd†} td| |ƒd| |ƒd| | ƒd | d | |ƒd | |ƒd | |ƒƒS(s  Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is performed to parse incomplete urls. Fields not provided will be None. This parser is RFC 3986 compliant. The parser logic and helper functions are based heavily on work done in the ``rfc3986`` module. :param str url: URL to parse into a :class:`.Url` namedtuple. Partly backwards-compatible with :mod:`urlparse`. Example:: >>> parse_url('http://google.com/mail/') Url(scheme='http', host='google.com', port=None, path='/mail/', ...) >>> parse_url('google.com:80') Url(scheme=None, host='google.com', port=80, path=None, ...) >>> parse_url('/foo?bar') Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) s//R,iiÿÿc@s|dkr|Sˆ|ƒS(N(R(Ry(t ensure_func(s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pyt ensure_type£sRRRRRR R N(NNN(Rt SCHEME_RERdtURI_RERbR|RRR`tSUBAUTHORITY_RERQtUSERINFO_CHARStintRRnR\R}R~Rt ValueErrortAttributeErrorRRuR]t text_typeR7R_( R%t source_urlRt authorityRR R t normalize_uriRRRRƒ((R‚s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pyt parse_urlRs^ $                  cC@s(t|ƒ}|jpd|j|jfS(s4 Deprecated. Use :func:`parse_url` instead. R (RRR R(R%tp((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pytget_host±s (R R N(6t __future__Rtret collectionsRt exceptionsRtpackagesRt url_attrsRR`tcompileR8R„tUNICODEtDOTALLR…tIPV4_PATtHEX_PATtformattLS32_PATt_subst _variationstUNRESERVED_PATRXRytIPV6_PATt ZONE_ID_PATtIPV6_ADDRZ_PATt REG_NAME_PATR{RgtIPV6_RERatBRACELESS_IPV6_ADDRZ_RERctSUBAUTHORITY_PATR†tsetRfR‡R}R~RRR4RQR\RnRhRRR‘(((s1/tmp/pip-build-Q8jF4w/urllib3/urllib3/util/url.pytsl  .  ] # %     _