o
    
j6h	=  ã                   @   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	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^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)é-  é4  c                 C   s0   t  | ¡ ¡ }|d |d |d |d |d fS )z‡Parses 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   úr/var/www/html/chefvision.cloud.itp360.com/venv/lib/python3.10/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   r   )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}|r(d ||g¡p)|}|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   Ú_urlnorm0   s   zCacheController._urlnormc                 C   s
   |   |¡S ©N)r+   )r#   r   r   r   r   Ú	cache_urlD   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 ]c}| ¡ s/q(| d	d
¡}|d  ¡ }z|| \}}	W n tyR   t d|¡ Y q(w |rW|	s[d ||< |r‹z||d
  ¡ ƒ||< W q( tyz   |	rxt d|¡ Y q( tyŠ   t d||j	¡ Y q(w q(|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_controlH   s^   óþþ€ýÿ÷z#CacheController.parse_cache_controlc                 C   s*  |   |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 	||¡}|sOt 
d
¡ dS t|jƒtv r_d}t |¡ |S t|jƒ}|rjd|vr€d|vryt d¡ | j |¡ t d¡ dS t ¡ }t t|d ƒ¡}	td||	 ƒ}
t d|
¡ |  |¡}d}d|v r°|d }t d|¡ n d|v rÐt|d ƒ}|durÐt |¡|	 }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 cacher0   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 ignoredzQReturning cached permanent redirect 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=   rJ   rA   r   r8   r   ÚloadsÚwarningr7   ÚstatusÚPERMANENT_REDIRECT_STATUSESr   ÚdeleteÚtimeÚcalendarÚtimegmr   Úmax)r   Úrequestr-   ÚccÚ
cache_dataÚrespÚmsgrA   ÚnowrK   Úcurrent_ageÚresp_ccÚfreshness_lifetimerM   Úexpire_timeÚ	min_freshr   r   r   Úcached_request~   sz   



ÿ





ÿ



zCacheController.cached_requestc                 C   s`   |   |j¡}| j || j |¡¡}i }|r.t|jƒ}d|v r$|d |d< d|v r.|d |d< |S )NrL   ÚETagzIf-None-Matchzlast-modifiedzLast-ModifiedzIf-Modified-Since)r-   rN   r   rO   r   r8   r   rA   )r   rX   r-   r[   Únew_headersrA   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|v r't t|d ƒ¡}nd}|durCd|v rC|d  	¡ rCt
|d ƒt|ƒkrCdS |  |j¡}|  |¡}	|  |j¡}
t d|
¡ d}d|	v rgd	}t d
¡ d|v rrd	}t d¡ |r…| j |
¡r…t d¡ | j |
¡ |r‰dS d| dd¡v r˜t d¡ dS | jrÚd|v rÚd}| d¡r·t|d ƒ}|dur·t |¡| }t|dƒ}t d |¡¡ t d¡ | jj|
| j |||¡|d dS t
|jƒtv rõt d¡ | j |
| j ||d¡¡ dS d|v rbt t|d ƒ¡}d|	v r)|	d dkr)t d¡ |	d }| jj|
| j |||¡|d dS d|v rd|d rft|d ƒ}|durFt |¡| }nd}t d |¡¡ | jj|
| jj|||d|d dS dS dS dS )zc
        Algorithm for caching requests.

        This assumes a requests Response object.
        zStatus code %s not in %sNrK   r   úcontent-lengthz&Updating cache with response from "%s"Fr1   TzResponse header has "no-store"zRequest header has "no-store"z0Purging existing cache entry to honor "no-store"Ú*Úvaryr4   zResponse header has "Vary: *"rL   rM   i u z"etag object cached for {0} secondszCaching due to etag)rM   zCaching permanent redirectó    r.   z'Caching b/c date exists and max-age > 0z5Caching b/c of expires header. expires in {0} seconds)Úbody)r   rQ   r<   r=   r   rA   rU   rV   r   Úisdigitr7   ÚlenrJ   r-   rN   r   r8   rS   r   rW   ÚformatÚsetr   ÚdumpsrR   )r   rX   Úresponserk   r   r   Úresponse_headersrK   Úcc_reqrY   r-   Úno_storeÚexpires_timerM   r   r   r   Úcache_responseþ   s¢   

ÿ

ÿ








ý



ý


ÿÿ
ýåzCacheController.cache_responsec                    sv   |   |j¡}| j || j |¡¡}|s|S dg‰ |j t‡ fdd„|j 	¡ D ƒƒ¡ d|_
| j || j ||¡¡ |S )zéOn 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.
        rg   c                 3   s(    | ]\}}|  ¡ ˆ vr||fV  qd S r,   )r!   )Ú.0ÚkÚv©Úexcluded_headersr   r   Ú	<genexpr>’  s   € þýz9CacheController.update_cached_response.<locals>.<genexpr>r   )r-   rN   r   rO   r   r8   rA   ÚupdateÚdictÚitemsrQ   ro   rp   )r   rX   rq   r-   Úcached_responser   rz   r   Úupdate_cached_responsey  s   	þÿ	z&CacheController.update_cached_response)NTNN)NN)r@   Ú
__module__Ú__qualname__Ú__doc__r   Úclassmethodr+   r-   rJ   rc   rf   rv   r   r   r   r   r   r   $   s    
ÿ

6p
{r   )r„   ÚloggingÚrerU   rT   Úemail.utilsr   Úpip._vendor.requests.structuresr   r   r   Ú	serializer   Ú	getLoggerr@   r<   Úcompiler   rR   r   Úobjectr   r   r   r   r   Ú<module>   s   

	