U
    ˜¤Œ]M'  ã                   @   sÎ   d dl Z d dlZd dlZd dlZd dlmZ ddlmZmZ ddl	m
Z
mZmZmZ ddlmZmZmZmZmZmZmZ dadd	œd
d„ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )é    N)ÚTracebackTypeé   )Ú
PoolLimitsÚTimeoutConfig)ÚConnectTimeoutÚPoolTimeoutÚReadTimeoutÚWriteTimeouté   )ÚBaseBackgroundManagerÚ	BaseEventÚBasePoolSemaphoreÚ	BaseQueueÚBaseTCPStreamÚConcurrencyBackendÚTimeoutFlagF©Úreturnc                     s,   t jj} | j‰ tddœ‡ fdd„}|| _dS )a=  
    Monkey-patch for https://bugs.python.org/issue36709

    This prevents console errors when outstanding HTTPS connections
    still exist at the point of exiting.

    Clients which have been opened using a `with` block, or which have
    had `close()` closed, will not exhibit this issue in the first place.
    N©Údatar   c                    s   | j r| j  ¡ sˆ | |ƒ d S ©N)Ú_loopZ	is_closed©Úselfr   ©Z_write© úy/var/www/html/staging.mfahmagazine.net/magazine_api/magazine_env/lib/python3.8/site-packages/httpx/concurrency/asyncio.pyÚ_fixed_write$   s    z&ssl_monkey_patch.<locals>._fixed_write)ÚasyncioÚselector_eventsZ_SelectorSocketTransportÚwriteÚbytes)ZMonkeyPatchr   r   r   r   Ússl_monkey_patch   s    
r"   c                   @   sˆ   e Zd Zejejedœdd„Zedœdd„Z	de
eeedœd	d
„Zeddœdd„Zdeeeddœdd„Zedœdd„Zddœdd„ZdS )Ú	TCPStream©Ústream_readerÚstream_writerÚtimeoutc                 C   s   || _ || _|| _d S r   r$   )r   r%   r&   r'   r   r   r   Ú__init__,   s    zTCPStream.__init__r   c                 C   s<   | j  d¡}|d krdS | ¡ }|d kr,dS |dkr8dS dS )NÚ
ssl_objectzHTTP/1.1Zh2zHTTP/2)r&   Zget_extra_infoZselected_alpn_protocol)r   r)   Úidentr   r   r   Úget_http_version6   s    zTCPStream.get_http_versionN)Únr'   Úflagr   c                 Ã   s†   |d kr| j }|d kp|j}|r&|jnd}z"t | j |¡|¡I d H }W q‚W q tjk
r~   |rjtƒ d ‚t 	d¡I d H  Y qX q|S )Ng{®Gáz„?r   )
r'   Zraise_on_read_timeoutÚread_timeoutr   Úwait_forr%   ÚreadÚTimeoutErrorr   Úsleep)r   r,   r'   r-   Úshould_raiser.   r   r   r   r   r0   C   s    zTCPStream.readr   c                 C   s   | j  |¡ d S r   )r&   r    r   r   r   r   Úwrite_no_block]   s    zTCPStream.write_no_block)r   r'   r-   r   c                 Ã   s|   |sd S |d kr| j }| j |¡ z"t | j ¡ |j¡I d H  W qxW q" tjk
rt   |d kpb|j}|rpt	ƒ d ‚Y q"X q"d S r   )
r'   r&   r    r   r/   ZdrainZwrite_timeoutr1   Zraise_on_write_timeoutr	   )r   r   r'   r-   r3   r   r   r   r    `   s     ÿ
zTCPStream.writec                 C   s
   | j  ¡ S r   )r%   Zat_eof©r   r   r   r   Úis_connection_droppedx   s    zTCPStream.is_connection_droppedc                 Ã   s   | j  ¡  d S r   )r&   Úcloser5   r   r   r   r7   ‰   s    zTCPStream.close)NN)NN)Ú__name__Ú
__module__Ú__qualname__r   ÚStreamReaderÚStreamWriterr   r(   Ústrr+   Úintr   r!   r0   r4   r    Úboolr6   r7   r   r   r   r   r#   +   s0   ü
   ÿ  þ   ÿ  þr#   c                   @   sP   e Zd Zedœdd„Zeejej	 dœdd„ƒZ
ddœdd	„Zddœd
d„ZdS )ÚPoolSemaphore©Úpool_limitsc                 C   s
   || _ d S r   rA   )r   rB   r   r   r   r(   Ž   s    zPoolSemaphore.__init__r   c                 C   s6   t | dƒs0| jj}|d kr"d | _ntj|d�| _| jS )NÚ
_semaphore)Úvalue)ÚhasattrrB   Z
hard_limitrC   r   ÚBoundedSemaphore)r   Zmax_connectionsr   r   r   Ú	semaphore‘   s    
zPoolSemaphore.semaphoreNc                 Ã   sT   | j d krd S | jj}zt | j  ¡ |¡I d H  W n tjk
rN   tƒ ‚Y nX d S r   )rG   rB   Zpool_timeoutr   r/   Úacquirer1   r   )r   r'   r   r   r   rH   ›   s    
zPoolSemaphore.acquirec                 C   s   | j d krd S | j  ¡  d S r   )rG   Úreleaser5   r   r   r   rI   ¥   s    
zPoolSemaphore.release)r8   r9   r:   r   r(   ÚpropertyÚtypingÚOptionalr   rF   rG   rH   rI   r   r   r   r   r@   �   s
   	
r@   c                   @   sà   e Zd Zddœdd„Zeejdœdd„ƒZee	e
jej eedœdd	„Zeeejeed
œdd„Ze
je
je
je
jdœdd„Ze
je
je
je
jdœdd„Zeedœdd„Ze	edœdd„Zedœdd„Ze
je
jddœdd„ZdS )ÚAsyncioBackendNr   c                 C   s   t s
tƒ  da d S )NT)ÚSSL_MONKEY_PATCH_APPLIEDr"   r5   r   r   r   r(   ­   s    zAsyncioBackend.__init__c                 C   s>   t | dƒs8zt ¡ | _W n tk
r6   t ¡ | _Y nX | jS )Nr   )rE   r   Úget_event_loopr   ÚRuntimeErrorÚnew_event_loopr5   r   r   r   Úloop´   s    
zAsyncioBackend.loop)ÚhostnameÚportÚssl_contextr'   r   c                 Ã   sT   z(t  t j|||d�|j¡I d H \}}W n t jk
rD   tƒ ‚Y nX t|||d�S )N)Ússlr$   )r   r/   Zopen_connectionÚconnect_timeoutr1   r   r#   )r   rS   rT   rU   r'   r%   r&   r   r   r   Úopen_tcp_stream½   s    þ  ÿzAsyncioBackend.open_tcp_stream)ÚstreamrS   rU   r'   r   c           
      Ã   s�   | j }t|dƒstdƒ‚t|tƒs&t‚t ¡ }t |¡}|j	j
}|j}	tj|	||||d�|jd�I d H }| |¡ ||_tj||||d�|_	|S )NÚ	start_tlszFasyncio.AbstractEventLoop.start_tls() is only available in Python 3.7+)Ú	transportÚprotocolZ
sslcontextZserver_hostname)r'   )r[   r\   ÚreaderrR   )rR   rE   ÚNotImplementedErrorÚ
isinstancer#   ÚAssertionErrorr   r;   ZStreamReaderProtocolr&   r[   rZ   r/   rW   Zset_transportr%   r<   )
r   rY   rS   rU   r'   rR   r%   r\   r[   Zloop_start_tlsr   r   r   rZ   Ð   s8    
ÿ
üù

   ÿzAsyncioBackend.start_tls)ÚfuncÚargsÚkwargsr   c                 Ï   s,   |rt j|f|Ž}| jjd |f|žŽ I d H S r   )Ú	functoolsÚpartialrR   Zrun_in_executor)r   ra   rb   rc   r   r   r   Úrun_in_threadpoolö   s    z AsyncioBackend.run_in_threadpool)Ú	coroutinerb   rc   r   c                 O   s<   | j }| ¡ rt ¡ | _z| j  |||Ž¡W ¢S || _X d S r   )rR   Z
is_runningr   rQ   r   Zrun_until_complete)r   rg   rb   rc   rR   r   r   r   Úrunþ   s    
zAsyncioBackend.run)Úlimitsr   c                 C   s   t |ƒS r   )r@   )r   ri   r   r   r   Úget_semaphore	  s    zAsyncioBackend.get_semaphore)Úmax_sizer   c                 C   s   t  ttj|d�¡S )N)Úmaxsize)rK   Úcastr   r   ÚQueue)r   rk   r   r   r   Úcreate_queue  s    zAsyncioBackend.create_queuec                 C   s   t  tt ¡ ¡S r   )rK   rm   r   r   ÚEventr5   r   r   r   Úcreate_event  s    zAsyncioBackend.create_eventÚBackgroundManager©rg   rb   r   c                 G   s
   t ||ƒS r   )rr   ©r   rg   rb   r   r   r   Úbackground_manager  s    z!AsyncioBackend.background_manager)r8   r9   r:   r(   rJ   r   ZAbstractEventLooprR   r=   r>   rK   rL   rV   Z
SSLContextr   r   rX   rZ   ÚCallableÚAnyrf   rh   r   r   rj   r   ro   r   rq   ru   r   r   r   r   rM   ¬   s@   

úú'  þ	  þ þrM   c                   @   sL   e Zd Zejejddœdd„Zd dœdd„Zdeje	 e	e
ddœd	d
„ZdS )rr   Nrs   c                 C   s   || _ || _d S r   )rg   rb   rt   r   r   r   r(     s    zBackgroundManager.__init__r   c                 Ã   s    t  ¡ }| | j| jŽ ¡| _| S r   )r   rO   Zcreate_taskrg   rb   Útask)r   rR   r   r   r   Ú
__aenter__  s    zBackgroundManager.__aenter__)Úexc_typeÚ	exc_valueÚ	tracebackr   c                 Ã   s"   | j I d H  |d kr| j  ¡  d S r   )rx   Úresult)r   rz   r{   r|   r   r   r   Ú	__aexit__"  s    zBackgroundManager.__aexit__)NNN)r8   r9   r:   rK   rv   rw   r(   ry   ZTypeÚBaseExceptionr   r~   r   r   r   r   rr     s      üûrr   )r   rd   rV   rK   Útypesr   Úconfigr   r   Ú
exceptionsr   r   r   r	   Úbaser   r   r   r   r   r   r   rN   r"   r#   r@   rM   rr   r   r   r   r   Ú<module>   s   $
bl