o
    hM'                     @   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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 dtddf 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.
    datar   Nc                    s&   | j r| j  s | | d S d S d S N)_loopZ	is_closedselfr   _write a/var/www/html/magazine_api/magazine_env/lib/python3.10/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dejdejdefddZdefddZ			dd
e
dededefddZdedd	fddZ		ddedededd	fddZdefddZ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   r   r   __init__,   s   
zTCPStream.__init__r   c                 C   s<   | j d}|d u rdS | }|d u rdS |dkrdS dS )N
ssl_objectzHTTP/1.1Zh2zHTTP/2)r$   Zget_extra_infoselected_alpn_protocol)r   r(   identr   r   r   get_http_version6   s   zTCPStream.get_http_versionNnflagc                    s   |d u r| j }	 |d u p|j}|r|jnd}zt| j||I d H }W |S  tjy?   |r5t d t	dI d H  Y nw q	)NTg{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]      zTCPStream.write_no_blockc                    sx   |sd S |d u r| j }| j| 	 zt| j |jI d H  W d S  tjy:   |d u p1|j}|r8t	 d Y nw q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$   closer6   r   r   r   r8      s   zTCPStream.close)NNr   N)__name__
__module____qualname__r   StreamReaderStreamWriterr   r'   strr+   intr   r    r0   r4   r   boolr7   r8   r   r   r   r   r"   +   s@    



r"   c                   @   sH   e Zd ZdefddZedejej	 fddZ
ddd	Zdd
dZdS )PoolSemaphorepool_limitsc                 C   s
   || _ d S r   )rC   )r   rC   r   r   r   r'      s   
zPoolSemaphore.__init__r   c                 C   s:   t | ds| jj}|d u rd | _| jS tj|d| _| jS )N
_semaphore)value)hasattrrC   Z
hard_limitrD   r   BoundedSemaphore)r   Zmax_connectionsr   r   r   	semaphore   s   
zPoolSemaphore.semaphoreNc                    sN   | j d u rd S | jj}zt| j  |I d H  W d S  tjy&   t w r   )rH   rC   pool_timeoutr   r/   acquirer1   r   )r   r%   r   r   r   rJ      s   
zPoolSemaphore.acquirec                 C   s   | j d u rd S | j   d S r   )rH   releaser6   r   r   r   rK      s   
zPoolSemaphore.releaser9   )r:   r;   r<   r   r'   propertytypingOptionalr   rG   rH   rJ   rK   r   r   r   r   rB      s    
	
rB   c                
   @   s   e Zd Zd#ddZedejfddZdede	d	e
jej d
edef
ddZdeded	ejd
edef
ddZde
jde
jde
jde
jfddZde
jde
jde
jde
jfddZdedefddZde	defddZdefddZde
jde
jdd fd!d"ZdS )$AsyncioBackendr   Nc                 C   s   t st  da d S )NT)SSL_MONKEY_PATCH_APPLIEDr!   r6   r   r   r   r'      s   zAsyncioBackend.__init__c                 C   sD   t | dsz	t | _W | jS  ty   t | _Y | jS w | jS )Nr   )rF   r   get_event_loopr   RuntimeErrornew_event_loopr6   r   r   r   loop   s   
zAsyncioBackend.loophostnameportssl_contextr%   c                    sP   zt t j|||d|jI d H \}}W n t jy    t w t|||dS )N)sslr&   )r   r/   Zopen_connectionconnect_timeoutr1   r   r"   )r   rU   rV   rW   r%   r#   r$   r   r   r   open_tcp_stream   s   zAsyncioBackend.open_tcp_streamstreamc           
         s   | j }t|dstdt|tsJ 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
sslcontextserver_hostname)r%   )r]   r^   readerrT   )rT   rF   NotImplementedError
isinstancer"   r   r=   ZStreamReaderProtocolr$   r]   r\   r/   rY   Zset_transportr#   r>   )
r   r[   rU   rW   r%   rT   r#   r^   r]   Zloop_start_tlsr   r   r   r\      s4   



zAsyncioBackend.start_tlsfuncargskwargsc                    s4   |rt j|fi |}| jjd |g|R  I d H S r   )	functoolspartialrT   Zrun_in_executor)r   rc   rd   re   r   r   r   run_in_threadpool   s   z AsyncioBackend.run_in_threadpool	coroutinec                 O   s@   | j }| rt | _z| j ||i |W || _S || _w r   )rT   Z
is_runningr   rS   r   Zrun_until_complete)r   ri   rd   re   rT   r   r   r   run   s   
zAsyncioBackend.runlimitsc                 C   s   t |S r   )rB   )r   rk   r   r   r   get_semaphore	  s   zAsyncioBackend.get_semaphoremax_sizec                 C   s   t ttj|dS )N)maxsize)rM   castr   r   Queue)r   rm   r   r   r   create_queue  s   zAsyncioBackend.create_queuec                 C   s   t tt S r   )rM   ro   r   r   Eventr6   r   r   r   create_event  r5   zAsyncioBackend.create_eventBackgroundManagerc                 G   s
   t ||S r   )rt   r   ri   rd   r   r   r   background_manager  s   
z!AsyncioBackend.background_managerr9   )r:   r;   r<   r'   rL   r   ZAbstractEventLooprT   r?   r@   rM   rN   rX   
SSLContextr   r   rZ   r\   CallableAnyrh   rj   r   r   rl   r   rq   r   rs   rv   r   r   r   r   rO      sl    



&

rO   c                	   @   sX   e Zd ZdejdejddfddZdddZ			dd	eje	 d
e	de
ddfddZdS )rt   ri   rd   r   Nc                 C   s   || _ || _d S r   )ri   rd   ru   r   r   r   r'     s   
zBackgroundManager.__init__c                    s"   t  }|| j| j | _| S r   )r   rQ   Zcreate_taskri   rd   task)r   rT   r   r   r   
__aenter__  s   zBackgroundManager.__aenter__exc_type	exc_value	tracebackc                    s(   | j I d H  |d u r| j   d S d S r   )rz   result)r   r|   r}   r~   r   r   r   	__aexit__"  s
   zBackgroundManager.__aexit__)r   rt   )NNN)r:   r;   r<   rM   rx   ry   r'   r{   TypeBaseExceptionr   r   r   r   r   r   rt     s    
rt   r9   )r   rf   rX   rM   typesr   configr   r   
exceptionsr   r   r   r	   baser   r   r   r   r   r   r   rP   r!   r"   rB   rO   rt   r   r   r   r   <module>   s    $

bl