o
    éT•j›  ã                   @   s$  d Z 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
y1   dZ	Y nw 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 )zÄEvent loop using a selector and related classes.

A selector is a "notify-when-ready" multiplexer.  For a subclass which
also includes support for signal handling, see the unix_events sub-module.
)ÚBaseSelectorEventLoopé    Né   )Úbase_events)Ú	constants)Úevents)Úfutures)Ú	protocols)Ússlproto)Ú
transports)Útrsock)Úloggerc                 C   s2   z|   |¡}W n
 ty   Y dS w t|j|@ ƒS ©NF)Úget_keyÚKeyErrorÚboolr   )ÚselectorÚfdÚeventÚkey© r   ú./usr/lib/python3.10/asyncio/selector_events.pyÚ_test_selector_event    s   ÿr   c                       s–  e Zd ZdZdS‡ fdd„	ZdSdddœdd„Z	dSddddejd	œd
d„Z	dTd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/d0„ Zd1d2„ Zd3d4„ ZdSd5d6„Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dSdEdF„Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*dQdR„ Z+‡  Z,S )Ur   zJSelector event loop.

    See events.EventLoop for API specification.
    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   ó   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)r2   r&   )r	   ÚSSLProtocolr+   Ú_app_transport)r$   Úrawsockr-   Ú
sslcontextr.   r0   r1   r'   r(   r2   Ússl_protocolr   r   r   Ú_make_ssl_transport@   s   ýÿz)BaseSelectorEventLoop._make_ssl_transportc                 C   r)   r*   )Ú_SelectorDatagramTransport)r$   r,   r-   Úaddressr.   r'   r   r   r   Ú_make_datagram_transportM   s   ÿz.BaseSelectorEventLoop._make_datagram_transportc                    sP   |   ¡ rtdƒ‚|  ¡ rd S |  ¡  tƒ  ¡  | jd ur&| j ¡  d | _d S d S )Nz!Cannot close a running event loop)Ú
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_fdsrA   r   r   r   r?   ]   s   

z&BaseSelectorEventLoop._close_self_pipec                 C   sN   t  ¡ \| _| _| j d¡ | j d¡ |  jd7  _|  | j ¡ | j¡ d S )NFr   )	ÚsocketÚ
socketpairrC   rE   ÚsetblockingrF   Ú_add_readerrD   Ú_read_from_selfrA   r   r   r   r    e   s
   z%BaseSelectorEventLoop._make_self_pipec                 C   s   d S r*   r   ©r$   Údatar   r   r   Ú_process_self_datam   ó   z(BaseSelectorEventLoop._process_self_datac                 C   sN   	 z| j  d¡}|sW d S |  |¡ W n ty   Y q  ty%   Y d S w q)NTi   )rC   ÚrecvrN   ÚInterruptedErrorÚBlockingIOErrorrL   r   r   r   rK   p   s   ÿøz%BaseSelectorEventLoop._read_from_selfc                 C   sR   | j }|d u r	d S z| d¡ W d S  ty(   | jr%tjddd� Y d S Y d S w )Nó    z3Fail to write a null byte into the self-pipe socketT©Úexc_info)rE   Ú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*   )rJ   rD   Ú_accept_connection)r$   Úprotocol_factoryr,   r6   r(   Úbacklogr2   r   r   r   Ú_start_servingŽ   s   
þz$BaseSelectorEventLoop._start_servingc                 C   s  t |ƒD ]}}z| ¡ \}}	| jrt d||	|¡ | d¡ W nO tttfy,   Y  d S  t	ym }
 z6|
j
t
jt
jt
jt
jfv rb|  d|
t |¡dœ¡ |  | ¡ ¡ |  tj| j||||||¡ n‚ W Y d }
~
qd }
~
ww d|	i}|  ||||||¡}|  |¡ qd S )Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)ÚmessageÚ	exceptionrG   Úpeername)ÚrangeÚacceptrX   r   r   rI   rR   rQ   ÚConnectionAbortedErrorrW   ÚerrnoÚEMFILEÚENFILEÚENOBUFSÚENOMEMÚcall_exception_handlerr   ÚTransportSocketrB   rD   Ú
call_laterr   ÚACCEPT_RETRY_DELAYr_   Ú_accept_connection2Úcreate_task)r$   r]   r,   r6   r(   r^   r2   Ú_ÚconnÚaddrÚexcr'   rd   r   r   r   r\   •   sH   ÿÿýýû€ó
þÞz(BaseSelectorEventLoop._accept_connectionc              
   Ã   sú   �d }d }z7|ƒ }|   ¡ }	|r| j||||	d|||d�}n
| j|||	||d�}z	|	I d H  W W d S  ty<   | ¡  ‚ w  ttfyF   ‚  ty| }
 z+| jrqd|
dœ}|d ur]||d< |d ure||d< |  |¡ W Y d }
~
d S W Y d }
~
d S d }
~
ww )NT)r.   r0   r'   r(   r2   )r.   r'   r(   z3Error on transport creation for incoming connection)r`   ra   r-   Ú	transport)	Úcreate_futurer8   r/   ÚBaseExceptionr@   Ú
SystemExitÚKeyboardInterruptrX   rk   )r$   r]   rr   r'   r6   r(   r2   r-   ru   r.   rt   Úcontextr   r   r   ro   Á   sJ   €ýþþýö€ÿz)BaseSelectorEventLoop._accept_connection2c              
   C   sˆ   |}t |tƒs"zt| ¡ ƒ}W n tttfy!   td|›�ƒd ‚w z| j| }W n
 ty3   Y d S w | ¡ sBt	d|›d|›�ƒ‚d S )NzInvalid file object: zFile descriptor z is used by transport )
Ú
isinstanceÚintrD   ÚAttributeErrorÚ	TypeErrorÚ
ValueErrorr#   r   Ú
is_closingr=   )r$   r   rD   ru   r   r   r   Ú_ensure_fd_no_transportê   s&   
þÿÿÿÿz-BaseSelectorEventLoop._ensure_fd_no_transportc           	   	   G   s”   |   ¡  t ||| d ¡}z| j |¡}W n ty)   | j |tj|d f¡ Y |S w |j|j	}\}}| j 
||tjB ||f¡ |d urH| ¡  |S r*   )Ú_check_closedr   ÚHandler   r   r   Úregisterr   Ú
EVENT_READrM   ÚmodifyÚcancel©	r$   r   ÚcallbackÚargsÚhandler   ÚmaskÚreaderÚwriterr   r   r   rJ   ü   ó"   ÿ÷ÿz!BaseSelectorEventLoop._add_readerc                 C   sŽ   |   ¡ rdS z| j |¡}W n
 ty   Y dS w |j|j}\}}|tj M }|s1| j |¡ n
| j 	||d |f¡ |d urE| 
¡  dS dS )NFT)r>   r   r   r   r   rM   r   r…   Ú
unregisterr†   r‡   ©r$   r   r   rŒ   r�   rŽ   r   r   r   rB     s    ÿz$BaseSelectorEventLoop._remove_readerc           	   	   G   s”   |   ¡  t ||| d ¡}z| j |¡}W n ty)   | j |tjd |f¡ Y |S w |j|j	}\}}| j 
||tjB ||f¡ |d urH| ¡  |S r*   )r‚   r   rƒ   r   r   r   r„   r   ÚEVENT_WRITErM   r†   r‡   rˆ   r   r   r   Ú_add_writer!  r�   z!BaseSelectorEventLoop._add_writerc                 C   sŽ   |   ¡ rdS z| j |¡}W n
 ty   Y dS w |j|j}\}}|tj M }|s1| j |¡ n
| j 	|||df¡ |durE| 
¡  dS dS )úRemove a writer callback.FNT)r>   r   r   r   r   rM   r   r’   r�   r†   r‡   r‘   r   r   r   Ú_remove_writer1  s    ÿz$BaseSelectorEventLoop._remove_writerc                 G   ó"   |   |¡ | j||g|¢R Ž  dS )zAdd a reader callback.N)r�   rJ   ©r$   r   r‰   rŠ   r   r   r   Ú
add_readerH  ó   
z BaseSelectorEventLoop.add_readerc                 C   ó   |   |¡ |  |¡S )zRemove a reader callback.)r�   rB   ©r$   r   r   r   r   Úremove_readerM  ó   

z#BaseSelectorEventLoop.remove_readerc                 G   r–   )zAdd a writer callback..N)r�   r“   r—   r   r   r   Ú
add_writerR  r™   z BaseSelectorEventLoop.add_writerc                 C   rš   )r”   )r�   r•   r›   r   r   r   Úremove_writerW  r�   z#BaseSelectorEventLoop.remove_writerc              	   Ã   óš   �t  |¡ | jr| ¡ dkrtdƒ‚z| |¡W S  ttfy$   Y nw |  ¡ }| 	¡ }|  
|¡ |  || j|||¡}| tj| j||d�¡ |I dH S )zÌReceive data from the socket.

        The return value is a bytes object representing the data received.
        The maximum amount of data to be received at once is specified by
        nbytes.
        r   úthe socket must be non-blocking©r‹   N)r   Ú_check_ssl_socketrX   Ú
gettimeoutr   rP   rR   rQ   rv   rD   r�   rJ   Ú
_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   ó"   |d u s|  ¡ s|  |¡ d S d S r*   )Ú	cancelledrœ   ©r$   r   r«   r‹   r   r   r   r©   r  ó   ÿz%BaseSelectorEventLoop._sock_read_donec              
   C   ó‚   |  ¡ rd S z| |¡}W n, ttfy   Y d S  ttfy"   ‚  ty9 } z| |¡ W Y d }~d S d }~ww | |¡ d S r*   )	ÚdonerP   rR   rQ   rx   ry   rw   Úset_exceptionÚ
set_result)r$   r«   r,   rª   rM   rt   r   r   r   r¥   v  s   €ÿz BaseSelectorEventLoop._sock_recvc              	   Ã   r    )z¥Receive data from the socket.

        The received data is written into *buf* (a writable buffer).
        The return value is the number of bytes written.
        r   r¡   r¢   N)r   r£   rX   r¤   r   Ú	recv_intorR   rQ   rv   rD   r�   rJ   Ú_sock_recv_intor¦   r§   r¨   r©   )r$   r,   Úbufr«   r   r‹   r   r   r   Úsock_recv_into†  s"   €
ÿ
ÿ
z$BaseSelectorEventLoop.sock_recv_intoc              
   C   r±   r*   )	r²   rµ   rR   rQ   rx   ry   rw   r³   r´   )r$   r«   r,   r·   Únbytesrt   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y'   d}Y nw |t|ƒkr0dS |  	¡ }| 
¡ }|  |¡ |  || j||t|ƒ|g¡}| tj| j||d�¡ |I dH S )aš  Send data to the socket.

        The socket must be connected to a remote socket. This method continues
        to send data from data until either all data has been sent or an
        error occurs. None is returned on success. On error, an exception is
        raised, and there is no way to determine how much data, if any, was
        successfully processed by the receiving end of the connection.
        r   r¡   Nr¢   )r   r£   rX   r¤   r   rV   rR   rQ   Úlenrv   rD   r�   r“   Ú_sock_sendallÚ
memoryviewr¦   r§   r¨   Ú_sock_write_done)r$   r,   rM   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y!   Y d S  ttfy*   ‚  tyA } z| |¡ W Y d }~d S d }~ww ||7 }|t|ƒkrS| 	d ¡ d S ||d< d S )Nr   )
r²   rV   rR   rQ   rx   ry   rw   r³   rº   r´   )r$   r«   r,   ÚviewÚposÚstartrª   rt   r   r   r   r»   Ë  s$   
€þz#BaseSelectorEventLoop._sock_sendallc                 Ã   s¤   �t  |¡ | jr| ¡ dkrtdƒ‚|jtjks"t jr;|jtj	kr;| j
||j|j|j| d�I dH }|d \}}}}}|  ¡ }|  |||¡ z|I dH W d}S d}w )zTConnect to a remote socket at address.

        This method is a coroutine.
        r   r¡   )ÚfamilyÚtypeÚprotoÚloopN)r   r£   rX   r¤   r   rÂ   rG   ÚAF_INETÚ	_HAS_IPv6ÚAF_INET6Ú_ensure_resolvedrÃ   rÄ   rv   Ú_sock_connect)r$   r,   r:   Úresolvedrq   r«   r   r   r   Úsock_connectá  s$   €
ÿþ
z"BaseSelectorEventLoop.sock_connectc              
   C   sÒ   |  ¡ }zaz| |¡ W nE ttfy2   |  |¡ |  || j|||¡}| tj	| j
||d�¡ Y n* ttfy;   ‚  tyQ } z| |¡ W Y d }~nd }~ww | d ¡ W d }d S W d }d S W d }d S d }w )Nr¢   )rD   ÚconnectrR   rQ   r�   r“   Ú_sock_connect_cbr¦   r§   r¨   r½   rx   ry   rw   r³   r´   )r$   r«   r,   r:   r   r‹   rt   r   r   r   rÊ   ú  s.   
ÿÿ€ÿ÷	üz#BaseSelectorEventLoop._sock_connectc                 C   r­   r*   )r®   rŸ   r¯   r   r   r   r½     r°   z&BaseSelectorEventLoop._sock_write_donec              
   C   s¾   |  ¡ rd S zUz| tjtj¡}|dkrt|d|› �ƒ‚W n* ttfy(   Y n* tt	fy1   ‚  t
yG } z| |¡ W Y d }~nd }~ww | d ¡ W d }d S W d }d S W d }d S d }w )Nr   zConnect call failed )r²   Ú
getsockoptrG   Ú
SOL_SOCKETÚSO_ERRORrW   rR   rQ   rx   ry   rw   r³   r´   )r$   r«   r,   r:   Úerrrt   r   r   r   rÎ     s*   þ€ÿøüz&BaseSelectorEventLoop._sock_connect_cbc                 Ã   sD   �t  |¡ | jr| ¡ dkrtdƒ‚|  ¡ }|  ||¡ |I dH S )aW  Accept a connection.

        The socket must be bound to an address and listening for connections.
        The return value is a pair (conn, address) where conn is a new socket
        object usable to send and receive data on the connection, and address
        is the address bound to the socket on the other end of the connection.
        r   r¡   N)r   r£   rX   r¤   r   rv   Ú_sock_accept)r$   r,   r«   r   r   r   Úsock_accept*  s   €

z!BaseSelectorEventLoop.sock_acceptc              
   C   sÂ   |  ¡ }z| ¡ \}}| d¡ W nF ttfy7   |  |¡ |  || j||¡}| t	j
| j||d�¡ Y d S  ttfy@   ‚  tyW } z| |¡ W Y d }~d S d }~ww | ||f¡ d S )NFr¢   )rD   rd   rI   rR   rQ   r�   rJ   rÓ   r¦   r§   r¨   r©   rx   ry   rw   r³   r´   )r$   r«   r,   r   rr   r:   r‹   rt   r   r   r   rÓ   9  s"   

ÿ€ÿz"BaseSelectorEventLoop._sock_acceptc              	   Ã   sŒ   �| j |j= | ¡ }| ¡  | ¡ I d H  z| j|j|||dd�I d H W | ¡  |r.| ¡  || j |j< S | ¡  |r?| ¡  || j |j< w )NF)Úfallback)	r#   Ú_sock_fdÚ
is_readingÚpause_readingÚ_make_empty_waiterÚsock_sendfileÚ_sockÚ_reset_empty_waiterÚresume_reading)r$   ÚtranspÚfileÚoffsetÚcountrÝ   r   r   r   Ú_sendfile_nativeJ  s"   €
ÿýz&BaseSelectorEventLoop._sendfile_nativec                 C   s€   |D ];\}}|j |j}\}}|tj@ r&|d ur&|jr!|  |¡ n|  |¡ |tj@ r=|d ur=|jr8|  |¡ q|  |¡ qd S r*   )	ÚfileobjrM   r   r…   Ú
_cancelledrB   Ú_add_callbackr’   r•   )r$   Ú
event_listr   rŒ   rã   r�   rŽ   r   r   r   Ú_process_eventsX  s   

€õz%BaseSelectorEventLoop._process_eventsc                 C   s   |   | ¡ ¡ | ¡  d S r*   )rB   rD   r@   )r$   r,   r   r   r   Ú_stop_servingf  s   z#BaseSelectorEventLoop._stop_servingr*   ©NNN)-r   Ú
__module__Ú__qualname__Ú__doc__r   r/   r   ÚSSL_HANDSHAKE_TIMEOUTr8   r;   r@   r?   r    rN   rK   rZ   r_   r\   ro   r�   rJ   rB   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   +   sl    
ÿÿü
ÿ
þ	
ý.
ý)

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y&   d | jd< Y nw d| jvrEz	| ¡ | jd< W n tj	yD   d | jd< Y nw || _
| ¡ | _d| _|  |¡ || _|  ¡ | _d| _d| _| jd urm| j ¡  | |j| j< d S )NrG   Úsocknamerb   Fr   )r   r   r   rl   Ú_extraÚgetsocknamerW   ÚgetpeernamerG   ÚerrorrÛ   rD   rÖ   Ú_protocol_connectedÚset_protocolÚ_serverÚ_buffer_factoryÚ_bufferÚ
_conn_lostÚ_closingÚ_attachr#   )r$   rÅ   r,   r-   r'   r(   r%   r   r   r   w  s0   ÿ
ÿ




z_SelectorTransport.__init__c                 C   sÖ   | j jg}| jd u r| d¡ n| jr| d¡ | d| j› �¡ | jd urc| j ¡ sct| jj	| jt
jƒ}|r=| d¡ n| d¡ t| jj	| jt
jƒ}|rQd}nd}|  ¡ }| d|› d	|› d
�¡ d d |¡¡S )NÚclosedÚclosingzfd=zread=pollingz	read=idleÚpollingÚidlezwrite=<z
, bufsize=ú>z<{}>ú )r   r   rÛ   Úappendrû   rÖ   Ú_loopr>   r   r   r   r…   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_closerA   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   ó   | j S r*   )r  rA   r   r   r   Úget_protocol´  ó   z_SelectorTransport.get_protocolc                 C   r  r*   )rû   rA   r   r   r   r€   ·  r  z_SelectorTransport.is_closingc                 C   sX   | j rd S d| _ | j | j¡ | js*|  jd7  _| j | j¡ | j | jd ¡ d S d S ©NTr   )	rû   r  rB   rÖ   rù   rú   r•   Ú	call_soonÚ_call_connection_lostrA   r   r   r   r@   º  s   ýz_SelectorTransport.closec                 C   s0   | j d ur|d| ›�t| d� | j  ¡  d S 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: %sTrT   )r`   ra   ru   r-   )	r{   rW   r  Ú	get_debugr   r   rk   r  r  )r$   rt   r`   r   r   r   Ú_fatal_errorÉ  s   

€üz_SelectorTransport._fatal_errorc                 C   sd   | j rd S | jr| j ¡  | j | j¡ | js!d| _| j | j¡ |  j d7  _ | j | j	|¡ d S r  )
rú   rù   Úclearr  r•   rÖ   rû   rB   r  r  ©r$   rt   r   r   r   r  ×  s   
z_SelectorTransport._force_closec                 C   s�   z*| j r
| j |¡ W | j ¡  d | _d | _d | _| j}|d ur)| ¡  d | _d S d S | j ¡  d | _d | _d | _| j}|d urG| ¡  d | _w r*   )rõ   r  Úconnection_lostrÛ   r@   r  r÷   Ú_detach)r$   rt   r(   r   r   r   r  ã  s*   €

þ
ûz(_SelectorTransport._call_connection_lostc                 C   s
   t | jƒS r*   )rº   rù   rA   r   r   r   r  ñ  ó   
z(_SelectorTransport.get_write_buffer_sizec                 G   s$   | j rd S | jj||g|¢R Ž  d S r*   )rû   r  rJ   r—   r   r   r   rJ   ô  s   z_SelectorTransport._add_reader)NN)r  )r   rê   rë   Úmax_sizeÚ	bytearrayrø   rÛ   r   r  r  rö   r  r€   r@   ÚwarningsÚwarnr  r  r  r  r  rJ   rî   r   r   r%   r   rï   k  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r?| j	 
tj|d ¡ d S d S r   )Ú_read_ready_cbr   r   Ú_eofÚ_pausedÚ_empty_waiterr   Ú_set_nodelayrÛ   r  r  r  Úconnection_maderJ   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*   )r{   r   Ú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û   rA   r   r   r   r×     s   z#_SelectorSocketTransport.is_readingc                 C   sB   | j s| jrd S d| _| j | j¡ | j ¡ rt d| ¡ d S d S )NTz%r pauses reading)rû   r)  r  rB   rÖ   r  r   r   rA   r   r   r   rØ   "  s   
ÿz&_SelectorSocketTransport.pause_readingc                 C   sD   | j s| jsd S d| _|  | j| j¡ | j ¡ r t d| ¡ d S d S )NFz%r resumes reading)	rû   r)  rJ   rÖ   r-  r  r  r   r   rA   r   r   r   rÝ   *  s   
ÿz'_SelectorSocketTransport.resume_readingc                 C   s   |   ¡  d S r*   )r'  rA   r   r   r   r-  2  s   z$_SelectorSocketTransport._read_readyc              
   C   sD  | j rd S z| j d¡}t|ƒstdƒ‚W n" ttfy   ‚  ty7 } z|  |d¡ W Y d }~d S d }~ww z| j	 
|¡}W n- ttfyL   Y d S  ttfyU   ‚  tym } z|  |d¡ W Y d }~d S d }~ww |sv|  ¡  d S z	| j |¡ W d S  ttfy‰   ‚  ty¡ } z|  |d¡ W Y d }~d S d }~ww )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  Ú
get_bufferrº   r=   rx   ry   rw   r  rÛ   rµ   rR   rQ   Ú_read_ready__on_eofÚbuffer_updated)r$   r·   rt   r¹   r   r   r   r0  5  sP   ÿÿ€ý€þÿ€ÿz0_SelectorSocketTransport._read_ready__get_bufferc              
   C   sà   | j rd S z	| j | j¡}W n- ttfy   Y d S  ttfy#   ‚  ty; } z|  	|d¡ W Y d }~d S d }~ww |sD|  
¡  d S z	| j |¡ W d S  ttfyW   ‚  tyo } z|  	|d¡ W Y d }~d S d }~ww )Nr3  z2Fatal error: protocol.data_received() call failed.)rú   rÛ   rP   r#  rR   rQ   rx   ry   rw   r  r5  r  Údata_received)r$   rM   rt   r   r   r   r1  Z  s4   €þÿ€ÿz3_SelectorSocketTransport._read_ready__data_receivedc              
   C   sŒ   | j  ¡ rt d| ¡ z| j ¡ }W n" ttfy   ‚  ty4 } z|  	|d¡ W Y d }~d S d }~ww |r@| j  
| j¡ d S |  ¡  d S )Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)r  r  r   r   r  Úeof_receivedrx   ry   rw   r  rB   rÖ   r@   )r$   Ú	keep_openrt   r   r   r   r5  s  s    
ÿ€ýz,_SelectorSocketTransport._read_ready__on_eofc              
   C   s(  t |tttfƒstdt|ƒj›�ƒ‚| jrtdƒ‚| j	d ur"tdƒ‚|s&d S | j
r=| j
tjkr4t d¡ |  j
d7  _
d S | jsˆz| j |¡}W n, ttfyS   Y n, ttfy\   ‚  tyt } z|  |d¡ W Y d }~d S d }~ww ||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)r{   Úbytesr$  r¼   r~   rÃ   r   r(  r=   r*  rú   r   Ú!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   Úwarningrù   rÛ   rV   rR   rQ   rx   ry   rw   r  r  r“   rÖ   Ú_write_readyÚextendÚ_maybe_pause_protocol)r$   rM   rª   rt   r   r   r   Úwriteˆ  sB   ÿ

€þz_SelectorSocketTransport.writec              
   C   s8  | j sJ dƒ‚| jrd S z	| j | j ¡}W nK ttfy!   Y d S  ttfy*   ‚  ty` } z+| j	 
| j¡ | j  ¡  |  |d¡ | jd urU| j |¡ W Y d }~d S W Y d }~d S d }~ww |ri| j d |…= |  ¡  | j s˜| j	 
| j¡ | jd ur‚| j d ¡ | jrŒ|  d ¡ d S | jrš| j tj¡ d S d S d S )NzData should not be emptyr<  )rù   rú   rÛ   rV   rR   rQ   rx   ry   rw   r  r•   rÖ   r  r  r*  r³   Ú_maybe_resume_protocolr´   rû   r  r(  ÚshutdownrG   ÚSHUT_WR)r$   rª   rt   r   r   r   r@  ¯  s>   

ÿ€ü
ùz%_SelectorSocketTransport._write_readyc                 C   s2   | j s| jrd S d| _| js| j tj¡ d S d S r  )rû   r(  rù   rÛ   rE  rG   rF  rA   r   r   r   Ú	write_eofÍ  s   ÿz"_SelectorSocketTransport.write_eofc                 C   s   dS r  r   rA   r   r   r   Úcan_write_eofÔ  rO   z&_SelectorSocketTransport.can_write_eofc                    s.   t ƒ  |¡ | jd ur| j tdƒ¡ d S 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s| j  d ¡ | j S )NzEmpty waiter is already set)r*  r=   r  rv   rù   r´   rA   r   r   r   rÙ   Ý  s   
z+_SelectorSocketTransport._make_empty_waiterc                 C   s
   d | _ d S r*   )r*  rA   r   r   r   rÜ   å  r"  z,_SelectorSocketTransport._reset_empty_waiterré   )r   rê   rë   Ú_start_tls_compatibler   Ú_SendfileModeÚ
TRY_NATIVEÚ_sendfile_compatibler   rö   r×   rØ   rÝ   r-  r0  r1  r5  rC  r@  rG  rH  r  rÙ   rÜ   rî   r   r   r%   r   r+   û  s*    ÿ%'r+   c                       sJ   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 )r9   Nc                    sb   t ƒ  ||||¡ || _| j | jj| ¡ | j | j| j| j	¡ |d ur/| j t
j|d ¡ d S d S r*   )r   r   Ú_addressr  r  r  r,  rJ   rÖ   r-  r   r.  )r$   rÅ   r,   r-   r:   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º   )Ú.0rM   rq   r   r   r   Ú	<genexpr>û  s   € zC_SelectorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)Úsumrù   rA   r   r   r   r  ú  s   z0_SelectorDatagramTransport.get_write_buffer_sizec              
   C   s¾   | j rd S z| j | j¡\}}W nE ttfy   Y d S  ty4 } z| j |¡ W Y d }~d S d }~w t	t
fy=   ‚  tyU } z|  |d¡ W Y d }~d S d }~ww | j ||¡ d S )Nz&Fatal read error on datagram transport)rú   rÛ   Úrecvfromr#  rR   rQ   rW   r  Úerror_receivedrx   ry   rw   r  Údatagram_received©r$   rM   rs   rt   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r+|d | jfvr(td| j› �ƒ‚| j}| j	rE| jrE| j	t
jkr<t d¡ |  j	d7  _	d S | js®z| jd rW| j |¡ W d S | j ||¡ W d S  ttfyt   | j | j| j¡ Y n: tyŒ } z| j |¡ W Y d }~d S d }~w ttfy•   ‚  ty­ } z|  |d¡ W Y d }~d S d }~ww | j  t|ƒ|f¡ |  !¡  d S )Nr:  z!Invalid address: must be None or r;  r   rb   ú'Fatal write error on datagram transport)"r{   r=  r$  r¼   r~   rÃ   r   rN  r   rú   r   r>  r   r?  rù   rñ   rÛ   rV   ÚsendtorR   rQ   r  r“   rÖ   Ú_sendto_readyrW   r  rS  rx   ry   rw   r  r  rB  rU  r   r   r   rW    sR   ÿ
ÿ

ÿ€ÿ€ýz!_SelectorDatagramTransport.sendtoc              
   C   s  | j ro| j  ¡ \}}z| jd r| j |¡ n| j ||¡ W nL ttfy2   | j  ||f¡ Y n= t	yJ } z| j
 |¡ W Y d }~d S d }~w ttfyS   ‚  tyk } z|  |d¡ W Y d }~d S d }~ww | j s|  ¡  | j s‡| j | j¡ | jr‰|  d ¡ d S d S d S )Nrb   rV  )rù   Úpopleftrñ   rÛ   rV   rW  rR   rQ   Ú
appendleftrW   r  rS  rx   ry   rw   r  rD  r  r•   rÖ   rû   r  rU  r   r   r   rX  8  s>   
€€ÿ€ýñýz(_SelectorDatagramTransport._sendto_readyré   r*   )r   rê   rë   ÚcollectionsÚdequerø   r   r  r-  rW  rX  rî   r   r   r%   r   r9   é  s    ÿ
+r9   )rì   Ú__all__r[  rf   r§   r   rG   r%  r!   ÚsslÚImportErrorÚ r   r   r   r   r   r	   r
   r   Úlogr   r   ÚBaseEventLoopr   Ú_FlowControlMixinÚ	Transportrï   r+   r9   r   r   r   r   Ú<module>   sH    ÿ    Dÿ  o