Ë
    Eü´jò5  ã                  óÖ  — d Z ddlmZ ddlZddlZddlZddl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mZmZ dd	lm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 m!Z!m"Z"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l0m1Z1 erddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9  ejt                  e;«      Z< G d„ de«      Z= ed¬«       G d„ de=«      «       Z> G d„ d«      Z?dedœ	 	 	 	 	 dd„Z@y)zBprawcore.sessions: Provides prawcore.Session and prawcore.session.é    )ÚannotationsN)ÚABCÚabstractmethod)Údeepcopy)Ú	dataclass)Úpformat)ÚIOÚTYPE_CHECKINGÚAnyÚClassVar)Úurljoin)Úcodes)ÚBaseAuthorizer)ÚTIMEOUTÚWINDOW_SIZE)ÚBadJSONÚ
BadRequestÚConflictÚInvalidInvocationÚNotFoundÚRedirectÚRequestExceptionÚResponseExceptionÚServerErrorÚSpecialErrorÚTooLargeÚTooManyRequestsÚUnavailableForLegalReasonsÚ
URITooLong)ÚRateLimiter)Úauthorization_error_class)ÚMapping)ÚResponse)ÚSelf)Ú	Requestorc                  óN   — e Zd ZdZedd„«       Zedd„«       Zed	d„«       Zd
d„Zy)ÚRetryStrategyz¯An abstract class for scheduling request retries.

    The strategy controls both the number and frequency of retry attempts.

    Instances of this class are immutable.

    c                 ó   — y )N© ©Úselfs    úO/root/workspace/ytshorts/venv/lib/python3.12/site-packages/prawcore/sessions.pyÚ_sleep_secondszRetryStrategy._sleep_seconds;   s   € àó    c                 ó   — y)úAllow one fewer retry.Nr)   r*   s    r,   Úconsume_available_retryz%RetryStrategy.consume_available_retry?   ó   � r.   c                 ó   — y)z*Return ``True`` when a retry should occur.Nr)   r*   s    r,   Úshould_retry_on_failurez%RetryStrategy.should_retry_on_failureC   r2   r.   c                óŒ   — | j                  «       x}�2d|d›d�}t        j                  |«       t        j                  |«       yy)z0Sleep until we are ready to attempt the request.Nz
Sleeping: z0.2fz seconds prior to retry)r-   ÚlogÚdebugÚtimeÚsleep)r+   Úsleep_secondsÚmessages      r,   r9   zRetryStrategy.sleepG   sF   € à!×0Ñ0Ó2Ð2ˆMÐ?Ø" =°Ð"6Ð6MÐNˆGÜ�I‰I�gÔÜ�J‰J�}Õ%ð @r.   N©Úreturnzfloat | None)r=   r'   ©r=   Úbool©r=   ÚNone)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r-   r1   r4   r9   r)   r.   r,   r'   r'   2   sH   „ ñð òó ðð ò%ó ð%ð ò9ó ð9ô&r.   r'   T)Úfrozenc                  óF   — e Zd ZU dZdZded<   eZded<   dd„Zdd„Zdd	„Z	y
)ÚFiniteRetryStrategyzIA :class:`.RetryStrategy` that retries requests a finite number of times.é   zClassVar[int]ÚDEFAULT_RETRIESÚintÚretriesc                ó�   — | j                   | j                  k  r-| j                   dkD  rdnd}|dt        j                  «       z  z   S y )Nr   rI   )rL   rJ   Úrandom)r+   Úbases     r,   r-   z"FiniteRetryStrategy._sleep_secondsW   s?   € Ø�<‰<˜$×.Ñ.Ò.ØŸ™ qÒ(‘1¨aˆDØ˜!œfŸm™m›oÑ-Ñ-Ð-Ør.   c                ó@   —  t        | «      | j                  dz
  ¬«      S )r0   é   ©rL   )ÚtyperL   r*   s    r,   r1   z+FiniteRetryStrategy.consume_available_retry]   s   € àŒt�D‹z $§,¡,°Ñ"2Ô3Ð3r.   c                ó    — | j                   dkD  S )zEReturn ``True`` if and only if the strategy will allow another retry.r   rR   r*   s    r,   r4   z+FiniteRetryStrategy.should_retry_on_failurea   s   € à�|‰|˜aÑÐr.   Nr<   )r=   rH   r>   )
rB   rC   rD   rE   rJ   Ú__annotations__rL   r-   r1   r4   r)   r.   r,   rH   rH   O   s(   … áSà%&€O�]Ó&à"€GˆSÓ"óó4ô r.   rH   c                  ó   — e Zd ZU dZej
                  j                  ej
                  j                  ej
                  j                  fZ	dde
d   e
d   e
d   e
d   e
d   hZd	ed
<   i e
d   e“e
d   e“e
d   e“e
d   e“e
d   e“e
d   e“e
d   e“e
d   e“e
d   e“e
d   e“e
d   e“e
d   e“e
d   e“e
d   e“e
d   e“e
d   e“de“dei¥Zd	ed<   e
d   e
d   e
d   hZd	ed<   ed-d„«       Ze	 	 	 	 	 	 	 	 	 	 d.d„«       Zed/d„«       Zed0d„«       Zd1d „Z d2d!„Z!e"d"œ	 	 	 	 	 d3d#„Z#	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d4d$„Z$	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d5d%„Z%d&d'œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d6d(„Z&d7d)„Z'd8d*„Z(d&d&d&d&e)d+œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d9d,„Z*y&):ÚSessionz3The low-level connection interface to Reddit's API.i  i
  Úbad_gatewayÚgateway_timeoutÚinternal_server_errorÚrequest_timeoutÚservice_unavailabler   ÚRETRY_STATUSESÚbad_requestÚconflictÚfoundÚ	forbiddenÚ
media_typeÚmoved_permanentlyÚ	not_foundÚrequest_entity_too_largeÚrequest_uri_too_largeÚtoo_many_requestsÚunauthorizedÚunavailable_for_legal_reasonsÚSTATUS_EXCEPTIONSÚacceptedÚcreatedÚokÚSUCCESS_STATUSESc                ó   — | j                   S )z?Return the :class:`.BaseAuthorizer` used to authorize requests.)Ú_authorizerr*   s    r,   Ú
authorizerzSession.authorizer�   s   € ð ×ÑÐr.   c                óÔ   — t         j                  d||t        j                  «       «       t         j                  dt	        | «      «       t         j                  dt	        |«      «       y )NzFetching: %s %s at %szData: %sz
Params: %s)r6   r7   r8   Ú	monotonicr   ©ÚdataÚmethodÚparamsÚurls       r,   Ú_log_requestzSession._log_request”   sB   € ô 	�	‰	Ð)¨6°3¼¿¹Ó8HÔIÜ�	‰	�*œg d›mÔ,Ü�	‰	�,¤¨£Õ0r.   c                ó   — | j                   S )z9Return the :class:`.RateLimiter` that throttles requests.)Ú_rate_limiterr*   s    r,   Úrate_limiterzSession.rate_limiter    s   € ð ×!Ñ!Ð!r.   c                óB   — | j                   j                  j                  S )z;Return the :class:`.Requestor` used to issue HTTP requests.)rp   ÚauthenticatorÚ	requestorr*   s    r,   r   zSession.requestor¥   s   € ð ×Ñ×-Ñ-×7Ñ7Ð7r.   c                ó   — | S )ú2Allow this object to be used as a context manager.r)   r*   s    r,   Ú	__enter__zSession.__enter__ª   s   € àˆr.   c                ó$   — | j                  «        y)r�   N)Úclose)r+   Ú_argss     r,   Ú__exit__zSession.__exit__®   s   € à�
‰
�r.   ©Úwindow_sizec               óŠ   — t        |t        «      sd|› �}t        |«      ‚|| _        t	        |¬«      | _        t        | _        y)zÂPrepare the connection to Reddit's API.

        :param authorizer: An instance of :class:`.Authorizer`.
        :param window_size: The size of the rate limit reset window in seconds.

        zinvalid Authorizer: r‡   N)Ú
isinstancer   r   rp   r    r{   rH   Ú_retry_strategy_class)r+   rq   rˆ   Úmsgs       r,   Ú__init__zSession.__init__²   sB   € ô ˜*¤nÔ5Ø(¨¨Ð5ˆCÜ# CÓ(Ð(Ø%ˆÔÜ(°[ÔAˆÔÜ%8ˆÕ"r.   c       	   
     ó€   — t         j                  d|||	«       | j                  ||||||j                  «       ||	¬«      S )NzRetrying due to %s: %s %s)ru   ÚfilesÚjsonrv   rw   Úretry_strategy_stateÚtimeoutrx   )r6   ÚwarningÚ_request_with_retriesr1   )
r+   ru   r�   r�   rv   rw   r‘   Ústatusr’   rx   s
             r,   Ú	_do_retryzSession._do_retryÅ   sP   € ô 	�‰Ð/°¸ÀÔEØ×)Ñ)ØØØØØØ!5×!MÑ!MÓ!OØØð *ó 	
ð 		
r.   c               óÂ  — | j                   j                  d|||||| j                  j                  | j                  ||¬«
      }t
        j                  d|j                  |j                  j                  d«      |j                  j                  d«      |j                  j                  d«      |j                  j                  d«      t        j                  «       «       |S )NF)
Úallow_redirectsru   r�   r�   rv   rw   Úrequest_functionÚset_header_callbackr’   rx   z?Response: %s (%s bytes) (rst-%s:rem-%s:used-%s ratelimit) at %súcontent-lengthzx-ratelimit-resetzx-ratelimit-remainingzx-ratelimit-used)r{   Úcallr   ÚrequestÚ_set_header_callbackr6   r7   Ústatus_codeÚheadersÚgetr8   rs   )	r+   ru   r�   r�   rv   rw   r’   rx   Úresponses	            r,   Ú_make_requestzSession._make_requestÞ   sÌ   € ð ×%Ñ%×*Ñ*Ø!ØØØØØØ!Ÿ^™^×3Ñ3Ø $× 9Ñ 9ØØð +ó 
ˆô 	�	‰	ØMØ× Ñ Ø×Ñ× Ñ Ð!1Ó2Ø×Ñ× Ñ Ð!4Ó5Ø×Ñ× Ñ Ð!8Ó9Ø×Ñ× Ñ Ð!3Ó4Ü�N‰NÓô	
ð ˆr.   N)r‘   c               óT  — |€| j                  «       }|j                  «        | j                  ||||¬«       	 | j                  |||||||¬«      }	d }|	j                  t        d   k(  r@| j                  j                  «        t        | j                  d«      r7|	j                  › d�}n'|	j                  | j                   v r|	j                  › d�}|�*|j                  «       r| j                  |||||||||¬«	      S |	j                  t        d   k(  ry |	j                  | j"                  v r | j"                  |	j                     |	«      ‚|	j                  | j$                  vrt'        |	«      ‚|	j(                  j+                  d«      d	k(  ry
	 |	j-                  «       S # t        $ rh}
|j                  «       rRt        |
j                  | j                  «      r2| j                  ||||||t        |
j                  «      ||¬«	      cY d }
~
S ‚ d }
~
ww xY w# t.        $ r t1        |	«      d ‚w xY w)Nrt   ©ru   r�   r�   rv   rw   r’   rx   )	ru   r�   r�   rv   rw   r‘   r•   r’   rx   rh   Úrefreshz statusÚ
no_contentr›   Ú0Ú )r‹   r9   ry   r£   r   r4   rŠ   Úoriginal_exceptionÚRETRY_EXCEPTIONSr–   ÚreprrŸ   r   rp   Ú_clear_access_tokenÚhasattrr]   rj   rn   r   r    r¡   r�   Ú
ValueErrorr   )r+   ru   r�   r�   rv   rw   r‘   r’   rx   r¢   Ú	exceptionÚretry_statuss               r,   r”   zSession._request_with_retries   sU  € ð  Ð'Ø#'×#=Ñ#=Ó#?Ð à×"Ñ"Ô$Ø×Ñ˜t¨F¸6ÀsÐÔKð	Ø×)Ñ)ØØØØØØØð *ó ˆHð6 ˆØ×Ñ¤5¨Ñ#8Ò8à×Ñ×0Ñ0Ô2Ü�t×'Ñ'¨Ô3Ø"*×"6Ñ"6Ð!7°wÐ?‘Ø×!Ñ! T×%8Ñ%8Ñ8Ø&×2Ñ2Ð3°7Ð;ˆLàÐ#Ð(<×(TÑ(TÔ(VØ—>‘>ØØØØØØ%9Ø#ØØð "ó 
ð 
ð ×Ñ¤5¨Ñ#6Ò6ØØ×Ñ 4×#9Ñ#9Ñ9Ø>�$×(Ñ(¨×)=Ñ)=Ñ>¸xÓHÐHØ×Ñ t×'<Ñ'<Ñ<Ü# HÓ-Ð-Ø×Ñ×ÑÐ 0Ó1°SÒ8Øð	.Ø—=‘=“?Ð"øôa  ò 	Ø#×;Ñ;Ô=Ä*Ø×,Ñ,Ø×%Ñ%ôCð —~‘~ØØØØ!Ø!Ø)=Ü 	× <Ñ <Ó=Ø#Øð &ó 
õ 
ð ûð!	ûôb ò 	.Ü˜(Ó#¨Ð-ð	.ús0   ¹F ÆH Æ	HÆ&AH	ÈHÈH	È	HÈH'c                ó¬   — t        | j                  dd «      }| j                  j                  «       s	|� |«        dd| j                  j                  › �iS )Nr¦   ÚAuthorizationzbearer )Úgetattrrp   Úis_validÚaccess_token)r+   Úrefresh_methods     r,   rž   zSession._set_header_callbackP  sR   € Ü  ×!1Ñ!1°9¸dÓCˆØ×Ñ×(Ñ(Ô*¨~Ð/IÙÔØ 7¨4×+;Ñ+;×+HÑ+HÐ*IÐ!JÐKÐKr.   c                ó8   — | j                   j                  «        y)z+Close the session and perform any clean up.N)r   r„   r*   s    r,   r„   zSession.closeV  s   € à�‰×ÑÕr.   )ru   r�   r�   rw   r’   c          	     ód  — |rt        t        |«      «      ni }d|d<   t        |t        «      r*t        |«      }d|d<   t        |j	                  «       «      }n|}t        |t        «      rt        |«      }d|d<   t        | j                  j                  |«      }	| j                  |||||||	¬«      S )aƒ  Return the json content from the resource at ``path``.

        :param data: Dictionary, bytes, or file-like object to send in the body of the
            request.
        :param files: Dictionary, mapping ``filename`` to file-like object.
        :param json: Object to be serialized to JSON in the body of the request.
        :param method: The request verb. E.g., ``"GET"``, ``"POST"``, ``"PUT"``.
        :param params: The query parameters to send with the request.
        :param path: The path of the request. This path will be combined with the
            ``oauth_url`` of the Requestor.
        :param timeout: Specifies a particular timeout, in seconds.

        Automatically refreshes the access token if it becomes invalid and a refresh
        token is available.

        :raises: :class:`.InvalidInvocation` in such a case if a refresh token is not
            available.

        rQ   Úraw_jsonr�   Úapi_typer¥   )	r   ÚdictrŠ   ÚsortedÚitemsr   r   Ú	oauth_urlr”   )
r+   ru   r�   r�   rv   rw   Úpathr’   Ú	data_listrx   s
             r,   r�   zSession.requestZ  s²   € ñ< ,2”œ$˜v›,Ô'°rˆØˆˆzÑÜ�dœDÔ!Ü˜D“>ˆDØ%ˆD�ÑÜ˜tŸz™z›|Ó,‰IàˆIÜ�dœDÔ!Ü˜D“>ˆDØ%ˆD�ÑÜ�d—n‘n×.Ñ.°Ó5ˆØ×)Ñ)ØØØØØØØð *ó 
ð 	
r.   )r=   r   )
ru   ú7list[tuple[str, object]] | bytes | IO[Any] | str | Nonerv   Ústrrw   údict[str, object]rx   rÃ   r=   rA   )r=   r    )r=   r%   )r=   r$   )r…   Úobjectr=   rA   )rq   úBaseAuthorizer | Nonerˆ   rK   r=   rA   )ru   rÂ   r�   údict[str, IO[Any]] | Noner�   ú'dict[str, object] | list[object] | Nonerv   rÃ   rw   rÄ   r‘   rH   r•   rÃ   r’   Úfloatrx   rÃ   r=   údict[str, object] | str | None)ru   rÂ   r�   rÇ   r�   rÈ   rv   rÃ   rw   rÄ   r’   rÉ   rx   rÃ   r=   r#   )ru   rÂ   r�   rÇ   r�   rÈ   rv   rÃ   rw   rÄ   r‘   zFiniteRetryStrategy | Noner’   rÉ   rx   rÃ   r=   rÊ   )r=   zdict[str, str]r@   )ru   z0dict[str, object] | bytes | IO[Any] | str | Noner�   rÇ   r�   rÈ   rv   rÃ   rw   zMapping[str, object] | NonerÀ   rÃ   r’   rÉ   r=   rÊ   )+rB   rC   rD   rE   ÚrequestsÚ
exceptionsÚChunkedEncodingErrorÚConnectionErrorÚReadTimeoutr«   r   r]   rU   r   r   r   r   r!   r   r   r   r   r   r   rj   rn   Úpropertyrq   Ústaticmethodry   r|   r   r‚   r†   r   r�   r–   r£   r”   rž   r„   r   r�   r)   r.   r,   rW   rW   f   s4  … Ù=ð 	×Ñ×0Ñ0Ø×Ñ×+Ñ+Ø×Ñ×'Ñ'ðÐð 	ØØˆmÑØÐÑ ØÐ%Ñ&ØÐÑ ØÐ#Ñ$ð €N�Hó ð#ØˆmÑ˜kð#àˆmÑ˜jð#ð 	ˆjÑ˜8ð#ð 	ˆg‰˜ð	#ð
 	ˆkÑÐ5ð#ð 	ÐÑ  +ð#ð 	Ð%Ñ&¨ð#ð 	ˆlÑ˜\ð#ð 	Ð!Ñ" Hð#ð 	ˆkÑ˜Hð#ð 	Ð(Ñ)¨8ð#ð 	Ð%Ñ&¨
ð#ð 	Ð#Ñ$ kð#ð 	Ð!Ñ" Oð#ð 	ˆnÑÐ8ð#ð  	Ø+ñ	
à%ð%#ð& 	ˆ[ð'#ð( 	ˆ[ñ)#Ð�xó ð, #(¨
Ñ"3°U¸9Ñ5EÀuÈTÁ{Ð!SÐ�hÓSàò ó ð ð ð	1àEð	1ð ð	1ð "ð		1ð
 ð	1ð 
ò	1ó ð	1ð ò"ó ð"ð ò8ó ð8óóð 'ñ	9ð *ð9ð ð	9ð
 
ó9ð&
ð Fð
ð )ð	
ð
 6ð
ð ð
ð "ð
ð 2ð
ð ð
ð ð
ð ð
ð 
(ó
ð2 ð Fð ð )ð	 ð
 6ð ð ð ð "ð ð ð ð ð ð 
ó ðT <@ñN.ð FðN.ð )ð	N.ð
 6ðN.ð ðN.ð "ðN.ð 9ðN.ð ðN.ð ðN.ð 
(óN.ó`Lóð BFØ+/Ø8<à.2à ñ2
ð ?ð2
ð )ð	2
ð
 6ð2
ð ð2
ð ,ð2
ð ð2
ð ð2
ð 
(ô2
r.   rW   ©rq   rˆ   c                ó   — t        | |¬«      S )z·Return a :class:`.Session` instance.

    :param authorizer: An instance of :class:`.BaseAuthorizer`.
    :param window_size: The size of the rate limit reset window in seconds.

    rÒ   )rW   rÒ   s     r,   ÚsessionrÔ   �  s   € ô ˜j°kÔBÐBr.   )rq   rÆ   rˆ   rK   r=   rW   )ArE   Ú
__future__r   ÚloggingrN   r8   Úabcr   r   Úcopyr   Údataclassesr   Úpprintr   Útypingr	   r
   r   r   Úurllib.parser   Úrequests.exceptionsrË   Úrequests.status_codesr   Úprawcore.authr   Úprawcore.constr   r   Úprawcore.exceptionsr   r   r   r   r   r   r   r   r   r   r   r   r   r   Úprawcore.rate_limitr    Úprawcore.utilr!   Úcollections.abcr"   Úrequests.modelsr#   Útyping_extensionsr$   Úprawcore.requestorr%   Ú	getLoggerÚ__package__r6   r'   rH   rW   rÔ   r)   r.   r,   ú<module>rê      sØ   ðÙ Hå "ã Û Û ß #Ý Ý !Ý ß 3Ó 3Ý  ã Ý 'å (ß /÷÷ ÷ ÷ õ  ,Ý 3áÝ'å(Ý&å,à€g×Ñ˜Ó$€ô&�Cô &ñ: �$Ôô ˜-ó  ó ð ÷,f
ñ f
ðV	 )-Ø"ñCà%ðCð ðCð ô	Cr.   