ó
Ý²k^c           @` sR  d  d l  m Z m Z m Z m Z d  d l Z d  d l m Z d  d l m Z m	 Z	 d  d l
 Z
 d  d l Z d d l m Z m Z d d l m Z m Z d d	 l m Z d d
 l m Z d d l m Z m Z y& d  d l m Z m Z m Z m Z Wn3 e k
 r)d  d l m Z m Z m Z m Z n Xd „  Z  e d „  ƒ Z! d Z" e d „  ƒ Z# e d „  ƒ Z$ d „  Z% d „  Z& d „  Z' d „  Z( d „  Z) d „  Z* d „  Z+ e+ Z, d „  Z- d „  Z. d „  Z/ d „  Z0 d „  Z1 d „  Z2 d „  Z3 d  „  Z4 e d! „  ƒ Z5 d" „  Z6 e7 d# „ Z8 d$ „  Z9 d% „  Z: e; d& k rNd  d l< Z< e< j= ƒ  n  d S('   i    (   t   absolute_importt   divisiont   print_functiont   unicode_literalsN(   t   getpass(   t   abspatht
   expanduseri   (   t   inputt   on_win(   t   split_filenamet   strip_pkg_extensioni   (   t   memoize(   t   LocationParseError(   t   Urlt	   parse_url(   t   quotet
   quote_plust   unquotet   unquote_plusc         C` sŽ   t  |  ƒ }  t  d ƒ } t  d ƒ } t  d ƒ } t  d ƒ } |  | k r^ |  | k r^ |  | n) |  | k r„ |  | k r„ |  | d n d  } | S(   Nu   0u   9u   Au   Fi
   (   t   ordt   None(   t   hot   o0t   o9t   oAt   oFt   res(    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   hex_octal_to_int   s    Nc   
   	   C` s\  d |  k r |  Sg  } x9 t  j d |  ƒ D]% } | j | j ƒ  | j ƒ  f ƒ q) Wt | ƒ sb |  Sd } d } xÚ t |  ƒ D]Ì \ } } | d k r£ | d 8} q{ n  | j d ƒ } | } | d k r4xm | D]b } | | d k rË d d  l }	 |	 j	 d t
 |  | d ƒ d	 t
 |  | d
 ƒ ƒ } d
 } PqË qË Wn  | r{ | | 7} q{ q{ Wt j | ƒ d S(   Nu   %u   (%[0-9A-F]{2})t    i    i   u   asciit   %u   Bi   i   (   t   ret   finditert   appendt   startt   endt   lent	   enumeratet   encodet   structt   packR   t   codecst   utf_8_decode(
   t   patht   rangest   mt   resultt   skipst   it   ct   emitt   rR&   (    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   percent_decode$   s4    #
0u   file://c         ` s*  |  s t  d |  ƒ ‚ n  |  j t ƒ ra y |  j d ƒ Wn! t k
 r\ t  d |  ƒ ‚ n X|  St t |  ƒ ƒ j d d ƒ }  d ‰  ‡  f d †  } t d „  |  Dƒ ƒ ré | t	 |  d	 ƒ rË |  j d
 ƒ n t
 |  d ƒ j d
 ƒ ƒ }  n  t |  ƒ d k r|  d d k rt d |  }  n
 t |  }  |  S(   Nu   Not allowed: %ru   asciiu8   Non-ascii not allowed for things claiming to be URLs: %ru   \u   /u   !'()*-._/\:c         ` s   d j  ‡  f d †  |  Dƒ ƒ S(   Nu    c         3` sG   |  ]= } d  t  | ƒ | g | d k  r4 | j ƒ  p= | ˆ  k Vq d S(   u   %%%02Xu   {N(   R   t   isalnum(   t   .0R0   (   t   percent_encode_chars(    s/   lib/python2.7/site-packages/conda/common/url.pys	   <genexpr>n   s   (   t   join(   t   s(   R6   (    s/   lib/python2.7/site-packages/conda/common/url.pyt   <lambda>n   s   c         s` s!   |  ] } t  | ƒ d  k Vq d S(   i€   N(   R   (   R5   t   char(    (    s/   lib/python2.7/site-packages/conda/common/url.pys	   <genexpr>q   s    u   decodeu   unicode-escapeu   utf-8i   u   :(   t
   ValueErrort
   startswitht   file_schemet   decodet   UnicodeDecodeErrorR   R   t   replacet   anyt   hasattrt   bytesR#   (   R*   t   percent_encode(    (   R6   s/   lib/python2.7/site-packages/conda/common/url.pyt   path_to_urlU   s&    "
c         C` s2   t  r( |  j d ƒ r( |  j d d ƒ n  t |  ƒ S(   Nu   file:u   \u   /(   R   R<   R@   R   (   t   url(    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   urlparse~   s    c         C` sH   t  |  ƒ } | j d k s+ t d |  ƒ ‚ | j | j } } | | f S(   u¼   Convert an s3 url to a tuple of bucket and key.

    Examples:
        >>> url_to_s3_info("s3://bucket-name.bucket/here/is/the/key")
        ('bucket-name.bucket', '/here/is/the/key')
    u   s3u"   You can only use s3: urls (not %r)(   R   t   schemet   AssertionErrort   hostR*   (   RF   t
   parsed_urlt   buckett   key(    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   url_to_s3_info…   s    c         C` s:   |  s
 t  Sy t |  ƒ j d k	 SWn t k
 r5 t  SXd S(   un   
    Examples:
        >>> is_url(None)
        False
        >>> is_url("s3://some/bucket")
        True
    N(   t   FalseRG   RH   R   R   (   RF   (    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   is_url’   s    c         C` s<   y t  j |  ƒ Wn t  j k
 r( t SX|  j d ƒ d k S(   u  
    Examples:
        >>> [is_ipv4_address(ip) for ip in ('8.8.8.8', '192.168.10.10', '255.255.255.255')]
        [True, True, True]
        >>> [is_ipv4_address(ip) for ip in ('8.8.8', '192.168.10.10.20', '256.255.255.255', '::1')]
        [False, False, False, False]
    u   .i   (   t   sockett	   inet_atont   errorRO   t   count(   t	   string_ip(    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   is_ipv4_address¢   s
    c         C` sX   y t  j } Wn t k
 r' t |  ƒ SXy | t  j |  ƒ Wn t  j k
 rS t SXt S(   uô   
    Examples:
        >> [is_ipv6_address(ip) for ip in ('::1', '2001:db8:85a3::370:7334', '1234:'*7+'1234')]
        [True, True, True]
        >> [is_ipv6_address(ip) for ip in ('192.168.10.10', '1234:'*8+'1234')]
        [False, False]
    (   RQ   t	   inet_ptont   AttributeErrort   is_ipv6_address_win_py27t   AF_INET6RS   RO   t   True(   RU   RW   (    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   is_ipv6_address±   s    c         C` s&   t  t j d |  d t j t j Bƒƒ S(   uç   
    Examples:
        >>> [is_ipv6_address_win_py27(ip) for ip in ('::1', '1234:'*7+'1234')]
        [True, True]
        >>> [is_ipv6_address_win_py27(ip) for ip in ('192.168.10.10', '1234:'*8+'1234')]
        [False, False]
    u”   ^(((?=.*(::))(?!.*\3.+\3))\3?|[\dA-F]{1,4}:)([\dA-F]{1,4}(\3|:\b)|\2){5}(([\dA-F]{1,4}(\3|:\b|$)|\2){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})\Zt   flags(   t   boolR   t   matcht   DOTALLt
   IGNORECASE(   RU   (    (    s/   lib/python2.7/site-packages/conda/common/url.pyRY   Ä   s    	c         C` s   t  |  ƒ p t |  ƒ S(   u°   
    Examples:
        >> is_ip_address('192.168.10.10')
        True
        >> is_ip_address('::1')
        True
        >> is_ip_address('www.google.com')
        False
    (   RV   R\   (   RU   (    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   is_ip_addressÖ   s    
c          G` sO   |  d s |  d j  d ƒ r$ d n d } | d j d „  d „  |  Dƒ Dƒ ƒ S(   Ni    u   /u    c         s` s   |  ] } | r | Vq d  S(   N(    (   R5   t   y(    (    s/   lib/python2.7/site-packages/conda/common/url.pys	   <genexpr>å   s    c         s` s$   |  ] } | r | j  d  ƒ Vq d S(   u   /N(   t   strip(   R5   t   x(    (    s/   lib/python2.7/site-packages/conda/common/url.pys	   <genexpr>å   s    (   R<   R7   (   t   argsR!   (    (    s/   lib/python2.7/site-packages/conda/common/url.pyR7   ã   s    *c         C` s   t  j d |  ƒ S(   Nu   [a-z][a-z0-9]{0,11}://(   R   R_   (   t   value(    (    s/   lib/python2.7/site-packages/conda/common/url.pyt
   has_schemeë   s    c         C` s   |  j  d d ƒ d S(   u¾   
    Examples:
        >>> strip_scheme("https://www.conda.io")
        'www.conda.io'
        >>> strip_scheme("s3://some.bucket/plus/a/path.ext")
        'some.bucket/plus/a/path.ext'
    u   ://i   iÿÿÿÿ(   t   split(   RF   (    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   strip_schemeï   s    c         C` s/   t  |  ƒ \ } } | r+ |  j | d d ƒ S|  S(   Nu   <TOKEN>i   (   t   split_anaconda_tokenR@   (   RF   t   _t   token(    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   mask_anaconda_tokenú   s    c         C` sl   t  j d |  ƒ } | r( | j ƒ  d n d } | d k	 rS |  j d | d d ƒ n |  } | j d ƒ | f S(   uÛ  
    Examples:
        >>> split_anaconda_token("https://1.2.3.4/t/tk-123-456/path")
        (u'https://1.2.3.4/path', u'tk-123-456')
        >>> split_anaconda_token("https://1.2.3.4/t//path")
        (u'https://1.2.3.4/path', u'')
        >>> split_anaconda_token("https://some.domain/api/t/tk-123-456/path")
        (u'https://some.domain/api/path', u'tk-123-456')
        >>> split_anaconda_token("https://1.2.3.4/conda/t/tk-123-456/path")
        (u'https://1.2.3.4/conda/path', u'tk-123-456')
        >>> split_anaconda_token("https://1.2.3.4/path")
        (u'https://1.2.3.4/path', None)
        >>> split_anaconda_token("https://10.2.3.4:8080/conda/t/tk-123-45")
        (u'https://10.2.3.4:8080/conda', u'tk-123-45')
    u   /t/([a-zA-Z0-9-]*)i    u   /t/u    i   u   /N(   R   t   searcht   groupsR   R@   t   rstrip(   RF   t   _token_matchRm   t   cleaned_url(    (    s/   lib/python2.7/site-packages/conda/common/url.pyRk   ÿ   s    +c         C` s   d d j  d „  | Dƒ ƒ } t j | |  t j ƒ } | rK | j ƒ  d n d } | d k	 rv |  j d | d d ƒ n |  } | j d ƒ | f S(	   uæ   

    Examples:
        >>> from conda.base.constants import PLATFORM_DIRECTORIES
        >>> split_platform("https://1.2.3.4/t/tk-123/osx-64/path", PLATFORM_DIRECTORIES)
        (u'https://1.2.3.4/t/tk-123/path', u'osx-64')

    u   /(%s)/?u   |c         s` s   |  ] } d  | Vq d S(   u   %sN(    (   R5   t   d(    (    s/   lib/python2.7/site-packages/conda/common/url.pys	   <genexpr>  s    i    u   /u    i   N(   R7   R   Ro   Ra   Rp   R   R@   Rq   (   RF   t   known_subdirst   _platform_match_regext   _platform_matcht   platformRs   (    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   split_platform  s
    	+c         C` sH   t  |  ƒ \ } } | s d  S| j d d ƒ d } | | k rD | pG d  S(   Nu   /i   iÿÿÿÿ(   R	   R   t   rsplit(   RF   Ru   t   url_no_package_nameRl   t   maybe_a_platform(    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   has_platform%  s
    c      	   C` sn   |  s
 d St |  ƒ \ } } t | ƒ } t d | j d | j d | j d | j ƒ j } | | j	 | j
 | f S(   uð   
    Examples:
        >>> split_scheme_auth_token("https://u:p@conda.io/t/x1029384756/more/path")
        ('conda.io/more/path', 'https', 'u:p', 'x1029384756')
        >>> split_scheme_auth_token(None)
        (None, None, None, None)
    RJ   t   portR*   t   queryN(   NNNN(   R   Rk   RG   R   RJ   R~   R*   R   RF   RH   t   auth(   RF   Rs   Rm   t	   url_partst   remainder_url(    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   split_scheme_auth_token-  s    !c   	   	   C` s    t  |  ƒ \ } } t | | ƒ \ } } t | ƒ \ } } | rQ | j d d ƒ n	 | d  f \ } } t | ƒ } | j | j | | | | j | j	 | j
 | j f	 S(   Nu   /i   (   Rk   Ry   R
   Rz   R   RG   RH   R€   RJ   R~   R*   R   (	   RF   Ru   Rs   Rm   Rx   Rl   t   extt   package_filenameR   (    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   split_conda_url_easy_parts>  s    *c         C` s&   t  d |  ƒ } t d ƒ } | | f S(   Nu   
%s proxy username: u
   Password: (   R   R   (   RH   t   usernamet   passwd(    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   get_proxy_username_and_passM  s    c         C` s:   t  |  ƒ j ƒ  } | d t | d ƒ | d <t |   j S(   Nu   :u    u   auth(   R   t   _asdictR   R   RF   (   RF   R‡   t   passwordR   (    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   add_username_and_passwordT  s    c         C` sH   | s
 |  St  |  ƒ j ƒ  } | d r1 | r1 |  S| | d <t |   j S(   u~  Add auth if the url doesn't currently have it.

    By default, does not replace auth if it already exists.  Setting ``force`` to ``True``
    overrides this behavior.

    Examples:
        >>> maybe_add_auth("https://www.conda.io", "user:passwd")
        'https://user:passwd@www.conda.io'
        >>> maybe_add_auth("https://www.conda.io", "")
        'https://www.conda.io'
    u   auth(   RG   RŠ   R   RF   (   RF   R€   t   forceR   (    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   maybe_add_authZ  s    
c         C` s   |  r t  t |  ƒ ƒ S|  S(   N(   R   t   remove_auth(   RF   (    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   maybe_unquoteo  s    c         C` s3   t  |  ƒ j ƒ  } | d r& | d =n  t |   j S(   Nu   auth(   R   RŠ   R   RF   (   RF   R   (    (    s/   lib/python2.7/site-packages/conda/common/url.pyR   s  s    

u   __main__(>   t
   __future__R    R   R   R   R(   R   t   os.pathR   R   R   RQ   t   compatR   R   R*   R	   R
   t   _vendor.auxlib.decoratorsR   t   _vendor.urllib3.exceptionsR   t   _vendor.urllib3.util.urlR   R   t   urllib.parseR   R   R   R   t   ImportErrort   urllibR   R3   R=   RE   RG   RN   RP   RV   R\   RY   Rb   R7   t   join_urlRh   Rj   Rn   Rk   Ry   R}   Rƒ   R†   R‰   RŒ   RO   RŽ   R   R   t   __name__t   doctestt   testmod(    (    (    s/   lib/python2.7/site-packages/conda/common/url.pyt   <module>   sV   "&&	
#)																		