Ë
    }D™jÂG  ã                   óP  — d Z ddlmZmZ ddlmZ ddlmZmZ ddl	m
Z
mZmZmZmZ ddlmZ ddlmZ ddlmZ d	d
lmZmZ d	dlmZmZmZ d	dlmZmZmZ d	dl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d	dl,m-Z- ddgZ.e
reZ/ne0Z/ ee1«      Z2 G d„ de/«      Z3 G d„ de3e«      Z4dedefd„Z5y)zDMain classes to add caching features to :py:class:`requests.Session`é    )ÚcontextmanagerÚnullcontext)Ú	getLogger)ÚRLockÚThread)ÚTYPE_CHECKINGÚIterableÚMutableMappingÚOptionalÚUnion)ÚPreparedRequest)ÚSession)Údispatch_hooké   )Úget_valid_kwargsÚpatch_form_boundary)ÚBackendSpecifierÚ	StrOrPathÚinit_backend)ÚAnyResponseÚCachedResponseÚOriginalResponse)ÚDEFAULT_CACHE_NAMEÚDEFAULT_IGNORED_PARAMSÚDEFAULT_METHODSÚDEFAULT_STATUS_CODESÚCacheActionsÚCacheSettingsÚExpirationPatternsÚExpirationTimeÚFilterCallbackÚKeyCallbackÚset_request_headers)ÚSerializerTypeÚCachedSessionÚ
CacheMixinc            #       óà  ‡ — e Zd ZdZeddddddeededdddddfdede	e
   de	e   d	ed
e	e   dede	e   dee   dee   dedee   deee   ef   de	e   de	e   dedeeef   def"ˆ fd„Zededd fd„«       Zedefd„«       Zej8                  defd„«       Zedefd„«       Zej8                  defd„«       Zd;d edefd!„Zd edefd"„Z d edefd#„Z!d;d edefd$„Z"d;d edefd%„Z#d;d edefd&„Z$d edefd'„Z%dddddd(œd)ed ed*e	e&eef      d	ed+ed,ed-edefˆ fd.„Z'	 	 	 	 d<d/e(d	ed+ed,ed-edefd0„Z)	 d;d/e(d1e*d2e	e+   defˆ fd3„Z,d/e(d1e*d2e+defd4„Z-d5„ Z.d2e+d1e*defd6„Z/e0d7„ «       Z1ˆ fd8„Z2d9„ Z3d:„ Z4ˆ xZ5S )=r&   z‡Mixin class that extends :py:class:`requests.Session` with caching features.
    See :py:class:`.CachedSession` for usage details.
    NéÿÿÿÿFTÚ
cache_nameÚbackendÚ
serializerÚexpire_afterÚurls_expire_afterÚcache_controlÚcontent_root_keyÚallowable_codesÚallowable_methodsÚalways_revalidateÚignored_parametersÚmatch_headersÚ	filter_fnÚkey_fnÚ	read_onlyÚstale_if_errorÚ	autoclosec                 óà   •— t        ||fd|i|¤Ž| _        t        j                  d||||||	|
|||||||dœ|¤Ž| _        t        «       | _        t        ‰| �   di t        t        ‰| �   |«      ¤Ž y )Nr+   )r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   © )
r   Úcacher   Úfrom_kwargsÚsettingsr   Ú_lockÚsuperÚ__init__r   )Úselfr)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   ÚkwargsÚ	__class__s                      €úb/var/www/html/Astrologybackend/backend/venv/lib/python3.12/site-packages/requests_cache/session.pyrA   zCacheMixin.__init__,   s“   ø€ ô* " *¨gÑWÀ*ÐWÐPVÑWˆŒ
Ü%×1Ñ1ð 
Ø%Ø/Ø'Ø-Ø+Ø/Ø/Ø1Ø'ØØØØ)Øñ
ð ñ
ˆŒô" “WˆŒ
ô 	‰ÑÑFÔ+¬E©GÑ,<¸fÓEÓFó    Úoriginal_sessionÚreturnc                 ó®  —  | di |¤Ž}|j                   |_         |j                  |_        |j                  |_        |j                  |_        |j                  |_        |j
                  |_        |j                  |_        |j                  |_        |j                  |_        |j                  |_	        |j                  |_
        |j                  |_        |S )a	  Add caching to an existing :py:class:`~requests.Session` object, while retaining all
        original session settings.

        Args:
            original_session: Session object to wrap
            kwargs: Keyword arguments for :py:class:`.CachedSession`
        r;   )ÚadaptersÚauthÚcertÚcookiesÚheadersÚhooksÚmax_redirectsÚparamsÚproxiesÚstreamÚ	trust_envÚverify)ÚclsrG   rC   Úsessions       rE   ÚwrapzCacheMixin.wrapX   s³   € ñ ‘-˜‘-ˆØ+×4Ñ4ˆÔØ'×,Ñ,ˆŒØ'×,Ñ,ˆŒØ*×2Ñ2ˆŒØ*×2Ñ2ˆŒØ(×.Ñ.ˆŒØ 0× >Ñ >ˆÔØ)×0Ñ0ˆŒØ*×2Ñ2ˆŒØ)×0Ñ0ˆŒØ,×6Ñ6ˆÔØ)×0Ñ0ˆŒØˆrF   c                 ó.   — | j                   j                  S )z#Settings that affect cache behavior©r<   Ú	_settings©rB   s    rE   r>   zCacheMixin.settingsp   s   € ð �z‰z×#Ñ#Ð#rF   Úvaluec                 ó&   — || j                   _        y ©NrZ   ©rB   r]   s     rE   r>   zCacheMixin.settingsu   s   € à$ˆ�
‰
ÕrF   c                 ó.   — | j                   j                  S r_   ©r>   r,   r\   s    rE   r,   zCacheMixin.expire_afterz   s   € à�}‰}×)Ñ)Ð)rF   c                 ó&   — || j                   _        y r_   rb   r`   s     rE   r,   zCacheMixin.expire_after~   s   € à%*ˆ�‰Õ"rF   Úurlc                 óR   — |j                  dd«        | j                  d|fd|i|¤ŽS )NÚallow_redirectsTÚGETrQ   ©Ú
setdefaultÚrequest)rB   rd   rQ   rC   s       rE   ÚgetzCacheMixin.getƒ   s0   € Ø×ÑÐ+¨TÔ2Øˆt�|‰|˜E 3Ñ@¨vÐ@¸Ñ@Ð@rF   c                 óN   — |j                  dd«        | j                  d|fi |¤ŽS )Nrf   TÚOPTIONSrh   ©rB   rd   rC   s      rE   ÚoptionszCacheMixin.options‡   s+   € Ø×ÑÐ+¨TÔ2Øˆt�|‰|˜I sÑ5¨fÑ5Ð5rF   c                 óN   — |j                  dd«        | j                  d|fi |¤ŽS )Nrf   FÚHEADrh   rn   s      rE   ÚheadzCacheMixin.head‹   s+   € Ø×ÑÐ+¨UÔ3Øˆt�|‰|˜F CÑ2¨6Ñ2Ð2rF   c                 ó.   —  | j                   d|fd|i|¤ŽS )NÚPOSTÚdata©rj   ©rB   rd   ru   rC   s       rE   ÚpostzCacheMixin.post�   s   € Øˆt�|‰|˜F CÑ=¨dÐ=°fÑ=Ð=rF   c                 ó.   —  | j                   d|fd|i|¤ŽS )NÚPUTru   rv   rw   s       rE   ÚputzCacheMixin.put’   s   € Øˆt�|‰|˜E 3Ñ<¨TÐ<°VÑ<Ð<rF   c                 ó.   —  | j                   d|fd|i|¤ŽS )NÚPATCHru   rv   rw   s       rE   ÚpatchzCacheMixin.patch•   s   € Øˆt�|‰|˜G SÑ>¨tÐ>°vÑ>Ð>rF   c                 ó*   —  | j                   d|fi |¤ŽS )NÚDELETErv   rn   s      rE   ÚdeletezCacheMixin.delete˜   s   € Øˆt�|‰|˜H cÑ4¨VÑ4Ð4rF   )rN   r,   Úonly_if_cachedÚrefreshÚforce_refreshÚmethodrN   r‚   rƒ   r„   c                óÄ   •— t        |||||«      }|	j                  d«      r
t        «       n	t        «       5  t	        ‰
| �  ||g|¢­d|i|	¤Žcddd«       S # 1 sw Y   yxY w)aY  This method prepares and sends a request while automatically performing any necessary
        caching operations. This will be called by any other method-specific ``requests`` functions
        (get, post, etc.). This is not used by :py:class:`~requests.PreparedRequest` objects, which
        are handled by :py:meth:`send()`.

        See :py:meth:`requests.Session.request` for base parameters. Additional parameters:

        Args:
            expire_after: Expiration time to set only for this request. See :ref:`expiration` for
                details.
            only_if_cached: Only return results from the cache. If not cached, return a 504 response
                instead of sending a new request.
            refresh: Revalidate with the server before using a cached response, and refresh if needed
                (e.g., a "soft refresh," like F5 in a browser)
            force_refresh: Always make a new request, and overwrite any previously cached response
                (e.g., a "hard refresh", like Ctrl-F5 in a browser))

        Returns:
            Either a new or cached response
        ÚfilesrN   N)r#   rk   r   r   r@   rj   )rB   r…   rd   rN   r,   r‚   rƒ   r„   ÚargsrC   rD   s             €rE   rj   zCacheMixin.request›   se   ø€ ô@ & g¨|¸^ÈWÐVcÓdˆØ&,§j¡j°Ô&9Ô Ô"¼{»}ñ 	RÜ‘7‘? 6¨3ÐQ°ÒQ¸wÐQÈ&ÑQ÷	R÷ 	Rò 	Rús   ¶AÁArj   c                 ó´  — t        |j                  ||||«      |_        t        j                   | j                  j
                  |fi |¤Ž|| j                  «      }d}|j                  s%| j                  j                  |j                  «      } |j                  || j                  j
                  fi |¤Ž |j                  r„|j                  }	| j                  j                  |	«      }
|	|_	        |
�Td|_        d|_        d|_        d|_        d|_        i |_         |j                  |
| j                  j
                  fi |¤Ž |
}|j                  rt#        |«      }nj|j                  r | j$                  |||fi |¤Ž |}nF|j                  r | j&                  |||fi |¤Ž}n$|j                  r | j(                  |||fi |¤Ž}n|}| j                  j*                  �d| j                  j+                  |«      sIt,        j/                  d|j0                  › �«       | j                  j3                  |j                  «       |S t5        d|j6                  |fi |¤ŽS )a«  Send a prepared request, with caching. See :py:meth:`requests.Session.send` for base
        parameters, and see :py:meth:`.request` for extra parameters.

        **Order of operations:** For reference, a request will pass through the following methods:

        1. :py:func:`requests.get`, :py:meth:`CachedSession.get`, etc. (optional)
        2. :py:meth:`.CachedSession.request`
        3. :py:meth:`requests.Session.request`
        4. :py:meth:`.CachedSession.send`
        5. :py:meth:`.BaseCache.get_response`
        6. :py:meth:`requests.Session.send` (if not using a cached response)
        7. :py:meth:`.BaseCache.save_response` (if not using a cached response)
        NFz$Deleting filtered response for URL: Úresponse)r#   rN   r   Úfrom_requestr<   Ú
create_keyr>   Ú	skip_readÚget_responseÚ	cache_keyÚupdate_from_cached_responseÚvary_cache_keyÚsend_requestÚresend_requestÚresend_asyncÚ	error_504Ú_validation_headersÚget_504_responseÚ_resend_asyncÚ_resendÚ_send_and_cacher5   ÚloggerÚdebugrd   r�   r   rO   )rB   rj   r,   r‚   rƒ   r„   rC   ÚactionsÚcached_responseÚvary_keyÚvary_cachedrŠ   s               rE   ÚsendzCacheMixin.send¿   s'  € ô. .Ø�O‰O˜\¨>¸7ÀMó
ˆŒô ×+Ñ+Ø!ˆD�J‰J×!Ñ! 'Ñ4¨VÑ4°g¸t¿}¹}ó
ˆð
 59ˆØ× Ò Ø"Ÿj™j×5Ñ5°g×6GÑ6GÓHˆOØ+ˆ×+Ñ+¨O¸T¿Z¹Z×=RÑ=RÑ]ÐV\Ò]ð ×!Ò!Ø×-Ñ-ˆHØŸ*™*×1Ñ1°(Ó;ˆKà (ˆGÔØÐ&à',�Ô$Ø).�Ô&Ø',�Ô$Ø$)�Ô!Ø)-�Ô&Ø.0�Ô+à3�×3Ñ3°KÀÇÁ×AVÑAVÑaÐZ`ÒaØ"-�ð ×ÒÜ$4°WÓ$=‰HØ×!Ò!ØˆD×Ñ˜w¨°ÑKÀFÒKØ&‰HØ×#Ò#Ø#�t—|‘| G¨W°oÑPÈÑP‰HØ×!Ò!Ø+�t×+Ñ+¨G°W¸oÑXÐQWÑX‰Hà&ˆHð �=‰=×"Ñ"Ð.°t·}±}×7NÑ7NÈxÔ7XÜ�L‰LÐ?ÀÇÁ¸~ÐNÔOØ�J‰J×Ñ˜g×/Ñ/Ô0ØˆOô ˜Z¨¯©¸ÑKÀFÑKÐKrF   r�   rž   c                 ó<  •— |j                  |«      }t        ‰| �  |fi |¤Ž}|j                  |«       |j                  s2| j
                  j                  ||j                  |j                  «       n„|�`|j                  dk(  rQ|j                  ||«      }|j                  s1| j
                  j                  ||j                  |j                  «       |S t        j                  d|j                  › �«       t        |t        «      r|S t!        j"                  ||«      S )z�Send a request and cache the response, unless disabled by settings or headers.
        If applicable, also handle conditional requests.
        i0  zSkipping cache write for URL: )Úupdate_requestr@   r¡   Úupdate_from_responseÚ
skip_writer<   Úsave_responser�   ÚexpiresÚstatus_codeÚupdate_revalidated_responser›   rœ   rd   Ú
isinstancer   r   Úwrap_response)rB   rj   r�   rž   rC   rŠ   rD   s         €rE   rš   zCacheMixin._send_and_cache  sï   ø€ ð ×(Ñ(¨Ó1ˆÜ‘7‘< Ñ2¨6Ñ2ˆØ×$Ñ$ XÔ.à×!Ò!Ø�J‰J×$Ñ$ X¨w×/@Ñ/@À'Ç/Á/ÕRØÐ(¨X×-AÑ-AÀSÒ-HØ%×AÑAÀ(ÈOÓ\ˆOØ×%Ò%Ø—
‘
×(Ñ(¨¸'×:KÑ:KÈWÏ_É_Ô]Ø"Ð"ä�L‰LÐ9¸'¿+¹+¸ÐGÔHô �h¤Ô/ØˆOä#×1Ñ1°(¸GÓDÐDrF   c                 ó.  — t         j                  d«       	  | j                  |||fi |¤Ž}| j                  j                  r2|j
                  | j                  j                  vr|j                  «        |S # t        $ r | j                  ||«      cY S w xY w)znHandle a stale cached response by attempting to resend the request and cache a fresh
        response
        z-Stale response; attempting to re-send request)
r›   rœ   rš   r>   r8   r¨   r0   Úraise_for_statusÚ	ExceptionÚ_handle_error)rB   rj   r�   rž   rC   rŠ   s         rE   r™   zCacheMixin._resend+  s�   € ô 	�‰ÐDÔEð		@Ø+�t×+Ñ+¨G°W¸oÑXÐQWÑXˆHà—‘×,Ò,Ø×(Ñ(°·±×0MÑ0MÑMà×)Ñ)Ô+ØˆOøÜò 	@Ø×%Ñ% o°wÓ?Ò?ð	@ús   —AA6 Á6BÂBc                 ó~   — t         j                  d«       t        | j                  ||¬«      }|j	                  «        y)z8Send a non-blocking request to refresh a cached responsez'Using stale response while revalidating)Útargetrˆ   rC   N)r›   rœ   r   rš   Ústart)rB   rˆ   rC   Úthreads       rE   r˜   zCacheMixin._resend_asyncA  s,   € ä�‰Ð>Ô?Ü˜t×3Ñ3¸$ÀvÔNˆØ�‰�rF   c                 óŒ   — |j                  |d¬«      r1t        j                  d|j                  j                  › d�d¬«       |S ‚ )z°Handle a request error based on settings:
        * Default behavior: re-raise the error
        * stale-if-error: Ignore the error and and return the stale cache item
        T)ÚerrorzRequest for URL z failed; using cached response)Úexc_info)Ú	is_usabler›   Úwarningrj   rd   )rB   rž   r�   s      rE   r¯   zCacheMixin._handle_errorG  sP   € ð
 ×Ñ˜_°DÐÔ9Ü�N‰NØ" ?×#:Ñ#:×#>Ñ#>Ð"?Ð?]Ð^Øð ô ð #Ð"àrF   c              #   ó¼   K  — | j                   j                  rd–— yd| j                   _        	 d–— d| j                   _        y# d| j                   _        w xY w­w)a  
        Context manager for temporary disabling the cache

        .. warning:: This method is not thread-safe.

        Example:

            >>> s = CachedSession()
            >>> with s.cache_disabled():
            ...     s.get('https://httpbin.org/ip')

        NTF)r>   Údisabledr\   s    rE   Úcache_disabledzCacheMixin.cache_disabledU  sD   è ø€ ð �=‰=×!Ò!Üà%)ˆD�M‰MÔ"ð/Ûà).�—‘Õ&ø¨�—‘Õ&üs   ‚-A°A ´AÁAÁAc                 ó„   •— t         ‰| �  «        | j                  j                  r| j                  j                  «        yy)z2Close the session and any open backend connectionsN)r@   Úcloser>   r9   r<   )rB   rD   s    €rE   r½   zCacheMixin.closel  s.   ø€ ä‰‰ŒØ�=‰=×"Ò"Ø�J‰J×ÑÕð #rF   c                 ó   — t        d«      ‚)NzCachedSession cannot be pickled)ÚNotImplementedErrorr\   s    rE   Ú__getstate__zCacheMixin.__getstate__r  s   € ô "Ð"CÓDÐDrF   c                 óN   — dt        | j                  «      › d| j                  › d�S )Nz<CachedSession(cache=z, settings=z)>)Úreprr<   r>   r\   s    rE   Ú__repr__zCacheMixin.__repr__x  s&   € Ø&¤t¨D¯J©JÓ'7Ð&8¸ÀDÇMÁMÀ?ÐRTÐUÐUrF   r_   )NFFF)6Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r$   r    r   ÚboolÚstrr	   Úintr   r!   r"   rA   ÚclassmethodÚOriginalSessionrX   Úpropertyr   r>   Úsetterr,   r   rk   ro   rr   rx   r{   r~   r�   r
   rj   r   r¡   r   r   rš   r™   r˜   r¯   r   r»   r½   rÀ   rÃ   Ú__classcell__)rD   s   @rE   r&   r&   '   sæ  ø„ ñð !3Ø.2Ø/3Ø')Ø:>Ø#Ø*.Ø)=Ø+:Ø"'Ø,BØ49Ø.2Ø(,ØØ+0Øñ%*Gàð*Gð Ð*Ñ+ð*Gð ˜^Ñ,ð	*Gð
 %ð*Gð $Ð$6Ñ7ð*Gð ð*Gð # 3™-ð*Gð " #™ð*Gð $ C™=ð*Gð  ð*Gð % S™Mð*Gð ˜X c™]¨DÐ0Ñ1ð*Gð ˜NÑ+ð*Gð ˜Ñ%ð*Gð  ð!*Gð" ˜d C˜iÑ(ð#*Gð$ õ%*GðX ð Oð À,ò ó ðð. ð$˜-ò $ó ð$ð ‡_�_ð%˜mò %ó ð%ð ð*˜nò *ó ð*ð ×Ñð+ .ò +ó ð+ñA�sð A°kó Að6˜3ð 6¨[ó 6ð3˜ð 3¨+ó 3ñ>˜ð >°[ó >ñ=�sð =°Kó =ñ?˜ð ?°kó ?ð5˜#ð 5¨Kó 5ð 7;Ø'+Ø$ØØ#ò"Ràð"Rð ð"Rð
 ˜.¨¨c¨Ñ2Ñ3ð"Rð %ð"Rð ð"Rð ð"Rð ð"Rð 
õ"RðN (,Ø$ØØ#ñKLà ðKLð %ðKLð ð	KLð
 ðKLð ðKLð 
óKLðb 59ñ	Eà ðEð ðEð " .Ñ1ð	Eð 
õEð>@à ð@ð ð@ð (ð	@ð 
ó@ò,ð¨^ð Àlð ÐWbó ð ñ/ó ð/ô,òEöVrF   c                   ó   — e Zd ZdZy)r%   a@	  Session class that extends :py:class:`requests.Session` with caching features.

    See individual :py:mod:`backend classes <requests_cache.backends>` for additional
    backend-specific arguments. Also see :ref:`user-guide` for more details and examples on how the
    following arguments affect cache behavior.

    Args:
        cache_name: Used as a cache path, prefix, or namespace, depending on the backend
        backend: Cache backend name or instance; name may be one of
            ``['sqlite', 'filesystem', 'mongodb', 'gridfs', 'redis', 'dynamodb', 'memory']``
        serializer: Serializer name or instance; name may be one of
            ``['pickle', 'json', 'yaml', 'bson']``.
        expire_after: Time after which cached items will expire. See :ref:`expiration` for details.
        urls_expire_after: Expiration times to apply for different URL patterns
        cache_control: Use Cache-Control and other response headers to set expiration
        allowable_codes: Only cache responses with one of these status codes
        allowable_methods: Cache only responses for one of these HTTP methods
        always_revalidate: Revalidate with the server for every request, even if the cached response
            is not expired
        match_headers: Request headers to match, when `Vary` response header is not available. May
            be a list of headers, or ``True`` to match all.
        ignored_parameters: Request parameters, headers, and/or JSON body params to exclude from both
            request matching and cached request data
        read_only: Read existing cached responses, but do not write any new responses to the cache
        stale_if_error: Return a stale response if a new request raises an exception. Optionally
            accepts a time value representing maximum staleness to accept.
        stale_while_revalidate: Return a stale response initially, while a non-blocking request is
            sent to refresh the response for the next time it's requested
        autoclose: Close the cache backend when the session is closed
        filter_fn: Response filtering function that indicates whether or not a given response should
            be cached. See :ref:`custom-filtering` for details.
        key_fn: Request matching function for generating custom cache keys. See
            :ref:`custom-matching` for details.
    N)rÄ   rÅ   rÆ   rÇ   r;   rF   rE   r%   r%   |  s   „ ò!rF   rj   rH   c                 ó<   — t        | j                  xs ddd| ¬«      S )zHGet a 504: Not Cached error response, for use with only-if-cached optionÚ iø  z
Not Cached)rd   r¨   Úreasonrj   )r   rd   rv   s    rE   r—   r—   ¡  s$   € äØ�K‰KÒ˜2ØØØô	ð rF   N)6rÇ   Ú
contextlibr   r   Úloggingr   Ú	threadingr   r   Útypingr   r	   r
   r   r   Úrequestsr   r   rÌ   Úrequests.hooksr   Ú_utilsr   r   Úbackendsr   r   r   Úmodelsr   r   r   Úpolicyr   r   r   r   r   r   r   r    r!   r"   r#   Úserializersr$   Ú__all__Ú
MIXIN_BASEÚobjectrÄ   r›   r&   r%   r—   r;   rF   rE   ú<module>râ      sœ   ðÙ Jç 2Ý ß #ß KÕ Kå $Ý /Ý (ç 9ß ?Ñ ?ß AÑ A÷÷ ÷ ñ õ (à˜LÐ
)€ÙØ �Jà€Já	�8Ó	€ôRV�ô RVôj
"�J ô "ðJ˜oð °.ô rF   