Viewing File: /opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/cachecontrol/controller.pyo

ó
“tÆ_c@s·dZddlZddlZddlZddlZddlmZddlmZddl	m
Z
ddlmZej
eƒZejdƒZd	„Zd
efd„ƒYZdS(s7
The httplib2 algorithms ported for use with requests.
iÿÿÿÿN(tparsedate_tz(tCaseInsensitiveDicti(t	DictCache(t
Serializers9^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?cCs<tj|ƒjƒ}|d|d|d|d|dfS(s‡Parses a URI using the regex given in Appendix B of RFC 3986.

        (scheme, authority, path, query, fragment) = parse_uri(uri)
    iiiii(tURItmatchtgroups(turiR((sT/opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/cachecontrol/controller.pyt	parse_uristCacheControllercBsteZdZd	ed	d	d„Zed„ƒZed„ƒZd„Z	d„Z
d„Zd	d	d„Zd„Z
RS(
s9An interface to see if request should cached or not.
    cCsL|dkrtƒn||_||_|p3tƒ|_|pBd|_dS(NiÈiËi,i-(iÈiËi,i-(tNoneRtcachetcache_etagsRt
serializertcacheable_status_codes(tselfRRR
tstatus_codes((sT/opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/cachecontrol/controller.pyt__init__"s	c	Csšt|ƒ\}}}}}|s)|r<td|ƒ‚n|jƒ}|jƒ}|scd}n|r~dj||gƒp|}|d||}|S(s4Normalize the URL to create a safe key for the caches(Only absolute URIs are allowed. uri = %st/t?s://(Rt	Exceptiontlowertjoin(	tclsRtschemet	authoritytpathtquerytfragmenttrequest_urit
defrag_uri((sT/opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/cachecontrol/controller.pyt_urlnorm*s	!cCs
|j|ƒS(N(R(RR((sT/opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/cachecontrol/controller.pyt	cache_url>sc
Csèittfd6ttfd6ttfd6dtfd6dtfd6dtfd6dtfd6dtfd6dtfd	6dtfd
6dtfd6ttfd6}|jd
|jddƒƒ}i}x|jdƒD]
}|jƒsîqÖn|jddƒ}|djƒ}y||\}}	Wn$tk
rJtj	d|ƒqÖnX|sY|	rfd||<n|rÖy||djƒƒ||<Wqàt
k
r¶|	rÝtj	d|ƒqÝqàtk
rÜtj	d||jƒqàXqÖqÖW|S(Nsmax-ages	max-stales	min-freshsno-cachesno-storesno-transformsonly-if-cachedsmust-revalidatetpublictprivatesproxy-revalidatess-maxages
cache-controls
Cache-Controltt,t=iis,Ignoring unknown cache-control directive: %ss-Missing value for cache-control directive: %ss8Invalid value for cache-control directive %s, must be %s(
tinttTruetFalseR
tgettsplittstriptKeyErrortloggertdebugt
IndexErrort
ValueErrort__name__(
Rtheaderstknown_directivest
cc_headerstretvaltcc_directivetpartst	directivettyptrequired((sT/opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/cachecontrol/controller.pytparse_cache_controlBsR















cCs|j|jƒ}tjd|ƒ|j|jƒ}d|krQtjdƒtSd|kr~|ddkr~tjdƒtS|jj|ƒ}|dkr­tjdƒtS|j
j||ƒ}|sÙtjdƒtS|j
d	krÿd
}tj|ƒ|St|jƒ}|s!d|kr^d|krMtjd
ƒ|jj|ƒntjdƒtStjƒ}tjt|dƒƒ}	td||	ƒ}
tjd|
ƒ|j|ƒ}d}d|krä|d}tjd|ƒn`d|krDt|dƒ}
|
dk	rDtj|
ƒ|	}td|ƒ}tjd|ƒqDnd|krm|d}tjd|ƒnd|kr |d}|
|7}
tjd|
ƒn||
krÐtjdƒtjd||
ƒ|Sd|krütjdƒ|jj|ƒntS(se
        Return a cached response if it exists in the cache, otherwise
        return False.
        sLooking up "%s" in the cachesno-caches-Request header has "no-cache", cache bypassedsmax-ageis1Request header has "max_age" as 0, cache bypassedsNo cache entry availables1Cache entry deserialization failed, entry ignoredi-sVReturning cached "301 Moved Permanently" response (ignoring date and etag information)tdatetetags(Purging cached response: no date or etags!Ignoring cached response: no datesCurrent age based on date: %is#Freshness lifetime from max-age: %itexpiress#Freshness lifetime from expires: %is+Freshness lifetime from request max-age: %is	min-freshs'Adjusted current age from min-fresh: %is2The response is "fresh", returning cached responses%i > %is4The cached response is "stale" with no etag, purgingN(R turlR-R.R;R2R(RR)R
R
tloadstwarningtstatusRtdeletettimetcalendarttimegmRtmax(RtrequestR tcct
cache_datatresptmsgR2tnowR<tcurrent_agetresp_cctfreshness_lifetimeR>texpire_timet	min_fresh((sT/opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/cachecontrol/controller.pytcached_requestxsv














cCs|j|jƒ}|jj||jj|ƒƒ}i}|r‹t|jƒ}d|krk|d|d<nd|kr‹|d|d<q‹n|S(NR=tETags
If-None-Matchs
last-modifieds
Last-ModifiedsIf-Modified-Since(R R?R
R@RR)RR2(RRHR RKtnew_headersR2((sT/opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/cachecontrol/controller.pytconditional_headersçs!cCsÍ|p|j}|j|kr8tjd|j|ƒdSt|jƒ}|dk	rd|kr|djƒrt|dƒt	|ƒkrdS|j
|jƒ}|j
|ƒ}|j|jƒ}	tjd|	ƒt
}
d|krút}
tjdƒnd|krt}
tjdƒn|
rT|jj|	ƒrTtjdƒ|jj|	ƒn|
r^dSd	|jd
dƒkr‡tjdƒdS|jrÔd
|krÔtjdƒ|jj|	|jj||d|ƒƒnõ|jdkrtjdƒ|jj|	|jj||ƒƒn´d|krÉd|kru|ddkrutjdƒ|jj|	|jj||d|ƒƒqÉd|krÉ|drÆtjdƒ|jj|	|jj||d|ƒƒqÆqÉndS(sc
        Algorithm for caching requests.

        This assumes a requests Response object.
        sStatus code %s not in %sNscontent-lengths&Updating cache with response from "%s"sno-storesResponse header has "no-store"sRequest header has "no-store"s0Purging existing cache entry to honor "no-store"t*tvaryR#sResponse header has "Vary: *"R=sCaching due to etagtbodyi-sCaching permanant redirectR<smax-ageis'Caching b/c date exists and max-age > 0R>sCaching b/c of expires header(RRBR-R.RR2R
tisdigitR&tlenR;R R?R(R'RR)RCRtsetR
tdumps(RRHtresponseRYRRtresponse_headerstcc_reqRIR tno_store((sT/opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/cachecontrol/controller.pytcache_response÷s^


	"
%
	"

	cs¤|j|jƒ}|jj||jj|ƒƒ}|s=|Sdg‰|jjt‡fd†|jj	ƒDƒƒƒd|_
|jj||jj||ƒƒ|S(sé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.
        scontent-lengthc3s3|])\}}|jƒˆkr||fVqdS(N(R(t.0tktv(texcluded_headers(sT/opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/cachecontrol/controller.pys	<genexpr>ls	iÈ(
R R?R
R@RR)R2tupdatetdicttitemsRBR\R](RRHR^R tcached_response((RfsT/opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/cachecontrol/controller.pytupdate_cached_responseRs!				"N(R1t
__module__t__doc__R
R'RtclassmethodRR R;RSRVRbRk(((sT/opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/cachecontrol/controller.pyR	s	6	o	[(RmtloggingtreRERDtemail.utilsRtpip._vendor.requests.structuresRRRt	serializeRt	getLoggerR1R-tcompileRRtobjectR	(((sT/opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/cachecontrol/controller.pyt<module>s		
Back to Directory File Manager