U
    ,e @                     @   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
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SeparateBodyBaseCache)
Serializerz9^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)-  4  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   d/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/pip/_vendor/cachecontrol/controller.py	parse_uri   s    r   c                   @   sf   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dZdd ZdS )CacheControllerz4An interface to see if request should cached or not.NTc                 C   s4   |d k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}|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_uriZ
defrag_urir   r   r   _urlnorm/   s    zCacheController._urlnormc                 C   s
   |  |S N)r+   )r$   r   r   r   r   	cache_urlC   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-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   headersZknown_directivesZ
cc_headersretvalZcc_directivepartsZ	directivetyprequiredr   r   r   parse_cache_controlG   sV    
z#CacheController.parse_cache_controlc                 C   sX  |  |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 t| jt	r| j
|}nd}| j|||}|std
 dS t|jtkrd}t| |S t|j}|rd|kr$d|krt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r4td td|| |S d|krTt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=   rF   rA   r   r8   
isinstancer   get_bodyr   loadswarningr7   statusPERMANENT_REDIRECT_STATUSESr   deletetimecalendartimegmr   max)r   requestr-   ccZ
cache_dataZ	body_filerespmsgrA   nowrG   Zcurrent_ageZresp_ccZfreshness_lifetimerI   Zexpire_timeZ	min_freshr   r   r   cached_request}   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 )NrH   ZETagzIf-None-Matchzlast-modifiedzLast-ModifiedzIf-Modified-Since)r-   rJ   r   rM   r   r8   r   rA   )r   rV   r-   rX   Znew_headersrA   r   r   r   conditional_headers   s    
z#CacheController.conditional_headersc                 C   s\   t | jtr:| jj|| j||d|d | j|| n| jj|| j||||d dS )z.
        Store the data in the cache.
            )rI   N)rK   r   r   setr   dumpsZset_body)r   r-   rV   responsebodyexpires_timer   r   r   
_cache_set  s    zCacheController._cache_setc                 C   s  |p| j }|j|kr(td|j| dS t|j}d|krNtt|d }nd}|dk	rd|kr|d 	 rt
|d t|krdS | |j}| |}	| |j}
td|
 d}d|	krd	}td
 d|krd	}td |r| j|
rtd | j|
 |rdS d|ddkr8td dS | jrd|krd}|dr~t|d }|dk	r~t|| }t|d}td| td | |
|||| nt
|jtkrtd | |
||d nd|krtt|d }d|	kr<|	d dkr<td |	d }| |
|||| n`d|kr|d rt|d }|dk	rvt|| }nd}td| | |
|||| dS )zc
        Algorithm for caching requests.

        This assumes a requests Response object.
        zStatus code %s not in %sNrG   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"*Zvaryr4   zResponse header has "Vary: *"rH   rI   i u z"etag object cached for {0} secondszCaching due to etagzCaching permanent redirectr]   r.   z'Caching b/c date exists and max-age > 0z5Caching b/c of expires header. expires in {0} seconds)r   rO   r<   r=   r   rA   rS   rT   r   isdigitr7   lenrF   r-   rJ   r   r8   rQ   r   rU   formatrc   rP   )r   rV   r`   ra   r   r   Zresponse_headersrG   Zcc_reqrW   r-   Zno_storerb   rI   r   r   r   cache_response  s    

  
















zCacheController.cache_responsec                    sl   |  |j}| j|| j|}|s*|S dg |jt fdd|j	 D  d|_
| ||| |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.
        rd   c                 3   s&   | ]\}}|   kr||fV  qd S r,   )r"   ).0kvZexcluded_headersr   r   	<genexpr>  s   z9CacheController.update_cached_response.<locals>.<genexpr>r   )r-   rJ   r   rM   r   r8   rA   updatedictitemsrO   rc   )r   rV   r`   r-   cached_responser   rm   r   update_cached_response  s    		z&CacheController.update_cached_response)NTNN)NN)NN)r@   
__module____qualname____doc__r   classmethodr+   r-   rF   r[   r\   rc   ri   rs   r   r   r   r   r   $   s           


6u

{r   )rv   loggingrerS   rR   email.utilsr   pip._vendor.requests.structuresr   r   r   r   	serializer   	getLoggerr@   r<   compiler   rP   r   objectr   r   r   r   r   <module>   s   

	