ó ¡fH^c @@sÎddlmZddlZddlmZddlmZddlmZddd d d d d gZ dCZ 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'd3ƒZ)e(e)Bd4hBZ*e*d5d6hBZ+e+d7hBZ,Z-d8ed8e ƒfd9„ƒYZ.d:„Z/d;d<„Z0d=„Z1d>„Z2d?„Z3d@„Z4dA„Z5dB„Z6dS(Di(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)?::sDABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._!\-~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/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 ((surllib3/util/url.pyR[s   cC@s|jS(s@For backwards-compatibility with urlparse. We're nice like that.(R(tself((surllib3/util/url.pythostnamemscC@s6|jp d}|jdk r2|d|j7}n|S(s)Absolute path including the query string.RRN(RR R(R turi((surllib3/util/url.pyt request_urirscC@s$|jrd|j|jfS|jS(s(Network location including host and ports%s:%d(RR(R ((surllib3/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( R RRRRRR R turl((surllib3/util/url.pyR&ƒs"         cC@s|jS(N(R&(R ((surllib3/util/url.pyt__str__«s(N( t__name__t __module__t__doc__t __slots__RRtpropertyR!R#R$R&R'(((surllib3/util/url.pyRRs  (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((surllib3/util/url.pyt split_first¯s    sutf-8c C@s$|d kr|Stj|ƒ}tjd„|ƒ\}}|jddƒ}||jdƒk}tƒ}xªtdt |ƒƒD]“}|||d!}t |ƒ} |rµ|dksÓ| dkrã|j ƒ|krã||7}q€n|j dt | ƒdjƒjdƒjƒƒq€W|j |ƒS( sfPercent-encodes a URI component without reapplying onto an already percent-encoded component. cS@s|jdƒjƒS(Ni(tgrouptupper(tmatch((surllib3/util/url.pytßssutf-8t surrogatepasst%iii€iN(RRt ensure_textt PERCENT_REtsubntencodetcountt bytearraytrangetlentordtdecodetextendR tzfillR7( t componentt allowed_charstencodingtpercent_encodingst uri_bytestis_percent_encodedtencoded_componenttitbytetbyte_ord((surllib3/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((surllib3/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%25iR;RS(t isinstanceRt binary_typet ensure_strtNORMALIZABLE_SCHEMESt IPV6_ADDRZ_RER8t ZONE_ID_REtsearchtspanRRRtUNRESERVED_CHARSRtIPV4_RERYRTt _idna_encode(RRtis_ipv6R8tstarttendtzone_idtlabel((surllib3/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( tanyRDtidnat ImportErrorRt raise_fromRRR?RtTruet IDNAError(tnametxRs((surllib3/util/url.pyRh.s1   #cC@sZtj|ƒjƒ\}}t|tƒ}t|tƒ}|dk rV|d|7}n|S(sHPercent-encodes a request target so that there are no invalid charactersRN(t TARGET_RER8tgroupsRRt PATH_CHARSt QUERY_CHARSR(ttargetRR ((surllib3/util/url.pyt_encode_target@s  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(surllib3/util/url.pyt ensure_type›sRRRRRR R N(NNN(Rt SCHEME_RERdtURI_RER8R{RRRatSUBAUTHORITY_RERRtUSERINFO_CHARStintRRnR]R|R}tFRAGMENT_CHARSt ValueErrortAttributeErrorRRuR^t text_typeR<R`( R&t source_urlRt authorityRR R t normalize_uriRRRR((R€surllib3/util/url.pyt parse_urlJs^ $                  cC@s(t|ƒ}|jpd|j|jfS(s4 Deprecated. Use :func:`parse_url` instead. R (RŽRR!R(R&tp((surllib3/util/url.pytget_host©s (R R N(7t __future__Rtret collectionsRt exceptionsRtpackagesRt url_attrsRRatcompileR=R‚tUNICODEtDOTALLRƒtIPV4_PATtHEX_PATtformattLS32_PATt_subst _variationstUNRESERVED_PATRYRytIPV6_PATt ZONE_ID_PATtIPV6_ADDRZ_PATt REG_NAME_PATRzRgtIPV6_RERbtBRACELESS_IPV6_ADDRZ_RERctSUBAUTHORITY_PATR„tsetRftSUB_DELIM_CHARSR…R|R}R‡RR5RRR]RnRhRRŽR(((surllib3/util/url.pytsn  .   ] # "    _