
    ce>                    d   d Z ddlmZ dgZddlZddlZddl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 ddlZddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlm Z!  e
j"        e
j#        j$                    G d de          Z% G d dej&                  Z' G d de          Z(da)d Z*dS )z%Worker threads for downloading files.    )annotationsDownloadAPIN)QBufferQObjectQThreadQTimerSignal)	ClientAPI)CondaAPI)CONF)http_loggerlogger)to_text_string)	url_utils   )utilsc                       e Zd 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 fdZd Zd Zd Z xZS )DownloadWorker"Download Worker based on requests.c                    t                                                       || _        || _        || _        d| _        dS )r   FN)super__init__methodargskwargs_is_finished)selfr   r   r   	__class__s       Clib/python3.11/site-packages/anaconda_navigator/api/download_api.pyr   zDownloadWorker.__init__2   s<    	!    c                >    | j                             | |d            d S N)sig_partialemit)r   datas     r   _handle_partialzDownloadWorker._handle_partial:   s#    dD$/////r    c                    | j         S )z@Return True if worker status is finished otherwise return False.)r   r   s    r   is_finishedzDownloadWorker.is_finished=   s      r    c                    d}d}	  | j         | j        i | j        }n(# t          $ r}t	          |           |}Y d}~nd}~ww xY w| j                            | ||           d| _        dS )z6Start process worker for given method args and kwargs.NT)r   r   r   	Exceptionprintsig_finishedr$   r   )r   erroroutputerrs       r   startzDownloadWorker.startA   s    	 T[$);t{;;FF 	 	 	#JJJEEEEEE	 	tVU333 s    
A>A)__name__
__module____qualname____doc__r	   objectsig_chain_finishedstrsig_download_finishedintsig_download_progressr#   r-   r   r&   r)   r1   __classcell__r   s   @r   r   r   )   s        ,,77"F3,,"F3S#66&00K6&&&11L" " " " "0 0 0! ! !! ! ! ! ! ! !r    r   c                      e Zd ZdZ ej                    Z ej                    Z ej                    Z ej                    Z	ddZ
dS )ErrorDetailz4Verbose values for :code:`False` validation results.returnboolc                    dS )z3Retrieve :class:`~bool` equivalent of the instance.F r(   s    r   __bool__zErrorDetail.__bool__X   s    ur    N)r@   rA   )r2   r3   r4   r5   enumautono_internet	ssl_error
http_errorgeneral_errorrD   rC   r    r   r?   r?   P   sb        >>$)++K	IJDIKKM     r    r?   c                      e Zd ZdZ eee          Z eeeee          Z ee	          Z
dZdZ fdZd Zd$dZed             Zd	 Zd
 Zd Z	 	 	 	 d%d&dZd'dZ	 	 d(dZd)dZd'dZd%dZd Zd$d Zd*d!Z	 	 d+d"Zd$d#Z xZ S ),_DownloadAPIDownload API based on requests.      c                   t                                                       t                      | _        t	                      | _        t          j                    | _        t          j                    | _	        g | _
        g | _        t                      | _        t                      | _        d| _        t          j                    | _        d| _        | j                            d           | j        j                            | j                   | j                            d           | j        j                            | j                   dS )rM   r   i   iM  i  N)r   r   r   
_conda_apir
   _client_apicollectionsdeque_queue_queue_workers_threads_workersr   _timer_timer_worker_delete_running_threads_bag_collector_chunk_sizesetIntervaltimeoutconnect_start_clean_workers)r   r   s    r   r   z_DownloadAPI.__init__g   s   "**$;;!')))/11hh$*HH! !)/11$$$##DK000!--d333!)11$2EFFFFFr    c                    | j         r | j                                          | j          | j                                         dS )z+Delete periodically workers in workers bag.N)r\   popleftrZ   stopr(   s    r   rb   z_DownloadAPI._clean_workers{   sJ    ! 	*''))) ! 	*!&&(((((r    Tc                F    || j                             |          }n|}|S )zGet verify ssl.Nset_conda_ssl)rR   get_ssl)r   verifyrh   verify_values       r   _get_verify_sslz_DownloadAPI._get_verify_ssl   s-    >+33-3PPLL!Lr    c                 :    t          j        dd          rd} nd} | S )zCheck initernet availability.mainoffline_modeFT)r   get)connectivitys    r   _is_internet_availablez#_DownloadAPI._is_internet_available   s*     8FN++ 	  LLLr    c                4    | j                                         S )zAReturn the proxy servers available from the conda rc config file.)rQ   load_proxy_configr(   s    r   proxy_serversz_DownloadAPI.proxy_servers   s    00222r    c                   | j         r| j        | j        k     r| xj        dz  c_        t                      }| j                                         }|                    |           |j                            |j                   |j	                            |j
                   |
                                 | j                            |           | j        rR| j        D ]J}|                                r4| j                            |           | j                            |           K| j        rH| j        D ]@}|                                r*| j                            |           | xj        dz  c_        At%          | j                  dk    rLt%          | j                  dk    r6| j                                         | j        
                                 dS dS dS )z-Start threads and check for inactive workers.r   r   N)rV   r[   MAX_THREADSr   rd   moveToThreadr-   r`   quitstartedr1   rW   appendrX   r)   r\   remove
isFinishedlenrY   re   rZ   )r   threadworkerwts        r   ra   z_DownloadAPI._start   s    	)4#84;K#K#K!!Q&!!YYF(0022F'''''444N""6<000LLNNNM  (((= 	,] , ,==?? ,'..q111M((+++= 	/] / /<<>> /M((+++))Q.))t}""s4='9'9Q'>'>K%++----- #"'>'>r    c                |   t          |||          }| j                            |           | j                            |           | j                            |j                   | j                            |j                   | j	                            |j
                   | j                                         |S )zCreate a new worker instance.)r   rX   r{   rV   _sig_download_finishedr`   r9   _sig_download_progressr;   _sig_partialr&   rY   r1   )r   r   r   r   r   s        r   _create_workerz_DownloadAPI._create_worker   s    f55V$$$""6***#++F,HIII#++F,HIII!!&"8999r    NFurlr8   pathtyping.Optional[str]forcerA   rj   typing.Optional[bool]chunkedr@   c                   |                      |d          }|t          j        |          }t          j        t          j                            t          j                            |                    d           |                                 s| j	        
                    ||           |S 	 t          j        ||                                 t          j        |          | j                  }t#          j        |           |                                 n:# t(          $ r-}t+          j        t/          |                     |cY d}~S d}~ww xY wt1          |j                            dd	                    }	t          j                            |          r"|s t          j                            |          }
nd
}
|
|	k    r| j	        
                    ||           |S 	 t          j        |||                                 t          j        |          | j                  }t#          j        |           |                                 n:# t(          $ r-}t+          j        t/          |                     |cY d}~S d}~ww xY wd	}t;                      }|                    t:          j                   |r|                     | j!                  D ]g}|rc|"                    |           |tG          |          z  }| j$        
                    ||||	           | j%        
                    ||||	d           hn|"                    |j&                   |'                    d	           |(                                }t=          |d          5 }|"                    |           ddd           n# 1 swxY w Y   |)                                 | j	        
                    ||           |S )zCallback for download.Frg   NT)exist_okproxiesrj   r_   responsezContent-Lengthr   )streamr   rj   r_   )
chunk_size)r   r   progress_size
total_sizewb)*rl   r   	file_nameosmakedirsr   dirnameabspathrr   r   r$   requestsheadru   	api_utilsnormalize_certificateDEFAULT_TIMEOUTr   httpraise_for_statusr+   r   r.   r8   r:   headersrp   isfilegetsizer   open	ReadWriteiter_contentr]   writer~   r   r   contentseekr%   close)r   r   r   r   rj   r   rk   r   r.   r   	file_sizer   bytes_streamchunkr%   fs                   r   	_downloadz_DownloadAPI._download   s?    ++F%+HH<&s++D
BGOOBGOOD$9$9::TJJJJ**,, 	',,S$777K	}**,, 6|DD,	  H h////%%'''' 	 	 	LU$$$KKKKKK	 )--.>BBCC
 7>>$ 	 	--III 
""',,S$777K	|**,, 6|DD,  H h////%%'''' 	 	 	LU$$$KKKKKK	
 yy'+,,,  	1!..$:J.KK    &&u---!SZZ/M/44%"	   %**#&$(-:*4	   , x/000!  ""$ 	GGDMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	#((d333sP   0A*D 
E%"EEE$A+I 
J"J<JJN44N8;N8c                   |                      |          }|                                 r	 t          j        ||                                 t          j        |          | j                  }t          j	        |           |j
        dv }n:# t          $ r-}t          j        t          |                     d}Y d}~nd}~ww xY w|S )zCallback for is_valid_url.r   r      FN)rl   rr   r   r   ru   r   r   r   r   r   status_coder+   r   r.   r8   )r   r   rj   rk   rvaluer.   s          r   _is_valid_urlz_DownloadAPI._is_valid_url'  s    ++F33&&(( 	M ..00$:<HH 0	    !,,,,.   SZZ((( s   AB 
C#B==Chttps://conda.anaconda.orgc                d   |                      |          }|                    d          s|                    d          r|}n| d| }|d         dk    r
|dd         }| j                                        }| d| d}|                                 r	 t          j        ||                                 t          j	        |          | j
                  }t          j        |           |j        d	v }	n:# t          $ r-}
t          j        t#          |
                     d
}	Y d}
~
nd}
~
ww xY w|	S )zCallback for is_valid_channel.zhttps://zhttp:///r   Nz/repodata.jsonr   r   r   F)rl   
startswithrQ   get_platformrr   r   r   ru   r   r   r   r   r   r   r+   r   r.   r8   )r   channel	conda_urlrj   rk   r   platrepodata_urlr   r   r.   s              r   _is_valid_channelz_DownloadAPI._is_valid_channel;  sc    ++F33j)) 	+W-?-?	-J-J 	+CC****Cr7c>>crc(C++--44444&&(( 	M  ..00$:<HH 0	    !,,,,.   SZZ((( s   AC6 6
D- #D((D-c                   |r|sdS || j                                         }|                                 st          j        S 	 t          j        ||                                 t          j	        |          | j
                  }t          j        |           |                                }n# t
          j        j        $ r*}t!          j        |           t          j        cY d}~S d}~wt
          j        $ r*}t!          j        |           t          j        cY d}~S d}~wt*          $ r*}t!          j        |           t          j        cY d}~S d}~ww xY w|                    dd          dk    p|                    dd	          dk    S )
zCallback for is_valid_api_url.TNr   r   okr   r   status )rR   ri   rr   r?   rG   r   rp   ru   r   r   r   r   r   json
exceptionsSSLErrorr   	exceptionrH   	HTTPErrorrI   r+   rJ   )r   r   rj   allow_blankr   r%   r.   s          r   _is_valid_api_urlz_DownloadAPI._is_valid_api_url_  s    	 	4>%--//F**,, 	+**	-|**,, 6v>>,	  H h////==??DD"+ 	) 	) 	)U###(((((((! 	* 	* 	*U###))))))) 	- 	- 	-U###,,,,,,,	-
 q!!Q&KDHHXr,B,Bd,JKsC   A*B. .EC'!E'E9DEE+E
EEc                   |                      |          }|dddddd}|                                 r	 t          j        ||                                 t          j        |          | j                  }t          j	        |           t          |j        d	
          }t          j        |          }|                    d|d                   |d<   n8# t          $ r+}t          j        t#          |                     Y d}~nd}~ww xY w|S )z	Callback.zhttps://api.anaconda.org/docszhttps://conda.anaconda.org/zhttps://anaconda.org/zhttps://pypi.anaconda.org/z%https://api.anaconda.org/swagger.json)api_urlapi_docs_urlr   main_urlpypi_urlswagger_urlr   r   zutf-8)encodingr   N)rl   rr   r   rp   ru   r   r   r   r   r   r   r   r   loadsr+   r   r.   r8   )	r   r   rj   rk   r%   r   r   new_datar.   s	            r   _get_api_infoz_DownloadAPI._get_api_info  s.   ++F33;6/4B
 
 &&(( 	))L ..00$:<HH 0	    !,,,,(WEEE:g..$,LLd;>O$P$P[!! ) ) )SZZ(((((((() s   BC 
D	!DD	c                F    | j         }|                     ||||||          S )z/Download file given by url and save it to path.)r   r   rj   r   )r   r   )r   r   r   r   rj   r   r   s          r   downloadz_DownloadAPI.download  s8    "" # 
 
 	
r    c                ^    | j         D ]}|                                 g | _        g | _        dS )z"Terminate all workers and threads.N)rW   ry   _threadrX   )r   r   s     r   	terminatez_DownloadAPI.terminate  s4     	 	AFFHHHHr    c                j    |r| j         }|                     ||          S |                      |          S )zCheck if url is valid.)r   r   r   r   non_blockingr   s       r   is_valid_urlz_DownloadAPI.is_valid_url  <     	4'F&&vs333!!#&&&r    c                r    |r|                      | j        |||          S |                     |||          S )z#Check if anaconda api url is valid.)r   rj   r   )r   r   )r   r   r   rj   r   s        r   is_valid_api_urlz_DownloadAPI.is_valid_api_url  sG     	p&&t'=3vcn&ooo%%#f+%VVVr    c                p    |r| j         }|                     |||          S |                      ||          S )z"Check if a conda channel is valid.)r   )r   r   )r   r   r   r   r   s        r   is_valid_channelz_DownloadAPI.is_valid_channel  sF      	C+F&&vw	BBB%%g%CCCr    c                j    |r| j         }|                     ||          S |                      |          S )zQuery anaconda api info.)r   r   r   s       r   get_api_infoz_DownloadAPI.get_api_info  r   r    )T)NFNT)r   r8   r   r   r   rA   rj   r   r   rA   r@   r8   r"   )r   N)NF)TNF)r   T)!r2   r3   r4   r5   r	   r8   r   r:   r   r6   r   rw   r   r   rb   rl   staticmethodrr   ru   ra   r   r   r   r   r   r   r   r   r   r   r   r   r<   r=   s   @r   rL   rL   ]   s       ))#VC--#VCc3776&>>LKOG G G G G() ) )      \3 3 3. . .8	 	 	 &*(,f f f f fP   . /	" " " "H"L "L "L "LH   <

 

 

 

  ' ' ' 'W W W W /	
D 
D 
D 
D' ' ' ' ' ' ' 'r    rL   c                 :    t           t                      a t           S )z/Download API threaded worker based on requests.)DOWNLOAD_APIrL   rC   r    r   r   r     s     #~~r    )+r5   
__future__r   __all__rS   rE   r   r   typingurllib3.exceptionsurllib3qtpy.QtCorer   r   r   r   r	   r   !anaconda_navigator.api.client_apir
    anaconda_navigator.api.conda_apir   anaconda_navigator.configr   anaconda_navigator.utils.logsr   r   "anaconda_navigator.utils.py3compatr   anaconda_navigator.utilsr   r   r   r   disable_warningsr   InsecureRequestWarningr   IntEnumr?   rL   r   r   rC   r    r   <module>r      s   , + " " " " " "/       				      A A A A A A A A A A A A A A  7 7 7 7 7 7 5 5 5 5 5 5 * * * * * * = = = = = = = = = = = = = = . . . . . .              +B C C C$! $! $! $! $!W $! $! $!N
 
 
 
 
$, 
 
 
u' u' u' u' u'7 u' u' u'p     r    