a
    òñ"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ÚfdÚeventÚkey© r   ú?/opt/python-3.9.21/usr/lib/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__Ú	selectorsÚDefaultSelectorr   ÚdebugÚ	__class__Ú__name__Ú	_selectorÚ_make_self_pipeÚweakrefÚ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)r1   r&   )r	   ZSSLProtocolr*   Z_app_transport)r$   Zrawsockr,   Ú
sslcontextr-   r/   r0   r'   r(   r1   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   r:   R   s    


zBaseSelectorEventLoop.closec                 C   sB   |   | j ¡ ¡ | j ¡  d | _| j ¡  d | _|  jd8  _d S )Nr   )Ú_remove_readerÚ_ssockÚfilenor:   Ú_csockÚ_internal_fdsr;   r   r   r   r9   ]   s    

z&BaseSelectorEventLoop._close_self_pipec                 C   sN   t  ¡ \| _| _| j d¡ | j d¡ |  jd7  _|  | j ¡ | j¡ d S )NFr   )	ÚsocketÚ
socketpairr=   r?   Úsetblockingr@   Ú_add_readerr>   Ú_read_from_selfr;   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=   ÚrecvrH   ÚInterruptedErrorÚBlockingIOErrorrF   r   r   r   rE   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$   Úcsockr   r   r   Ú_write_to_self|   s    þz$BaseSelectorEventLoop._write_to_selféd   c              
   C   s"   |   | ¡ | j||||||¡ d S r)   )rD   r>   Ú_accept_connection)r$   Úprotocol_factoryr+   r2   r(   Úbacklogr1   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Ú	exceptionrA   Úpeername)ÚrangeÚacceptrQ   r   r   rC   rK   rJ   ÚConnectionAbortedErrorrP   ÚerrnoZEMFILEZENFILEZENOBUFSZENOMEMÚcall_exception_handlerr   ÚTransportSocketr<   r>   Z
call_laterr   ZACCEPT_RETRY_DELAYrX   Ú_accept_connection2Zcreate_task)r$   rV   r+   r2   r(   rW   r1   Ú_ÚconnÚaddrÚexcr'   r]   r   r   r   rU   •   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(   r1   )r-   r'   r(   z3Error on transport creation for incoming connection)rY   rZ   r,   Ú	transport)	Úcreate_futurer3   r.   ÚBaseExceptionr:   Ú
SystemExitÚKeyboardInterruptrQ   r`   )r$   rV   rd   r'   r2   r(   r1   r,   rg   r-   rf   Úcontextr   r   r   rb   Á   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_closingr7   )r$   r   r>   rg   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_READrG   ÚmodifyÚcancel©	r$   r   ÚcallbackÚargsÚhandler   ÚmaskÚreaderÚwriterr   r   r   rD   ü   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)r8   r   r   r   r   rG   r   rw   Ú
unregisterrx   ry   ©r$   r   r   r~   r   r€   r   r   r   r<     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)   )rt   r   ru   r   r   r   rv   r   ÚEVENT_WRITErG   rx   ry   rz   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   )r8   r   r   r   r   rG   r   r„   r‚   rx   ry   rƒ   r   r   r   Ú_remove_writer1  s    z$BaseSelectorEventLoop._remove_writerc                 G   s"   |   |¡ | j||g|¢R Ž  d S r)   )rs   rD   ©r$   r   r{   r|   r   r   r   Ú
add_readerH  s    
z BaseSelectorEventLoop.add_readerc                 C   s   |   |¡ |  |¡S r)   )rs   r<   ©r$   r   r   r   r   Úremove_readerM  s    
z#BaseSelectorEventLoop.remove_readerc                 G   s"   |   |¡ | j||g|¢R Ž  d S r)   )rs   r…   r‡   r   r   r   Ú
add_writerR  s    
z BaseSelectorEventLoop.add_writerc                 C   s   |   |¡ |  |¡S r)   )rs   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©r}   )r   Ú_check_ssl_socketrQ   Ú
gettimeoutrq   rI   rK   rJ   rh   r>   rs   rD   Ú
_sock_recvÚadd_done_callbackÚ	functoolsÚpartialÚ_sock_read_done)r$   r+   ÚnÚfutr   r}   r   r   r   Ú	sock_recv\  s    

ÿzBaseSelectorEventLoop.sock_recvc                 C   s   |d u s|  ¡ s|  |¡ d S r)   )Ú	cancelledrŠ   ©r$   r   r˜   r}   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)   )	ÚdonerI   rK   rJ   rj   rk   ri   Úset_exceptionÚ
set_result)r$   r˜   r+   r—   rG   rf   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   rQ   r‘   rq   Ú	recv_intorK   rJ   rh   r>   rs   rD   Ú_sock_recv_intor“   r”   r•   r–   )r$   r+   Úbufr˜   r   r}   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Ÿ   rK   rJ   rj   rk   ri   r   rž   )r$   r˜   r+   r¡   Únbytesrf   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   rQ   r‘   rq   rO   rK   rJ   Úlenrh   r>   rs   r…   Ú_sock_sendallÚ
memoryviewr“   r”   r•   Ú_sock_write_done)r$   r+   rG   r—   r˜   r   r}   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œ   rO   rK   rJ   rj   rk   ri   r   r¤   rž   )r$   r˜   r+   ÚviewÚposÚstartr—   rf   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   rQ   r‘   rq   r¬   rA   ÚAF_INETZ	_HAS_IPv6ÚAF_INET6Z_ensure_resolvedr­   r®   rh   Ú_sock_connect)r$   r+   r5   Zresolvedrc   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>   ÚconnectrK   rJ   rs   r…   Ú_sock_connect_cbr“   r”   r•   r§   rj   rk   ri   r   rž   )r$   r˜   r+   r5   r   r}   rf   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œ   Ú
getsockoptrA   Ú
SOL_SOCKETÚSO_ERRORrP   rK   rJ   rj   rk   ri   r   rž   )r$   r˜   r+   r5   Úerrrf   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   rQ   r‘   rq   rh   Ú_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>   r]   rC   rK   rJ   rs   rD   rº   r“   r”   r•   r–   rj   rk   ri   r   rž   )r$   r˜   r+   r   rd   r5   r}   rf   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)Ú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)   )	ÚfileobjrG   r   rw   Z
_cancelledr<   Z_add_callbackr„   r†   )r$   Z
event_listr   r~   rÈ   r   r€   r   r   r   Ú_process_eventsP  s    
z%BaseSelectorEventLoop._process_eventsc                 C   s   |   | ¡ ¡ | ¡  d S r)   )r<   r>   r:   )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_TIMEOUTr3   r6   r:   r9   r    rH   rE   rS   rX   rU   rb   rs   rD   r<   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 )NrA   Zsocknamer[   Fr   )r   r   r   ra   Ú_extraÚgetsocknamerP   ÚgetpeernamerA   Ú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½   Ú_loopr8   r   r   r   rw   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_closer;   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ë   r;   r   r   r   Úget_protocol¬  s    z_SelectorTransport.get_protocolc                 C   s   | j S r)   )rÙ   r;   r   r   r   rr   ¯  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à   r<   r½   r×   rØ   r†   Ú	call_soonÚ_call_connection_lostr;   r   r   r   r:   ²  s    z_SelectorTransport.closec                 C   s,   | j d ur(|d| ›t| d | j  ¡  d S )Nzunclosed transport )Úsource)rÁ   ÚResourceWarningr:   )r$   Ú_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: %sTrM   )rY   rZ   rg   r,   )	rm   rP   rà   Ú	get_debugr   r   r`   rë   rè   )r$   rf   rY   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Ù   r<   rï   rð   ©r$   rf   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Á   r:   rà   rÕ   Z_detach)r$   rf   r(   r   r   r   rð   Û  s&    
ù
z(_SelectorTransport._call_connection_lostc                 C   s
   t | jƒS r)   )r¤   r×   r;   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à   rD   r‡   r   r   r   rD   ì  s    z_SelectorTransport._add_reader)NN)rõ   )r   rË   rÌ   Úmax_sizeÚ	bytearrayrÖ   rÁ   r   rç   ré   rÔ   rí   rr   r:   ÚwarningsÚwarnrô   r÷   rè   rð   rá   rD   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_maderD   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)   )rm   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Ù   r;   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à   r<   r½   rö   r   r   r;   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   rD   r½   r  rà   rö   r   r   r;   r   r   r   rÃ   "  s    
z'_SelectorSocketTransport.resume_readingc                 C   s   |   ¡  d S r)   )rþ   r;   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¤   r7   rj   rk   ri   r÷   rÁ   rŸ   rK   rJ   Ú_read_ready__on_eofZbuffer_updated)r$   r¡   rf   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Á   rI   rú   rK   rJ   rj   rk   ri   r÷   r	  rë   Zdata_received)r$   rG   rf   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_receivedrj   rk   ri   r÷   r<   r½   r:   )r$   Z	keep_openrf   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)rm   Úbytesrû   r¦   rp   r­   r   rÿ   r7   r  rØ   r   Ú!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   Úwarningr×   rÁ   rO   rK   rJ   rj   rk   ri   r÷   rà   r…   r½   Ú_write_readyÚextendÚ_maybe_pause_protocol)r$   rG   r—   rf   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Á   rO   r×   rK   rJ   rj   rk   ri   rà   r†   r½   rø   r÷   r  r   Ú_maybe_resume_protocolrž   rÙ   rð   rÿ   ÚshutdownrA   ÚSHUT_WR)r$   r—   rf   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  rA   r  r;   r   r   r   Ú	write_eofÅ  s
    z"_SelectorSocketTransport.write_eofc                 C   s   dS rê   r   r;   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  r7   rà   rh   r×   rž   r;   r   r   r   rÀ   Õ  s    
z+_SelectorSocketTransport._make_empty_waiterc                 C   s
   d | _ d S r)   )r  r;   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 )r4   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  rD   r½   r  r   r  )r$   r¯   r+   r,   r5   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¤   )Ú.0rG   rc   r   r   r   Ú	<genexpr>ó  ó    zC_SelectorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)Úsumr×   r;   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Á   Úrecvfromrú   rK   rJ   rP   rë   Úerror_receivedrj   rk   ri   r÷   Zdatagram_received©r$   rG   re   rf   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   r[   ú'Fatal write error on datagram transport)"rm   r  rû   r¦   rp   r­   r   r  rq   rØ   r   r  r   r  r×   rÏ   rÁ   rO   ÚsendtorK   rJ   rà   r…   r½   Ú_sendto_readyrP   rë   r   rj   rk   ri   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 )Nr[   r"  )r×   ÚpopleftrÏ   rÁ   rO   r#  rK   rJ   Ú
appendleftrP   rë   r   rj   rk   ri   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   r4   á  s     ÿ
+r4   )Ú__all__r'  r_   r”   r   rA   rü   r!   ZsslÚImportErrorÚ r   r   r   r   r   r	   r
   r   Úlogr   r   ZBaseEventLoopr   Z_FlowControlMixinZ	TransportrÎ   r*   r4   r   r   r   r   Ú<module>   sB   
    <ÿ  o