3
gE7                 @   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jeZej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 j| j }|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   a/var/www/tester-filtro-web/env/lib/python3.6/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 krt  n|| _|| _|p"t | _|p,d| _d S )N      ,  -  )r   r   r   r   )r   cachecache_etagsr   
serializercacheable_status_codes)selfr   r   r   status_codesr   r   r   __init__"   s    zCacheController.__init__c       	      C   sl   t |\}}}}}| s| r*td| |j }|j }|sBd}|rTdj||gpV|}|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
   | j |S )N)r*   )r#   r   r   r   r   	cache_url>   s    zCacheController.cache_urlc       
      C   s2  t dft dft dfddddddddt dfd}|jd|jdd}i }x|jdD ]}|j s`qR|jdd	}|d
 j }y|| \}}	W n" tk
r   tjd| wRY nX | s|	 rd ||< |rRy||d	 j ||< W qR tk
r   |	r tjd| Y qR tk
r(   tjd||j	 Y qRX qRW |S )NTF)zmax-agez	max-stalez	min-freshzno-cachezno-storezno-transformzonly-if-cachedzmust-revalidate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)NF)NF)NF)NF)NF)NF)NF)NF)
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_controlB   sP    
z#CacheController.parse_cache_controlc             C   s4  | j |j}tjd| | j|j}d|kr:tjd dS d|kr\|d dkr\tjd dS | jj|}|dkr~tjd	 dS | jj	||}|stj
d
 dS |jdkrd}tj| |S t|j}| sd|kr d|krtjd | jj| tjd dS tj }tjt|d }	td||	 }
tjd|
 | j|}d}d|krb|d }tjd| nDd|krt|d }|dk	rtj||	 }td|}tjd| d|kr|d }tjd| d|kr|d }|
|7 }
tjd|
 ||
krtjd tjd||
 |S d|kr0tjd | jj| dS )ze
        Return a cached response if it exists in the cache, otherwise
        return False.
        zLooking up "%s" in the cachezno-cachez-Request header has "no-cache", cache bypassedFzmax-ager   z1Request header has "max_age" as 0, cache bypassedNzNo cache entry availablez1Cache entry deserialization failed, entry ignoredi-  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: %iz	min-freshz'Adjusted current age from min-fresh: %iz2The response is "fresh", returning cached responsez%i > %iz4The cached response is "stale" with no etag, purging)r+   urlr5   r6   r?   r:   r   r1   r   loadswarningstatusr   deletetimecalendartimegmr   max)r   requestr+   ccZ
cache_datarespmsgr:   nowr@   Zcurrent_ageZresp_ccZfreshness_lifetimerB   Zexpire_timeZ	min_freshr   r   r   cached_requestx   sv    





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

        This assumes a requests Response object.
        zStatus code %s not in %sNzcontent-lengthz&Updating cache with response from "%s"Fzno-storeTzResponse header has "no-store"zRequest header has "no-store"z0Purging existing cache entry to honor "no-store"*Zvaryr-   zResponse header has "Vary: *"rA   zCaching due to etag)bodyi-  zCaching permanant redirectr@   zmax-ager   z'Caching b/c date exists and max-age > 0rB   zCaching b/c of expires header)r   rF   r5   r6   r   r:   isdigitr0   lenr?   r+   rC   r   r1   rG   r   setr   dumps)r   rL   responserT   r   r   Zresponse_headersZcc_reqrM   r+   Zno_storer   r   r   cache_response   s^    














zCacheController.cache_responsec                sv   | j |j}| jj|| jj|}|s*|S dg |jjt fdd|jj	 D  d|_
| jj|| 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.
        zcontent-lengthc             3   s&   | ]\}}|j   kr||fV  qd S )N)r!   ).0kv)excluded_headersr   r   	<genexpr>l  s   z9CacheController.update_cached_response.<locals>.<genexpr>r   )r+   rC   r   rD   r   r1   r:   updatedictitemsrF   rW   rX   )r   rL   rY   r+   cached_responser   )r^   r   update_cached_responseR  s    	
z&CacheController.update_cached_response)NTNN)NN)r9   
__module____qualname____doc__r   classmethodr*   r+   r?   rQ   rR   rZ   rd   r   r   r   r   r      s   
6o
[r   )rg   loggingrerI   rH   email.utilsr   pip._vendor.requests.structuresr   r   r   	serializer   	getLoggerr9   r5   compiler   r   objectr   r   r   r   r   <module>   s   

	