U
    k7g0                     @   sj  d dl Z d dlZd dl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mZmZmZmZmZmZ d dlmZmZmZ d dlmZ d dlmZ d	d
lmZmZ ej dkrd dl	m!Z! nd dl"m!Z! G dd de!Z#eeef Z$ee$ee$ ee$df f Z%ee#ej&f Z'edee f Z(eG dd dZ)G dd dZ*e%eedf dddZ+G dd dZ,dS )    N)abstractmethod)	dataclass)TracebackType)
Any	AwaitableCallableDict	GeneratorListOptionalTupleTypeUnion)ClientResponseClientSessionhdrs)StrOrURL)URL   )ExponentialRetryRetryOptionsBase)      )Protocolc                   @   sX   e Zd ZdZeeeeddddZeeeeddddZeeeedddd	Z	dS )
_LoggerzA
    _Logger defines which methods logger object should have
    N)msgargskwargsreturnc                 O   s   d S N selfr   r   r   r    r    8/tmp/pip-unpacked-wheel-yoynr8kt/aiohttp_retry/client.pydebug%   s    z_Logger.debugc                 O   s   d S r   r    r!   r    r    r#   warning(   s    z_Logger.warningc                 O   s   d S r   r    r!   r    r    r#   	exception+   s    z_Logger.exception)
__name__
__module____qualname____doc__r   strr   r$   r%   r&   r    r    r    r#   r       s   r   .c                   @   sf   e Zd ZU eed< eed< dZeeee	f  ed< dZ
eeee	f  ed< dZeeee	f  ed< dS )RequestParamsmethodurlNheaderstrace_request_ctxr   )r'   r(   r)   r+   __annotations___RAW_URL_TYPEr/   r   r   r   r0   r   r    r    r    r#   r,   7   s
   
r,   c                   @   s   e Zd Zdeee eeeddddZ	e
edddZed	d
dZeedef d	ddZed	ddZeee  ee ee ddddZdS )_RequestContextFN)request_funcparams_listloggerretry_optionsraise_for_statusr   c                 C   s8   t |dkst|| _|| _|| _|| _|| _d | _d S )Nr   )lenAssertionError_request_func_params_list_logger_retry_options_raise_for_status	_response)r"   r4   r5   r6   r7   r8   r    r    r#   __init__A   s    z_RequestContext.__init__)coder   c                 C   s    |dkr| j jrdS || j jkS )Ni  F)r>   Zretry_all_server_errorsZstatuses)r"   rB   r    r    r#   _is_status_code_okS   s    z"_RequestContext._is_status_code_okr   c              
      s  d}| j d|d  d| jj  |d7 }z<z| j|d  }W n tk
r`   | jd }Y nX | j|j|jf|j	d|i|j
pi d|jpi I d H }| |js|| jjkrD| jr|  | jjd k	rz| j|I d H }W n& tk
r   | j d d	}Y nX nd
}|s*|| jjkr6|| _|W S | j d n| j d|j  | jj||d}W n tk
r   z`|| jjkr t fdd| jjD }|s | j dt   | jj|d d}W 5 d   X Y nX t|I d H  qd S )Nr   zAttempt r   z out of current_attempt)r/   r0   z/while evaluating response an exception occurredFTz/Retrying after evaluate response callback checkzRetrying after response code: )attemptresponsec                    s   g | ]}t  |qS r    )
isinstance).0excer    r#   
<listcomp>   s     z/_RequestContext._do_request.<locals>.<listcomp>zRetrying after exception: )r=   r$   r>   attemptsr<   
IndexErrorr;   r-   r.   r/   r0   r   rC   statusr?   r8   Zevaluate_response_callback	Exceptionr&   r@   Zget_timeoutany
exceptionsreprasynciosleep)r"   rF   paramsrH   Zis_response_correctZ
retry_waitZis_exc_validr    rL   r#   _do_requestX   s\      "z_RequestContext._do_requestc                 C   s   |    S r   )
__aenter__	__await__r"   r    r    r#   r[      s    z_RequestContext.__await__c                    s   |   I d H S r   )rY   r\   r    r    r#   rZ      s    z_RequestContext.__aenter__exc_typeexc_valexc_tbr   c                    s    | j d k	r| j js| j   d S r   )r@   closedcloser"   r^   r_   r`   r    r    r#   	__aexit__   s    
z_RequestContext.__aexit__)F)r'   r(   r)   RequestFuncr
   r,   _LoggerTyper   boolrA   intrC   r   rY   r	   r   r[   rZ   r   r   BaseExceptionr   rd   r    r    r    r#   r3   @   s$    9
r3   )r.   r   c                 C   s^   t | tst | tr| fS t | tr.t| }nt | tr>| }ntdt|dkrZtd|S )Nz*you can pass url only by str or list/tupler   z>you can pass url by str or list/tuple with attempts count size)rI   r+   YARL_URLlisttuple
ValueErrorr9   )r.   urlsr    r    r#   _url_to_urls   s    


ro   c                	   @   s  e Zd Zd+ee ee ee eeeddddZ	e
edddZd,ee ee ee ed	d
dZd-eeee ee eedddZd.eee ee eedddZd/eee ee eedddZd0eee ee eedddZd1eee ee eedddZd2eee ee eedddZd3eee ee eedddZd4eee ee eedddZddddZd5eeee ee eedd d!Zd6ee ee ee ed	d"d#Zd dd$d%Zeee   ee  ee! dd&d'd(Z"ddd)d*Z#dS )7RetryClientNF)client_sessionr6   r7   r8   r   r   r   c           	      O   sR   |d k	r|}d }nt ||}d}|| _|| _|p8td| _|pDt | _|| _d S )NFZaiohttp_retry)	r   _client_closedlogging	getLoggerr=   r   r>   r?   )	r"   rq   r6   r7   r8   r   r   clientra   r    r    r#   rA      s    	
zRetryClient.__init__rD   c                 C   s   | j S r   )r>   r\   r    r    r#   r7      s    zRetryClient.retry_options)r5   r7   r8   r   c                 C   s   | j |||dS )Nr5   r7   r8   )_make_requestsr"   r5   r7   r8   r    r    r#   requests   s
    zRetryClient.requests)r-   r.   r7   r8   r   r   c                 K   s   | j f ||||d|S N)r-   r.   r7   r8   )_make_request)r"   r-   r.   r7   r8   r   r    r    r#   request   s    zRetryClient.request)r.   r7   r8   r   r   c                 K   s   | j f tj|||d|S r{   )r|   r   ZMETH_GETr"   r.   r7   r8   r   r    r    r#   get   s    zRetryClient.getc                 K   s   | j f tj|||d|S r{   )r|   r   ZMETH_OPTIONSr~   r    r    r#   options   s    zRetryClient.optionsc                 K   s   | j f tj|||d|S r{   )r|   r   Z	METH_HEADr~   r    r    r#   head	  s    zRetryClient.headc                 K   s   | j f tj|||d|S r{   )r|   r   Z	METH_POSTr~   r    r    r#   post  s    zRetryClient.postc                 K   s   | j f tj|||d|S r{   )r|   r   ZMETH_PUTr~   r    r    r#   put&  s    zRetryClient.putc                 K   s   | j f tj|||d|S r{   )r|   r   Z
METH_PATCHr~   r    r    r#   patch5  s    zRetryClient.patchc                 K   s   | j f tj|||d|S r{   )r|   r   ZMETH_DELETEr~   r    r    r#   deleteD  s    zRetryClient.deletec                    s   | j  I d H  d| _d S )NT)rr   rb   rs   r\   r    r    r#   rb   S  s    zRetryClient.closec                    s,   t |} fdd|D }| j|||dS )Nc              
      s.   g | ]&}t | d i  dd dqS )r/   r0   N)r-   r.   r/   r0   r   )r,   pop)rJ   r.   r   r-   r    r#   rN   `  s   

z-RetryClient._make_request.<locals>.<listcomp>rw   )ro   rx   )r"   r-   r.   r7   r8   r   Zurl_listr5   r    r   r#   r|   W  s    zRetryClient._make_requestc                 C   s4   |d kr| j }|d kr| j}t| jj|| j||dS )N)r4   r5   r6   r7   r8   )r>   r?   r3   rr   r}   r=   ry   r    r    r#   rx   n  s    zRetryClient._make_requestsc                    s   | S r   r    r\   r    r    r#   rZ     s    zRetryClient.__aenter__r]   c                    s   |   I d H  d S r   )rb   rc   r    r    r#   rd     s    zRetryClient.__aexit__c                 C   s*   t | dd d krd S | js&| jd d S )Nrs   z#Aiohttp retry client was not closed)getattrrs   r=   r%   r\   r    r    r#   __del__  s    zRetryClient.__del__)NNNF)NN)NN)NN)NN)NN)NN)NN)NN)NN)NN)NN)$r'   r(   r)   r   r   rf   r   rg   r   rA   propertyr7   r
   r,   r3   rz   r+   r   r}   	_URL_TYPEr   r   r   r   r   r   r   rb   r|   rx   rZ   r   ri   r   rd   r   r    r    r    r#   rp      s                              
rp   )-rV   rt   sysabcr   Zdataclassesr   typesr   typingr   r   r   r   r	   r
   r   r   r   r   Zaiohttpr   r   r   Zaiohttp.typedefsr   Zyarlr   rj   r7   r   r   version_infor   Ztyping_extensionsr   r2   r   Loggerrf   re   r,   r3   ro   rp   r    r    r    r#   <module>   s.   0
b