
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \¨¢  ã               @   s8  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yddlZW n ek
rZ   dZY nX 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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 )ÚBaseSelectorEventLoopé    Né   )Úbase_events)Úcompat)Ú	constants)Úevents)Úfutures)Ú	selectors)Ú
transports)Ússlproto)Ú	coroutine)Úloggerc             C   s6   y| j |ƒ}W n tk
r"   dS X t|j|@ ƒS d S )NF)Úget_keyÚKeyErrorÚboolr   )ÚselectorÚfdZeventÚkey© r   ú//usr/lib64/python3.6/asyncio/selector_events.pyÚ_test_selector_event    s
    r   c                   sn  e Zd ZdN‡ fdd„	ZdOdddœdd„ZdPdddddœd	d
„Zdddddœdd„ZdQdd„Z‡ fdd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdRdd„ZdSd d!„ZedTd"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ed>d?„ ƒZ d@dA„ Z!dBdC„ Z"dDdE„ Z#dFdG„ Z$dHdI„ Z%dJdK„ Z&dLdM„ Z'‡  Z(S )Ur   Nc                sF   t ƒ jƒ  |d krtjƒ }tjd|jjƒ || _| j	ƒ  t
jƒ | _d S )NzUsing selector: %s)ÚsuperÚ__init__r	   Z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#   c      
   
   C   sN   t jƒ s"| j||||||||d�S t j| |||||ƒ}	t| ||	||d� |	jS )N)r)   r*   r"   r#   )r"   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 )N)Ú_SelectorSslTransport)	r!   r,   r&   r-   r'   r)   r*   r"   r#   r   r   r   r+   O   s    
z0BaseSelectorEventLoop._make_legacy_ssl_transportc             C   s   t | |||||ƒS )N)Ú_SelectorDatagramTransport)r!   r%   r&   Úaddressr'   r"   r   r   r   Ú_make_datagram_transportY   s    z.BaseSelectorEventLoop._make_datagram_transportc                sL   | j ƒ rtdƒ‚| jƒ rd S | jƒ  tƒ jƒ  | jd k	rH| j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   r6   ^   s    


zBaseSelectorEventLoop.closec             C   s   t ‚d S )N)ÚNotImplementedError)r!   r   r   r   Ú_socketpairi   s    z!BaseSelectorEventLoop._socketpairc             C   sB   | j | jjƒ ƒ | jjƒ  d | _| jjƒ  d | _|  jd8  _d S )Nr   )Ú_remove_readerÚ_ssockÚfilenor6   Ú_csockÚ_internal_fds)r!   r   r   r   r5   l   s    

z&BaseSelectorEventLoop._close_self_pipec             C   sN   | j ƒ \| _| _| jjdƒ | jjdƒ |  jd7  _| j| jjƒ | jƒ d S )NFr   )r8   r:   r<   Úsetblockingr=   Ú_add_readerr;   Ú_read_from_self)r!   r   r   r   r   t   s
    z%BaseSelectorEventLoop._make_self_pipec             C   s   d S )Nr   )r!   Údatar   r   r   Ú_process_self_data|   s    z(BaseSelectorEventLoop._process_self_datac             C   sV   xPy | j jdƒ}|sP | j|ƒ W q tk
r8   wY q tk
rL   P Y qX qW d S )Ni   )r:   ÚrecvrB   ÚInterruptedErrorÚBlockingIOError)r!   rA   r   r   r   r@      s    z%BaseSelectorEventLoop._read_from_selfc             C   sJ   | j }|d k	rFy|jdƒ W n( tk
rD   | jr@tjddd� Y nX 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 |jƒ | j|||||ƒ d S )N)r?   r;   Ú_accept_connection)r!   Úprotocol_factoryr%   r-   r#   Úbacklogr   r   r   Ú_start_serving›   s    z$BaseSelectorEventLoop._start_servingc             C   sþ   xøt |ƒD ]ì}y0|jƒ \}}| jr2tjd|||ƒ |jdƒ W n’ tttfk
rX   d S  t	k
rÐ }	 z^|	j
t
jt
jt
jt
jfkr¾| jd|	|dœƒ | j|jƒ ƒ | jtj| j|||||ƒ n‚ W Y d d }	~	X q
X d|i}
| j|||
||ƒ}| j|ƒ q
W d S )Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)ÚmessageÚ	exceptionÚsocketÚpeername)ÚrangeÚacceptrJ   r   r   r>   rE   rD   ÚConnectionAbortedErrorrI   ÚerrnoZEMFILEZENFILEZENOBUFSZENOMEMÚcall_exception_handlerr9   r;   Z
call_laterr   ZACCEPT_RETRY_DELAYrP   Ú_accept_connection2Zcreate_task)r!   rN   r%   r-   r#   rO   Ú_ÚconnÚaddrÚexcr"   rV   r   r   r   rM       s4    


z(BaseSelectorEventLoop._accept_connectionc             c   sÔ   d }d }yj|ƒ }| j ƒ }|r6| j||||d||d�}n| j|||||d�}y|E d H  W n   |jƒ  ‚ Y nX W n\ tk
rÎ }	 z@| jr¾d|	dœ}
|d k	r¤||
d< |d k	r´||
d< | j|
ƒ W Y d d }	~	X nX d S )NT)r'   r)   r"   r#   )r'   r"   r#   z3Error on transport creation for incoming connection)rQ   rR   r&   Ú	transport)Úcreate_futurer.   r(   r6   Ú	ExceptionrJ   rY   )r!   rN   r\   r"   r-   r#   r&   r_   r'   r^   Úcontextr   r   r   rZ   É   s4    z)BaseSelectorEventLoop._accept_connection2c             C   s@   y| j | }W n tk
r"   Y nX |jƒ s<tdj||ƒƒ‚d S )Nz.File descriptor {!r} is used by transport {!r})r    r   Ú
is_closingr3   Úformat)r!   r   r_   r   r   r   Ú_ensure_fd_no_transportî   s    z-BaseSelectorEventLoop._ensure_fd_no_transportc       	      G   s’   | j ƒ  tj||| ƒ}y| jj|ƒ}W n* tk
rP   | jj|tj|d fƒ Y n>X |j|j	 }\}}| jj
||tjB ||fƒ |d k	rŽ|jƒ  d S )N)Ú_check_closedr   ÚHandler   r   r   Úregisterr	   Ú
EVENT_READrA   ÚmodifyÚcancel)	r!   r   ÚcallbackÚargsÚhandler   ÚmaskÚreaderÚwriterr   r   r   r?   ù   s    
z!BaseSelectorEventLoop._add_readerc             C   s’   | j ƒ rdS y| jj|ƒ}W n tk
r0   dS X |j|j }\}}|tj M }|sb| jj|ƒ n| jj	||d |fƒ |d k	rŠ|j
ƒ  dS dS d S )NFT)r4   r   r   r   r   rA   r	   ri   Ú
unregisterrj   rk   )r!   r   r   ro   rp   rq   r   r   r   r9     s    z$BaseSelectorEventLoop._remove_readerc       	      G   s’   | j ƒ  tj||| ƒ}y| jj|ƒ}W n* tk
rP   | jj|tjd |fƒ Y n>X |j|j	 }\}}| jj
||tjB ||fƒ |d k	rŽ|jƒ  d S )N)rf   r   rg   r   r   r   rh   r	   ÚEVENT_WRITErA   rj   rk   )	r!   r   rl   rm   rn   r   ro   rp   rq   r   r   r   Ú_add_writer  s    
z!BaseSelectorEventLoop._add_writerc             C   s’   | j ƒ rdS y| jj|ƒ}W n tk
r0   dS X |j|j }\}}|tj M }|sb| jj|ƒ n| jj	|||d fƒ |d k	rŠ|j
ƒ  dS dS d S )NFT)r4   r   r   r   r   rA   r	   rs   rr   rj   rk   )r!   r   r   ro   rp   rq   r   r   r   Ú_remove_writer,  s    z$BaseSelectorEventLoop._remove_writerc             G   s   | j |ƒ | j||f|žŽ S )N)re   r?   )r!   r   rl   rm   r   r   r   Ú
add_readerC  s    
z BaseSelectorEventLoop.add_readerc             C   s   | j |ƒ | j|ƒS )N)re   r9   )r!   r   r   r   r   Úremove_readerH  s    
z#BaseSelectorEventLoop.remove_readerc             G   s   | j |ƒ | j||f|žŽ S )N)re   rt   )r!   r   rl   rm   r   r   r   Ú
add_writerM  s    
z BaseSelectorEventLoop.add_writerc             C   s   | j |ƒ | j|ƒS )N)re   ru   )r!   r   r   r   r   Úremove_writerR  s    
z#BaseSelectorEventLoop.remove_writerc             C   s6   | j r|jƒ dkrtdƒ‚| jƒ }| j|d ||ƒ |S )Nr   zthe socket must be non-blocking)rJ   Ú
gettimeoutÚ
ValueErrorr`   Ú
_sock_recv)r!   r%   ÚnÚfutr   r   r   Ú	sock_recvW  s
    	zBaseSelectorEventLoop.sock_recvc             C   sœ   |d k	r| j |ƒ |jƒ rd S y|j|ƒ}W n` ttfk
rb   |jƒ }| j|| j||||ƒ Y n6 tk
rŒ } z|j	|ƒ W Y d d }~X nX |j
|ƒ d S )N)rw   Ú	cancelledrC   rE   rD   r;   rv   r|   ra   Úset_exceptionÚ
set_result)r!   r~   Úregistered_fdr%   r}   rA   r   r^   r   r   r   r|   f  s    
z BaseSelectorEventLoop._sock_recvc             C   sF   | j r|jƒ dkrtdƒ‚| jƒ }|r8| j|d ||ƒ n
|jd ƒ |S )Nr   zthe socket must be non-blocking)rJ   rz   r{   r`   Ú_sock_sendallr‚   )r!   r%   rA   r~   r   r   r   Úsock_sendall{  s    
z"BaseSelectorEventLoop.sock_sendallc             C   s¼   |d k	r| j |ƒ |jƒ rd S y|j|ƒ}W nD ttfk
rH   d}Y n* tk
rp } z|j|ƒ d S d }~X nX |t|ƒkrŠ|jd ƒ n.|rš||d … }|j	ƒ }| j
|| j||||ƒ d S )Nr   )ry   r€   rH   rE   rD   ra   r�   Úlenr‚   r;   rx   r„   )r!   r~   rƒ   r%   rA   r}   r^   r   r   r   r   r„   �  s"    

z#BaseSelectorEventLoop._sock_sendallc             c   s�   | j r|jƒ dkrtdƒ‚ttdƒ s2|jtjkrptj||j|j	| d�}|j
ƒ sZ|E d H  |jƒ d \}}}}}| jƒ }| j|||ƒ |E d H S )Nr   zthe socket must be non-blockingÚAF_UNIX)ÚfamilyÚprotoÚloop)rJ   rz   r{   ÚhasattrrS   rˆ   r‡   r   Z_ensure_resolvedr‰   ÚdoneÚresultr`   Ú_sock_connect)r!   r%   r1   Zresolvedr[   r~   r   r   r   Úsock_connect¥  s    
z"BaseSelectorEventLoop.sock_connectc             C   s�   |j ƒ }y|j|ƒ W nj ttfk
rV   |jtj| j|ƒƒ | j|| j	|||ƒ Y n6 t
k
r€ } z|j|ƒ W Y d d }~X nX |jd ƒ d S )N)r;   ZconnectrE   rD   Zadd_done_callbackÚ	functoolsÚpartialÚ_sock_connect_donerx   Ú_sock_connect_cbra   r�   r‚   )r!   r~   r%   r1   r   r^   r   r   r   rŽ   ¹  s    z#BaseSelectorEventLoop._sock_connectc             C   s   | j |ƒ d S )N)ry   )r!   r   r~   r   r   r   r’   Ê  s    z(BaseSelectorEventLoop._sock_connect_donec             C   sŠ   |j ƒ rd S y,|jtjtjƒ}|dkr6t|d|f ƒ‚W nB ttfk
rP   Y n6 tk
rz } z|j	|ƒ W Y d d }~X nX |j
d ƒ d S )Nr   zConnect call failed %s)r€   Z
getsockoptrS   Z
SOL_SOCKETZSO_ERRORrI   rE   rD   ra   r�   r‚   )r!   r~   r%   r1   Úerrr^   r   r   r   r“   Í  s    z&BaseSelectorEventLoop._sock_connect_cbc             C   s4   | j r|jƒ dkrtdƒ‚| jƒ }| j|d|ƒ |S )Nr   zthe socket must be non-blockingF)rJ   rz   r{   r`   Ú_sock_accept)r!   r%   r~   r   r   r   Úsock_acceptÞ  s
    
z!BaseSelectorEventLoop.sock_acceptc             C   s¦   |j ƒ }|r| j|ƒ |jƒ r"d S y|jƒ \}}|jdƒ W nV ttfk
rh   | j|| j|d|ƒ Y n: t	k
r’ } z|j
|ƒ W Y d d }~X nX |j||fƒ d S )NFT)r;   rw   r€   rV   r>   rE   rD   rv   r•   ra   r�   r‚   )r!   r~   Z
registeredr%   r   r\   r1   r^   r   r   r   r•   î  s    
z"BaseSelectorEventLoop._sock_acceptc             C   s„   x~|D ]v\}}|j |j }\}}|tj@ rN|d k	rN|jrD| j|ƒ n
| j|ƒ |tj@ r|d k	r|jrr| j|ƒ q| j|ƒ qW d S )N)	ÚfileobjrA   r	   ri   Z
_cancelledr9   Z_add_callbackrs   ru   )r!   Z
event_listr   ro   r—   rp   rq   r   r   r   Ú_process_eventsþ  s    
z%BaseSelectorEventLoop._process_eventsc             C   s   | j |jƒ ƒ |jƒ  d S )N)r9   r;   r6   )r!   r%   r   r   r   Ú_stop_serving  s    z#BaseSelectorEventLoop._stop_serving)N)N)N)NNN)NNrL   )NNrL   )NN))r   Ú
__module__Ú__qualname__r   r(   r.   r+   r2   r6   r8   r5   r   rB   r@   rK   rP   rM   r   rZ   re   r?   r9   rt   ru   rv   rw   rx   ry   r   r|   r…   r„   r�   rŽ   r’   r“   r–   r•   r˜   r™   Ú__classcell__r   r   )r   r   r   +   sR   



(#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r`dd„ Zd!dd„Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )"Ú_SelectorTransporté   i   Nc                sÀ   t ƒ j||ƒ || jd< |jƒ | jd< d| jkrdy|jƒ | jd< W n  tjk
rb   d | jd< Y nX || _|jƒ | _	|| _
d| _|| _| jƒ | _d| _d| _| jd k	r°| jjƒ  | |j| j	< d S )NrS   ZsocknamerT   Tr   F)r   r   Ú_extraZgetsocknameZgetpeernamerS   ÚerrorÚ_sockr;   Ú_sock_fdÚ	_protocolÚ_protocol_connectedÚ_serverÚ_buffer_factoryÚ_bufferÚ
_conn_lostÚ_closingZ_attachr    )r!   rŠ   r%   r&   r"   r#   )r   r   r   r     s&    





z_SelectorTransport.__init__c             C   sÎ   | j jg}| jd kr |jdƒ n| jr0|jdƒ |jd| j ƒ | jd k	rÀ| jjƒ  rÀt| jj	| jt
jƒ}|rz|jdƒ n
|jdƒ t| jj	| jt
jƒ}|r¢d}nd}| jƒ }|jd||f ƒ d	d
j|ƒ S )NÚclosedÚclosingzfd=%szread=pollingz	read=idleÚpollingZidlezwrite=<%s, bufsize=%s>z<%s>ú )r   r   r¡   Úappendr©   r¢   Ú_loopr4   r   r   r	   ri   rs   Úget_write_buffer_sizeÚjoin)r!   Úinfor¬   ÚstateÚbufsizer   r   r   Ú__repr__2  s*    



z_SelectorTransport.__repr__c             C   s   | j d ƒ d S )N)Ú_force_close)r!   r   r   r   ÚabortN  s    z_SelectorTransport.abortc             C   s
   || _ d S )N)r£   )r!   r&   r   r   r   Úset_protocolQ  s    z_SelectorTransport.set_protocolc             C   s   | j S )N)r£   )r!   r   r   r   Úget_protocolT  s    z_SelectorTransport.get_protocolc             C   s   | j S )N)r©   )r!   r   r   r   rc   W  s    z_SelectorTransport.is_closingc             C   sT   | j r
d S d| _ | jj| jƒ | jsP|  jd7  _| jj| jƒ | jj| jd ƒ d S )NTr   )	r©   r¯   r9   r¢   r§   r¨   ru   Ú	call_soonÚ_call_connection_lost)r!   r   r   r   r6   Z  s    z_SelectorTransport.closec             C   s,   | j d k	r(tjd|  t| d� | j jƒ  d S )Nzunclosed transport %r)Úsource)r¡   ÚwarningsÚwarnÚResourceWarningr6   )r!   r   r   r   Ú__del__h  s    
z_SelectorTransport.__del__úFatal error on transportc             C   sP   t |tjƒr*| jjƒ rBtjd| |dd� n| jj||| | jdœƒ | j	|ƒ d S )Nz%r: %sT)rG   )rQ   rR   r_   r&   )
Ú
isinstancer   Z_FATAL_ERROR_IGNOREr¯   Ú	get_debugr   r   rY   r£   r¶   )r!   r^   rQ   r   r   r   Ú_fatal_errorn  s    
z_SelectorTransport._fatal_errorc             C   sd   | j r
d S | jr(| jjƒ  | jj| jƒ | jsBd| _| jj| jƒ |  j d7  _ | jj| j	|ƒ d S )NTr   )
r¨   r§   Úclearr¯   ru   r¢   r©   r9   rº   r»   )r!   r^   r   r   r   r¶   |  s    
z_SelectorTransport._force_closec             C   sV   z| j r| jj|ƒ W d | jjƒ  d | _d | _d | _| j}|d k	rP|jƒ  d | _X d S )N)r¤   r£   Zconnection_lostr¡   r6   r¯   r¥   Z_detach)r!   r^   r#   r   r   r   r»   ˆ  s    
z(_SelectorTransport._call_connection_lostc             C   s
   t | jƒS )N)r†   r§   )r!   r   r   r   r°   –  s    z(_SelectorTransport.get_write_buffer_sizec             G   s"   | j r
d S | jj||f|žŽ  d S )N)r©   r¯   r?   )r!   r   rl   rm   r   r   r   r?   ™  s    z_SelectorTransport._add_readeri   )NN)rÁ   )r   rš   r›   Úmax_sizeÚ	bytearrayr¦   r¡   r   rµ   r·   r¸   r¹   rc   r6   r   ZPY34rÀ   rÄ   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                sr   t ƒ j|||||ƒ d| _d| _tj| jƒ | jj| j	j
| ƒ | jj| j| j| jƒ |d k	rn| jjtj|d ƒ d S )NF)r   r   Ú_eofÚ_pausedr   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             C   s>   | j s| jrd S d| _| jj| jƒ | jjƒ r:tjd| ƒ d S )NTz%r pauses reading)r©   rÉ   r¯   r9   r¢   rÃ   r   r   )r!   r   r   r   Úpause_reading¶  s    
z&_SelectorSocketTransport.pause_readingc             C   sB   | j s| j rd S d| _| j| j| jƒ | jjƒ r>tjd| ƒ d S )NFz%r resumes reading)	r©   rÉ   r?   r¢   rË   r¯   rÃ   r   r   )r!   r   r   r   Úresume_reading¾  s    
z'_SelectorSocketTransport.resume_readingc             C   s´   | j r
d S y| jj| jƒ}W nD ttfk
r4   Y n| tk
r` } z| j|dƒ W Y d d }~X nPX |rt| jj	|ƒ n<| j
jƒ rŠtjd| ƒ | jjƒ }|r¨| j
j| jƒ n| jƒ  d S )Nz$Fatal read error on socket transportz%r received EOF)r¨   r¡   rC   rÆ   rE   rD   ra   rÄ   r£   Údata_receivedr¯   rÃ   r   r   Úeof_receivedr9   r¢   r6   )r!   rA   r^   Ú	keep_openr   r   r   rË   Æ  s     

z$_SelectorSocketTransport._read_readyc             C   sþ   t |tttfƒs"tdt|ƒj ƒ‚| jr0tdƒ‚|s8d S | j	rf| j	t
jkrTtjdƒ |  j	d7  _	d S | jsæy| jj|ƒ}W nB ttfk
r”   Y n@ tk
r¾ } z| j|dƒ d S d }~X nX ||d … }|sÔd S | jj| j| jƒ | jj|ƒ | jƒ  d S )Nz1data argument must be a bytes-like object, not %rz%Cannot call write() after write_eof()zsocket.send() raised exception.r   z%Fatal write error on socket transport)rÂ   ÚbytesrÇ   Ú
memoryviewÚ	TypeErrorÚtyper   rÈ   r3   r¨   r   Ú!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   Úwarningr§   r¡   rH   rE   rD   ra   rÄ   r¯   rt   r¢   Ú_write_readyÚextendÚ_maybe_pause_protocol)r!   rA   r}   r^   r   r   r   ÚwriteÞ  s4    
z_SelectorSocketTransport.writec             C   sÐ   | j r
d S y| jj| jƒ}W n\ ttfk
r4   Y n˜ tk
rx } z*| jj| j	ƒ | jj
ƒ  | j|dƒ W Y d d }~X nTX |rŠ| jd |…= | jƒ  | jsÌ| jj| j	ƒ | jr¸| jd ƒ n| jrÌ| jjtjƒ d S )Nz%Fatal write error on socket transport)r¨   r¡   rH   r§   rE   rD   ra   r¯   ru   r¢   rÅ   rÄ   Ú_maybe_resume_protocolr©   r»   rÈ   ÚshutdownrS   ÚSHUT_WR)r!   r}   r^   r   r   r   rØ     s&    
z%_SelectorSocketTransport._write_readyc             C   s.   | j s| jrd S d| _| js*| jjtjƒ d S )NT)r©   rÈ   r§   r¡   rÝ   rS   rÞ   )r!   r   r   r   Ú	write_eof  s
    z"_SelectorSocketTransport.write_eofc             C   s   dS )NTr   )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$      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 )r/   NFc
                s¾   t d krtdƒ‚|s tj||ƒ}|ddœ}
|r<| r<||
d< |j|f|
Ž}tƒ j|||||	ƒ d| _|| _|| _	|| _
d| _| jj|d� | jjƒ r¬tjd| ƒ | jjƒ }nd }| j|ƒ d S )Nzstdlib ssl module not availableF)r)   Zdo_handshake_on_connectr*   )r-   z%r starts SSL handshake)Ússlr3   r   Z_create_transport_contextZwrap_socketr   r   r¤   Ú_server_hostnameÚ_waiterÚ_sslcontextrÉ   rŸ   Úupdater¯   rÃ   r   r   ÚtimeÚ_on_handshake)r!   rŠ   r,   r&   r-   r'   r)   r*   r"   r#   Zwrap_kwargsZsslsockÚ
start_time)r   r   r   r   (  s*    

z_SelectorSslTransport.__init__c             C   sD   | j d krd S | j jƒ s:|d k	r.| j j|ƒ n| j jd ƒ d | _ d S )N)rã   r€   r�   r‚   )r!   r^   r   r   r   Ú_wakeup_waiterL  s    

z$_SelectorSslTransport._wakeup_waiterc          "   C   s$  y| j jƒ  W nÌ tjk
r8   | jj| j| j|ƒ d S  tjk
r`   | jj	| j| j|ƒ d S  t
k
rÚ } z`| jjƒ rŠtjd| dd� | jj| jƒ | jj| jƒ | j jƒ  | j|ƒ t|tƒrÈd S ‚ W Y d d }~X nX | jj| jƒ | jj| jƒ | j jƒ }t| jdƒ�sŽ| j�rŽ| jjtjk�rŽytj|| jƒ W nR tk
�rŒ } z4| jjƒ �rjtjd| dd� | j jƒ  | j|ƒ d S d }~X nX | jj|| j jƒ | j jƒ | j d� d| _d| _ | jj| j| j!ƒ d| _"| jj#| j$j%| ƒ | jj#| jƒ | jjƒ �r | jj&ƒ | }tj'd| |d	 ƒ d S )
Nz%r: SSL handshake failedT)rG   Zcheck_hostnamez1%r: SSL handshake failed on matching the hostname)ÚpeercertÚcipherÚcompressionZ
ssl_objectFz%r: SSL handshake took %.1f msg     @�@)(r¡   Zdo_handshakerá   ÚSSLWantReadErrorr¯   r?   r¢   rç   ÚSSLWantWriteErrorrt   ÚBaseExceptionrÃ   r   r×   r9   ru   r6   ré   rÂ   ra   Zgetpeercertr‹   rä   râ   Zverify_modeZ	CERT_NONEZmatch_hostnamerŸ   rå   rë   rì   Ú_read_wants_writeÚ_write_wants_readrË   r¤   rº   r£   rÊ   ræ   r   )r!   rè   r^   rê   Zdtr   r   r   rç   V  sb    













z#_SelectorSslTransport._on_handshakec             C   sJ   | j rtdƒ‚| jrtdƒ‚d| _| jj| jƒ | jjƒ rFtjd| ƒ d S )Nz#Cannot pause_reading() when closingzAlready pausedTz%r pauses reading)	r©   r3   rÉ   r¯   r9   r¢   rÃ   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ƒ | jjƒ rFtj	d| ƒ d S )Nz
Not pausedFz%r resumes reading)
rÉ   r3   r©   r¯   r?   r¢   rË   rÃ   r   r   )r!   r   r   r   rÎ   ¥  s    
z$_SelectorSslTransport.resume_readingc             C   s"  | j r
d S | jr6d| _| jƒ  | jr6| jj| j| jƒ y| jj| j	ƒ}W n‚ t
ttjfk
rd   Y nº tjk
rž   d| _| jj| jƒ | jj| j| jƒ Y n€ tk
rÊ } z| j|dƒ W Y d d }~X nTX |rÞ| jj|ƒ n@z4| jjƒ rötjd| ƒ | jjƒ }|�rtjdƒ W d | jƒ  X d S )NFTz!Fatal read error on SSL transportz%r received EOFz?returning true from eof_received() has no effect when using ssl)r¨   rñ   rØ   r§   r¯   rt   r¢   r¡   rC   rÆ   rE   rD   rá   rí   rî   rð   r9   ra   rÄ   r£   rÏ   rÃ   r   r   rÐ   r×   r6   )r!   rA   r^   rÑ   r   r   r   rË   ¯  s4    

z!_SelectorSslTransport._read_readyc             C   s(  | j r
d S | jr<d| _| jƒ  | jp(| js<| jj| j| jƒ | jrôy| j	j
| jƒ}W nŽ tttjfk
rt   d}Y np tjk
r    d}| jj| jƒ d| _Y nD tk
râ } z(| jj| jƒ | jjƒ  | j|dƒ d S d }~X nX |rô| jd |…= | jƒ  | j�s$| jj| jƒ | j�r$| jd ƒ d S )NFr   Tz"Fatal write error on SSL transport)r¨   rð   rË   rÉ   r©   r¯   r?   r¢   r§   r¡   rH   rE   rD   rá   rî   rí   ru   rñ   ra   rÅ   rÄ   rÜ   r»   )r!   r}   r^   r   r   r   rØ   Ñ  s8    

z"_SelectorSslTransport._write_readyc             C   sˆ   t |tttfƒs"tdt|ƒj ƒ‚|s*d S | jrX| jtj	krFt
jdƒ |  jd7  _d S | jsp| jj| j| jƒ | jj|ƒ | jƒ  d S )Nz1data argument must be a bytes-like object, not %rzsocket.send() raised exception.r   )rÂ   rÒ   rÇ   rÓ   rÔ   rÕ   r   r¨   r   rÖ   r   r×   r§   r¯   rt   r¢   rØ   rÙ   rÚ   )r!   rA   r   r   r   rÛ   ô  s    
z_SelectorSslTransport.writec             C   s   dS )NFr   )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   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 )r0   Nc                s^   t ƒ j||||ƒ || _| jj| jj| ƒ | jj| j| j| j	ƒ |d k	rZ| jjt
j|d ƒ d S )N)r   r   Ú_addressr¯   rº   r£   rÊ   r?   r¢   rË   r   rÌ   )r!   rŠ   r%   r&   r1   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 )N)r†   )Ú.0rA   r[   r   r   r   ú	<genexpr>  s    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 y| jj| jƒ\}}W np ttfk
r8   Y nh tk
rd } z| jj|ƒ W Y d d }~X n< t	k
r� } z| j
|dƒ W Y d d }~X nX | jj||ƒ d S )Nz&Fatal read error on datagram transport)r¨   r¡   ZrecvfromrÆ   rE   rD   rI   r£   Úerror_receivedra   rÄ   Zdatagram_received)r!   rA   r]   r^   r   r   r   rË      s    z&_SelectorDatagramTransport._read_readyc             C   sT  t |tttfƒs"tdt|ƒj ƒ‚|s*d S | jrN|d | jfkrNtd| jf ƒ‚| j	r‚| jr‚| j	t
jkrptjdƒ |  j	d7  _	d S | j�s4y&| jr | jj|ƒ n| jj||ƒ d S  ttfk
rÚ   | jj| j| jƒ Y nZ tk
�r } z| jj|ƒ d S d }~X n. tk
�r2 } z| j|dƒ d S d }~X nX | jjt|ƒ|fƒ | jƒ  d S )Nz1data argument must be a bytes-like object, not %rz#Invalid address: must be None or %szsocket.send() raised exception.r   z'Fatal write error on datagram transport)rÂ   rÒ   rÇ   rÓ   rÔ   rÕ   r   rò   r{   r¨   r   rÖ   r   r×   r§   r¡   rH   ÚsendtorE   rD   r¯   rt   r¢   Ú_sendto_readyrI   r£   rö   ra   rÄ   r®   rÚ   )r!   rA   r]   r^   r   r   r   r÷   .  s<    
z!_SelectorDatagramTransport.sendtoc             C   sð   x¾| j r¾| j jƒ \}}y&| jr,| jj|ƒ n| jj||ƒ W q ttfk
rf   | j j||fƒ P Y q t	k
r� } z| j
j|ƒ d S d }~X q tk
rº } z| j|dƒ d S d }~X qX qW | jƒ  | j sì| jj| jƒ | jrì| jd ƒ d S )Nz'Fatal write error on datagram transport)r§   Úpopleftrò   r¡   rH   r÷   rE   rD   Ú
appendleftrI   r£   rö   ra   rÄ   rÜ   r¯   ru   r¢   r©   r»   )r!   rA   r]   r^   r   r   r   rø   U  s*    z(_SelectorDatagramTransport._sendto_ready)NNN)N)r   rš   r›   ÚcollectionsÚdequer¦   r   r°   rË   r÷   rø   rœ   r   r   )r   r   r0     s    
'r0   )Ú__all__rû   rX   r�   rS   r½   r   rá   ÚImportErrorÚ r   r   r   r   r   r	   r
   r   Z
coroutinesr   Úlogr   r   ZBaseEventLoopr   Z_FlowControlMixinZ	Transportr�   r$   r/   r0   r   r   r   r   Ú<module>   sB   
   i   i