
    dh1                       d Z ddlmZ ddlZddlZddlZddl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 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 m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3  ejh                  e5      Z6ddZ7d dZ8	 d!	 	 	 	 	 	 	 	 	 	 	 d"dZ9d#dZ:d$dZ;d%dZ<e G d d             Z= G d d      Z>y)&z(Download files with progress indicators.    )annotationsN)IterableMapping)	dataclass)
HTTPStatus)BinaryIO)PreparedRequest)Response)HTTPResponse)HTTPHeaderDict)ReadTimeoutError)BarTypeget_download_progress_renderer)IncompleteDownloadErrorNetworkConnectionError)PyPI)Link)SafeFileCacheis_from_cache)CacheControlAdapter
PipSession)HEADERSraise_for_statusresponse_chunks)format_sizeredact_auth_from_urlsplitextc                h    	 t        | j                  d         S # t        t        t        f$ r Y y w xY w)Ncontent-length)intheaders
ValueErrorKeyError	TypeErrorresps    `/var/www/html/vivango/api/ia/venv/lib/python3.12/site-packages/pip/_internal/network/download.py_get_http_response_sizer(       s5    4<< 0122), s    11c                l    | j                   j                  d| j                   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*    
 <<FDLL$4$4_$EFF    c                `   |j                   t        j                  k(  r|j                  }n|j                  }t        |      }|r1|r| dt        |       dt        |       d}n| dt        |       d}t        |       rt        j                  d|       n/|rt        j                  d|       nt        j                  d|       t        j                         t        j                  kD  rd}nt        |       rd}n|sd}n
|d	kD  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&   linkprogress_bartotal_lengthrange_starturl
logged_urlshow_progresschunksrenderers
             r'   _log_downloadrF   /   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-L;H Fr-   c                @    t         j                  j                  |       S )zJ
    Sanitize the "filename" value from a Content-Disposition header.
    )ospathbasename)filenames    r'   sanitize_content_filenamerL   b   s     77H%%r-   c                    t         j                  j                         }| |d<   |j                  d      }|rt	        t        |            }|xs |S )z
    Parse the "filename" value from a Content-Disposition header, and
    return the default filename if the result is empty.
    content-typerK   )emailmessageMessage	get_paramrL   str)content_dispositiondefault_filenamemrK   s       r'   parse_content_dispositionrW   i   sM    
 	A+An{{:&H -S];'''r-   c                   |j                   }| j                  j                  d      }|rt        ||      }t	        |      d   }|s6t        j                  | j                  j                  dd            }|r||z  }|sL|j                  | j                  k7  r3t        j                  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   rN    )
rK   r!   r+   rW   r   	mimetypesguess_extensionrA   rH   rI   )r&   r=   rK   rT   exts        r'   _get_http_response_filenamer^   x   s     }}H,,**+@A,-@(Kx(+C''(8(8(LMOH488txx'ggtxx(+OHOr-   c                  d    e Zd ZU dZded<   ded<   ded<   dZd	ed
<   dZd	ed<   ddZddZddZ	y)_FileDownloadz+Stores the state of a single link download.r   r=   r   output_file
int | Noner2   r   r    bytes_received
reattemptsc                f    t        | j                  d uxr | j                  | j                  k        S N)boolr2   rc   selfs    r'   is_incompletez_FileDownload.is_incomplete   s*    DIIT)Md.A.ADII.MNNr-   c                v    | xj                   t        |      z  c_         | j                  j                  |       y rf   )rc   lenra   write)ri   datas     r'   write_chunkz_FileDownload.write_chunk   s+    s4y(t$r-   c                |    | j                   j                  d       | j                   j                          d| _        y)z1Delete any saved data and reset progress to zero.r   N)ra   seektruncaterc   rh   s    r'   
reset_filez_FileDownload.reset_file   s0    a !!#r-   N)returnrg   )rn   bytesrt   None)rt   rv   )
__name__
__module____qualname____doc____annotations__rc   rd   rj   ro   rs    r-   r'   r`   r`      s:    5
J
NCJO% r-   r`   c                      e Zd Z	 	 	 	 	 	 	 	 d
dZ	 	 	 	 	 	 ddZddZddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	e
fddZy	)
Downloaderc                F    |dk\  sJ d       || _         || _        || _        y )Nr   z<Number of max resume retries must be bigger or equal to zero)_session_progress_bar_resume_retries)ri   sessionr>   resume_retriess       r'   __init__zDownloader.__init__   s5     a	JI	J)-r-   c              #  B   K   |D ]  } | ||      \  }}|||ff  yw)z.Convenience method to download multiple links.Nr|   )ri   linkslocationr=   filepathcontent_types         r'   batchzDownloader.batch   s8       	1D%)$%9"Hl<000	1s   c                   | j                  |      }t        |      }t        j                  j	                  |t        ||            }t        |d      5 }t        |||      }| j                  ||       |j                         r| j                  ||       ddd       |j                  j                  dd      }||fS # 1 sw Y   )xY w)z+Download a link and save it under location.wbNzContent-TyperZ   )	_http_getr(   rH   rI   joinr^   openr`   _process_responserj   _attempt_resumes_or_redownloadsr!   r+   )	ri   r=   r   r&   download_sizer   content_filedownloadr   s	            r'   __call__zDownloader.__call__   s    ~~d#/577<<*EdD*QR(D! 	E\$T<GH""8T2%%'44XtD		E ||'';%%	E 	Es   AB==Cc                   t        ||j                  | j                  |j                  |j                        }	 |D ]  }|j                  |        y# t        $ r-}|j                  |t        j                  d       Y d}~yd}~ww xY w)z)Download and save chunks from a response.)r@   Nz'Connection timed out while downloading.)	rF   r=   r   r2   rc   ro   r   r8   warning)ri   r   r&   rD   chunkes         r'   r   zDownloader._process_response   s    MMMM //
	F ,$$U+, 	F}}$NNDEE	Fs   A 	B	#BB	c                R   |j                   | j                  k  r|j                         r|j                  J |xj                   dz  c_         t        j                  dt        |j                        t        |j                        |j                          	 | j                  ||      }|j                  t        j                  k7  }|r"|j                          t        |      |_        |}| j                  ||       |j                   | j                  k  r|j                         r|j                         r4t%        j&                  |j(                  j*                         t-        |      |j                   dkD  r| j/                  ||       yy# t        t         t"        f$ r Y w xY w)zAAttempt to resume/restart the download if connection was dropped.NrY   z<Attempting to resume incomplete download (%s/%s, attempt %d))should_matchr   )rd   r   rj   r2   r8   r   r   rc   _http_get_resumestatus_coder   PARTIAL_CONTENTrs   r(   r   ConnectionErrorr   OSErrorrH   removera   namer   _cache_resumed_download)ri   r   
first_respresume_respmust_restarts        r'   r   z*Downloader._attempt_resumes_or_redownloads   sk   
 !!D$8$88X=S=S=U==,,,1$NNNH334HMM*##	"33H:3V  +66*:T:TT'')$;K$HHM!,J&&x=+ !!D$8$88X=S=S=U4 !!#IIh**//0)(33 "((:> # $%5w? s   A&F F&%F&c                   |j                   j                  }| j                  j                  |      }t	        |t
              st        j                  d|       yt	        |j                  t              sJ d       t               }|j                  d|i        t               }|j                  j                         D ]  \  }}|j                         dvs|||<    t!        |j"                        |d<   t%        d|d	d
      }	|j&                  j)                  |      }
|j&                  j*                  j-                  ||	d      }|j                  j/                  |
|       |j0                  j3                          t5        |j0                  j6                  d      5 }|j                  j9                  |
|       ddd       t        j                  d|       y# 1 sw Y    xY w)an  
        Manually cache a file that was successfully downloaded via resume retries.

        cachecontrol doesn't cache 206 (Partial Content) responses, since they
        are not complete files. This method manually adds the final file to the
        cache as though it was downloaded in a single request, so that future
        requests can use the cache.
        z<Skipping resume download caching: no cache controller for %sNzseparate body cache not in use!GET)methodrA   r!   )zcontent-ranger   r   rZ      F)bodyr!   statuspreload_contentr-   rbz?Cached resumed download as complete response for future use: %s)r=   r7   r   get_adapter
isinstancer   r8   debugcacher   r	   preparer   r!   itemslowerrS   r2   URLlib3Response
controller	cache_url
serializerdumpssetra   flushr   r   set_body_from_io)ri   r   original_responserA   adaptersynthetic_requestsynthetic_response_headerskeyvaluesynthetic_responser   metadata_blobfs                r'   r   z"Downloader._cache_resumed_download  s    mm00--++C0 '#67LLNPS  MM=
 	-,	- 
 ,-!!C!D%3%5"+3399; 	8JCyy{"EE27*3/	8 8;8==7I"#34,.!	
 &&005	**55;;13
 	)]3""$(&&++T2 	9aMM**9a8	9 	Ms	
	9 	9s   GG c                    t        j                         }d|j                   d|d<   t        |      x}r||d<   | j	                  |j
                  |      S )z2Issue a HTTP range request to resume the download.zbytes=-RangezIf-Range)r   copyrc   r,   r   r=   )ri   r   r   r!   
identifiers        r'   r   zDownloader._http_get_resume=  s[     ,,.#H$;$;#<A> B,OO:O",GJ~~hmmW55r-   c                   |j                   }	 | j                  j                  ||d      }t        |       |S # t        $ r?}|j
                  J t        j                  d|j
                  j                  |        d }~ww xY w)NT)r!   streamzHTTP error %s while getting %s)	r7   r   r+   r   r   responser8   criticalr   )ri   r=   r!   
target_urlr&   r   s         r'   r   zDownloader._http_getK  s    ..
	==$$Z$NDT"  & 	::)))OO0!**2H2H$ 	s   )9 	B:A<<BN)r   r   r>   r   r   r    rt   rv   )r   zIterable[Link]r   rS   rt   z&Iterable[tuple[Link, tuple[str, str]]])r=   r   r   rS   rt   ztuple[str, str])r   r`   r&   r
   rt   rv   )r   r`   r   r
   rt   rv   )r   r`   r   r
   rt   rv   )r   r`   r   r
   rt   r
   )r=   r   r!   zMapping[str, str]rt   r
   )rw   rx   ry   r   r   r   r   r   r   r   r   r   r|   r-   r'   r~   r~      s    .. . 	.
 
.1#1/21	/1&F&&?%&?3;&?	&?P6
%6
:B6
	6
p6%65=6	6 BI r-   r~   )r&   r
   rt   rb   )r&   r
   rt   z
str | None)r   )r&   r
   r=   r   r>   r   r?   rb   r@   rb   rt   zIterable[bytes])rK   rS   rt   rS   )rT   rS   rU   rS   rt   rS   )r&   r
   r=   r   rt   rS   )?rz   
__future__r   email.messagerO   r;   r[   rH   collections.abcr   r   dataclassesr   httpr   typingr   pip._vendor.requestsr	   pip._vendor.requests.modelsr
   pip._vendor.urllib3r   r    pip._vendor.urllib3._collectionsr   pip._vendor.urllib3.exceptionsr   pip._internal.cli.progress_barsr   r   pip._internal.exceptionsr   r   pip._internal.models.indexr   pip._internal.models.linkr   pip._internal.network.cacher   r   pip._internal.network.sessionr   r   pip._internal.network.utilsr   r   r   pip._internal.utils.miscr   r   r   	getLoggerrw   r8   r(   r,   rF   rL   rW   r^   r`   r~   r|   r-   r'   <module>r      s    . "    	 - !   0 0 ? ; ; S T + * D I R R P P			8	$G  0
0
0 0 	0
 0 0f&(*      .q qr-   