
    q"hF+                        S r SSKrSSKrSSKrSSKrSSKJr  SSKJ	r	J
r
JrJr  SSKJr  SSKJr  SSKJr  SSKJrJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJrJ r J!r!  SSK"J#r#J$r$J%r%  \RL                  " \'5      r(S\S\\)   4S jr*S\S\\+   4S jr, S%S\S\S\+S\\)   S\\)   S\
\-   4S jjr.S\+S\+4S jr/S\+S\+S\+4S jr0S\S\S\+4S jr1  S&S\S\S\\)   S\\+   S\4
S  jjr2 " S! S"5      r3 " S# S$5      r4g)'z(Download files with progress indicators.    N)
HTTPStatus)BinaryIOIterableOptionalTuple)Response)ReadTimeoutError)get_download_progress_renderer)IncompleteDownloadErrorNetworkConnectionError)PyPI)Link)is_from_cache)
PipSession)HEADERSraise_for_statusresponse_chunks)format_sizeredact_auth_from_urlsplitextrespreturnc                 j     [        U R                  S   5      $ ! [        [        [        4 a     g f = f)Nzcontent-length)intheaders
ValueErrorKeyError	TypeErrorr   s    P/var/www/html/env/lib/python3.13/site-packages/pip/_internal/network/download.py_get_http_response_sizer!      s5    4<< 0122), s    22c                 l    U R                   R                  SU R                   R                  S5      5      $ )z
Return either the ETag or Last-Modified header (or None if neither exists).
The return value can be used in an If-Range header.
etagzlast-modified)r   getr   s    r    (_get_http_response_etag_or_last_modifiedr%       s*    
 <<FDLL$4$4_$EFF    linkprogress_bartotal_lengthrange_startc                    UR                   [        R                  :X  a  UR                  nOUR                  n[        U5      nU(       a6  U(       a  U S[        U5       S[        U5       S3nOU S[        U5       S3n[        U 5      (       a  [        R                  SU5        O4U(       a  [        R                  SU5        O[        R                  SU5        [        R                  5       [        R                  :  a  SnO([        U 5      (       a  SnOU(       d  SnOUS	:  a  SnOSn[        U 5      nU(       d  U$ [        X#US
9n	U	" U5      $ )Nz (/)zUsing cached %szResuming download %szDownloading %sFTi   )bar_typesizeinitial_progress)netlocr   file_storage_domainshow_urlurl_without_fragmentr   r   r   loggerinfogetEffectiveLevelloggingINFOr   r
   )
r   r'   r(   r)   r*   url
logged_urlshow_progresschunksrenderers
             r    _prepare_downloadr?   (   s)    {{d...mm''%c*J,b[!9 :!K<U;VVWX  '<r+l*C)DAFJT%z2	*J7$j1!GLL0	t				$T"F-;H Fr&   filenamec                 @    [         R                  R                  U 5      $ )zB
Sanitize the "filename" value from a Content-Disposition header.
)ospathbasename)r@   s    r    sanitize_content_filenamerE   [   s     77H%%r&   content_dispositiondefault_filenamec                     [         R                  R                  5       nXS'   UR                  S5      nU(       a  [	        [        U5      5      nU=(       d    U$ )zw
Parse the "filename" value from a Content-Disposition header, and
return the default filename if the result is empty.
content-typer@   )emailmessageMessage	get_paramrE   str)rF   rG   mr@   s       r    parse_content_dispositionrP   b   sK    
 	A+n{{:&H -S];'''r&   c                    UR                   nU R                  R                  S5      nU(       a  [        X25      n[	        U5      S   nU(       d;  [
        R                  " U R                  R                  SS5      5      nU(       a  X$-  nU(       dQ  UR                  U R                  :w  a7  [        R                  R	                  U R                  5      S   nU(       a  X$-  nU$ )zgGet an ideal filename from the given HTTP response, falling back to
the link filename if not provided.
zcontent-disposition   rI    )
r@   r   r$   rP   r   	mimetypesguess_extensionr:   rB   rC   )r   r'   r@   rF   exts        r    _get_http_response_filenamerW   q   s     }}H,,**+@A,-@K!(+A.C''(8(8(LMOH488txx'ggtxx(+OHOr&   sessionif_rangec                 v   UR                   R                  SS5      S   n[        R                  " 5       nU(       a	  SU S3US'   U(       a  X5S'    U R	                  XESS	9n[        U5        U$ ! [         a@  nUR                  c   e[        R                  S
UR                  R                  U5        e S nAff = f)N#rR   r   zbytes=-RangezIf-RangeT)r   streamzHTTP error %s while getting %s)r:   splitr   copyr$   r   r   responser5   criticalstatus_code)rX   r'   r*   rY   
target_urlr   r   es           r    _http_get_downloadrf      s     Q'*JllnG#K=2&
{{:t{D
 K	 " zz%%%8!**:P:PRVWs   A. .
B88;B33B8c                       \ rS rSrS\S\S\SS4S jrS\S	\S\	\\4   4S
 jr
S\S\S\S\S\\   S\4S jrS\\   S\S\S\4S jrS\S\S\S\\   S\SS4S jrS\S\S\	\\\   \\   4   4S jrSrg)
Downloader   rX   r(   resume_retriesr   Nc                 B    US:  d   S5       eXl         X l        X0l        g )Nr   z<Number of max resume retries must be bigger or equal to zero)_session_progress_bar_resume_retriesselfrX   r(   rj   s       r    __init__Downloader.__init__   s/     a	JI	J)-r&   r'   locationc                    [        U R                  U5      n[        U5      nUR                  R	                  SS5      n[        X15      n[        R                  R                  X&5      n[        US5       nU R                  X1USU5      n	U(       a  X:  a  U R                  X1XU	5        SSS5        Xu4$ ! , (       d  f       Xu4$ = f)z.Download the file given by link into location.zContent-TyperS   wbr   N)rf   rl   r!   r   r$   rW   rB   rC   joinopen_process_response_attempt_resume)
rp   r'   rs   r   r)   content_typer@   filepathcontent_filebytes_receiveds
             r    __call__Downloader.__call__   s    !$--6 /t4||'';.t:77<<3(D!\!33L!\N  =$$N " %% "! %%s   44B33
Cr   r|   r}   r)   c                 ^    [        XU R                  XTS9nU R                  Xc[        U5      S9$ )z6Process the response and write the chunks to the file.)r*   )allow_partial)r?   rm   _write_chunks_to_filebool)rp   r   r'   r|   r}   r)   r=   s          r    rx   Downloader._process_response   s?     #**L
 ))\0B * 
 	
r&   r=   r   c                    Sn U H"  nU[        U5      -  nUR                  U5        M$     U$ ! [         a)  nU(       d  Ue[        R	                  S5         SnAU$ SnAff = f)zEWrite the chunks to the file and return the number of bytes received.r   z'Connection timed out while downloading.N)lenwriter	   r5   warning)rp   r=   r|   r   r}   chunkre   s          r    r    Downloader._write_chunks_to_file   sq     
	F#e*,""5)      	F  NNDEE	Fs   (. 
A!AA!c                 ~   [        U5      nU R                  nU(       a  U(       a  XT:  a  US-  n[        R                  S[	        U5      [	        U5      U R                  U-
  5         [        U R                  UUUS9nUR                  [        R                  :g  n	U	(       a  U R                  X5      u  pTnXPR                  XX5U5      -  nU(       a  U(       a  XT:  a  M  U(       a:  XT:  a4  [        R                   " UR"                  5        [%        X%X@R                  S9egg! [        [        [        4 a     GM#  f = f)z9Attempt to resume the download if connection was dropped.rR   z<Attempting to resume incomplete download (%s/%s, attempt %d))r*   rY   )retriesN)r%   rn   r5   r   r   rf   rl   rc   r   PARTIAL_CONTENT_reset_download_staterx   ConnectionErrorr	   OSErrorrB   removenamer   )
rp   r   r'   r|   r)   r}   etag_or_last_modifiedattempts_leftresume_respmust_restarts
             r    ry   Downloader._attempt_resume   s1    !I N,,}1NQMNNNN+L)%%5	0MM .2	  +66*:T:TT22;M HN2G "8"8|\# 9 }1NF N9IIl''()l<P<P  :<	 $%5w? s   (A#D" "D<;D<c                 |    UR                  S5        UR                  5         Sn[        U5      n[        U5      nX4U4$ )zCReset the download state to restart downloading from the beginning.r   )seektruncater!   r%   )rp   r   r|   r}   r)   r   s         r    r    Downloader._reset_download_state  sD     	!.t4 H N-BBBr&   )rm   rn   rl   )__name__
__module____qualname____firstlineno__r   rN   r   rq   r   r   r~   r   r   r   rx   r   bytesr   r   ry   r   __static_attributes__ r&   r    rh   rh      s8   .. . 	.
 
.&T &S &U38_ &0

 
 	

 
 sm
 

 uo5=QU	&33 3 	3
 sm3 3 
3jCC C 
sHSM8C=0	1	Cr&   rh   c                   d    \ rS rSrS\S\S\SS4S jrS\\	   S	\S\\
\	\
\\4   4      4S
 jrSrg)BatchDownloaderi+  rX   r(   rj   r   Nc                 &    [        XU5      U l        g )N)rh   _downloaderro   s       r    rq   BatchDownloader.__init__,  s     &g^Lr&   linksrs   c              #   R   #    U H  nU R                  X25      u  pEX4U44v   M     g7f)z0Download the files given by links into location.Nr   )rp   r   rs   r'   r{   rz   s         r    r~   BatchDownloader.__call__4  s2      D%)%5%5d%E"H<000 s   %'r   )r   r   r   r   r   rN   r   rq   r   r   r   r~   r   r   r&   r    r   r   +  sj    MM M 	M
 
M1d^1/21	%eCHo-.	/1r&   r   )r   )r   N)5__doc__email.messagerJ   r8   rT   rB   httpr   typingr   r   r   r   pip._vendor.requests.modelsr   pip._vendor.urllib3.exceptionsr	   pip._internal.cli.progress_barsr
   pip._internal.exceptionsr   r   pip._internal.models.indexr   pip._internal.models.linkr   pip._internal.network.cacher   pip._internal.network.sessionr   pip._internal.network.utilsr   r   r   pip._internal.utils.miscr   r   r   	getLoggerr   r5   r   r!   rN   r%   r   r?   rE   rP   rW   rf   rh   r   r   r&   r    <module>r      su   .    	  6 6 0 ; J T + * 5 4 R R P P			8	$( x} G8 G G "#0
0
0 0 3-	0
 #0 e_0f& & &(3 (# (RU (h d s 0 "#"	
 # sm	
 0JC JCZ1 1r&   