
     hF+                         d Z ddlZddlZddlZddlZddlmZ ddl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mZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZm Z m!Z! ddl"m#Z#m$Z$m%Z%  ej&        e'          Z(dedee)         fdZ*dedee+         fdZ,	 d%dedede+dee)         dee)         de
e-         fdZ.de+de+fdZ/de+de+de+fdZ0dedede+fdZ1	 	 d&dededee)         dee+         def
d Z2 G d! d"          Z3 G d# d$          Z4dS )'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                 t    	 t          | j        d                   S # t          t          t          f$ r Y d S w xY w)Nzcontent-length)intheaders
ValueErrorKeyError	TypeErrorr   s    ]/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/pip/_internal/network/download.py_get_http_response_sizer!      sF    4< 01222),   tts    77c                 h    | j                             d| j                             d                    S )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,    
 <FDL$4$4_$E$EFFF    linkprogress_bartotal_lengthrange_startc                    |j         t          j        k    r|j        }n|j        }t          |          }|r=|r&| dt          |           dt          |           d}n| dt          |           d}t          |           rt          	                    d|           n9|rt          	                    d|           nt          	                    d|           t          
                                t          j        k    rd}n"t          |           rd}n|sd}n|d	k    rd}nd}t          |           }|s|S t          |||
          }	 |	|          S )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...m'%c**J G 	GXX[!9!9XXK<U<UXXX J 'FF+l*C*CFFFJT 2%z2222	 2*J7777$j111!!GL00	t		  		$	$T""F -L;  H 8Fr&   filenamec                 @    t           j                            |           S )zJ
    Sanitize the "filename" value from a Content-Disposition header.
    )ospathbasename)r@   s    r    sanitize_content_filenamerE   [   s     7H%%%r&   content_dispositiondefault_filenamec                     t           j                                        }| |d<   |                    d          }|rt	          t          |                    }|p|S )z
    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   s[    
 	A+An{{:&&H < -S]];;'''r&   c                    |j         }| j                            d          }|rt          ||          }t	          |          d         }|s4t          j        | j                            dd                    }|r||z  }|sA|j        | j        k    r1t          j	                            | j                  d         }|r||z  }|S )zoGet 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A L,-@(KK!(++A.C '(8(8(L(LMM 	OH 48tx''gtx((+ 	OHOr&   sessionif_rangec                 h   |j                             dd          d         }t          j                    }|r	d| d|d<   |r||d<   	 |                     ||d	          }t          |           nB# t          $ r5}|j        J t          	                    d
|j        j
        |            d }~ww xY w|S )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lnnG 32K222 '&
{{:wt{DD!   z%%%8!*:PRVWWW Ks   'A0 0
B/:0B**B/c                      e Zd ZdedededdfdZdededeeef         fd	Z	d
e
dedededee         defdZdee         dededefdZd
e
dededee         deddfdZd
e
dedeeee         ee         f         fdZdS )
DownloaderrX   r(   resume_retriesr   Nc                 P    |dk    s
J d            || _         || _        || _        d S )Nr   z<Number of max resume retries must be bigger or equal to zero)_session_progress_bar_resume_retriesselfrX   r(   ri   s       r    __init__zDownloader.__init__   s=     aI  )-r&   r'   locationc                    t          | j        |          }t          |          }|j                            dd          }t          ||          }t          j                            ||          }t          |d          5 }| 
                    |||d|          }	|r|	|k     r|                     |||||	           ddd           n# 1 swxY w Y   ||fS )z.Download the file given by link into location.zContent-TyperS   wbr   N)rf   rk   r!   r   r$   rW   rB   rC   joinopen_process_response_attempt_resume)
ro   r'   rq   r   r)   content_typer@   filepathcontent_filebytes_receiveds
             r    __call__zDownloader.__call__   s#   !$-66 /t44|'';;.tT::7<<(33(D!! 	\!33dL!\ N   = =$$$lN  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 %%s    ;CCCr   rz   r{   r)   c                 ~    t          ||| j        ||          }|                     ||t          |                    S )z6Process the response and write the chunks to the file.)r*   )allow_partial)r?   rl   _write_chunks_to_filebool)ro   r   r'   rz   r{   r)   r=   s          r    rv   zDownloader._process_response   sT     #$*Ln
 
 
 ))L\0B0B * 
 
 	
r&   r=   r~   c                    d}	 |D ])}|t          |          z  }|                    |           *n5# t          $ r(}|s|t                              d           Y d}~nd}~ww xY w|S )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)ro   r=   rz   r~   r{   chunkre   s          r    r   z Downloader._write_chunks_to_file   s     
	F * *#e**,""5))))*   	F 	F 	F   NNDEEEEEEEE	F s   ,1 
A#AA#c                 `   t          |          }| j        }|r|r||k     r|dz  }t                              dt	          |          t	          |          | j        |z
             	 t          | j        |||          }|j        t          j	        k    }	|	r| 
                    ||          \  }}}||                     |||||          z  }n# t          t          t          f$ r Y w xY w|r|r||k     |r7||k     r3t          j        |j                   t%          |||| j                  dS dS )z9Attempt to resume the download if connection was dropped.rR   z<Attempting to resume incomplete download (%s/%s, attempt %d))r*   rY   )retriesN)r%   rm   r5   r   r   rf   rk   rc   r   PARTIAL_CONTENT_reset_download_staterv   ConnectionErrorr	   OSErrorrB   removenamer   )
ro   r   r'   rz   r)   r{   etag_or_last_modifiedattempts_leftresume_respmust_restarts
             r    rw   zDownloader._attempt_resume   s    !I N N,  	}  	,1N1NQMNNNN++L))%5	  0M .2	    +6*:TT 22;MM HNL2G $"8"8|^\# #  $%5w?   ?   	}  	,1N1NF  	N\99Il'((()nlD<P   	 	99s   &A%C C&%C&c                     |                     d           |                                 d}t          |          }t          |          }|||fS )zCReset the download state to restart downloading from the beginning.r   )seektruncater!   r%   )ro   r   rz   r{   r)   r   s         r    r   z Downloader._reset_download_state  sX     	!.t44 H N N|-BBBr&   )__name__
__module____qualname__r   rN   r   rp   r   r   r|   r   r   r   rv   r   bytesr   r   rw   r    r&   r    rh   rh      s       .. . 	.
 
. . . .&T &S &U38_ & & & &0

 
 	

 
 sm
 

 
 
 
 uo5=QU	   &33 3 	3
 sm3 3 
3 3 3 3jCC C 
sHSM8C=0	1	C C C C C Cr&   rh   c                   r    e Zd ZdedededdfdZdee         dedee	ee	eef         f                  fd	Z
dS )
BatchDownloaderrX   r(   ri   r   Nc                 2    t          |||          | _        d S )N)rh   _downloaderrn   s       r    rp   zBatchDownloader.__init__,  s     &g|^LLr&   linksrq   c              #   V   K   |D ]#}|                      ||          \  }}|||ffV  $dS )z0Download the files given by links into location.N)r   )ro   r   rq   r'   ry   rx   s         r    r|   zBatchDownloader.__call__4  sT        	1 	1D%)%5%5dH%E%E"Hl<000000	1 	1r&   )r   r   r   r   rN   r   rp   r   r   r   r|   r   r&   r    r   r   +  s        MM M 	M
 
M M M M1d^1/21	%eCHo-.	/1 1 1 1 1 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      s;   . .          				       6 6 6 6 6 6 6 6 6 6 6 6 0 0 0 0 0 0 ; ; ; ; ; ; J J J J J J T T T T T T T T + + + + + + * * * * * * 5 5 5 5 5 5 4 4 4 4 4 4 R R R R R R R R R R P P P P P P P P P P		8	$	$( x}    G8 G G G G G "#0 0
0
0 0 3-	0
 #0 e_0 0 0 0f& & & & & &(3 (# (RU ( ( ( (h d s    0 "#"	 
 # sm	
    0JC JC JC JC JC JC JC JCZ1 1 1 1 1 1 1 1 1 1r&   