
    ,Of/                         U 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m	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ dZee d<    G d de      Z!y)    N)datetimetimezone)Logger)TracebackType)AnyOptional)Response)CaseInsensitiveDict)get_encoding_from_headers)Self)Retry)ConnectionPool)MaxRetryError)HTTPResponse)GithubException)	Requester<   DEFAULT_SECONDARY_RATE_WAITc                        e Zd ZU dZdZee   ed<   eZ	e
fdededdf fdZdedef fd	Z	 	 	 	 	 	 dd
ee   dee   dee   dee   dee   dee   def fdZedededefd       ZdedededdfdZ xZS )GithubRetrya&  
    A Github-specific implementation of `urllib3.Retry`

    This retries 403 responses if they are retry-able. Github requests are retry-able when
    the response provides a `"Retry-After"` header, or the content indicates a rate limit error.

    By default, response codes 403, and 500 up to 599 are retried. This can be configured
    via the `status_forcelist` argument.

    By default, all methods defined in `Retry.DEFAULT_ALLOWED_METHODS` are retried, plus GET and POST.
    This can be configured via the `allowed_methods` argument.

    N_GithubRetry__loggersecondary_rate_waitkwargsreturnc           	          || _         |j                  dt        t        dd                  dgz   |d<   |j                  dt        j
                  j                  ddh            |d<   t        |    d	i | y)
z
        :param secondary_rate_wait: seconds to wait before retrying secondary rate limit errors
        :param kwargs: see urllib3.Retry for more arguments
        status_forcelisti  iX    allowed_methodsGETPOSTN )	r   getlistranger   DEFAULT_ALLOWED_METHODSunionsuper__init__)selfr   r   	__class__s      2lib/python3.12/site-packages/github/GithubRetry.pyr(   zGithubRetry.__init__H   sz    
 $7  &,ZZ0BDsTWDY%Z^a]b%b!"$*JJ/@%B_B_BeBeglntfuBv$w !"6"    kwc                 l    |j                  t        | j                               t        |   di |S )N)r   r!   )updatedictr   r'   new)r)   r-   r*   s     r+   r1   zGithubRetry.newU   s,    
		$4+C+CDEw{ R  r,   methodurlresponseerror_pool_stacktracec                    |r>|j                   dk(  r.| j                  t        j                  d| d| d|j                    d|j                          d|j
                  v r?| j                  t        j                  d|j
                  j                  d       d       n|j                  }	 | j                  ||      }t        j                  |      }|j                  d	      }	 t        j                  |      rt        j                  |      rdnd}
| j                  t        j                   d|
 d|        t"        | I  ||||||      }dt        j                  |      rd|j
                  v r|j
                  j                  d      }|r|j'                         r| j(                  j+                  t-        |      t.        j0                        }|| j(                  j3                  t.        j0                        z
  }|j5                         }|dkD  r3| j                  t        j                   dt7        |       d| d| d       |dz   n| j8                  |j;                         }|kD  r>dkD  r7| j                  t        j                   d| d dj=                  dd             |dt>        ffd}| j                  t        j                  d dj=                  dd             ||_        |S | j                  t        j                   d       t        j@                  |j                   |j
                  |      t"        | I  ||||||      S # t        $ rE}		 t        d
      |	# t        $ r'}	t        |j                   ||j
                        |	d }	~	ww xY wd }	~	ww xY w# tB        t        f$ r  t        $ rE}		 t        d      |	# t        $ r'}	t        |j                   ||j
                        |	d }	~	ww xY wd }	~	ww xY w) Nr   zRequest  z failed with z: zRetry-AfterzRetrying after z secondsmessagez"Failed to inspect response messageprimary	secondaryz#Response body indicates retry-able z rate limit error: g        zX-RateLimit-Resetr   zReset occurs in z (z / )   zRetry backoff of z)s exceeds required rate limit backoff of sz.0sr   c                       S Nr!   )backoffs   r+   get_backoff_timez/GithubRetry.increment.<locals>.get_backoff_time   s    '.r,   zSetting next backoff to z3Response message does not indicate retry-able errorz!Failed to determine retry backoff)"status_GithubRetry__logloggingINFOreasonheadersr"   get_contentjsonloads	ExceptionRuntimeErrorr   r   isRateLimitErrorisPrimaryRateLimitErrorDEBUGr'   	incrementisdigit_GithubRetry__datetimefromtimestampintr   utcnowtotal_secondsstrr   rC   replacefloatcreateExceptionr   )r)   r2   r3   r4   r5   r6   r7   contentr:   e	rate_typeretryvalueresetdeltaresetBackoffretry_backoffrC   rB   r*   s                     @r+   rR   zGithubRetry.incrementY   s     #%

LLvhauM(//9J"X__L]^ !H$4$44JJ)(*:*:*>*>}*M)NhW
 'ooG
e"&"2"28S"A"&**W"5")++i"8De$55g>5>5V5VW^5_	epI JJ '"Ei[Pcdkcl m %*G$5fc8UTY[f$gE '*G(@@I#6(:J:J#J,4,<,<,@,@AT,UE',040M0McRWjZbZfZf0g058K8KHLL8Y0Y7<7J7J7L+7!+;,0JJ072B3u:,bQVPWWZ[`Zaab0c-. 3?2B*.*B*B -2,B,B,DM,w6#*Q;$(JJ(/*;M? KJJQRS)UU\U\]bdgUh%&
 +8/e / !JJ '":7)1 E M MeUX Y 6FE2#(L

#MMQ (77IYIY[bcc$ w hukRRk % ee"./S"TZ[[+ e"1(//7HL\L\"]cddeeH *?; $ ee"./R"SYZZ+ e"1(//7HL\L\"]cddeesh   08M )HN) 9AN) 	N&"M..	N7"NNN!!N&)PO	O>"O99O>>PPrespc                    t               }t        | dd       |_        t        t        | di             |_        t        |j                        |_        | |_        |j                  j                  |_        ||_	        |j                  S )NrD   rI   )r	   getattrstatus_coder
   rI   r   encodingrawrH   r3   r^   )rg   r3   r4   s      r+   rJ   zGithubRetry.get_content   sv     :  'tXt< /wtY/KL 6h6F6FG",,--r,   levelr:   c                     | j                   t        j                  t              | _         | j                   j	                  |      r | j                   j
                  ||fi | y y rA   )r   rF   	getLogger__name__isEnabledForlog)r)   rm   r:   r   s       r+   __logzGithubRetry.__log   sP    == #--h7DM==%%e,DMMeW77 -r,   )NNNNNN)rp   
__module____qualname____doc__r   r   r   __annotations__r   rT   r   r\   r   r(   r   r1   rZ   r   rM   r   r   r   rR   staticmethodbytesrJ   rV   rE   __classcell__)r*   s   @r+   r   r   3   s&    "&Hhv% J4O #E #[^ #cg #! ! ! !%!+/%)*./3tStS c]tS <(	tS
 	"tS 'tS m,tS 
tSl  ,  S  U    &83 8 8 8 8r,   r   )"rK   rF   r   r   r   typesr   typingr   r   requestsr	   requests.modelsr
   requests.utilsr   typing_extensionsr   urllib3r   urllib3.connectionpoolr   urllib3.exceptionsr   urllib3.responser   github.GithubExceptionr   github.Requesterr   r   rV   rw   r   r!   r,   r+   <module>r      sP   :   '      / 4 "  1 , ) 2 &#% S %t8% t8r,   