U ÀÒ.e‚5ã@s„dZddlZddlZddlZddlZddlmZddlmZddl m Z ddl m Z e  e¡Ze d¡Zd d „ZGd d „d eƒZdS) z7 The httplib2 algorithms ported for use with requests. éN)Ú parsedate_tz)ÚCaseInsensitiveDicté)Ú DictCache)Ú Serializerz9^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?cCs0t |¡ ¡}|d|d|d|d|dfS)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úG/usr/lib/python3.8/site-packages/pip/_vendor/cachecontrol/controller.pyÚ parse_urisrc@s\eZdZdZddd„Zedd„ƒZedd „ƒZd d „Zd d „Z dd„Z ddd„Z dd„Z dS)ÚCacheControllerz9An interface to see if request should cached or not. NTcCs,|ptƒ|_||_|ptƒ|_|p$d|_dS)N)éÈéËi,é-)rÚcacheÚ cache_etagsrÚ serializerÚcacheable_status_codes)ÚselfrrrÚ status_codesrrrÚ__init__"s  zCacheController.__init__c Csht|ƒ\}}}}}|r|s&td|ƒ‚| ¡}| ¡}|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) ÚclsrZschemeZ authorityÚpathZqueryZfragmentZ request_uriZ defrag_urirrrÚ_urlnorm*s zCacheController._urlnormcCs | |¡S©N)r$)r"rrrrÚ cache_url>szCacheController.cache_urlc Cs(tdftdftdfddddddddtdfdœ }| d| dd¡¡}i}| d¡D]Ò}| ¡s^qP| d d ¡}|d  ¡}z||\}} Wn$tk rªt d |¡YqPYnX|r´| s¼d||<|rPz||d  ¡ƒ||<WqPtk rü| røt d |¡YqPtk r t d||j ¡YqPXqP|S)NTF)NF) úmax-agez max-staleú min-freshúno-cacheúno-storez no-transformzonly-if-cachedzmust-revalidateZpublicZprivatezproxy-revalidatezs-maxagez cache-controlz Cache-ControlÚú,ú=rrz,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ÚheadersZknown_directivesZ cc_headersZretvalZ cc_directiveÚpartsZ directiveÚtypZrequiredrrrÚparse_cache_controlBsVó    þý z#CacheController.parse_cache_controlcCs0| |j¡}t d|¡| |j¡}d|kr:t d¡dSd|kr\|ddkr\t d¡dS|j |¡}|dkr~t d ¡dS|j  ||¡}|sžt  d ¡dS|j d krºd }t |¡|St |jƒ}|rÐd |krüd|krît d¡|j  |¡t d¡dSt ¡}t t|d ƒ¡} td|| ƒ} t d| ¡| |¡} d} d| kr^| d} t d| ¡nDd|kr¢t|dƒ} | dk r¢t | ¡| }td|ƒ} t d| ¡d|krÀ|d} t d| ¡d|kræ|d}| |7} t d| ¡| | kr t d¡t d| | ¡|Sd|kr,t d¡|j  |¡dS)ze Return a cached response if it exists in the cache, otherwise return False. zLooking up "%s" in the cacher)z-Request header has "no-cache", cache bypassedFr'rz1Request header has "max_age" as 0, cache bypassedNzNo cache entry availablez1Cache entry deserialization failed, entry ignoredrzVReturning cached "301 Moved Permanently" response (ignoring date and etag information)ÚdateÚetagz(Purging cached response: no date or etagz!Ignoring cached response: no datezCurrent 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&Úurlr3r4r;r8rr/rÚloadsZwarningÚstatusrÚdeleteÚtimeÚcalendarZtimegmrÚmax)rÚrequestr&ÚccZ cache_dataÚrespÚmsgr8Znowr<Z current_ageZresp_ccZfreshness_lifetimer>Z expire_timeZ min_freshrrrÚcached_requestxs|         ÿ               ÿ       zCacheController.cached_requestcCs`| |j¡}|j ||j |¡¡}i}|r\t|jƒ}d|krH|d|d<d|kr\|d|d<|S)Nr=ZETagz If-None-Matchz last-modifiedz Last-ModifiedzIf-Modified-Since)r&r?rr@rr/rr8)rrFr&rHZ new_headersr8rrrÚconditional_headersçs    z#CacheController.conditional_headersc Csä|p|j}|j|kr(t d|j|¡dSt|jƒ}|dk rfd|krf|d ¡rft|dƒt|ƒkrfdS|  |j¡}|  |¡}|  |j ¡} t d| ¡d} d|kr®d} t d¡d|krÄd} t d ¡| rê|j   | ¡rêt d ¡|j  | ¡| ròdS|jr,d |kr,t d ¡|j  | |jj|||d ¡n´|jdkr\t d¡|j  | |j ||¡¡n„d|kràd|kr¦|ddkr¦t d¡|j  | |jj|||d ¡n:d|krà|dràt d¡|j  | |jj|||d ¡dS)zc Algorithm for caching requests. This assumes a requests Response object. zStatus code %s not in %sNúcontent-lengthz&Updating cache with response from "%s"Fr*TzResponse header has "no-store"zRequest header has "no-store"z0Purging existing cache entry to honor "no-store"r=zCaching due to etag)ÚbodyrzCaching permanant redirectr<r'rz'Caching b/c date exists and max-age > 0r>zCaching b/c of expires header)rrAr3r4rr8Úisdigitr.Úlenr;r&r?rr/rBrÚsetrÚdumps) rrFÚresponserMrrZresponse_headersZcc_reqrGr&Zno_storerrrÚcache_response÷sr  ÿ ÿþ ýü         ÿ    ÿ   ÿzCacheController.cache_responsecsv| |j¡}|j ||j |¡¡}|s*|Sdg‰|j t‡fdd„|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. rLc3s&|]\}}| ¡ˆkr||fVqdSr%)r )Ú.0ÚkÚv©Zexcluded_headersrrÚ bs þz9CacheController.update_cached_response..r) r&r?rr@rr/r8ÚupdateÚdictÚitemsrArPrQ)rrFrRr&Zcached_responserrWrÚupdate_cached_responseIs   þÿ z&CacheController.update_cached_response)NTNN)NN) r7Ú __module__Ú __qualname__Ú__doc__rÚ classmethodr$r&r;rJrKrSr\rrrrrsÿ   6o Rr)r_ZloggingÚrerDrCZ email.utilsrZpip._vendor.requests.structuresrrrZ serializerZ getLoggerr7r3Úcompiler rÚobjectrrrrrÚs