
:\c           @   sj  d  Z  d d l m Z d d l Z d d l Z d d l Z d d l m Z m Z m	 Z	 m
 Z
 m Z m Z d d l m Z d d l m Z d d l m Z d d l Z d d l m Z d d	 l m Z d d
 l m Z d d l m Z e j j j e  d   Z d e	 f d     YZ  d e	 f d     YZ! e" a# e" d  Z$ d   Z% d   Z& e' d k rfe&   n  d S(   s%   Worker threads for downloading files.i(   t   dequeN(   t   QBuffert
   QByteArrayt   QObjectt   QThreadt   QTimert   Signal(   t   HTTPAdapter(   t   InsecureRequestWarning(   t   Retry(   t	   ClientAPI(   t   CondaAPI(   t   logger(   t   to_text_stringc         C   s.   t  |  t  r |  j   }  n  t |  d | S(   s    Qt/Python3 compatibility helper.t   encoding(   t
   isinstanceR   t   dataR   (   t   objR   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   handle_qbytearray'   s    t   DownloadWorkerc           B   s   e  Z d  Z e e e e  Z e e e  Z e e e e e  Z	 e e e e  Z
 e e e e  Z d   Z d   Z d   Z d   Z RS(   s"   Download Worker based on requests.c         C   s;   t  t |   j   | |  _ | |  _ | |  _ t |  _ d S(   s"   Download Worker based on requests.N(   t   superR   t   __init__t   methodt   argst   kwargst   Falset   _is_finished(   t   selfR   R   R   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyR   8   s
    			c         C   s   |  j  j |  | d   d  S(   N(   t   sig_partialt   emitt   None(   R   R   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   _handle_partial@   s    c         C   s   |  j  S(   s@   Return True if worker status is finished otherwise return False.(   R   (   R   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   is_finishedC   s    c         C   s   d } d } y |  j |  j |  j   } Wn= t k
 rg } | GH| } t j t |  j j | f   n X|  j	 j
 |  | |  t |  _ d S(   s6   Start process worker for given method args and kwargs.N(   R   R   R   R   t	   ExceptionR   t   debugt   strt   __name__t   sig_finishedR   t   TrueR   (   R   t   errort   outputt   err(    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   startG   s    #(   R$   t
   __module__t   __doc__R   t   objectt   sig_chain_finishedR#   t   sig_download_finishedt   intt   sig_download_progressR   R%   R   R   R    R*   (    (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyR   /   s   			t   _DownloadAPIc           B   sR  e  Z d  Z e e e  Z e e e e e  Z e e  Z	 d Z
 d Z d d  Z d   Z e d  Z d   Z e d    Z d   Z d	   Z d e d e d
  Z d d  Z d d d  Z d d  Z e d d  Z d d  Z d e d e d  Z d   Z e d  Z e d d  Z  d e d  Z! e d e d  Z" e d  Z# RS(   s   Download API based on requests.i   i   c         C   s   t  t |   j   t   |  _ t   |  _ | |  _ t   |  _	 t   |  _
 g  |  _ g  |  _ t   |  _ t   |  _ d |  _ t   |  _ d |  _ |  j j d  |  j j j |  j  |  j j d  |  j j j |  j  d S(   s   Download API based on requests.i    i   iM  i  N(   R   R   R   R   t
   _conda_apiR
   t   _client_apit   _configR    t   _queuet   _queue_workerst   _threadst   _workersR   t   _timert   _timer_worker_deletet   _running_threadst   _bag_collectort   _chunk_sizet   setIntervalt   timeoutt   connectt   _startt   _clean_workers(   R   t   config(    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyR   a   s"    					c         C   s.   x |  j  r |  j  j   q W|  j j   d S(   s+   Delete periodically workers in workers bag.N(   R=   t   popleftR;   t   stop(   R   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyRC   v   s    c         C   s.   | d k r$ |  j j d |  } n | } | S(   s   Get verify ssl.t   set_conda_sslN(   R   R4   t   get_ssl(   R   t   verifyRG   t   verify_value(    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   _get_verify_ssl|   s
    c         C   s@   |  j  r! |  j  j d d  } n t } | r6 t } n t } | S(   s   Check initernet availability.t   maint   offline_mode(   R5   t   getR   R&   (   R   t   config_valuet   connectivity(    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   _is_internet_available   s    		c         C   s   |  j  j   S(   sA   Return the proxy servers available from the conda rc config file.(   R3   t   load_proxy_config(   R   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   proxy_servers   s    c         C   sz  |  j  r |  j |  j k  r |  j d 7_ t   } |  j  j   } | j |  | j j | j  | j	 j | j
  | j
   |  j j |  n  |  j r xC |  j D]5 } | j   r |  j j |  |  j j |  q q Wn  |  j r/xB |  j D]4 } | j   r |  j j |  |  j d 8_ q q Wn  t |  j  d k rvt |  j  d k rv|  j j   |  j j
   n  d S(   s-   Start threads and check for inactive workers.i   i    N(   R7   R<   t   MAX_THREADSR   RE   t   moveToThreadR%   RA   t   quitt   startedR*   R8   t   appendR9   R    R=   t   removet
   isFinishedt   lenR:   RF   R;   (   R   t   threadt   workert   wt   t(    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyRB      s,    	
		*c         O   s|   t  | | |  } |  j j |  |  j j |  |  j j | j  |  j j | j  |  j	 j | j
  |  j j   | S(   s   Create a new worker instance.(   R   R9   RX   R7   t   _sig_download_finishedRA   R/   t   _sig_download_progressR1   t   _sig_partialR   R:   R*   (   R   R   R   R   R]   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   _create_worker   s    c      
   C   s%  |  j  | d t } | d k r7 | j d  d } n  t j j t j j |   } t j j |  sw t j	 |  n  |  j
   ry4 t j | d |  j d | d |  j } | j }	 Wn, t k
 r }
 d }	 t j t |
   n Xt j d j |	 |   |	 d k r%t j d	 j |   | St | j j d
 d   } t j j |  rn| rnt j j |  } n d } | | k r|  j j | |  | Sy: t j | d | d |  j d | d |  j } | j }	 Wn, t k
 r}
 d }	 t j t |
   n Xd } t   } | j t j  | rx | j  d |  j!  D]q } | r;| j" |  | t# |  7} |  j$ j | | | |  |  j% j i | d 6| d 6| d 6| d 6 q;q;Wn | j" | j&  | j' d  | j(   } t | d   } | j" |  Wd QX| j)   n  |  j j | |  | S(   s   Callback for download.RG   t   /it   proxiesRI   R@   s   Status code {0} - urli   s   Invalid url {0}s   Content-Lengthi    t   streamt
   chunk_sizet   urlt   patht   progress_sizet
   total_sizet   wbN(*   RK   R   R   t   splitt   osRi   t   dirnamet   abspatht   isdirt   makedirsRQ   t   requestst   headRS   t   DEFAULT_TIMEOUTt   status_codeR!   R   R'   R#   R"   t   formatR0   t   headersRN   t   isfilet   getsizeR`   R   R   t   opent	   ReadWritet   iter_contentR>   t   writeR[   Ra   Rb   t   contentt   seekR   t   close(   R   Rh   Ri   t   forceRI   t   chunkedRJ   t   foldert   rRv   R'   Rk   t	   file_sizeRj   t   bytes_streamt   chunkR   t   f(    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt	   _download   s    						c         C   s   |  j  |  } |  j   r y: t j | d |  j d | d |  j } | j d k } Wq t k
 r } t j	 t
 |   t } q Xn  | S(   s   Callback for is_valid_url.Re   RI   R@   i   (   i   (   RK   RQ   Rs   Rt   RS   Ru   Rv   R!   R   R'   R#   R   (   R   Rh   RI   RJ   R   t   valueR'   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   _is_valid_url5  s    	s   https://conda.anaconda.orgc         C   s  |  j  |  } | j d  s- | j d  r6 | } n d j | |  } | d d k re | d  } n  |  j j   } d j | | d  } |  j   ry: t j | d |  j d	 | d
 |  j	 } | j
 d k }	 Wqt k
 r }
 t j t |
   t }	 qXn  |	 S(   s   Callback for is_valid_channel.s   https://s   http://s   {0}/{1}iRd   s   {0}/{1}/{2}s   repodata.jsonRe   RI   R@   i   (   i   (   RK   t
   startswithRw   R3   t   get_platformRQ   Rs   Rt   RS   Ru   Rv   R!   R   R'   R#   R   (   R   t   channelt	   conda_urlRI   RJ   Rh   t   platt   repodata_urlR   R   R'   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   _is_valid_channelH  s(    		c         C   s   |  j  |  } i  } | d	 k r3 |  j j   } n | } |  j   r yO t j | d |  j d | d |  j } t	 | j
 d d } t j |  } Wq t k
 r } t j t |   q Xn  | j d d  d k S(
   s   Callback for is_valid_api_url.Re   RI   R@   R   s   utf-8t   oki    i   N(   RK   R   R4   RH   RQ   Rs   RN   RS   Ru   R   R   t   jsont   loadsR!   R   R'   R#   (   R   Rh   RI   RJ   R   R   R   R'   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   _is_valid_api_urlk  s"    	c         C   s   i  } |  j  |  } |  j   r y t j   } t d d d d  } t d |  } | j d |  | j d |  | j | d |  j d	 | d
 |  j	 }	 t
 |	 j d d } | r t j |  } n  Wq t k
 r }
 t j t |
   q Xn  | S(   s   Callback for url checking.RA   i   t   backoff_factorg      ?t   max_retriess   http://s   https://Re   RI   R@   R   s   utf-8(   RK   RQ   Rs   t   SessionR	   R   t   mountRN   RS   Ru   R   R   R   R   R!   R   R'   R#   (   R   Rh   t   as_jsonRI   R   RJ   t   sessiont   retryt   adapterR   R'   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   _get_url  s(    	c   	      C   s   |  j  |  } i | d 6d d 6d d 6d d 6d d	 6d
 d 6} |  j   r yi t j | d |  j d | d |  j } t | j d d } t j	 |  } | j d | d  | d <Wq t
 k
 r } t j t |   q Xn  | S(   s	   Callback.t   api_urls   https://api.anaconda.org/docst   api_docs_urls   https://conda.anaconda.org/R   s   https://anaconda.org/t   main_urls   https://pypi.anaconda.org/t   pypi_urls%   https://api.anaconda.org/swagger.jsont   swagger_urlRe   RI   R@   R   s   utf-8(   RK   RQ   Rs   RN   RS   Ru   R   R   R   R   R!   R   R'   R#   (	   R   Rh   RI   RJ   R   R   R   t   new_dataR'   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   _get_api_info  s,    
	c         C   sM   t  j t | | | f   |  j } |  j | | d | d | d | d | S(   s/   Download file given by url and save it to path.Ri   R   RI   R   (   R   R"   R#   R   Rc   (   R   Rh   Ri   R   RI   R   R   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   download  s    	c         C   s4   x |  j  D] } | j   q
 Wg  |  _ g  |  _ d S(   s"   Terminate all workers and threads.N(   R8   RV   t   _threadR9   (   R   R_   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt	   terminate  s    	c         C   sC   t  j t |   | r2 |  j } |  j | |  S|  j |  Sd S(   s   Check if url is valid.N(   R   R"   R#   R   Rc   (   R   Rh   t   non_blockingR   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   is_valid_url  s
    	c         C   sR   t  j t |   | r8 |  j } |  j | | d | S|  j d | d |  Sd S(   s#   Check if anaconda api url is valid.RI   Rh   N(   R   R"   R#   R   Rc   (   R   Rh   R   RI   R   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   is_valid_api_url  s
    	c         C   sR   t  j t | | f   | r; |  j } |  j | | |  S|  j | d | Sd S(   s"   Check if a conda channel is valid.R   N(   R   R"   R#   R   Rc   (   R   R   R   R   R   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   is_valid_channel  s
    	c         C   s[   t  j t |   | r> |  j } |  j | | d | d | S|  j | d | d | Sd S(   s   Get url content.R   RI   N(   R   R"   R#   R   Rc   (   R   Rh   R   RI   R   R   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   get_url  s    	c         C   sI   t  j t | | f   | r8 |  j } |  j | |  S|  j |  Sd S(   s   Query anaconda api info.N(   R   R"   R#   R   Rc   (   R   Rh   R   R   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   get_api_info  s
    	N($   R$   R+   R,   R   R#   R`   R0   Ra   R-   Rb   RT   Ru   R   R   RC   R&   RK   RQ   t   propertyRS   RB   Rc   R   R   R   R   R   R   R   R   R   R   R   R   R   R   (    (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyR2   W   s>   	
		!	j		
c         C   s"   t  d k r t d |   a  n  t  S(   s/   Download API threaded worker based on requests.RD   N(   t   DOWNLOAD_APIR   R2   (   RD   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   DownloadAPI  s    c         C   s   |  | | f GHd S(   s   Print worker output for tests.N(    (   R]   R(   R'   (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   ready_print  s    c    	      C   s]  d d l  m }  d d d d d g } t j j t j j d  d g  } |    } t   } | d	 g 7} x t |  D]~ \ } } | j	 |  } | | _
 | j j t  t j j | t |  d
  } | j | d | d t } | j j t  qu Wt   } | j d  GH| j d  GH| j d  GH| j d  GH| j d  GHt j | j    d S(   s   Main local test.i(   t   qapplications>   https://repo.anaconda.com/pkgs/free/linux-64/repodata.json.bz2s>   https://conda.anaconda.org/anaconda/linux-64/repodata.json.bz2s>   https://conda.anaconda.org/asmeurer/linux-64/repodata.json.bz2sA   https://conda.anaconda.org/conda-forge/linux-64/repodata.json.bz2t   ~s   testing-downloadt   asdasdasdads	   .json.bz2Ri   R   s   https://api.anaconda.orgs   https://conda.anaconda.orgs   https://google.coms(   https://conda.anaconda.org/continuumcrewN(   t"   anaconda_navigator.utils.qthelpersR   Rn   t   sept   joinRi   t
   expanduserR   t	   enumerateR   Rh   R%   RA   R   R#   R   R&   R   R   R   t   syst   exitt   exec_(	   R   t   urlsRi   t   appt   apit   iRh   R]   t   filepath(    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt
   local_test   s0    	$				t   __main__((   R,   t   collectionsR    R   Rn   R   t   qtpy.QtCoreR   R   R   R   R   R   t   requests.adaptersR   t$   requests.packages.urllib3.exceptionsR   t$   requests.packages.urllib3.util.retryR	   Rs   t!   anaconda_navigator.api.client_apiR
   t    anaconda_navigator.api.conda_apiR   t   anaconda_navigator.utils.logsR   t"   anaconda_navigator.utils.py3compatR   t   packagest   urllib3t   disable_warningsR   R   R2   R   R   R   R   R   R$   (    (    (    sB   lib/python2.7/site-packages/anaconda_navigator/api/download_api.pyt   <module>   s0   .	( 		 