£Á°è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>
U
    .e5                     @   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   G/usr/lib/python3.8/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   s,   |pt  | _|| _|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   ZschemeZ	authoritypathZqueryZfragmentZrequest_uriZ
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k
r   td| Y qPY nX |r|	sd ||< |rPz||d
  ||< W qP tk
r   |	rtd| Y qP tk
r    td||j	 Y qPX qP|S )NTF)NF)max-agez	max-stale	min-freshno-cacheno-storezno-transformzonly-if-cachedzmust-revalidateZpublicZ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   headersZknown_directivesZ
cc_headersZretvalZcc_directivepartsZ	directivetypZrequiredr   r   r   parse_cache_controlB   sV    
z#CacheController.parse_cache_controlc                 C   s0  |  |j}td| | |j}d|kr:td dS d|kr\|d dkr\td dS | j|}|dkr~td	 dS | j	||}|st
d
 dS |jdkrd}t| |S t|j}|rd|krd|krtd | j| td dS t }tt|d }	td||	 }
td|
 | |}d}d|kr^|d }td| nDd|krt|d }|dk	rt||	 }td|}td| d|kr|d }td| d|kr|d }|
|7 }
td|
 ||
krtd td||
 |S d|k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&   urlr3   r4   r;   r8   r   r/   r   loadsZwarningstatusr   deletetimecalendarZtimegmr   max)r   requestr&   ccZ
cache_datarespmsgr8   Znowr<   Zcurrent_ageZresp_ccZfreshness_lifetimer>   Zexpire_timeZ	min_freshr   r   r   cached_requestx   s|    















 




zCacheController.cached_requestc                 C   s`   |  |j}| j|| j|}i }|r\t|j}d|krH|d |d< d|kr\|d |d< |S )Nr=   ZETagzIf-None-Matchzlast-modifiedzLast-ModifiedzIf-Modified-Since)r&   r?   r   r@   r   r/   r   r8   )r   rF   r&   rH   Znew_headersr8   r   r   r   conditional_headers   s    
z#CacheController.conditional_headersc                 C   s  |p| j }|j|kr(td|j| dS t|j}|dk	rfd|krf|d  rft|d t|krfdS | 	|j}| 	|}| 
|j}	td|	 d}
d|krd}
td d|krd}
td	 |
r| j|	rtd
 | j|	 |
rdS | jr,d|kr,td | j|	| jj|||d n|jdkr\td | j|	| j|| nd|krd|kr|d dkrtd | j|	| jj|||d n:d|kr|d rt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"Fr*   TzResponse header has "no-store"zRequest header has "no-store"z0Purging existing cache entry to honor "no-store"r=   zCaching due to etag)bodyr   zCaching permanant redirectr<   r'   r   z'Caching b/c date exists and max-age > 0r>   zCaching b/c of expires header)r   rA   r3   r4   r   r8   isdigitr.   lenr;   r&   r?   r   r/   rB   r   setr   dumps)r   rF   responserM   r   r   Zresponse_headersZcc_reqrG   r&   Zno_storer   r   r   cache_response   sr    

  






 


 


 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.
        rL   c                 3   s&   | ]\}}|   kr||fV  qd S r%   )r    ).0kvZexcluded_headersr   r   	<genexpr>b  s   z9CacheController.update_cached_response.<locals>.<genexpr>r   )r&   r?   r   r@   r   r/   r8   updatedictitemsrA   rP   rQ   )r   rF   rR   r&   Zcached_responser   rW   r   update_cached_responseI  s    		z&CacheController.update_cached_response)NTNN)NN)r7   
__module____qualname____doc__r   classmethodr$   r&   r;   rJ   rK   rS   r\   r   r   r   r   r      s          


6o
Rr   )r_   ZloggingrerD   rC   Zemail.utilsr   Zpip._vendor.requests.structuresr   r   r   Z	serializer   Z	getLoggerr7   r3   compiler   r   objectr   r   r   r   r   <module>   s   

	