<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
a
    XC?hLš  ã                   @   s   d Z ddlZddlZddlZddlZddlZddlZddlZzddlZW n e	y^   dZY n0 ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ dd	l
mZ dd
l
mZ ddl
mZ ddlmZ dd„ ZG dd„ dejƒZG dd„ dejejƒZG dd„ deƒZG dd„ deƒZdS ))ÚBaseSelectorEventLoopé    Né   )Úbase_events)Ú	constants)Úevents)Úfutures)Ú	protocols)Ússlproto)Ú
transports)Útrsock)Úloggerc                 C   s6   z|   |¡}W n ty"   Y dS 0 t|j|@ ƒS d S ©NF)Úget_keyÚKeyErrorÚboolr   )ÚselectorÚfdZeventÚkey© r   ú</opt/alt/python39/lib64/python3.9/asyncio/selector_events.pyÚ_test_selector_event    s
    r   c                       sŽ  e Zd ZdR‡ fdd„	ZdSdddœdd„ZdTddddejdœd	d
„ZdUdd„Z‡ fdd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdddejfdd„Zdddejfdd„Zddejfdd„Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ ZdVd4d5„Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dWdDdE„Z$dFdG„ Z%dHdI„ Z&dJdK„ Z'dLdM„ Z(dNdO„ Z)dPdQ„ Z*‡  Z+S )Xr   Nc                    sF   t ƒ  ¡  |d u rt ¡ }t d|jj¡ || _|  	¡  t
 ¡ | _d S )NzUsing selector: %s)ÚsuperÚ__init__Ú	selectorsZDefaultSelectorr   ÚdebugÚ	__class__Ú__name__Ú	_selectorÚ_make_self_pipeÚweakrefZWeakValueDictionaryÚ_transports)Úselfr   ©r   r   r   r   1   s    
zBaseSelectorEventLoop.__init__©ÚextraÚserverc                C   s   t | |||||ƒS ©N)Ú_SelectorSocketTransport)r!   ÚsockÚprotocolÚwaiterr$   r%   r   r   r   Ú_make_socket_transport;   s    
ÿz,BaseSelectorEventLoop._make_socket_transportF)Úserver_sideÚserver_hostnamer$   r%   Ússl_handshake_timeoutc             	   C   s0   t j| ||||||	d}
t| ||
||d |
jS )N)r.   r#   )r	   ZSSLProtocolr'   Z_app_transport)r!   Zrawsockr)   Ú
sslcontextr*   r,   r-   r$   r%   r.   Zssl_protocolr   r   r   Ú_make_ssl_transport@   s    ýÿz)BaseSelectorEventLoop._make_ssl_transportc                 C   s   t | |||||ƒS r&   )Ú_SelectorDatagramTransport)r!   r(   r)   Úaddressr*   r$   r   r   r   Ú_make_datagram_transportM   s    ÿz.BaseSelectorEventLoop._make_datagram_transportc                    sL   |   ¡ rtdƒ‚|  ¡ rd S |  ¡  tƒ  ¡  | jd urH| j ¡  d | _d S )Nz!Cannot close a running event loop)Z
is_runningÚRuntimeErrorÚ	is_closedÚ_close_self_piper   Úcloser   ©r!   r"   r   r   r7   R   s    


zBaseSelectorEventLoop.closec                 C   sB   |   | j ¡ ¡ | j ¡  d | _| j ¡  d | _|  jd8  _d S )Nr   )Ú_remove_readerÚ_ssockÚfilenor7   Ú_csockÚ_internal_fdsr8   r   r   r   r6   ]   s    

z&BaseSelectorEventLoop._close_self_pipec                 C   sN   t  ¡ \| _| _| j d¡ | j d¡ |  jd7  _|  | j ¡ | j¡ d S )NFr   )	ÚsocketZ
socketpairr:   r<   Úsetblockingr=   Ú_add_readerr;   Ú_read_from_selfr8   r   r   r   r   e   s
    z%BaseSelectorEventLoop._make_self_pipec                 C   s   d S r&   r   ©r!   Údatar   r   r   Ú_process_self_datam   s    z(BaseSelectorEventLoop._process_self_datac                 C   sT   z"| j  d¡}|sW qP|  |¡ W q  ty8   Y q Y q  tyL   Y qPY q 0 q d S )Ni   )r:   ÚrecvrD   ÚInterruptedErrorÚBlockingIOErrorrB   r   r   r   rA   p   s    z%BaseSelectorEventLoop._read_from_selfc                 C   sL   | j }|d u rd S z| d¡ W n& tyF   | jrBtjddd Y n0 d S )Nó    z3Fail to write a null byte into the self-pipe socketT©Úexc_info)r<   ÚsendÚOSErrorÚ_debugr   r   )r!   Zcsockr   r   r   Ú_write_to_self|   s    þz$BaseSelectorEventLoop._write_to_selféd   c              
   C   s"   |   | ¡ | j||||||¡ d S r&   )r@   r;   Ú_accept_connection)r!   Úprotocol_factoryr(   r/   r%   Úbacklogr.   r   r   r   Ú_start_servingŽ   s    
þz$BaseSelectorEventLoop._start_servingc                 C   s  t |ƒD ]ú}z0| ¡ \}}	| jr0t d||	|¡ | d¡ W nž tttfyX   Y  d S  t	yÚ }
 zl|
j
t
jt
jt
jt
jfv rÄ|  d|
t |¡dœ¡ |  | ¡ ¡ |  tj| j||||||¡ n‚ W Y d }
~
qd }
~
0 0 d|	i}|  ||||||¡}|  |¡ qd S )Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)ÚmessageÚ	exceptionr>   Úpeername)ÚrangeÚacceptrM   r   r   r?   rG   rF   ÚConnectionAbortedErrorrL   ÚerrnoZEMFILEZENFILEZENOBUFSZENOMEMÚcall_exception_handlerr   ÚTransportSocketr9   r;   Z
call_laterr   ZACCEPT_RETRY_DELAYrS   Ú_accept_connection2Zcreate_task)r!   rQ   r(   r/   r%   rR   r.   Ú_ÚconnÚaddrÚexcr$   rX   r   r   r   rP   •   s@    ÿÿýý
þz(BaseSelectorEventLoop._accept_connectionc              
   Ã   sô   d }d }zr|ƒ }|   ¡ }	|r8| j||||	d|||d}n| j|||	||d}z|	I d H  W n tyv   | ¡  ‚ Y n0 W nt ttfy’   ‚ Y n^ tyî }
 zF| jrÚd|
dœ}|d urÀ||d< |d urÐ||d< |  |¡ W Y d }
~
n
d }
~
0 0 d S )NT)r*   r,   r$   r%   r.   )r*   r$   r%   z3Error on transport creation for incoming connection)rT   rU   r)   Ú	transport)	Úcreate_futurer0   r+   ÚBaseExceptionr7   Ú
SystemExitÚKeyboardInterruptrM   r[   )r!   rQ   r_   r$   r/   r%   r.   r)   rb   r*   ra   Úcontextr   r   r   r]   Á   s@    ýþýz)BaseSelectorEventLoop._accept_connection2c              
   C   sŠ   |}t |tƒsHzt| ¡ ƒ}W n( tttfyF   td|›ƒd ‚Y n0 z| j| }W n tyh   Y n0 | ¡ s†t	d|›d|›ƒ‚d S )NzInvalid file object: zFile descriptor z is used by transport )
Ú
isinstanceÚintr;   ÚAttributeErrorÚ	TypeErrorÚ
ValueErrorr    r   Ú
is_closingr4   )r!   r   r;   rb   r   r   r   Ú_ensure_fd_no_transportê   s     
ÿÿz-BaseSelectorEventLoop._ensure_fd_no_transportc           	   	   G   s’   |   ¡  t ||| d ¡}z| j |¡}W n( tyP   | j |tj|d f¡ Y n>0 |j|j	 }\}}| j 
||tjB ||f¡ |d urŽ| ¡  |S r&   )Ú_check_closedr   ÚHandler   r   r   Úregisterr   Ú
EVENT_READrC   ÚmodifyÚcancel©	r!   r   ÚcallbackÚargsÚhandler   ÚmaskÚreaderÚwriterr   r   r   r@   ü   s    ÿ
ÿz!BaseSelectorEventLoop._add_readerc                 C   s’   |   ¡ rdS z| j |¡}W n ty0   Y dS 0 |j|j }\}}|tj M }|sb| j |¡ n| j 	||d |f¡ |d urŠ| 
¡  dS dS d S ©NFT)r5   r   r   r   r   rC   r   rr   Ú
unregisterrs   rt   ©r!   r   r   ry   rz   r{   r   r   r   r9     s    z$BaseSelectorEventLoop._remove_readerc           	   	   G   s’   |   ¡  t ||| d ¡}z| j |¡}W n( tyP   | j |tjd |f¡ Y n>0 |j|j	 }\}}| j 
||tjB ||f¡ |d urŽ| ¡  |S r&   )ro   r   rp   r   r   r   rq   r   ÚEVENT_WRITErC   rs   rt   ru   r   r   r   Ú_add_writer!  s    ÿ
ÿz!BaseSelectorEventLoop._add_writerc                 C   s’   |   ¡ rdS z| j |¡}W n ty0   Y dS 0 |j|j }\}}|tj M }|sb| j |¡ n| j 	|||d f¡ |d urŠ| 
¡  dS dS d S r|   )r5   r   r   r   r   rC   r   r   r}   rs   rt   r~   r   r   r   Ú_remove_writer1  s    z$BaseSelectorEventLoop._remove_writerc                 G   s"   |   |¡ | j||g|¢R Ž  d S r&   )rn   r@   ©r!   r   rv   rw   r   r   r   Ú
add_readerH  s    
z BaseSelectorEventLoop.add_readerc                 C   s   |   |¡ |  |¡S r&   )rn   r9   ©r!   r   r   r   r   Úremove_readerM  s    
z#BaseSelectorEventLoop.remove_readerc                 G   s"   |   |¡ | j||g|¢R Ž  d S r&   )rn   r€   r‚   r   r   r   Ú
add_writerR  s    
z BaseSelectorEventLoop.add_writerc                 C   s   |   |¡ |  |¡S r&   )rn   r   r„   r   r   r   Úremove_writerW  s    
z#BaseSelectorEventLoop.remove_writerc              	   Ã   s˜   t  |¡ | jr$| ¡ dkr$tdƒ‚z| |¡W S  ttfyF   Y n0 |  ¡ }| 	¡ }|  
|¡ |  || j|||¡}| tj| j||d¡ |I d H S ©Nr   úthe socket must be non-blocking©rx   )r   Ú_check_ssl_socketrM   Ú
gettimeoutrl   rE   rG   rF   rc   r;   rn   r@   Ú
_sock_recvÚadd_done_callbackÚ	functoolsÚpartialÚ_sock_read_done)r!   r(   ÚnÚfutr   rx   r   r   r   Ú	sock_recv\  s    

ÿzBaseSelectorEventLoop.sock_recvc                 C   s   |d u s|  ¡ s|  |¡ d S r&   )Ú	cancelledr…   ©r!   r   r“   rx   r   r   r   r‘   r  s    z%BaseSelectorEventLoop._sock_read_donec              
   C   s„   |  ¡ rd S z| |¡}W nZ ttfy2   Y d S  ttfyH   ‚ Y n8 tyt } z| |¡ W Y d }~nd }~0 0 | |¡ d S r&   )	ÚdonerE   rG   rF   re   rf   rd   Úset_exceptionÚ
set_result)r!   r“   r(   r’   rC   ra   r   r   r   r   v  s     z BaseSelectorEventLoop._sock_recvc              	   Ã   s˜   t  |¡ | jr$| ¡ dkr$tdƒ‚z| |¡W S  ttfyF   Y n0 |  ¡ }| 	¡ }|  
|¡ |  || j|||¡}| tj| j||d¡ |I d H S rˆ   )r   r‹   rM   rŒ   rl   Ú	recv_intorG   rF   rc   r;   rn   r@   Ú_sock_recv_intorŽ   r   r   r‘   )r!   r(   Úbufr“   r   rx   r   r   r   Úsock_recv_into†  s    

ÿz$BaseSelectorEventLoop.sock_recv_intoc              
   C   s„   |  ¡ rd S z| |¡}W nZ ttfy2   Y d S  ttfyH   ‚ Y n8 tyt } z| |¡ W Y d }~nd }~0 0 | |¡ d S r&   )	r—   rš   rG   rF   re   rf   rd   r˜   r™   )r!   r“   r(   rœ   Únbytesra   r   r   r   r›   ›  s     z%BaseSelectorEventLoop._sock_recv_intoc              	   Ã   s¶   t  |¡ | jr$| ¡ dkr$tdƒ‚z| |¡}W n ttfyL   d}Y n0 |t|ƒkr^d S |  	¡ }| 
¡ }|  |¡ |  || j||t|ƒ|g¡}| tj| j||d¡ |I d H S rˆ   )r   r‹   rM   rŒ   rl   rK   rG   rF   Úlenrc   r;   rn   r€   Ú_sock_sendallÚ
memoryviewrŽ   r   r   Ú_sock_write_done)r!   r(   rC   r’   r“   r   rx   r   r   r   Úsock_sendall¬  s&    	



ÿÿz"BaseSelectorEventLoop.sock_sendallc              
   C   s´   |  ¡ rd S |d }z| ||d … ¡}W n\ ttfyB   Y d S  ttfyX   ‚ Y n0 ty† } z| |¡ W Y d }~d S d }~0 0 ||7 }|t|ƒkr¨| 	d ¡ n||d< d S )Nr   )
r—   rK   rG   rF   re   rf   rd   r˜   rŸ   r™   )r!   r“   r(   ZviewÚposÚstartr’   ra   r   r   r   r    Ë  s     
z#BaseSelectorEventLoop._sock_sendallc                 Ã   s”   t  |¡ | jr$| ¡ dkr$tdƒ‚|jtjksBt jrt|jtj	krt| j
||j|j|j| dI d H }|d \}}}}}|  ¡ }|  |||¡ |I d H S )Nr   r‰   )ÚfamilyÚtypeÚprotoÚloop)r   r‹   rM   rŒ   rl   r¦   r>   ZAF_INETZ	_HAS_IPv6ZAF_INET6Z_ensure_resolvedr§   r¨   rc   Ú_sock_connect)r!   r(   r2   Zresolvedr^   r“   r   r   r   Úsock_connectá  s     
ÿ
ÿþz"BaseSelectorEventLoop.sock_connectc              
   C   s´   |  ¡ }z| |¡ W nŽ ttfyb   |  |¡ |  || j|||¡}| tj	| j
||d¡ Y nN ttfyx   ‚ Y n8 ty¤ } z| |¡ W Y d }~nd }~0 0 | d ¡ d S )NrŠ   )r;   ZconnectrG   rF   rn   r€   Ú_sock_connect_cbrŽ   r   r   r¢   re   rf   rd   r˜   r™   )r!   r“   r(   r2   r   rx   ra   r   r   r   rª   ö  s     
ÿÿ z#BaseSelectorEventLoop._sock_connectc                 C   s   |d u s|  ¡ s|  |¡ d S r&   )r•   r‡   r–   r   r   r   r¢     s    z&BaseSelectorEventLoop._sock_write_donec              
   C   s    |  ¡ rd S z,| tjtj¡}|dkr6t|d|› ƒ‚W nX ttfyN   Y nN tt	fyd   ‚ Y n8 t
y } z| |¡ W Y d }~nd }~0 0 | d ¡ d S )Nr   zConnect call failed )r—   Z
getsockoptr>   Z
SOL_SOCKETZSO_ERRORrL   rG   rF   re   rf   rd   r˜   r™   )r!   r“   r(   r2   Úerrra   r   r   r   r¬     s     z&BaseSelectorEventLoop._sock_connect_cbc                 Ã   sB   t  |¡ | jr$| ¡ dkr$tdƒ‚|  ¡ }|  ||¡ |I d H S )Nr   r‰   )r   r‹   rM   rŒ   rl   rc   Ú_sock_accept)r!   r(   r“   r   r   r   Úsock_accept"  s    
z!BaseSelectorEventLoop.sock_acceptc              
   C   sÂ   |  ¡ }z| ¡ \}}| d¡ W nŒ ttfyl   |  |¡ |  || j||¡}| t	j
| j||d¡ Y nR ttfy‚   ‚ Y n< ty® } z| |¡ W Y d }~nd }~0 0 | ||f¡ d S )NFrŠ   )r;   rX   r?   rG   rF   rn   r@   r®   rŽ   r   r   r‘   re   rf   rd   r˜   r™   )r!   r“   r(   r   r_   r2   rx   ra   r   r   r   r®   1  s    
ÿ z"BaseSelectorEventLoop._sock_acceptc              	   Ã   sœ   | j |j= | ¡ }| ¡  | ¡ I d H  zL| j|j|||ddI d H W | ¡  |rZ| ¡  || j |j< S || j |j< n"| ¡  |rŠ| ¡  || j |j< 0 d S )NF)Zfallback)	r    Ú_sock_fdÚ
is_readingÚpause_readingÚ_make_empty_waiterZsock_sendfileÚ_sockÚ_reset_empty_waiterÚresume_reading)r!   ZtranspÚfileÚoffsetÚcountr¶   r   r   r   Ú_sendfile_nativeB  s*    
ÿú   ýz&BaseSelectorEventLoop._sendfile_nativec                 C   s€   |D ]v\}}|j |j }\}}|tj@ rL|d urL|jrB|  |¡ n
|  |¡ |tj@ r|d ur|jrp|  |¡ q|  |¡ qd S r&   )	ÚfileobjrC   r   rr   Z
_cancelledr9   Z_add_callbackr   r   )r!   Z
event_listr   ry   r»   rz   r{   r   r   r   Ú_process_eventsP  s    
z%BaseSelectorEventLoop._process_eventsc                 C   s   |   | ¡ ¡ | ¡  d S r&   )r9   r;   r7   )r!   r(   r   r   r   Ú_stop_serving^  s    z#BaseSelectorEventLoop._stop_serving)N)N)N)NNN)N)N),r   Ú
__module__Ú__qualname__r   r+   r   ZSSL_HANDSHAKE_TIMEOUTr0   r3   r7   r6   r   rD   rA   rN   rS   rP   r]   rn   r@   r9   r€   r   rƒ   r…   r†   r‡   r”   r‘   r   r   r›   r£   r    r«   rª   r¢   r¬   r¯   r®   rº   r¼   r½   Ú__classcell__r   r   r"   r   r   +   sh   
ÿ ÿü ÿ
þ
	ý
.ý
)

r   c                       s’   e Zd ZdZeZdZd‡ fdd„	Zdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ Zejfdd„Zddd„Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS ) Ú_SelectorTransporti   Nc                    sê   t ƒ  ||¡ t |¡| jd< z| ¡ | jd< W n tyL   d | jd< Y n0 d| jvrŠz| ¡ | jd< W n tj	yˆ   d | jd< Y n0 || _
| ¡ | _d| _|  |¡ || _|  ¡ | _d| _d| _| jd urÚ| j ¡  | |j| j< d S )Nr>   ZsocknamerV   Fr   )r   r   r   r\   Ú_extraZgetsocknamerL   Zgetpeernamer>   Úerrorr´   r;   r°   Ú_protocol_connectedÚset_protocolÚ_serverÚ_buffer_factoryÚ_bufferÚ
_conn_lostÚ_closingZ_attachr    )r!   r©   r(   r)   r$   r%   r"   r   r   r   o  s,    





z_SelectorTransport.__init__c                 C   sÖ   | j jg}| jd u r | d¡ n| jr0| d¡ | d| j› ¡ | jd urÆ| j ¡ sÆt| jj	| jt
jƒ}|rz| d¡ n
| d¡ t| jj	| jt
jƒ}|r¢d}nd}|  ¡ }| d|› d	|› d
¡ d d |¡¡S )NÚclosedÚclosingzfd=zread=pollingz	read=idleÚpollingZidlezwrite=<z
, bufsize=ú>z<{}>ú )r   r   r´   ÚappendrÊ   r°   Ú_loopr5   r   r   r   rr   r   Úget_write_buffer_sizeÚformatÚjoin)r!   ÚinforÍ   ÚstateÚbufsizer   r   r   Ú__repr__‰  s.    


ÿ
þz_SelectorTransport.__repr__c                 C   s   |   d ¡ d S r&   )Ú_force_closer8   r   r   r   Úabort¥  s    z_SelectorTransport.abortc                 C   s   || _ d| _d S ©NT)Ú	_protocolrÄ   ©r!   r)   r   r   r   rÅ   ¨  s    z_SelectorTransport.set_protocolc                 C   s   | j S r&   )rÜ   r8   r   r   r   Úget_protocol¬  s    z_SelectorTransport.get_protocolc                 C   s   | j S r&   )rÊ   r8   r   r   r   rm   ¯  s    z_SelectorTransport.is_closingc                 C   sT   | j r
d S d| _ | j | j¡ | jsP|  jd7  _| j | j¡ | j | jd ¡ d S ©NTr   )	rÊ   rÑ   r9   r°   rÈ   rÉ   r   Ú	call_soonÚ_call_connection_lostr8   r   r   r   r7   ²  s    z_SelectorTransport.closec                 C   s,   | j d ur(|d| ›t| d | j  ¡  d S )Nzunclosed transport )Úsource)r´   ÚResourceWarningr7   )r!   Z_warnr   r   r   Ú__del__¼  s    
z_SelectorTransport.__del__úFatal error on transportc                 C   sN   t |tƒr(| j ¡ r@tjd| |dd n| j ||| | jdœ¡ |  |¡ d S )Nz%r: %sTrI   )rT   rU   rb   r)   )	rh   rL   rÑ   Ú	get_debugr   r   r[   rÜ   rÙ   )r!   ra   rT   r   r   r   Ú_fatal_errorÁ  s    

üz_SelectorTransport._fatal_errorc                 C   sd   | j r
d S | jr(| j ¡  | j | j¡ | jsBd| _| j | j¡ |  j d7  _ | j | j	|¡ d S rß   )
rÉ   rÈ   ÚclearrÑ   r   r°   rÊ   r9   rà   rá   ©r!   ra   r   r   r   rÙ   Ï  s    
z_SelectorTransport._force_closec                 C   sŽ   zN| j r| j |¡ W | j ¡  d | _d | _d | _| j}|d urŠ| ¡  d | _n:| j ¡  d | _d | _d | _| j}|d urˆ| ¡  d | _0 d S r&   )rÄ   rÜ   Zconnection_lostr´   r7   rÑ   rÆ   Z_detach)r!   ra   r%   r   r   r   rá   Û  s&    
ù
z(_SelectorTransport._call_connection_lostc                 C   s
   t | jƒS r&   )rŸ   rÈ   r8   r   r   r   rÒ   é  s    z(_SelectorTransport.get_write_buffer_sizec                 G   s$   | j r
d S | jj||g|¢R Ž  d S r&   )rÊ   rÑ   r@   r‚   r   r   r   r@   ì  s    z_SelectorTransport._add_reader)NN)rå   )r   r¾   r¿   Úmax_sizeÚ	bytearrayrÇ   r´   r   rØ   rÚ   rÅ   rÞ   rm   r7   ÚwarningsÚwarnrä   rç   rÙ   rá   rÒ   r@   rÀ   r   r   r"   r   rÁ   c  s    

rÁ   c                       sª   e Zd ZdZejjZd#‡ fdd„	Z‡ fdd„Z	dd„ Z
d	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡ fdd„Zdd „ Zd!d"„ Z‡  ZS )$r'   TNc                    s~   d | _ tƒ  |||||¡ d| _d| _d | _t | j¡ | j	 
| jj| ¡ | j	 
| j| j| j¡ |d urz| j	 
tj|d ¡ d S r   )Ú_read_ready_cbr   r   Ú_eofÚ_pausedÚ_empty_waiterr   Z_set_nodelayr´   rÑ   rà   rÜ   Úconnection_mader@   r°   Ú_read_readyr   Ú_set_result_unless_cancelled)r!   r©   r(   r)   r*   r$   r%   r"   r   r   r   ø  s    
ÿ
ÿz!_SelectorSocketTransport.__init__c                    s.   t |tjƒr| j| _n| j| _tƒ  |¡ d S r&   )rh   r   ZBufferedProtocolÚ_read_ready__get_bufferrî   Ú_read_ready__data_receivedr   rÅ   rÝ   r"   r   r   rÅ     s    
z%_SelectorSocketTransport.set_protocolc                 C   s   | j  o| j S r&   )rð   rÊ   r8   r   r   r   r±     s    z#_SelectorSocketTransport.is_readingc                 C   s>   | j s| jrd S d| _| j | j¡ | j ¡ r:t d| ¡ d S )NTz%r pauses reading)rÊ   rð   rÑ   r9   r°   ræ   r   r   r8   r   r   r   r²     s    
z&_SelectorSocketTransport.pause_readingc                 C   s@   | j s| jsd S d| _|  | j| j¡ | j ¡ r<t d| ¡ d S )NFz%r resumes reading)	rÊ   rð   r@   r°   ró   rÑ   ræ   r   r   r8   r   r   r   r¶   "  s    
z'_SelectorSocketTransport.resume_readingc                 C   s   |   ¡  d S r&   )rî   r8   r   r   r   ró   *  s    z$_SelectorSocketTransport._read_readyc              
   C   sV  | j r
d S z | j d¡}t|ƒs(tdƒ‚W nH ttfyB   ‚ Y n2 tyr } z|  |d¡ W Y d }~d S d }~0 0 z| j	 
|¡}W n^ ttfyœ   Y d S  ttfy²   ‚ Y n2 tyâ } z|  |d¡ W Y d }~d S d }~0 0 | sö|  ¡  d S z| j |¡ W nJ ttfy    ‚ Y n2 tyP } z|  |d¡ W Y d }~n
d }~0 0 d S )Néÿÿÿÿz%get_buffer() returned an empty bufferz/Fatal error: protocol.get_buffer() call failed.ú$Fatal read error on socket transportz3Fatal error: protocol.buffer_updated() call failed.)rÉ   rÜ   Z
get_bufferrŸ   r4   re   rf   rd   rç   r´   rš   rG   rF   Ú_read_ready__on_eofZbuffer_updated)r!   rœ   ra   rž   r   r   r   rõ   -  sB    ÿÿz0_SelectorSocketTransport._read_ready__get_bufferc              
   C   sè   | j r
d S z| j | j¡}W n^ ttfy4   Y d S  ttfyJ   ‚ Y n2 tyz } z|  	|d¡ W Y d }~d S d }~0 0 |sŒ|  
¡  d S z| j |¡ W nF ttfy´   ‚ Y n0 tyâ } z|  	|d¡ W Y d }~n
d }~0 0 d S )Nrø   z2Fatal error: protocol.data_received() call failed.)rÉ   r´   rE   rê   rG   rF   re   rf   rd   rç   rù   rÜ   Zdata_received)r!   rC   ra   r   r   r   rö   R  s,    ÿz3_SelectorSocketTransport._read_ready__data_receivedc              
   C   sŽ   | j  ¡ rt d| ¡ z| j ¡ }W nH ttfy<   ‚ Y n2 tyl } z|  	|d¡ W Y d }~d S d }~0 0 |r‚| j  
| j¡ n|  ¡  d S )Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)rÑ   ræ   r   r   rÜ   Zeof_receivedre   rf   rd   rç   r9   r°   r7   )r!   Z	keep_openra   r   r   r   rù   k  s    
ÿz,_SelectorSocketTransport._read_ready__on_eofc              
   C   s0  t |tttfƒs$tdt|ƒj›ƒ‚| jr2tdƒ‚| j	d urDtdƒ‚|sLd S | j
rz| j
tjkrht d¡ |  j
d7  _
d S | jsz| j |¡}W n\ ttfy¨   Y n^ ttfy¾   ‚ Y nH tyî } z|  |d¡ W Y d }~d S d }~0 0 ||d … }|sd S | j | j| j¡ | j |¡ |  ¡  d S )Nú/data argument must be a bytes-like object, not z%Cannot call write() after write_eof()z(unable to write; sendfile is in progressúsocket.send() raised exception.r   ú%Fatal write error on socket transport)rh   Úbytesrë   r¡   rk   r§   r   rï   r4   rñ   rÉ   r   Ú!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   ÚwarningrÈ   r´   rK   rG   rF   re   rf   rd   rç   rÑ   r€   r°   Ú_write_readyÚextendÚ_maybe_pause_protocol)r!   rC   r’   ra   r   r   r   Úwrite€  s>    ÿ

z_SelectorSocketTransport.writec              
   C   s  | j r
d S z| j | j¡}W nˆ ttfy2   Y nà ttfyH   ‚ Y nÊ ty¤ } zF| j	 
| j¡ | j ¡  |  |d¡ | jd ur| j |¡ W Y d }~nvd }~0 0 |r¶| jd |…= |  ¡  | js| j	 
| j¡ | jd urê| j d ¡ | jrü|  d ¡ n| jr| j tj¡ d S )Nrü   )rÉ   r´   rK   rÈ   rG   rF   re   rf   rd   rÑ   r   r°   rè   rç   rñ   r˜   Ú_maybe_resume_protocolr™   rÊ   rá   rï   Úshutdownr>   ÚSHUT_WR)r!   r’   ra   r   r   r   r   §  s2    

"
z%_SelectorSocketTransport._write_readyc                 C   s.   | j s| jrd S d| _| js*| j tj¡ d S rÛ   )rÊ   rï   rÈ   r´   r  r>   r  r8   r   r   r   Ú	write_eofÅ  s
    z"_SelectorSocketTransport.write_eofc                 C   s   dS rÛ   r   r8   r   r   r   Úcan_write_eofÌ  s    z&_SelectorSocketTransport.can_write_eofc                    s*   t ƒ  |¡ | jd ur&| j tdƒ¡ d S )NzConnection is closed by peer)r   rá   rñ   r˜   ÚConnectionErrorré   r"   r   r   rá   Ï  s
    
ÿz._SelectorSocketTransport._call_connection_lostc                 C   s6   | j d urtdƒ‚| j ¡ | _ | js0| j  d ¡ | j S )NzEmpty waiter is already set)rñ   r4   rÑ   rc   rÈ   r™   r8   r   r   r   r³   Õ  s    
z+_SelectorSocketTransport._make_empty_waiterc                 C   s
   d | _ d S r&   )rñ   r8   r   r   r   rµ   Ý  s    z,_SelectorSocketTransport._reset_empty_waiter)NNN)r   r¾   r¿   Z_start_tls_compatibler   Z_SendfileModeZ
TRY_NATIVEZ_sendfile_compatibler   rÅ   r±   r²   r¶   ró   rõ   rö   rù   r  r   r  r  rá   r³   rµ   rÀ   r   r   r"   r   r'   ó  s(     ÿ%'r'   c                       sF   e Zd ZejZd‡ fdd„	Zdd„ Zdd„ Zddd	„Z	d
d„ Z
‡  ZS )r1   Nc                    s^   t ƒ  ||||¡ || _| j | jj| ¡ | j | j| j| j	¡ |d urZ| j t
j|d ¡ d S r&   )r   r   Ú_addressrÑ   rà   rÜ   rò   r@   r°   ró   r   rô   )r!   r©   r(   r)   r2   r*   r$   r"   r   r   r   å  s    
ÿ
ÿz#_SelectorDatagramTransport.__init__c                 C   s   t dd„ | jD ƒƒS )Nc                 s   s   | ]\}}t |ƒV  qd S r&   )rŸ   )Ú.0rC   r^   r   r   r   Ú	<genexpr>ó  ó    zC_SelectorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)ÚsumrÈ   r8   r   r   r   rÒ   ò  s    z0_SelectorDatagramTransport.get_write_buffer_sizec              
   C   s¼   | j r
d S z| j | j¡\}}W nˆ ttfy6   Y n‚ tyd } z| j |¡ W Y d }~n\d }~0  t	t
fyz   ‚ Y n> ty¨ } z|  |d¡ W Y d }~nd }~0 0 | j ||¡ d S )Nz&Fatal read error on datagram transport)rÉ   r´   Zrecvfromrê   rG   rF   rL   rÜ   Úerror_receivedre   rf   rd   rç   Zdatagram_received©r!   rC   r`   ra   r   r   r   ró   õ  s     "z&_SelectorDatagramTransport._read_readyc              
   C   s„  t |tttfƒs$tdt|ƒj›ƒ‚|s,d S | jrV|d | jfvrPtd| j› ƒ‚| j}| j	rŠ| jrŠ| j	t
jkrxt d¡ |  j	d7  _	d S | jsdz,| jd r¬| j |¡ n| j ||¡ W d S  ttfyæ   | j | j| j¡ Y n~ ty } z| j |¡ W Y d }~d S d }~0  ttfy0   ‚ Y n4 tyb } z|  |d¡ W Y d }~d S d }~0 0 | j  t|ƒ|f¡ |  !¡  d S )Nrú   z!Invalid address: must be None or rû   r   rV   ú'Fatal write error on datagram transport)"rh   rý   rë   r¡   rk   r§   r   r
  rl   rÉ   r   rþ   r   rÿ   rÈ   rÂ   r´   rK   ÚsendtorG   rF   rÑ   r€   r°   Ú_sendto_readyrL   rÜ   r  re   rf   rd   rç   rÐ   r  r  r   r   r   r    sJ    ÿ
ÿ

ÿz!_SelectorDatagramTransport.sendtoc              
   C   s  | j râ| j  ¡ \}}z*| jd r.| j |¡ n| j ||¡ W q  ttfyh   | j  ||f¡ Y qâY q  t	y˜ } z| j
 |¡ W Y d }~d S d }~0  ttfy®   ‚ Y q  tyÞ } z|  |d¡ W Y d }~d S d }~0 0 q |  ¡  | j s| j | j¡ | jr|  d ¡ d S )NrV   r  )rÈ   ÚpopleftrÂ   r´   rK   r  rG   rF   Ú
appendleftrL   rÜ   r  re   rf   rd   rç   r  rÑ   r   r°   rÊ   rá   r  r   r   r   r  0  s0    
ÿz(_SelectorDatagramTransport._sendto_ready)NNN)N)r   r¾   r¿   ÚcollectionsÚdequerÇ   r   rÒ   ró   r  r  rÀ   r   r   r"   r   r1   á  s     ÿ
+r1   )Ú__all__r  rZ   r   r   r>   rì   r   ZsslÚImportErrorÚ r   r   r   r   r   r	   r
   r   Úlogr   r   ZBaseEventLoopr   Z_FlowControlMixinZ	TransportrÁ   r'   r1   r   r   r   r   Ú<module>   sB   
    <ÿ  o