a
    ið3eÐ˜  ã                   @   s.  d Z dg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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)Ú	selectors)Ú
transports)Ússlproto)Ú	coroutine)Ú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   úJ/home/pi/bot/my_env/lib/python3.9/site-packages/asyncio/selector_events.pyÚ_test_selector_event   s
    r   c                       sF  e Zd ZdZdD‡ fdd„	ZdEdddœdd„ZdFddddd	œd
d„Zddddd	œdd„ZdGdd„Z‡ fdd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdHdd„ZdId d!„ZedJd"d#„ƒZd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#‡  Z$S )Kr   zJSelector event loop.

    See events.EventLoop for API specification.
    Nc                    s<   t ƒ  ¡  |d u rt ¡ }t d|jj¡ || _|  	¡  d S )NzUsing selector: %s)
ÚsuperÚ__init__r   ÚDefaultSelectorr   ÚdebugÚ	__class__Ú__name__Ú	_selectorÚ_make_self_pipe)Úselfr   ©r   r   r   r   0   s    
zBaseSelectorEventLoop.__init__©ÚextraÚserverc                C   s   t | |||||ƒS ©N)Ú_SelectorSocketTransport)r    ÚsockÚprotocolÚwaiterr#   r$   r   r   r   Ú_make_socket_transport9   s    
ÿz,BaseSelectorEventLoop._make_socket_transportF©Úserver_sideÚserver_hostnamer#   r$   c          
   
   C   sN   t  ¡ s"| j||||||||dS t  | |||||¡}	t| ||	||d |	jS )Nr+   r"   )r
   Z_is_sslproto_availableÚ_make_legacy_ssl_transportZSSLProtocolr&   Z_app_transport)
r    Úrawsockr(   Ú
sslcontextr)   r,   r-   r#   r$   Zssl_protocolr   r   r   Ú_make_ssl_transport>   s    ýÿÿz)BaseSelectorEventLoop._make_ssl_transportc          	   
   C   s   t | ||||||||ƒ	S r%   )Ú_SelectorSslTransport)	r    r/   r(   r0   r)   r,   r-   r#   r$   r   r   r   r.   M   s    
þz0BaseSelectorEventLoop._make_legacy_ssl_transportc                 C   s   t | |||||ƒS r%   )Ú_SelectorDatagramTransport)r    r'   r(   Úaddressr)   r#   r   r   r   Ú_make_datagram_transportW   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   r9   \   s    


zBaseSelectorEventLoop.closec                 C   s   t ‚d S r%   )ÚNotImplementedErrorr:   r   r   r   Ú_socketpairg   s    z!BaseSelectorEventLoop._socketpairc                 C   sB   |   | j ¡ ¡ | j ¡  d | _| j ¡  d | _|  jd8  _d S )Nr   )Úremove_readerÚ_ssockÚfilenor9   Ú_csockÚ_internal_fdsr:   r   r   r   r8   j   s    

z&BaseSelectorEventLoop._close_self_pipec                 C   sN   |   ¡ \| _| _| j d¡ | j d¡ |  jd7  _|  | j ¡ | j¡ d S )NFr   )r<   r>   r@   ÚsetblockingrA   Ú
add_readerr?   Ú_read_from_selfr:   r   r   r   r   r   s
    z%BaseSelectorEventLoop._make_self_pipec                 C   s   d S r%   r   ©r    Údatar   r   r   Ú_process_self_dataz   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>   ÚrecvrG   ÚInterruptedErrorÚBlockingIOErrorrE   r   r   r   rD   }   s    z%BaseSelectorEventLoop._read_from_selfc                 C   sH   | j }|d urDz| d¡ W n& tyB   | jr>t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_selfc                 C   s   |   | ¡ | j||||¡ d S r%   )rC   r?   Ú_accept_connection)r    Úprotocol_factoryr'   r0   r$   r   r   r   Ú_start_serving™   s    ÿz$BaseSelectorEventLoop._start_servingc           
      C   sê   z0|  ¡ \}}| jr$t d|||¡ | d¡ W n tttfyH   Y nž tyÀ } zb|j	t	j
t	jt	jt	jfv rª|  d||dœ¡ |  | ¡ ¡ |  tj| j||||¡ n‚ W Y d }~n.d }~0 0 d|i}|  |||||¡}	|  |	¡ d S )Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)ÚmessageÚ	exceptionÚsocketÚpeername)ÚacceptrP   r   r   rB   rJ   rI   ÚConnectionAbortedErrorrO   ÚerrnoZEMFILEZENFILEZENOBUFSZENOMEMÚcall_exception_handlerr=   r?   Z
call_laterr   ZACCEPT_RETRY_DELAYrT   Ú_accept_connection2Zcreate_task)
r    rS   r'   r0   r$   ÚconnÚaddrÚexcr#   rY   r   r   r   rR   ž   s:    ÿÿýþ
ÿz(BaseSelectorEventLoop._accept_connectionc              
   c   sÚ   d }d }zn|ƒ }t j| d}|r:| j||||d||d}n| j|||||d}z|E d H  W n   | ¡  ‚ Y n0 W 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 )	N©ÚloopT)r)   r,   r#   r$   )r)   r#   r$   z3Error on transport creation for incoming connection)rU   rV   r(   Ú	transport)r   ÚFuturer1   r*   r9   Ú	ExceptionrP   r\   )r    rS   r^   r#   r0   r$   r(   rc   r)   r`   Úcontextr   r   r   r]   À   s:    þþýz)BaseSelectorEventLoop._accept_connection2c           	   	   G   s   |   ¡  t ||| ¡}z| j |¡}W n( tyN   | j |tj|df¡ Y n>0 |j|j	 }\}}| j 
||tjB ||f¡ |durŒ| ¡  dS )zAdd a reader callback.N)Ú_check_closedr   ÚHandler   r   r   Úregisterr   Ú
EVENT_READrF   ÚmodifyÚcancel©	r    r   ÚcallbackÚargsÚhandler   ÚmaskÚreaderÚwriterr   r   r   rC   å   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 )zRemove a reader callback.FNT)r7   r   r   r   r   rF   r   rj   Ú
unregisterrk   rl   ©r    r   r   rq   rr   rs   r   r   r   r=   õ   s    z#BaseSelectorEventLoop.remove_readerc           	   	   G   s   |   ¡  t ||| ¡}z| j |¡}W n( tyN   | j |tjd|f¡ Y n>0 |j|j	 }\}}| j 
||tjB ||f¡ |durŒ| ¡  dS )zAdd a writer callback..N)rg   r   rh   r   r   r   ri   r   ÚEVENT_WRITErF   rk   rl   rm   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 )zRemove a writer callback.FNT)r7   r   r   r   r   rF   r   rv   rt   rk   rl   ru   r   r   r   Úremove_writer  s    z#BaseSelectorEventLoop.remove_writerc                 C   s:   | j r| ¡ dkrtdƒ‚tj| d}|  |d||¡ |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.

        This method is a coroutine.
        r   úthe socket must be non-blockingra   F)rP   Ú
gettimeoutÚ
ValueErrorr   rd   Ú
_sock_recv)r    r'   ÚnÚfutr   r   r   Ú	sock_recv2  s
    	zBaseSelectorEventLoop.sock_recvc                 C   s˜   |  ¡ }|r|  |¡ | ¡ r"d S z| |¡}W nX ttfy\   |  || j|d||¡ Y n8 tyˆ } z| 	|¡ W Y d }~nd }~0 0 | 
|¡ d S ©NT)r?   r=   Ú	cancelledrH   rJ   rI   rC   r|   re   Úset_exceptionÚ
set_result)r    r~   Ú
registeredr'   r}   r   rF   r`   r   r   r   r|   A  s    
 z BaseSelectorEventLoop._sock_recvc                 C   sJ   | j r| ¡ dkrtdƒ‚tj| d}|r<|  |d||¡ n
| d¡ |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.

        This method is a coroutine.
        r   ry   ra   FN)rP   rz   r{   r   rd   Ú_sock_sendallrƒ   )r    r'   rF   r~   r   r   r   Úsock_sendallV  s    
z"BaseSelectorEventLoop.sock_sendallc              
   C   s¼   |  ¡ }|r|  |¡ | ¡ r"d S z| |¡}W nH ttfyJ   d}Y n0 tyx } z| |¡ W Y d }~d S d }~0 0 |t|ƒkr’| 	d ¡ n&|r¢||d … }|  
|| j|d||¡ d S )Nr   T)r?   rx   r   rN   rJ   rI   re   r‚   Úlenrƒ   rw   r…   )r    r~   r„   r'   rF   r   r}   r`   r   r   r   r…   j  s"    

z#BaseSelectorEventLoop._sock_sendallc              
   C   s~   | j r| ¡ dkrtdƒ‚tj| d}z| j r:t ||¡ W n. tyj } z| |¡ W Y d}~nd}~0 0 |  |||¡ |S )a   Connect to a remote socket at address.

        The address must be already resolved to avoid the trap of hanging the
        entire event loop when the address requires doing a DNS lookup. For
        example, it must be an IP address, not an hostname, for AF_INET and
        AF_INET6 address families. Use getaddrinfo() to resolve the hostname
        asynchronously.

        This method is a coroutine.
        r   ry   ra   N)	rP   rz   r{   r   rd   r   Z_check_resolved_addressr‚   Ú_sock_connect)r    r'   r4   r~   Úerrr   r   r   Úsock_connect  s     z"BaseSelectorEventLoop.sock_connectc              
   C   s¬   |  ¡ }z.z| |¡ W q4 ty.   Y q
Y q
0 q4q
W nf typ   | t | j|¡¡ |  || j	|||¡ Y n8 t
yœ } z| |¡ W Y d }~nd }~0 0 | d ¡ d S r%   )r?   ÚconnectrI   rJ   Zadd_done_callbackÚ	functoolsÚpartialÚ_sock_connect_donerw   Ú_sock_connect_cbre   r‚   rƒ   )r    r~   r'   r4   r   r`   r   r   r   rˆ   ˜  s    
ÿ z#BaseSelectorEventLoop._sock_connectc                 C   s   |   |¡ d S r%   )rx   )r    r   r~   r   r   r   rŽ   «  s    z(BaseSelectorEventLoop._sock_connect_donec              
   C   sŠ   |  ¡ rd S z,| tjtj¡}|dkr6t|d|f ƒ‚W nB ttfyN   Y n8 tyz } z| 	|¡ W Y d }~nd }~0 0 | 
d ¡ d S )Nr   zConnect call failed %s)r   Ú
getsockoptrW   Ú
SOL_SOCKETÚSO_ERRORrO   rJ   rI   re   r‚   rƒ   )r    r~   r'   r4   r‰   r`   r   r   r   r   ®  s     z&BaseSelectorEventLoop._sock_connect_cbc                 C   s8   | j r| ¡ dkrtdƒ‚tj| d}|  |d|¡ |S )a|  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.

        This method is a coroutine.
        r   ry   ra   F)rP   rz   r{   r   rd   Ú_sock_accept)r    r'   r~   r   r   r   Úsock_accept¿  s
    
z!BaseSelectorEventLoop.sock_acceptc              
   C   s¦   |  ¡ }|r|  |¡ | ¡ r"d S z| ¡ \}}| d¡ W nV ttfyf   |  || j|d|¡ Y n< t	y’ } z| 
|¡ W Y d }~nd }~0 0 | ||f¡ d S )NFT)r?   r=   r   rY   rB   rJ   rI   rC   r“   re   r‚   rƒ   )r    r~   r„   r'   r   r^   r4   r`   r   r   r   r“   Ï  s    
 z"BaseSelectorEventLoop._sock_acceptc                 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%   )	ÚfileobjrF   r   rj   Z
_cancelledr=   Z_add_callbackrv   rx   )r    Z
event_listr   rq   r•   rr   rs   r   r   r   Ú_process_eventsß  s    
z%BaseSelectorEventLoop._process_eventsc                 C   s   |   | ¡ ¡ | ¡  d S r%   )r=   r?   r9   )r    r'   r   r   r   Ú_stop_servingí  s    z#BaseSelectorEventLoop._stop_serving)N)N)N)NNN)NN)NN)NN)%r   Ú
__module__Ú__qualname__Ú__doc__r   r*   r1   r.   r5   r9   r<   r8   r   rG   rD   rQ   rT   rR   r   r]   rC   r=   rw   rx   r   r|   r†   r…   rŠ   rˆ   rŽ   r   r”   r“   r–   r—   Ú__classcell__r   r   r!   r   r   *   sX   	ÿþý ÿ
 ÿ
 ÿ
" ÿ$c                       sv   e Zd ZdZeZdZd‡ fdd„	Zdd„ Zdd„ Z	d	d
„ Z
ejdkrLdd„ Zddd„Zdd„ Zdd„ Zdd„ Z‡  ZS )Ú_SelectorTransporti   Nc                    s²   t ƒ  ||¡ || jd< | ¡ | jd< d| jvrbz| ¡ | jd< W n tjy`   d | jd< Y n0 || _| ¡ | _	|| _
d| _|| _|  ¡ | _d| _d| _| jd ur®| j ¡  d S )NrW   ZsocknamerX   Tr   F)r   r   Ú_extraÚgetsocknameÚgetpeernamerW   ÚerrorÚ_sockr?   Ú_sock_fdÚ	_protocolÚ_protocol_connectedÚ_serverÚ_buffer_factoryÚ_bufferÚ
_conn_lostÚ_closingZ_attach)r    rb   r'   r(   r#   r$   r!   r   r   r   þ  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´t| jj| jt	j
ƒ}|rn| d¡ n
| d¡ t| jj| jt	jƒ}|r–d}nd}|  ¡ }| d||f ¡ d	d
 |¡ S )NÚclosedÚclosingzfd=%szread=pollingz	read=idleÚpollingZidlezwrite=<%s, bufsize=%s>z<%s>ú )r   r   r¡   Úappendr©   r¢   Ú_loopr   r   r   rj   rv   Úget_write_buffer_sizeÚ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   sF   | j r
d S d| _ | j | j¡ | jsB|  jd7  _| j | jd ¡ d S ©NTr   )r©   r¯   r=   r¢   r§   r¨   Ú	call_soonÚ_call_connection_lostr:   r   r   r   r9   1  s    z_SelectorTransport.close)é   é   c                 C   s(   | j d ur$t d|  t¡ | j  ¡  d S )Nzunclosed transport %r)r¡   ÚwarningsÚwarnÚResourceWarningr9   r:   r   r   r   Ú__del__>  s    
z_SelectorTransport.__del__úFatal error on transportc                 C   sT   t |tttfƒr.| j ¡ rFtjd| |dd n| j ||| | j	dœ¡ |  
|¡ d S )Nz%r: %sTrL   )rU   rV   rc   r(   )Ú
isinstanceÚBrokenPipeErrorÚConnectionResetErrorrZ   r¯   Ú	get_debugr   r   r\   r£   r¶   )r    r`   rU   r   r   r   Ú_fatal_errorC  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¯   rx   r¢   r©   r=   r¹   rº   ©r    r`   r   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¡   r9   r¯   r¥   Z_detach)r    r`   r$   r   r   r   rº   ^  s&    
ù
z(_SelectorTransport._call_connection_lostc                 C   s
   t | jƒS r%   )r‡   r§   r:   r   r   r   r°   l  s    z(_SelectorTransport.get_write_buffer_size)NN)rÁ   )r   r˜   r™   Úmax_sizeÚ	bytearrayr¦   r¡   r   rµ   r·   r9   ÚsysÚversion_inforÀ   rÆ   r¶   rº   r°   r›   r   r   r!   r   rœ   ò  s   

rœ   c                       sV   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	dd„ Z
‡  ZS )r&   Nc                    sf   t ƒ  |||||¡ d| _d| _| j | jj| ¡ | j | jj| j	| j
¡ |d urb| j |jd ¡ d S r   )r   r   Ú_eofÚ_pausedr¯   r¹   r£   Úconnection_maderC   r¢   Ú_read_readyÚ_set_result_unless_cancelled)r    rb   r'   r(   r)   r#   r$   r!   r   r   r   r  s    ÿz!_SelectorSocketTransport.__init__c                 C   sJ   | j rtdƒ‚| jrtdƒ‚d| _| j | j¡ | j ¡ rFt d| ¡ d S ©Nz#Cannot pause_reading() when closingzAlready pausedTz%r pauses reading©	r©   r6   rÎ   r¯   r=   r¢   rÅ   r   r   r:   r   r   r   Úpause_reading€  s    
z&_SelectorSocketTransport.pause_readingc                 C   sJ   | j stdƒ‚d| _ | jrd S | j | j| j¡ | j ¡ rFt 	d| ¡ d S ©Nz
Not pausedFz%r resumes reading©
rÎ   r6   r©   r¯   rC   r¢   rÐ   rÅ   r   r   r:   r   r   r   Úresume_readingŠ  s    
z'_SelectorSocketTransport.resume_readingc              
   C   sª   z| j  | j¡}W nD ttfy(   Y n~ tyV } z|  |d¡ W Y d }~nXd }~0 0 |rj| j |¡ n<| j	 
¡ r€t d| ¡ | j ¡ }|rž| j	 | j¡ n|  ¡  d S )Nz$Fatal read error on socket transportú%r received EOF)r¡   rH   rÉ   rJ   rI   re   rÆ   r£   Údata_receivedr¯   rÅ   r   r   Úeof_receivedr=   r¢   r9   ©r    rF   r`   Z	keep_openr   r   r   rÐ   ”  s    "

z$_SelectorSocketTransport._read_readyc              
   C   sþ   t |tttfƒstdt|ƒƒ‚| jr,tdƒ‚|s4d S | jrb| jt	j
krPt d¡ |  jd7  _d S | jsæz| j |¡}W nF ttfyŽ   Y nF 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 byte-ish (%r)z%Cannot call write() after write_eof()úsocket.send() raised exception.r   ú%Fatal write error on socket transport)rÂ   ÚbytesrÊ   Ú
memoryviewÚ	TypeErrorÚtyperÍ   r6   r¨   r   Ú!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   Úwarningr§   r¡   rN   rJ   rI   re   rÆ   r¯   rw   r¢   Ú_write_readyÚextendÚ_maybe_pause_protocol)r    rF   r}   r`   r   r   r   Úwriteª  s6    ÿ
z_SelectorSocketTransport.writec              
   C   sÔ   | j sJ dƒ‚z| j | j ¡}W n\ ttfy6   Y nš ty| } z0| j | j¡ | j  	¡  |  
|d¡ W Y d }~n\d }~0 0 |rŽ| j d |…= |  ¡  | j sÐ| j | j¡ | jr¼|  d ¡ n| jrÐ| j tj¡ d S )NzData should not be emptyrÞ   )r§   r¡   rN   rJ   rI   re   r¯   rx   r¢   rÇ   rÆ   Ú_maybe_resume_protocolr©   rº   rÍ   ÚshutdownrW   ÚSHUT_WR©r    r}   r`   r   r   r   rå   Í  s$    
"z%_SelectorSocketTransport._write_readyc                 C   s(   | j r
d S d| _ | js$| j tj¡ d S r€   )rÍ   r§   r¡   rê   rW   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_eof)NNN)r   r˜   r™   r   rÔ   r×   rÐ   rè   rå   rí   rî   r›   r   r   r!   r   r&   p  s     ÿ

#r&   c                       sd   e Zd ZeZd‡ fdd„	Zddd„Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Z‡  ZS )r2   NFc
                    sÀ   t d u rtdƒ‚|s t ||¡}|ddœ}
|r:|s:||
d< |j|fi |
¤Ž}tƒ  |||||	¡ d| _|| _|| _	|| _
d| _| jj|d | j ¡ r®t d| ¡ | j ¡ }nd }|  |¡ d S )Nzstdlib ssl module not availableF)r,   Údo_handshake_on_connectr-   )r0   z%r starts SSL handshake)Ússlr6   r
   Z_create_transport_contextÚwrap_socketr   r   r¤   Ú_server_hostnameÚ_waiterÚ_sslcontextrÎ   r   Úupdater¯   rÅ   r   r   ÚtimeÚ_on_handshake)r    rb   r/   r(   r0   r)   r,   r-   r#   r$   Zwrap_kwargsÚsslsockÚ
start_timer!   r   r   r   ò  s,    þ
z_SelectorSslTransport.__init__c                 C   sD   | j d u rd S | j  ¡ s:|d ur.| j  |¡ n| j  d ¡ d | _ d S r%   )ró   r   r‚   rƒ   rÈ   r   r   r   Ú_wakeup_waiter  s    

z$_SelectorSslTransport._wakeup_waiterc              
   C   s2  z| j  ¡  W nØ tjy8   | j | j| j|¡ Y d S  tjy`   | j 	| j| j|¡ Y d S  t
yæ } zp| j ¡ rˆtjd| dd | j | j¡ | j | j¡ | j  ¡  |  |¡ t|tƒrÐW Y d }~d S ‚ W Y d }~n
d }~0 0 | j | j¡ | j | j¡ | j  ¡ }t| jdƒs | jr | jjtjkr zt || j¡ W nX tyž } z>| j ¡ rttjd| dd | j  ¡  |  |¡ W Y d }~d S d }~0 0 | jj|| j  ¡ | j  ¡ d d| _d| _ | j | j| j!¡ d| _"| j #| j$j%| ¡ | j #| j¡ | j ¡ r.| j &¡ | }t 'd| |d	 ¡ d S )
Nz%r: SSL handshake failedTrL   Úcheck_hostnamez1%r: SSL handshake failed on matching the hostname)ÚpeercertÚcipherÚcompressionFz%r: SSL handshake took %.1f msg     @@)(r¡   Údo_handshakerð   ÚSSLWantReadErrorr¯   rC   r¢   r÷   ÚSSLWantWriteErrorrw   ÚBaseExceptionrÅ   r   rä   r=   rx   r9   rú   rÂ   re   ÚgetpeercertÚhasattrrô   rò   Úverify_modeÚ	CERT_NONEÚmatch_hostnamer   rõ   rý   rþ   Ú_read_wants_writeÚ_write_wants_readrÐ   r¤   r¹   r£   rÏ   rö   r   )r    rù   r`   rü   Údtr   r   r   r÷      sl    
ÿ
ÿ
ÿ



ÿþ

þz#_SelectorSslTransport._on_handshakec                 C   sJ   | j rtdƒ‚| jrtdƒ‚d| _| j | j¡ | j ¡ rFt d| ¡ d S rÒ   rÓ   r:   r   r   r   rÔ   ^  s    
z#_SelectorSslTransport.pause_readingc                 C   sJ   | j stdƒ‚d| _ | jrd S | j | j| j¡ | j ¡ rFt 	d| ¡ d S rÕ   rÖ   r:   r   r   r   r×   n  s    
z$_SelectorSslTransport.resume_readingc              
   C   s  | j r,d| _ |  ¡  | jr,| j | j| j¡ z| j | j¡}W n€ t	t
tjfyX   Y nÂ tjy   d| _| j | j¡ | j | j| j¡ Y nŠ ty¾ } z|  |d¡ W Y d }~ndd }~0 0 |rÒ| j |¡ nHz<| j ¡ rêt d| ¡ | j ¡ }|rt d¡ W |  ¡  n
|  ¡  0 d S )NFTz!Fatal read error on SSL transportrØ   z?returning true from eof_received() has no effect when using ssl)r	  rå   r§   r¯   rw   r¢   r¡   rH   rÉ   rJ   rI   rð   r   r  r  r=   re   rÆ   r£   rÙ   rÅ   r   r   rÚ   rä   r9   rÛ   r   r   r   rÐ   x  s0    "

z!_SelectorSslTransport._read_readyc              
   C   s   | j r2d| _ |  ¡  | js2| js2| j | j| j¡ | jrìz| j 	| j¡}W n t
ttjfyh   d}Y nt tjy’   d}| j | j¡ d| _Y nJ tyÚ } z2| j | j¡ | j ¡  |  |d¡ W Y d }~d S d }~0 0 |rì| jd |…= |  ¡  | js| j | j¡ | jr|  d ¡ d S )NFr   Tz"Fatal write error on SSL transport)r  rÐ   rÎ   r©   r¯   rC   r¢   r§   r¡   rN   rJ   rI   rð   r  r   rx   r	  re   rÇ   rÆ   ré   rº   rì   r   r   r   rå   ˜  s4    

z"_SelectorSslTransport._write_readyc                 C   s„   t |tttfƒstdt|ƒƒ‚|s&d S | jrT| jtjkrBt	 
d¡ |  jd7  _d S | jsl| j | j| j¡ | j |¡ |  ¡  d S )NrÜ   rÝ   r   )rÂ   rß   rÊ   rà   rá   râ   r¨   r   rã   r   rä   r§   r¯   rw   r¢   rå   ræ   rç   rE   r   r   r   rè   ¹  s    ÿ
z_SelectorSslTransport.writec                 C   s   dS r   r   r:   r   r   r   rî   Í  s    z#_SelectorSslTransport.can_write_eof)NFNNN)N)r   r˜   r™   rÊ   r¦   r   rú   r÷   rÔ   r×   rÐ   rå   rè   rî   r›   r   r   r!   r   r2   î  s      þ$

>
 !r2   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 )r3   Nc                    s^   t ƒ  ||||¡ || _| j | jj| ¡ | j | jj| j| j	¡ |d urZ| j |j
d ¡ d S r%   )r   r   Ú_addressr¯   r¹   r£   rÏ   rC   r¢   rÐ   rÑ   )r    rb   r'   r(   r4   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‡   )Ú.0rF   Ú_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œ   z| j  | j¡\}}W nr ttfy,   Y nl tyZ } z| j |¡ W Y d }~nFd }~0  tyˆ } z|  	|d¡ W Y d }~nd }~0 0 | j 
||¡ d S )Nz&Fatal read error on datagram transport)r¡   ÚrecvfromrÉ   rJ   rI   rO   r£   Úerror_receivedre   rÆ   Zdatagram_received©r    rF   r_   r`   r   r   r   rÐ   ä  s     "z&_SelectorDatagramTransport._read_readyc              
   C   s\  t |tttfƒstdt|ƒƒ‚|s&d S | jrJ|d | jfvrJtd| jf ƒ‚| jr~| jr~| jt	j
krlt d¡ |  jd7  _d S | js<z(| jrœ| j |¡ n| j ||¡ W d S  ttfyÖ   | j | j| j¡ Y nf ty } z| j |¡ W Y d }~d S d }~0  ty: } z|  |d¡ W Y d }~d S d }~0 0 | j t|ƒ|f¡ |  ¡  d S )NrÜ   z#Invalid address: must be None or %srÝ   r   ú'Fatal write error on datagram transport)rÂ   rß   rÊ   rà   rá   râ   r  r{   r¨   r   rã   r   rä   r§   r¡   rN   ÚsendtorJ   rI   r¯   rw   r¢   Ú_sendto_readyrO   r£   r  re   rÆ   r®   rç   r  r   r   r   r  ð  sB    ÿÿ
ÿz!_SelectorDatagramTransport.sendtoc              
   C   sü   | j rÈ| j  ¡ \}}z&| jr*| j |¡ n| j ||¡ W q  ttfyd   | j  ||f¡ Y qÈY q  t	y” } z| j
 |¡ W Y d }~d S d }~0  tyÄ } z|  |d¡ W Y d }~d S d }~0 0 q |  ¡  | j  sø| j | j¡ | j rø|  d ¡ d S )Nr  )r§   Úpopleftr  r¡   rN   r  rJ   rI   Ú
appendleftrO   r£   r  re   rÆ   ré   r¯   rx   r¢   r©   rº   r  r   r   r   r    s,    ÿz(_SelectorDatagramTransport._sendto_ready)NNN)N)r   r˜   r™   ÚcollectionsÚdequer¦   r   r°   rÐ   r  r  r›   r   r   r!   r   r3   Ñ  s     ÿ
'r3   )rš   Ú__all__r  r[   rŒ   rW   rË   r½   rð   ÚImportErrorÚ r   r   r   r   r   r	   r
   Z
coroutinesr   Úlogr   r   ZBaseEventLoopr   Z_FlowControlMixinÚ	Transportrœ   r&   r2   r3   r   r   r   r   Ú<module>   s@   
   Kÿ~~ d