
    ;ȋh9?                       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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 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 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, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6  e	j7        e8          Z9ee:e:f         Z;dIdZ< G d de=          Z>dJd Z? G d! d"e=          Z@dKd%ZAdLd&ZBdMd)ZC G d* d+          ZD G d, d-e          ZEdNd/ZFeFdOd3            ZG ed45           G d6 d1                      ZH G d7 d8e          ZI	 dPdQd?ZJ	 dRdSdBZKdTdDZL G dE dFe          ZM G dG dH          ZNdS )UzO
The main purpose of this module is to expose LinkCollector.collect_sources().
    )annotationsN)IterableMutableMappingSequence)	dataclass)
HTMLParser)Values)Callable
NamedTupleProtocol)requests)Response)
RetryErrorSSLError)NetworkConnectionError)Link)SearchScope)
PipSession)raise_for_status)is_archive_fileredact_auth_from_url)vcs   )CandidatesFromPage
LinkSourcebuild_sourceurlstrreturn
str | Nonec                    t           j        D ]D}|                                                     |          r| t	          |                   dv r|c S EdS )zgLook for VCS schemes in the URL.

    Returns the matched VCS scheme, or None if there's no match.
    z+:N)r   schemeslower
startswithlen)r   schemes     Z/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/pip/_internal/index/collector.py_match_vcs_schemer)   .   sW    
 +  99;;!!&)) 	c#f++.>$.F.FMMM4    c                        e Zd Zd fdZ xZS )_NotAPIContentcontent_typer   request_descr    Nonec                h    t                                          ||           || _        || _        d S N)super__init__r-   r.   )selfr-   r.   	__class__s      r(   r3   z_NotAPIContent.__init__:   s3    |444((r*   )r-   r   r.   r   r    r/   )__name__
__module____qualname__r3   __classcell__r5   s   @r(   r,   r,   9   s=        ) ) ) ) ) ) ) ) ) )r*   r,   responser   r/   c                    | j                             dd          }|                                }|                    d          rdS t	          || j        j                  )z
    Check the Content-Type header to ensure the response contains a Simple
    API Response.

    Raises `_NotAPIContent` if the content type is not a valid content-type.
    Content-TypeUnknown)z	text/htmlz#application/vnd.pypi.simple.v1+html#application/vnd.pypi.simple.v1+jsonN)headersgetr$   r%   r,   requestmethod)r;   r-   content_type_ls      r(   _ensure_api_headerrE   @   sg     #''	BBL!''))N  	
   	
x'7'>
?
??r*   c                      e Zd ZdS )_NotHTTPN)r6   r7   r8    r*   r(   rG   rG   V   s        Dr*   rG   sessionr   c                    t           j                            |           \  }}}}}|dvrt                      |                    | d          }t          |           t          |           dS )z
    Send a HEAD request to the URL, and ensure the response contains a simple
    API Response.

    Raises `_NotHTTP` if the URL is not available for a HEAD request, or
    `_NotAPIContent` if the content type is not a valid content type.
    >   httphttpsT)allow_redirectsN)urllibparseurlsplitrG   headr   rE   )r   rI   r'   netlocpathqueryfragmentresps           r(   _ensure_api_responserW   Z   sq     -3L,A,A#,F,F)FFD%&&&jj<<T<22DTtr*   c                   t          t          |           j                  rt          | |           t                              dt          |                      |                    | d                    g d          dd          }t          |           t          |           t                              dt          |           |j                            d	d
                     |S )aY  Access an Simple API response with GET, and return the response.

    This consists of three parts:

    1. If the URL looks suspiciously like an archive, send a HEAD first to
       check the Content-Type is HTML or Simple API, to avoid downloading a
       large file. Raise `_NotHTTP` if the content type cannot be determined, or
       `_NotAPIContent` if it is not HTML or a Simple API.
    2. Actually perform the request. Raise HTTP exceptions on network failures.
    3. Check the Content-Type header to make sure we got a Simple API response,
       and raise `_NotAPIContent` otherwise.
    rI   zGetting page %sz, )r?   z*application/vnd.pypi.simple.v1+html; q=0.1ztext/html; q=0.01z	max-age=0)AcceptzCache-Control)r@   zFetched page %s as %sr=   r>   )r   r   filenamerW   loggerdebugr   rA   joinr   rE   r@   )r   rI   rV   s      r(   _get_simple_responser_   l   s     tCyy)** 3S'2222
LL"$8$=$=>>>;;ii   ( )+
 
   D4 T t
LLS!!33   Kr*   r@   ResponseHeadersc                    | rSd| v rOt           j                                        }| d         |d<   |                    d          }|rt	          |          S dS )z=Determine if we have any encoding information in our headers.r=   zcontent-typecharsetN)emailmessageMessage	get_paramr   )r@   mrb   s      r(   _get_encoding_from_headersrh      s`      >W,,M!!###N3.++i(( 	 w<<4r*   c                  &    e Zd ZddZdd	ZddZdS )CacheablePageContentpageIndexContentr    r/   c                &    |j         sJ || _        d S r1   )cache_link_parsingrk   r4   rk   s     r(   r3   zCacheablePageContent.__init__   s    &&&&			r*   otherobjectboolc                p    t          |t          |                     o| j        j        |j        j        k    S r1   )
isinstancetyperk   r   )r4   rp   s     r(   __eq__zCacheablePageContent.__eq__   s*    %d,,P%*.1PPr*   intc                4    t          | j        j                  S r1   )hashrk   r   r4   s    r(   __hash__zCacheablePageContent.__hash__   s    DIM"""r*   N)rk   rl   r    r/   )rp   rq   r    rr   )r    rw   )r6   r7   r8   r3   rv   r{   rH   r*   r(   rj   rj      sT           Q Q Q Q# # # # # #r*   rj   c                      e Zd ZddZdS )
ParseLinksrk   rl   r    Iterable[Link]c                    d S r1   rH   ro   s     r(   __call__zParseLinks.__call__   s      r*   Nrk   rl   r    r~   )r6   r7   r8   r   rH   r*   r(   r}   r}      s        AAAAAAr*   r}   fnc                |     t           j        d	 fd            t          j                   d
 fd            }|S )z
    Given a function that parses an Iterable[Link] from an IndexContent, cache the
    function's result (keyed by CacheablePageContent), unless the IndexContent
    `page` has `page.cache_link_parsing == False`.
    cacheable_pagerj   r    
list[Link]c                >    t           | j                            S r1   )listrk   )r   r   s    r(   wrapperz*with_cached_index_content.<locals>.wrapper   s    BB~*++,,,r*   rk   rl   c                r    | j         r t          |                     S t           |                     S r1   )rn   rj   r   )rk   r   r   s    r(   wrapper_wrapperz2with_cached_index_content.<locals>.wrapper_wrapper   s;    " 	77/55666BBtHH~~r*   )r   rj   r    r   )rk   rl   r    r   )	functoolscachewraps)r   r   r   s   ` @r(   with_cached_index_contentr      sr     _- - - - - _- _R      
 r*   rk   rl   r~   c              #    K   | j                                         }|                    d          rUt          j        | j                  }|                    dg           D ]#}t          j        || j	                  }||V  $dS t          | j	                  }| j        pd}|                    | j                            |                     | j	        }|j        p|}|j        D ] }	t          j        |	||          }||V  !dS )z\
    Parse a Simple API's Index Content, and yield its anchor elements as Link objects.
    r?   filesNzutf-8)page_urlbase_url)r-   r$   r%   jsonloadscontentrA   r   	from_jsonr   HTMLLinkParserencodingfeeddecoder   anchorsfrom_element)
rk   rD   datafilelinkparserr   r   r   anchors
             r(   parse_linksr      s!      &,,..N  !FGG z$,''HHWb)) 	 	D>$11D|JJJJDH%%F}'H
KK##H--...
(C%#H.   #III<



	 r*   T)frozenc                  R    e Zd ZU dZded<   ded<   ded<   ded<   d	Zd
ed<   ddZdS )rl   a  Represents one response (or page), along with its URL.

    :param encoding: the encoding to decode the given content.
    :param url: the URL from which the HTML was downloaded.
    :param cache_link_parsing: whether links parsed from this page's url
                               should be cached. PyPI index urls should
                               have this set to False, for example.
    bytesr   r   r-   r!   r   r   Trr   rn   r    c                *    t          | j                  S r1   )r   r   rz   s    r(   __str__zIndexContent.__str__  s    #DH---r*   N)r    r   )r6   r7   r8   __doc____annotations__rn   r   rH   r*   r(   rl   rl      sr           NNNHHH#####. . . . . .r*   c                  4     e Zd ZdZd fdZdd
ZddZ xZS )r   zf
    HTMLParser that keeps the first base HREF and a list of all anchor
    elements' attributes.
    r   r   r    r/   c                v    t                                          d           || _        d | _        g | _        d S )NT)convert_charrefs)r2   r3   r   r   r   )r4   r   r5   s     r(   r3   zHTMLLinkParser.__init__  s7    $///$(46r*   tagattrslist[tuple[str, str | None]]c                    |dk    r)| j         "|                     |          }|	|| _         d S d S |dk    r)| j                            t	          |                     d S d S )Nbasea)r   get_hrefr   appenddict)r4   r   r   hrefs       r(   handle_starttagzHTMLLinkParser.handle_starttag  sn    &==T]2==''D $  CZZLU,,,,, Zr*   r!   c                *    |D ]\  }}|dk    r|c S d S )Nr   rH   )r4   r   namevalues       r(   r   zHTMLLinkParser.get_href!  s1      	 	KD%v~~ tr*   )r   r   r    r/   )r   r   r   r   r    r/   )r   r   r    r!   )r6   r7   r8   r   r3   r   r   r9   r:   s   @r(   r   r     so         
7 7 7 7 7 7- - - -       r*   r   r   r   reasonstr | ExceptionmethCallable[..., None] | Nonec                <    |t           j        } |d| |           d S )Nz%Could not fetch URL %s: %s - skipping)r\   r]   )r   r   r   s      r(   _handle_get_simple_failr   (  s+    
 ||D	0$?????r*   rn   rr   c                |    t          | j                  }t          | j        | j        d         || j        |          S )Nr=   )r   r   rn   )rh   r@   rl   r   r   )r;   rn   r   s      r(   _make_index_contentr   2  sG     *(*:;;H(L-   r*   IndexContent | Nonec                  | j                             dd          d         }t          |          }|rt                              d||            d S t
          j                            |          \  }}}}}}|dk    rt          j	        
                    t
          j                            |                    rU|                    d          s|dz  }t
          j                            |d          }t                              d|           	 t!          ||	          }t#          || j        
          S # t&          $ r t                              d|            Y nt(          $ r1}t                              d| |j        |j                   Y d }~nd }~wt.          $ r}t1          | |           Y d }~nd }~wt2          $ r}t1          | |           Y d }~nd }~wt4          $ r:}d}	|	t7          |          z  }	t1          | |	t          j                   Y d }~nRd }~wt:          j        $ r}t1          | d|            Y d }~n(d }~wt:          j        $ r t1          | d           Y nw xY wd S )N#r   r   zICannot look at %s URL %s because it does not support lookup as web pages.r   /z
index.htmlz# file: URL is directory, getting %srY   )rn   z`Skipping page %s because it looks like an archive, and cannot be checked by a HTTP HEAD request.zSkipping page %s because the %s request got Content-Type: %s. The only supported Content-Types are application/vnd.pypi.simple.v1+json, application/vnd.pypi.simple.v1+html, and text/htmlz4There was a problem confirming the ssl certificate: )r   zconnection error: z	timed out) r   splitr)   r\   warningrN   rO   urlparseosrS   isdirrB   url2pathnameendswithurljoinr]   r_   r   rn   rG   r,   r.   r-   r   r   r   r   r   infor   ConnectionErrorTimeout)
r   rI   r   
vcs_schemer'   _rS   rV   excr   s
             r(   _get_index_contentr   ?  s   
(..a
 
 
#C #3''J W	
 	
 	

 t  &|44S99FAtQ1BGMM&.*E*Ed*K*KLL ||C   	3JC
 l""355:C@@@U#C999: #4D<STTTT9  
 
 
1	
 	
 	
 	
 	

  
 
 
A 	
 	
 	
 	
 	
 	
 	
 	
 " + + +c******** + + +c******** @ @ @G#c((f6;?????????# B B B&@3&@&@AAAAAAAA 3 3 3k222223 4sT   D6 6%I(	I(''FI( F55I(GI($0HI(+I"I('I(c                  $    e Zd ZU ded<   ded<   dS )CollectedSourceszSequence[LinkSource | None]
find_links
index_urlsN)r6   r7   r8   r   rH   r*   r(   r   r   |  s*         ++++++++++r*   r   c                  ^    e Zd ZdZddZe	 ddd            Zedd            Zd dZ	d!dZ
dS )"LinkCollectorz
    Responsible for collecting Link objects from all configured locations,
    making network requests as needed.

    The class's main method is its collect_sources() method.
    rI   r   search_scoper   r    r/   c                "    || _         || _        d S r1   )r   rI   )r4   rI   r   s      r(   r3   zLinkCollector.__init__  s    
 )r*   Foptionsr	   suppress_no_indexrr   c                   |j         g|j        z   }|j        r<|s:t                              dd                    d |D                                  g }|j        pg }t          j        |||j                  }t          ||          }|S )z
        :param session: The Session to use to make requests.
        :param suppress_no_index: Whether to ignore the --no-index option
            when constructing the SearchScope object.
        zIgnoring indexes: %s,c              3  4   K   | ]}t          |          V  d S r1   r   ).0r   s     r(   	<genexpr>z'LinkCollector.create.<locals>.<genexpr>  s+      IIs-c22IIIIIIr*   )r   r   no_index)rI   r   )
	index_urlextra_index_urlsr   r\   r]   r^   r   r   creater   )clsrI   r   r   r   r   r   link_collectors           r(   r   zLinkCollector.create  s     '(7+CC
 	$5 	LL&IIjIIIII   J '-2
")!!%
 
 

 '%
 
 
 r*   	list[str]c                    | j         j        S r1   )r   r   rz   s    r(   r   zLinkCollector.find_links  s     ++r*   locationr   r   c                .    t          || j                  S )z>
        Fetch an HTML page containing package links.
        rY   )r   rI   )r4   r   s     r(   fetch_responsezLinkCollector.fetch_response  s     "(DLAAAAr*   project_namer   candidates_from_pager   r   c                z    t          j         fd j                                      D                                                       }t          j         fd j        D                                                       }t                              t          j	                  red t          j        ||          D             }t          |           d dg|z   }t                              d                    |                     t          t!          |          t!          |                    S )Nc           	   3  V   K   | ]#}t          |j        j        d d           V  $dS )Fr   page_validator
expand_dirrn   r   Nr   rI   is_secure_originr   locr   r   r4   s     r(   r   z0LinkCollector.collect_sources.<locals>.<genexpr>  s_       
4
 
4
  %9#|< #()  
4
 
4
 
4
 
4
 
4
 
4
r*   c           	   3  V   K   | ]#}t          |j        j        d d           V  $dS )Tr   Nr   r   s     r(   r   z0LinkCollector.collect_sources.<locals>.<genexpr>  s_       
5
 
5
  %9#|<#')  
5
 
5
 
5
 
5
 
5
 
5
r*   c                4    g | ]}||j         d|j          S )Nz* )r   )r   ss     r(   
<listcomp>z1LinkCollector.collect_sources.<locals>.<listcomp>  s6       =QV%7 QV%7%7%7r*   z' location(s) to search for versions of :
)r   r   )collectionsOrderedDictr   get_index_urls_locationsvaluesr   r\   isEnabledForloggingDEBUG	itertoolschainr&   r]   r^   r   r   )r4   r   r   index_url_sourcesfind_links_sourcesliness   ```   r(   collect_sourceszLinkCollector.collect_sources  s    (3 
4
 
4
 
4
 
4
 
4
 
4
 (AA,OO
4
 
4
 
4
 

 

 &(( 	 )4 
5
 
5
 
5
 
5
 
5
 
5
 
5
 
5
 
5
 

 

 &(( 	 w}-- 
	+ ");=NOO  E u:: 3 3#/3 3 3 E LL5))***.//-..
 
 
 	
r*   N)rI   r   r   r   r    r/   )F)rI   r   r   r	   r   rr   r    r   )r    r   )r   r   r    r   )r   r   r   r   r    r   )r6   r7   r8   r   r3   classmethodr   propertyr   r   r  rH   r*   r(   r   r     s             
 #(	    [B , , , X,B B B B,
 ,
 ,
 ,
 ,
 ,
r*   r   )r   r   r    r!   )r;   r   r    r/   )r   r   rI   r   r    r/   )r   r   rI   r   r    r   )r@   r`   r    r!   )r   r}   r    r}   r   r1   )r   r   r   r   r   r   r    r/   )T)r;   r   rn   rr   r    rl   )r   r   rI   r   r    r   )Or   
__future__r   r  email.messagerc   r   r  r   r  r   urllib.parserN   urllib.requestcollections.abcr   r   r   dataclassesr   html.parserr   optparser	   typingr
   r   r   pip._vendorr   pip._vendor.requestsr   pip._vendor.requests.exceptionsr   r   pip._internal.exceptionsr   pip._internal.models.linkr   !pip._internal.models.search_scoper   pip._internal.network.sessionr   pip._internal.network.utilsr   pip._internal.utils.filetypesr   pip._internal.utils.miscr   pip._internal.vcsr   sourcesr   r   r   	getLoggerr6   r\   r   r`   r)   	Exceptionr,   rE   rG   rW   r_   rh   rj   r}   r   r   rl   r   r   r   r   r   r   rH   r*   r(   <module>r'     s    # " " " " "                   				         > > > > > > > > > > ! ! ! ! ! ! " " " " " "                !           ) ) ) ) ) ) @ @ @ @ @ @ @ @ ; ; ; ; ; ; * * * * * * 9 9 9 9 9 9 4 4 4 4 4 4 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 ! ! ! ! ! ! A A A A A A A A A A		8	$	$ c*   ) ) ) ) )Y ) ) )@ @ @ @,	 	 	 	 	y 	 	 	   $< < < <~   	# 	# 	# 	# 	# 	# 	# 	#B B B B B B B B   (    8 $. . . . . . . .(    Z   > (,@ @ @ @ @ 48
 
 
 
 
: : : :z, , , , ,z , , ,
h
 h
 h
 h
 h
 h
 h
 h
 h
 h
r*   