<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>

Yf                 @   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 y d d l Z Wn e	 k
 r d Z Yn Xd 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 e e d  rLd d   Z n d d   Z Gd d   d e j  Z Gd d   d e j e j  Z Gd d   d e  Z Gd d   d e  Z  Gd d   d e  Z! d S)zEvent 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)compat)	constants)events)futures)	selectors)
transports)sslproto)	coroutine)loggerc             C   sA   y |  j  |  } Wn t k
 r+ d SYn Xt | j | @ Sd  S)NF)get_keyKeyErrorboolr   )selectorfdZeventkey r   </opt/alt/python35/lib64/python3.5/asyncio/selector_events.py_test_selector_event    s
    	r   TCP_NODELAYc             C   s\   |  j  t j t j h k rX |  j t j k rX |  j t j k rX |  j t j t j	 d  d  S)Nr   )
familysocketZAF_INETZAF_INET6typeZSOCK_STREAMprotoZIPPROTO_TCPZ
setsockoptr   )sockr   r   r   _set_nodelay,   s    r   c             C   s   d  S)Nr   )r   r   r   r   r   2   s    c                   sD  e  Z d  Z d Z d   f d d  Z d d d d d d d Z d d	 d
 d d d d d d d d Z d	 d
 d d d d d d d d  Z d d d 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 d  d! d"  Z d d d  d# d$  Z e d d d% d&   Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d/ d0   Z d1 d2   Z d3 d4   Z d5 d6   Z d7 d8   Z d9 d:   Z d; d<   Z d= d>   Z d? d@   Z  e dA dB    Z! dC dD   Z" dE dF   Z# dG dH   Z$ dI dJ   Z% dK dL   Z& dM dN   Z' dO dP   Z(   S)Qr   zJSelector event loop.

    See events.EventLoop for API specification.
    Nc                sa   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   <   s    	
zBaseSelectorEventLoop.__init__extraserverc            C   s   t  |  | | | | |  S)N)_SelectorSocketTransport)r(   r   protocolwaiterr)   r*   r   r   r   _make_socket_transportF   s    z,BaseSelectorEventLoop._make_socket_transportserver_sideFserver_hostnamec      
      C   s{   t  j   s: |  j | | | | d | d | d | d | St  j |  | | | | |  }	 t |  | |	 d | d | |	 j S)Nr/   r0   r)   r*   )r   Z_is_sslproto_available_make_legacy_ssl_transportZSSLProtocolr+   Z_app_transport)
r(   rawsockr,   
sslcontextr-   r/   r0   r)   r*   Zssl_protocolr   r   r   _make_ssl_transportK   s    z)BaseSelectorEventLoop._make_ssl_transportc      	   
   C   s"   t  |  | | | | | | | | 	 S)N)_SelectorSslTransport)	r(   r2   r,   r3   r-   r/   r0   r)   r*   r   r   r   r1   Z   s    z0BaseSelectorEventLoop._make_legacy_ssl_transportc             C   s   t  |  | | | | |  S)N)_SelectorDatagramTransport)r(   r   r,   addressr-   r)   r   r   r   _make_datagram_transportd   s    z.BaseSelectorEventLoop._make_datagram_transportc                sh   |  j    r t d   |  j   r( d  S|  j   t   j   |  j d  k	 rd |  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   r<   i   s    
zBaseSelectorEventLoop.closec             C   s
   t   d  S)N)NotImplementedError)r(   r   r   r   _socketpairt   s    z!BaseSelectorEventLoop._socketpairc             C   sU   |  j  |  j j    |  j j   d  |  _ |  j j   d  |  _ |  j d 8_ d  S)Nr   )_remove_reader_ssockfilenor<   _csock_internal_fds)r(   r   r   r   r;   w   s    		z&BaseSelectorEventLoop._close_self_pipec             C   sg   |  j    \ |  _ |  _ |  j j d  |  j j d  |  j d 7_ |  j |  j j   |  j  d  S)NFr   )r>   r@   rB   setblockingrC   _add_readerrA   _read_from_self)r(   r   r   r   r$      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   s_   xX y* |  j  j d  } | s P|  j |  Wq t k
 rD w Yq t k
 rV PYq Xq Wd  S)Ni   )r@   recvrH   InterruptedErrorBlockingIOError)r(   rG   r   r   r   rF      s    z%BaseSelectorEventLoop._read_from_selfc             C   s[   |  j  } | d  k	 rW y | j d  Wn. t k
 rV |  j rR t j d d d Yn Xd  S)Ns    z3Fail to write a null byte into the self-pipe socketexc_infoT)rB   sendOSError_debugr   r    )r(   Zcsockr   r   r   _write_to_self   s    		z$BaseSelectorEventLoop._write_to_selfd   c             C   s,   |  j  | j   |  j | | | | |  d  S)N)rE   rA   _accept_connection)r(   protocol_factoryr   r3   r*   backlogr   r   r   _start_serving   s    z$BaseSelectorEventLoop._start_servingc             C   s[  xTt  |  D]F} yB | j   \ } } |  j rG t j d | | |  | j d  Wn t t t f k
 rv d  SYq t	 k
 r}	 z |	 j
 t
 j t
 j t
 j t
 j f k r	|  j d d d |	 d | i  |  j | j    |  j t j |  j | | | | |  n   WYd  d  }	 ~	 Xq Xd | i }
 |  j | | |
 | |  } |  j |  q Wd  S)Nz#%r got a new connection from %r: %rFmessagez&socket.accept() out of system resource	exceptionr   peername)rangeacceptrO   r   r    rD   rK   rJ   ConnectionAbortedErrorrN   errnoZEMFILEZENFILEZENOBUFSZENOMEMcall_exception_handlerr?   rA   Z
call_laterr   ZACCEPT_RETRY_DELAYrU   _accept_connection2Zcreate_task)r(   rS   r   r3   r*   rT   _connaddrexcr)   rZ   r   r   r   rR      s4    		
z(BaseSelectorEventLoop._accept_connectionc             c   s$  d  } d  } y |   } |  j    } | rZ |  j | | | d | d d d | d | } n$ |  j | | d | d | d | } y | Ed  HWn | j     Yn XWny t k
 r}	 zY |  j rd d d |	 i }
 | d  k	 r | |
 d	 <| d  k	 r | |
 d
 <|  j |
  WYd  d  }	 ~	 Xn Xd  S)Nr-   r/   Tr)   r*   rV   z3Error on transport creation for incoming connectionrW   r,   	transport)create_futurer4   r.   r<   	ExceptionrO   r]   )r(   rS   r`   r)   r3   r*   r,   rc   r-   rb   contextr   r   r   r^      s4    		
	

z)BaseSelectorEventLoop._accept_connection2c             C   sN   y |  j  | } Wn t k
 r% Yn% X| j   sJ t d j | |    d  S)Nz.File descriptor {!r} is used by transport {!r})r'   r   
is_closingr9   format)r(   r   rc   r   r   r   _ensure_fd_no_transport   s    z-BaseSelectorEventLoop._ensure_fd_no_transportc       	      G   s   |  j    t j | | |   } y |  j j |  } Wn1 t k
 rh |  j j | t j | d  f  YnS X| j | j	 } \ } } |  j j
 | | t j B| | f  | d  k	 r | j   d  S)N)_check_closedr   Handler#   r   r   registerr	   
EVENT_READrG   modifycancel)	r(   r   callbackargshandler   maskreaderwriterr   r   r   rE     s    
z!BaseSelectorEventLoop._add_readerc             C   s   |  j    r d Sy |  j j |  } Wn t k
 r> d SYn{ X| j | j } \ } } | t j M} | s |  j j |  n |  j j	 | | d  | f  | d  k	 r | j
   d Sd Sd  S)NFT)r:   r#   r   r   r   rG   r	   rm   
unregisterrn   ro   )r(   r   r   rs   rt   ru   r   r   r   r?     s    	
z$BaseSelectorEventLoop._remove_readerc       	      G   s   |  j    t j | | |   } y |  j j |  } Wn1 t k
 rh |  j j | t j d  | f  YnS X| j | j	 } \ } } |  j j
 | | t j B| | f  | d  k	 r | j   d  S)N)rj   r   rk   r#   r   r   rl   r	   EVENT_WRITErG   rn   ro   )	r(   r   rp   rq   rr   r   rs   rt   ru   r   r   r   _add_writer(  s    
z!BaseSelectorEventLoop._add_writerc             C   s   |  j    r d Sy |  j j |  } Wn t k
 r> d SYn{ X| j | j } \ } } | t j M} | s |  j j |  n |  j j	 | | | d f  | d k	 r | j
   d Sd Sd S)zRemove a writer callback.FNT)r:   r#   r   r   r   rG   r	   rw   rv   rn   ro   )r(   r   r   rs   rt   ru   r   r   r   _remove_writer7  s    	
z$BaseSelectorEventLoop._remove_writerc             G   s    |  j  |  |  j | | |  S)zAdd a reader callback.)ri   rE   )r(   r   rp   rq   r   r   r   
add_readerN  s    z BaseSelectorEventLoop.add_readerc             C   s   |  j  |  |  j |  S)zRemove a reader callback.)ri   r?   )r(   r   r   r   r   remove_readerS  s    z#BaseSelectorEventLoop.remove_readerc             G   s    |  j  |  |  j | | |  S)zAdd a writer callback..)ri   rx   )r(   r   rp   rq   r   r   r   
add_writerX  s    z BaseSelectorEventLoop.add_writerc             C   s   |  j  |  |  j |  S)zRemove a writer callback.)ri   ry   )r(   r   r   r   r   remove_writer]  s    z#BaseSelectorEventLoop.remove_writerc             C   sM   |  j  r' | j   d k r' t d   |  j   } |  j | d | |  | S)zReceive 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   zthe socket must be non-blockingF)rO   
gettimeout
ValueErrorrd   
_sock_recv)r(   r   nfutr   r   r   	sock_recvb  s
    	zBaseSelectorEventLoop.sock_recvc             C   s   | j    } | r |  j |  | j   r/ d  Sy | j |  } Wnh t t f k
 r{ |  j | |  j | d | |  Yn? t k
 r } z | j	 |  WYd  d  } ~ Xn X| j
 |  d  S)NT)rA   r{   	cancelledrI   rK   rJ   rz   r   re   set_exception
set_result)r(   r   
registeredr   r   r   rG   rb   r   r   r   r   q  s    # z BaseSelectorEventLoop._sock_recvc             C   sc   |  j  r' | j   d k r' t d   |  j   } | rR |  j | d | |  n | j 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   zthe socket must be non-blockingFN)rO   r~   r   rd   _sock_sendallr   )r(   r   rG   r   r   r   r   sock_sendall  s    z"BaseSelectorEventLoop.sock_sendallc             C   s   | j    } | r |  j |  | j   r/ d  Sy | j |  } WnS t t f k
 rb d } Yn6 t k
 r } z | j |  d  SWYd  d  } ~ Xn X| t |  k r | j	 d   n5 | r | | d   } |  j
 | |  j | d | |  d  S)Nr   T)rA   r}   r   rM   rK   rJ   re   r   lenr   r|   r   )r(   r   r   r   rG   r   r   rb   r   r   r   r     s"    
z#BaseSelectorEventLoop._sock_sendallc             c   s   |  j  r' | j   d k r' t d   t t d  sI | j t j k r t j | d | j d | j	 d |  } | j
   s | Ed H| j   d \ } } } } } |  j   } |  j | | |  | Ed HS)zTConnect to a remote socket at address.

        This method is a coroutine.
        r   zthe socket must be non-blockingAF_UNIXr   r   loopN)rO   r~   r   hasattrr   r   r   r   Z_ensure_resolvedr   doneresultrd   _sock_connect)r(   r   r7   Zresolvedr_   r   r   r   r   sock_connect  s    "!	z"BaseSelectorEventLoop.sock_connectc             C   s   | j    } y | j |  Wn t t f k
 ro | j t j |  j |   |  j | |  j	 | | |  Yn? t
 k
 r } z | j |  WYd  d  } ~ Xn X| j d   d  S)N)rA   ZconnectrK   rJ   Zadd_done_callback	functoolspartial_sock_connect_doner|   _sock_connect_cbre   r   r   )r(   r   r   r7   r   rb   r   r   r   r     s      z#BaseSelectorEventLoop._sock_connectc             C   s   |  j  |  d  S)N)r}   )r(   r   r   r   r   r   r     s    z(BaseSelectorEventLoop._sock_connect_donec             C   s   | j    r d  Sy> | j t j t j  } | d k rM t | d | f   WnI t t f k
 rh Yn? t k
 r } z | j	 |  WYd  d  } ~ Xn X| j
 d   d  S)Nr   zConnect call failed %s)r   Z
getsockoptr   Z
SOL_SOCKETZSO_ERRORrN   rK   rJ   re   r   r   )r(   r   r   r7   errrb   r   r   r   r     s     z&BaseSelectorEventLoop._sock_connect_cbc             C   sJ   |  j  r' | j   d k r' t d   |  j   } |  j | 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   zthe socket must be non-blockingF)rO   r~   r   rd   _sock_accept)r(   r   r   r   r   r   sock_accept  s
    
z!BaseSelectorEventLoop.sock_acceptc             C   s   | j    } | r |  j |  | j   r/ d  Sy# | j   \ } } | j d  Wne t t f k
 r |  j | |  j | d |  YnE t	 k
 r } z | j
 |  WYd  d  } ~ Xn X| j | | f  d  S)NFT)rA   r{   r   rZ   rD   rK   rJ   rz   r   re   r   r   )r(   r   r   r   r   r`   r7   rb   r   r   r   r     s      z"BaseSelectorEventLoop._sock_acceptc             C   s   x | D] \ } } | j  | j } \ } } | t j @rk | d  k	 rk | j r^ |  j |  n |  j |  | t j @r | d  k	 r | j r |  j |  q |  j |  q Wd  S)N)	fileobjrG   r	   rm   Z
_cancelledr?   Z_add_callbackrw   ry   )r(   Z
event_listr   rs   r   rt   ru   r   r   r   _process_events
  s    		z%BaseSelectorEventLoop._process_eventsc             C   s!   |  j  | j    | j   d  S)N)r?   rA   r<   )r(   r   r   r   r   _stop_serving  s    z#BaseSelectorEventLoop._stop_serving))r"   
__module____qualname____doc__r   r.   r4   r1   r8   r<   r>   r;   r$   rH   rF   rP   rU   rR   r   r^   ri   rE   r?   rx   ry   rz   r{   r|   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r!   r   r   6   sV   
(#c                   s   e  Z d  Z d Z e Z d Z d 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   S)_SelectorTransport   i   Nc                s  t    j | |  | |  j d <| j   |  j d <d |  j k r~ y | j   |  j d <Wn" t j k
 r} d  |  j d <Yn X| |  _ | j   |  _	 | |  _
 d |  _ | |  _ |  j   |  _ d |  _ d |  _ |  j d  k	 r |  j j   |  | j |  j	 <d  S)Nr   ZsocknamerX   Tr   F)r   r   _extraZgetsocknameZgetpeernamer   error_sockrA   _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 rD | j d  | j d |  j  |  j d  k	 r|  j j   rt |  j j	 |  j t
 j  } | r | 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   _loopr:   r   r#   r	   rm   rw   get_write_buffer_sizejoin)r(   infor   statebufsizer   r   r   __repr__>  s*    		z_SelectorTransport.__repr__c             C   s   |  j  d   d  S)N)_force_close)r(   r   r   r   abortZ  s    z_SelectorTransport.abortc             C   s   | |  _  d  S)N)r   )r(   r,   r   r   r   set_protocol]  s    z_SelectorTransport.set_protocolc             C   s   |  j  S)N)r   )r(   r   r   r   get_protocol`  s    z_SelectorTransport.get_protocolc             C   s   |  j  S)N)r   )r(   r   r   r   rg   c  s    z_SelectorTransport.is_closingc             C   sn   |  j  r d  Sd |  _  |  j j |  j  |  j sj |  j d 7_ |  j j |  j  |  j j |  j d   d  S)NTr   )	r   r   r?   r   r   r   ry   	call_soon_call_connection_lost)r(   r   r   r   r<   f  s    			z_SelectorTransport.closec             C   s4   |  j  d  k	 r0 t j d |  t  |  j  j   d  S)Nzunclosed transport %r)r   warningswarnResourceWarningr<   )r(   r   r   r   __del__t  s    z_SelectorTransport.__del__zFatal error on transportc          	   C   sy   t  | t j  r= |  j j   rh t j d |  | d d n+ |  j j d | d | d |  d |  j i  |  j	 |  d  S)Nz%r: %srL   TrV   rW   rc   r,   )

isinstancer   Z_FATAL_ERROR_IGNOREr   	get_debugr   r    r]   r   r   )r(   rb   rV   r   r   r   _fatal_errory  s    	z_SelectorTransport._fatal_errorc             C   s   |  j  r d  S|  j r6 |  j j   |  j j |  j  |  j s[ d |  _ |  j j |  j  |  j  d 7_  |  j j |  j	 |  d  S)NTr   )
r   r   clearr   ry   r   r   r?   r   r   )r(   rb   r   r   r   r     s    				z_SelectorTransport._force_closec             C   su   z |  j  r |  j j |  Wd  |  j j   d  |  _ d  |  _ d  |  _ |  j } | d  k	 rp | j   d  |  _ Xd  S)N)r   r   Zconnection_lostr   r<   r   r   Z_detach)r(   rb   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_sizei   )r"   r   r   max_size	bytearrayr   r   r   r   r   r   r   rg   r<   r   ZPY34r   r   r   r   r   r   r   )r!   r   r     s    	r   c                   s   e  Z d  Z d d 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
   S)r+   Nc                s   t    j | | | | |  d |  _ d |  _ t |  j  |  j j |  j j	 |   |  j j |  j j
 |  j |  j  | d  k	 r |  j j t j | d   d  S)NF)r   r   _eof_pausedr   r   r   r   r   connection_maderE   r   _read_readyr   _set_result_unless_cancelled)r(   r   r   r,   r-   r)   r*   )r!   r   r   r     s    		z!_SelectorSocketTransport.__init__c             C   si   |  j  r t d   |  j r* t d   d |  _ |  j j |  j  |  j j   re t j d |   d  S)Nz#Cannot pause_reading() when closingzAlready pausedTz%r pauses reading)	r   r9   r   r   r?   r   r   r   r    )r(   r   r   r   pause_reading  s    			z&_SelectorSocketTransport.pause_readingc             C   sg   |  j  s t d   d |  _  |  j r+ d  S|  j j |  j |  j  |  j j   rc t j	 d |   d  S)Nz
Not pausedFz%r resumes reading)
r   r9   r   r   rE   r   r   r   r   r    )r(   r   r   r   resume_reading  s    			z'_SelectorSocketTransport.resume_readingc             C   s   |  j  r d  Sy |  j j |  j  } WnL t t f k
 r@ Yn t k
 rt } z |  j | d  WYd  d  } ~ Xnn X| r |  j j	 |  nT |  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   rI   r   rK   rJ   re   r   r   data_receivedr   r   r   r    eof_receivedr?   r   r<   )r(   rG   rb   	keep_openr   r   r   r     s     	#z$_SelectorSocketTransport._read_readyc             C   sN  t  | t t t f  s1 t d t |  j   |  j rF t d   | sP d  S|  j	 r |  j	 t
 j k rx t j d  |  j	 d 7_	 d  S|  j s0y |  j j |  } WnP t t f k
 r YnS t k
 r } z |  j | d  d  SWYd  d  } ~ Xn 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	TypeErrorr   r"   r   r9   r   r   !LOG_THRESHOLD_FOR_CONNLOST_WRITESr   warningr   r   rM   rK   rJ   re   r   r   rx   r   _write_readyextend_maybe_pause_protocol)r(   rG   r   rb   r   r   r   write  s4    			z_SelectorSocketTransport.writec             C   s  |  j  s t d   |  j r" d  Sy |  j j |  j   } Wnl t t f k
 rU Yn t k
 r } z5 |  j j	 |  j
  |  j  j   |  j | d  WYd  d  } ~ Xnr X| r |  j  d  |  =|  j   |  j  s|  j j	 |  j
  |  j r |  j d   n |  j r|  j j t j  d  S)NzData should not be emptyz%Fatal write error on socket transport)r   AssertionErrorr   r   rM   rK   rJ   re   r   ry   r   r   r   _maybe_resume_protocolr   r   r   shutdownr   SHUT_WR)r(   r   rb   r   r   r   r   
  s(    	#
			z%_SelectorSocketTransport._write_readyc             C   s6   |  j  r d  Sd |  _  |  j s2 |  j j t j  d  S)NT)r   r   r   r   r   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)r"   r   r   r   r   r   r   r   r   r   r   r   r   )r!   r   r+     s   

#r+   c                   s   e  Z d  Z e Z d d d d 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   S)r5   NFc
                s  t  d  k r t d   | s0 t j | |  } d | d d i }
 | rY | rY | |
 d <| j | |
  } 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 availabler/   Zdo_handshake_on_connectFr0   r3   z%r starts SSL handshake)sslr9   r   Z_create_transport_contextZwrap_socketr   r   r   _server_hostname_waiter_sslcontextr   r   updater   r   r   r    time_on_handshake)r(   r   r2   r,   r3   r-   r/   r0   r)   r*   Zwrap_kwargsZsslsock
start_time)r!   r   r   r   1  s*    
					z_SelectorSslTransport.__init__c             C   s^   |  j  d  k r d  S|  j  j   sQ | d  k	 rA |  j  j |  n |  j  j d   d  |  _  d  S)N)r   r   r   r   )r(   rb   r   r   r   _wakeup_waiterU  s    z$_SelectorSslTransport._wakeup_waiterc          %   C   s  y |  j  j   Wnt j k
 rH |  j j |  j |  j |  d  SYn t j k
 r| |  j j	 |  j |  j |  d  SYn 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  WYd  d  } ~ Xn 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  Wnh t k
 r} zH |  j j   rt j d |  d d |  j  j   |  j |  d  SWYd  d  } ~ Xn X|  j j d | d |  j  j   d |  j  j   d	 |  j   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 failedrL   TZ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   rE   r   r   SSLWantWriteErrorrx   BaseExceptionr   r   r   r?   ry   r<   r   r   re   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   rb   r   Zdtr   r   r   r   _  sb    			
			z#_SelectorSslTransport._on_handshakec             C   si   |  j  r t d   |  j r* t d   d |  _ |  j j |  j  |  j j   re t j d |   d  S)Nz#Cannot pause_reading() when closingzAlready pausedTz%r pauses reading)	r   r9   r   r   r?   r   r   r   r    )r(   r   r   r   r     s    			z#_SelectorSslTransport.pause_readingc             C   sg   |  j  s t d   d |  _  |  j r+ d  S|  j j |  j |  j  |  j j   rc t j	 d |   d  S)Nz
Not pausedFz%r resumes reading)
r   r9   r   r   rE   r   r   r   r   r    )r(   r   r   r   r     s    			z$_SelectorSslTransport.resume_readingc             C   sr  |  j  r d  S|  j rK d |  _ |  j   |  j rK |  j j |  j |  j  y |  j j |  j	  } Wn t
 t t j f k
 r Yn t j k
 r d |  _ |  j j |  j  |  j j |  j |  j  Yn t k
 r} z |  j | d  WYd  d  } ~ Xnm X| r|  j j |  nS zE |  j j   r=t j d |   |  j j   } | r_t j d  Wd  |  j   Xd  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   rx   r   r   rI   r   rK   rJ   r   r   r   r   r?   re   r   r   r   r   r   r    r   r   r<   )r(   rG   rb   r   r   r   r   r     s4    			
		#z!_SelectorSslTransport._read_readyc             C   s  |  j  r d  S|  j rT d |  _ |  j   |  j p8 |  j sT |  j j |  j |  j  |  j rAy |  j	 j
 |  j  } Wn t t t j f k
 r d } Yn t j k
 r d } |  j j |  j  d |  _ YnY t k
 r*} z9 |  j j |  j  |  j j   |  j | d  d  SWYd  d  } ~ Xn X| rA|  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   rE   r   r   r   rM   rK   rJ   r   r   r   ry   r   re   r   r   r   r   )r(   r   rb   r   r   r   r     s8    			
	

		z"_SelectorSslTransport._write_readyc             C   s   t  | t t t f  s1 t d t |  j   | s; d  S|  j rv |  j t j	 k rc t
 j d  |  j d 7_ d  S|  j s |  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   rx   r   r   r   r   )r(   rG   r   r   r   r     s    		z_SelectorSslTransport.writec             C   s   d S)NFr   )r(   r   r   r   r     s    z#_SelectorSslTransport.can_write_eof)r"   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r!   r   r5   -  s   "
?
"#r5   c                   sg   e  Z d  Z e j Z d d d   f d d  Z d d   Z d d   Z d d d	  Z	 d
 d   Z
   S)r6   Nc                s   t    j | | | |  | |  _ |  j j |  j j |   |  j j |  j j |  j |  j	  | d  k	 r |  j j t
 j | d   d  S)N)r   r   _addressr   r   r   r   rE   r   r   r   r   )r(   r   r   r,   r7   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   ).0rG   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  Sy |  j j |  j  \ } } Wn t t f k
 rF Yn| t k
 rz } z |  j j |  WYd  d  } ~ XnH t	 k
 r } z |  j
 | d  WYd  d  } ~ Xn X|  j j | |  d  S)Nz&Fatal read error on datagram transport)r   r   Zrecvfromr   rK   rJ   rN   r   error_receivedre   r   Zdatagram_received)r(   rG   ra   rb   r   r   r   r   )  s    	"#z&_SelectorDatagramTransport._read_readyc             C   s  t  | t t t f  s1 t d t |  j   | s; d  S|  j ro | d  |  j f k ro t d |  j f   |  j	 r |  j r |  j	 t
 j k r t j d  |  j	 d 7_	 d  S|  j sy7 |  j r |  j j |  n |  j j | |  d  SWn t t f k
 r&|  j j |  j |  j  Ynq t k
 r^} z |  j j |  d  SWYd  d  } ~ Xn9 t k
 r} z |  j | d  d  SWYd  d  } ~ Xn 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   rM   sendtorK   rJ   r   rx   r   _sendto_readyrN   r   r   re   r   r   r   )r(   rG   ra   rb   r   r   r   r   7  s<    			z!_SelectorDatagramTransport.sendtoc             C   s:  x |  j  r |  j  j   \ } } y3 |  j r@ |  j j |  n |  j j | |  Wq t t f k
 r |  j  j | | f  PYq t	 k
 r } z |  j
 j |  d  SWYd  d  } ~ Xq t k
 r } z |  j | d  d  SWYd  d  } ~ Xq Xq W|  j   |  j  s6|  j j |  j  |  j r6|  j d   d  S)Nz'Fatal write error on datagram transport)r   popleftr   r   rM   r   rK   rJ   
appendleftrN   r   r   re   r   r   r   ry   r   r   r   )r(   rG   ra   rb   r   r   r   r   ^  s*    		
		z(_SelectorDatagramTransport._sendto_ready)r"   r   r   collectionsdequer   r   r   r   r   r   r   r   )r!   r   r6     s   	'r6   )"r   __all__r   r\   r   r   r   r%   r   ImportError r   r   r   r   r   r	   r
   r   Z
coroutinesr   logr   r   r   r   ZBaseEventLoopr   Z_FlowControlMixinZ	Transportr   r+   r5   r6   r   r   r   r   <module>   s@   	 