o
    ͷ6i!                     @   s   d dl 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 ddlmZ ddlmZmZmZmZ d	adddZd	dddde jde jdedededed
e jf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)
SSLContext)Optional   )
CloseErrorConnectErrorConnectTimeout	ReadErrorReadTimeout
WriteErrorWriteTimeoutmap_exceptions)TimeoutDict   )AsyncBackend	AsyncLockAsyncSemaphoreAsyncSocketStreamF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)_loop	is_closed)selfr   _write _/var/www/hoanhtaovolam_webdjango/env/lib/python3.10/site-packages/httpcore/_backends/asyncio.py_fixed_write#   s   z&ssl_monkey_patch.<locals>._fixed_write)asyncioselector_events_SelectorSocketTransportwritebytes)MonkeyPatchr   r   r   r   ssl_monkey_patch   s   

r$   )server_sideserver_hostnamessl_handshake_timeout	transportprotocolssl_contextr%   r&   r'   c          
   	      sh   ddl }| }| }|jj||||d|dd}	| |	 ||	j|  || j |I dH  |	j	S )z
    Python 3.6 asyncio doesn't have a start_tls() method on the loop
    so we use this function in place of the loop's start_tls() method.
    Adapted from this comment:
    https://github.com/urllib3/urllib3/issues/1323#issuecomment-362494839
    r   NF)r%   r&   call_connection_made)
asyncio.sslprotoget_event_loopcreate_futuresslprotoSSLProtocolset_protocol	call_soonconnection_maderesume_reading_app_transport)
r(   r)   r*   r%   r&   r'   r   loopwaiterssl_protocolr   r   r   backport_start_tls*   s$   


r9   c                   @   s   e Zd ZdejdejfddZdefddZde	d	e
d
edd fddZded
ede	fddZde	d
eddfddZdddZdefddZdS )SocketStreamstream_readerstream_writerc                 C   s$   || _ || _t | _t | _d S r   )r;   r<   r   Lock	read_lock
write_lock)r   r;   r<   r   r   r   __init__P   s   
zSocketStream.__init__r   c                 C   s0   | j d}|d u rdS | }|dkrdS dS )N
ssl_objectzHTTP/1.1h2zHTTP/2)r<   get_extra_infoselected_alpn_protocol)r   rA   identr   r   r   get_http_versionX   s
   zSocketStream.get_http_versionhostnamer*   timeoutc                    s   t  }t  }t |}| jj}t|dt}t j|||||	dd|
ddI d H }|| t j||||d}	t||	}
| |
_|
S )N	start_tlsascii)r&   connect)rH   )r(   r)   readerr6   )r   r-   StreamReaderStreamReaderProtocolr<   r(   getattrr9   wait_fordecodegetset_transportStreamWriterr:   _inner)r   rG   r*   rH   r6   r;   r)   r(   loop_start_tlsr<   
ssl_streamr   r   r   rI   a   s,   



zSocketStream.start_tlsnc              	      s   t jttti}| j4 I d H : t|" t | j	||
dI d H W  d    W  d   I d H  S 1 s9w   Y  W d   I d H  d S 1 I d H sOw   Y  d S )Nread)r   TimeoutErrorr	   OSErrorr   r>   r   rP   r;   rY   rR   )r   rX   rH   exc_mapr   r   r   rY      s   
.zSocketStream.readr   Nc              	      s   |sd S t jttti}| j4 I d H ? t|' | j| t 	| j
 |dI d H W  d    W  d   I d H  S 1 sBw   Y  W d   I d H  d S 1 I d H sXw   Y  d S )Nr!   )r   rZ   r   r[   r
   r?   r   r<   r!   rP   drainrR   )r   r   rH   r\   r   r   r   r!      s   
.zSocketStream.writec              	      sx   | j 4 I d H ' ttti | j  W d    n1 sw   Y  W d   I d H  d S 1 I d H s5w   Y  d S r   )r?   r   r[   r   r<   closer   r   r   r   aclose   s   .zSocketStream.aclosec                 C   s
   | j  S r   )r;   at_eofr_   r   r   r   is_connection_dropped   s   
z"SocketStream.is_connection_droppedr   N)__name__
__module____qualname__r   rM   rT   r@   strrF   r"   r   r   rI   intrY   r!   r`   boolrb   r   r   r   r   r:   O   s(    
	
!
r:   c                   @   s*   e Zd Zd	ddZd	ddZd	ddZdS )
r=   r   Nc                 C   s   t  | _d S r   )r   r=   _lockr_   r   r   r   r@         zLock.__init__c                 C      | j   d S r   )rj   releaser_   r   r   r   rm      rk   zLock.releasec                    s   | j  I d H  d S r   )rj   acquirer_   r   r   r   rn      s   zLock.acquirerc   )rd   re   rf   r@   rm   rn   r   r   r   r   r=      s    

r=   c                   @   sT   e Zd ZdededdfddZedejfddZ	dd	e
ddfd
dZdddZdS )	Semaphore	max_value	exc_classr   Nc                 C   s   || _ || _d S r   )rp   rq   r   rp   rq   r   r   r   r@      s   
zSemaphore.__init__c                 C   s    t | dstj| jd| _| jS )N
_semaphore)value)hasattrr   BoundedSemaphorerp   rs   r_   r   r   r   	semaphore   s   
zSemaphore.semaphorerH   c                    s:   zt | j |I d H  W d S  t jy   |  w r   )r   rP   rw   rn   rZ   rq   )r   rH   r   r   r   rn      s   zSemaphore.acquirec                 C   rl   r   )rw   rm   r_   r   r   r   rm      rk   zSemaphore.releaser   rc   )rd   re   rf   rh   typer@   propertyr   rv   rw   floatrn   rm   r   r   r   r   ro      s    ro   c                
   @   sj   e Zd ZdddZdededee dede	f
d	d
Z
defddZdededefddZdefddZdS )AsyncioBackendr   Nc                 C   s   t st  da d S )NT)SSL_MONKEY_PATCH_APPLIEDr$   r_   r   r   r   r@      s   zAsyncioBackend.__init__rG   portr*   rH   c           
         s~   | d}|d}tjttti}t| ttj	|||d|I d H \}}	t
||	dW  d    S 1 s8w   Y  d S )NrJ   rK   )ssl)r;   r<   )rQ   rR   r   rZ   r   r[   r   r   rP   open_connectionr:   )
r   rG   r}   r*   rH   hostconnect_timeoutr\   r;   r<   r   r   r   open_tcp_stream   s   


$zAsyncioBackend.open_tcp_streamc                 C   s   t  S r   )r=   r_   r   r   r   create_lock   s   zAsyncioBackend.create_lockrp   rq   c                 C   s   t ||dS )N)rq   )ro   rr   r   r   r   create_semaphore   s   zAsyncioBackend.create_semaphorec                 C   s   t  }| S r   )r   r-   time)r   r6   r   r   r   r      s   zAsyncioBackend.timerc   )rd   re   rf   r@   r"   rh   r   r   r   r:   r   r   r   rx   r   r   rz   r   r   r   r   r   r{      s     

r{   rc   )"r   r~   r   typingr   _exceptionsr   r   r   r   r	   r
   r   r   _typesr   baser   r   r   r   r|   r$   BaseTransportBaseProtocolri   rg   rz   	Transportr9   r:   r=   ro   r{   r   r   r   r   <module>   s<    (


%d