£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
a
    ReE7                     @   s   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 ddl	m
Z
 ddlmZ eeZedZd	d
 ZG dd deZdS )z7
The httplib2 algorithms ported for use with requests.
    N)parsedate_tz)CaseInsensitiveDict   )	DictCache)
Serializerz9^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?c                 C   s0   t |  }|d |d |d |d |d fS )zParses a URI using the regex given in Appendix B of RFC 3986.

        (scheme, authority, path, query, fragment) = parse_uri(uri)
    r               )URImatchgroups)urir    r   /builddir/build/BUILDROOT/alt-python39-pip-21.3.1-2.el8.x86_64/opt/alt/python39/lib/python3.9/site-packages/pip/_vendor/cachecontrol/controller.py	parse_uri   s    r   c                   @   s\   e Zd ZdZdddZedd Zedd	 Zd
d Zdd Z	dd Z
dddZdd ZdS )CacheControllerz9An interface to see if request should cached or not.
    NTc                 C   s4   |d u rt  n|| _|| _|p"t | _|p,d| _d S )N)      i,  -  )r   cachecache_etagsr   
serializercacheable_status_codes)selfr   r   r   status_codesr   r   r   __init__"   s    zCacheController.__init__c           	      C   sh   t |\}}}}}|r|s&td| | }| }|s>d}|rPd||gpR|}|d | | }|S )z4Normalize the URL to create a safe key for the cachez(Only absolute URIs are allowed. uri = %s/?z://)r   	Exceptionlowerjoin)	clsr   scheme	authoritypathqueryfragmentrequest_uri
defrag_urir   r   r   _urlnorm*   s    zCacheController._urlnormc                 C   s
   |  |S N)r*   )r"   r   r   r   r   	cache_url>   s    zCacheController.cache_urlc           
      C   s"  t dft dft dfddddddddt dfd}|d|dd}i }|dD ]}| s^qP|d	d
}|d  }z|| \}}	W n" ty   td| Y qPY n0 |r|	sd ||< |rPz||d
  ||< W qP ty   |	rtd| Y qP ty   td||j	 Y qP0 qP|S )NTF)NF)max-agez	max-stale	min-freshno-cacheno-storezno-transformzonly-if-cachedzmust-revalidatepublicprivatezproxy-revalidatezs-maxagezcache-controlzCache-Control ,=r   r   z,Ignoring unknown cache-control directive: %sz-Missing value for cache-control directive: %sz8Invalid value for cache-control directive %s, must be %s)
intgetsplitstripKeyErrorloggerdebug
IndexError
ValueError__name__)
r   headersknown_directives
cc_headersretvalcc_directiveparts	directivetyprequiredr   r   r   parse_cache_controlB   sV    
z#CacheController.parse_cache_controlc                 C   s0  |  |j}td| | |j}d|v r:td dS d|v r\|d dkr\td dS | j|}|du r~td	 dS | j	||}|st
d
 dS |jdkrd}t| |S t|j}|rd|vrd|vrtd | j| td dS t }tt|d }	td||	 }
td|
 | |}d}d|v r^|d }td| nDd|v rt|d }|durt||	 }td|}td| d|v r|d }td| d|v r|d }|
|7 }
td|
 ||
krtd td||
 |S d|vr,td | j| dS )ze
        Return a cached response if it exists in the cache, otherwise
        return False.
        zLooking up "%s" in the cacher/   z-Request header has "no-cache", cache bypassedFr-   r   z1Request header has "max_age" as 0, cache bypassedNzNo cache entry availablez1Cache entry deserialization failed, entry ignoredr   zVReturning cached "301 Moved Permanently" response (ignoring date and etag information)dateetagz(Purging cached response: no date or etagz!Ignoring cached response: no datezCurrent age based on date: %iz#Freshness lifetime from max-age: %iexpiresz#Freshness lifetime from expires: %iz+Freshness lifetime from request max-age: %ir.   z'Adjusted current age from min-fresh: %iz2The response is "fresh", returning cached responsez%i > %iz4The cached response is "stale" with no etag, purging)r,   urlr;   r<   rI   r@   r   r7   r   loadswarningstatusr   deletetimecalendartimegmr   max)r   requestr,   cc
cache_datarespmsgr@   nowrJ   current_ageresp_ccfreshness_lifetimerL   expire_time	min_freshr   r   r   cached_requestx   sz    




















zCacheController.cached_requestc                 C   s`   |  |j}| j|| j|}i }|r\t|j}d|v rH|d |d< d|v r\|d |d< |S )NrK   ETagzIf-None-Matchzlast-modifiedzLast-ModifiedzIf-Modified-Since)r,   rM   r   rN   r   r7   r   r@   )r   rV   r,   rY   new_headersr@   r   r   r   conditional_headers   s    
z#CacheController.conditional_headersc                 C   s  |p| j }|j|vr(td|j| dS t|j}|durfd|v rf|d  rft|d t|krfdS | 	|j}| 	|}| 
|j}	td|	 d}
d|v rd}
td d|v rd}
td	 |
r| j|	rtd
 | j|	 |
rdS d|ddv rtd dS | jrLd|v rLtd | j|	| jj|||d n|jdkr|td | j|	| j|| nd|v r d|v r|d dkrtd | j|	| jj|||d n:d|v r |d r td | j|	| jj|||d dS )zc
        Algorithm for caching requests.

        This assumes a requests Response object.
        zStatus code %s not in %sNcontent-lengthz&Updating cache with response from "%s"Fr0   TzResponse header has "no-store"zRequest header has "no-store"z0Purging existing cache entry to honor "no-store"*varyr3   zResponse header has "Vary: *"rK   zCaching due to etag)bodyr   zCaching permanant redirectrJ   r-   r   z'Caching b/c date exists and max-age > 0rL   zCaching b/c of expires header)r   rP   r;   r<   r   r@   isdigitr6   lenrI   r,   rM   r   r7   rQ   r   setr   dumps)r   rV   responserh   r   r   response_headerscc_reqrW   r,   no_storer   r   r   cache_response   sn    















zCacheController.cache_responsec                    sv   |  |j}| j|| j|}|s*|S dg |jt fdd|j	 D  d|_
| j|| j|| |S )zOn a 304 we will get a new set of headers that we want to
        update our cached value with, assuming we have one.

        This should only ever be called when we've sent an ETag and
        gotten a 304 as the response.
        re   c                 3   s&   | ]\}}|   vr||fV  qd S r+   )r    ).0kvexcluded_headersr   r   	<genexpr>k  s   z9CacheController.update_cached_response.<locals>.<genexpr>r   )r,   rM   r   rN   r   r7   r@   updatedictitemsrP   rk   rl   )r   rV   rm   r,   cached_responser   ru   r   update_cached_responseR  s    		z&CacheController.update_cached_response)NTNN)NN)r?   
__module____qualname____doc__r   classmethodr*   r,   rI   ra   rd   rq   r|   r   r   r   r   r      s    


6o
[r   )r   loggingrerS   rR   email.utilsr   Zpip._vendor.requests.structuresr   r   r   	serializer   	getLoggerr?   r;   compiler   r   objectr   r   r   r   r   <module>   s   

	