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 qW q tjk
r~   |rjt d t	dI d H  Y qX q|S )Ng{Gz?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