PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB`  oY @sdZdgZddlZddlZddlZddlZddlZddlZyddlZWne k rdZYnXddl m Z ddl m Z ddl m Z ddl mZdd l mZdd l mZdd l mZdd l mZdd lmZddlmZddZeedrLddZn ddZGddde jZGdddejejZGdddeZGdddeZ GdddeZ!dS)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. BaseSelectorEventLoopN) base_events)compat) constants)events)futures) selectors) transports)sslproto) coroutine)loggerc CsAy|j|}Wntk r+dSYnXt|j|@SdS)NF)get_keyKeyErrorboolr)selectorfdeventkeyr./opt/python35/lib/python3.5/selector_events.py_test_selector_event s   r TCP_NODELAYcCs\|jtjtjhkrX|jtjkrX|jtjkrX|jtjtj ddS)Nr) familysocketAF_INETAF_INET6type SOCK_STREAMproto IPPROTO_TCP setsockoptr)sockrrr _set_nodelay,sr#cCsdS)Nr)r"rrrr#2sc sDeZdZdZdfddZdddddddZdd d d dddddd d Zd d d dddddddZdddddZfddZ ddZ ddZ ddZ ddZ ddZddZddd d!d"Zddd d#d$Zeddd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Zd=d>Zd?d@Z edAdBZ!dCdDZ"dEdFZ#dGdHZ$dIdJZ%dKdLZ&dMdNZ'dOdPZ(S)QrzJSelector event loop. See events.EventLoop for API specification. Ncsatj|dkr%tj}tjd|jj||_|j t j |_ dS)NzUsing selector: %s) super__init__r DefaultSelectorr debug __class____name__ _selector_make_self_pipeweakrefWeakValueDictionary _transports)selfr)r(rrr%<s     zBaseSelectorEventLoop.__init__extraservercCst||||||S)N)_SelectorSocketTransport)r/r"protocolwaiterr0r1rrr_make_socket_transportFsz,BaseSelectorEventLoop._make_socket_transport server_sideFserver_hostnamec Cs{tjs:|j||||d|d|d|d|Stj||||||} t||| d|d|| jS)Nr6r7r0r1)r Z_is_sslproto_available_make_legacy_ssl_transportZ SSLProtocolr2Z_app_transport) r/rawsockr3 sslcontextr4r6r7r0r1Z ssl_protocolrrr_make_ssl_transportKs     z)BaseSelectorEventLoop._make_ssl_transportc Cs"t||||||||| S)N)_SelectorSslTransport) r/r9r3r:r4r6r7r0r1rrrr8Zsz0BaseSelectorEventLoop._make_legacy_ssl_transportcCst||||||S)N)_SelectorDatagramTransport)r/r"r3addressr4r0rrr_make_datagram_transportds z.BaseSelectorEventLoop._make_datagram_transportcsh|jrtd|jr(dS|jtj|jdk rd|jjd|_dS)Nz!Cannot close a running event loop)Z is_running RuntimeError is_closed_close_self_piper$closer*)r/)r(rrrCis      zBaseSelectorEventLoop.closecCs tdS)N)NotImplementedError)r/rrr _socketpairtsz!BaseSelectorEventLoop._socketpaircCsU|j|jj|jjd|_|jjd|_|jd8_dS)Nr)_remove_reader_ssockfilenorC_csock _internal_fds)r/rrrrBws     z&BaseSelectorEventLoop._close_self_pipecCsg|j\|_|_|jjd|jjd|jd7_|j|jj|jdS)NFr)rErGrI setblockingrJ _add_readerrH_read_from_self)r/rrrr+s z%BaseSelectorEventLoop._make_self_pipecCsdS)Nr)r/datarrr_process_self_datasz(BaseSelectorEventLoop._process_self_datac Cs_xXy*|jjd}|sP|j|Wqtk rDwYqtk rVPYqXqWdS)Ni)rGrecvrOInterruptedErrorBlockingIOError)r/rNrrrrMs  z%BaseSelectorEventLoop._read_from_selfc Cs[|j}|dk rWy|jdWn.tk rV|jrRtjdddYnXdS)Nsz3Fail to write a null byte into the self-pipe socketexc_infoT)rIsendOSError_debugr r')r/Zcsockrrr_write_to_selfs     z$BaseSelectorEventLoop._write_to_selfdcCs,|j|j|j|||||dS)N)rLrH_accept_connection)r/protocol_factoryr"r:r1backlogrrr_start_servingsz$BaseSelectorEventLoop._start_servingc Cs[xTt|D]F}yB|j\}}|jrGtjd||||jdWntttfk rvdSYq t k r} z| j t j t j t j t jfkr |jddd| d|i|j|j|jtj|j|||||nWYdd} ~ Xq Xd|i} |j||| ||} |j| q WdS)Nz#%r got a new connection from %r: %rFmessagez&socket.accept() out of system resource exceptionrpeername)rangeacceptrVr r'rKrRrQConnectionAbortedErrorrUerrnoZEMFILEZENFILEZENOBUFSZENOMEMcall_exception_handlerrFrHZ call_laterrZACCEPT_RETRY_DELAYr\_accept_connection2Z create_task) r/rZr"r:r1r[_connaddrexcr0rarrrrYs4         z(BaseSelectorEventLoop._accept_connectionc cs$d}d}y|}|j}|rZ|j|||d|ddd|d|}n$|j||d|d|d|}y |EdHWn|jYnXWnytk r} zY|jr ddd| i} |dk r|| d <|dk r|| d <|j| WYdd} ~ XnXdS) Nr4r6Tr0r1r]z3Error on transport creation for incoming connectionr^r3 transport) create_futurer;r5rC ExceptionrVrd) r/rZrgr0r:r1r3rjr4ricontextrrrres4            z)BaseSelectorEventLoop._accept_connection2c CsNy|j|}Wntk r%Yn%X|jsJtdj||dS)Nz.File descriptor {!r} is used by transport {!r})r.r is_closingr@format)r/rrjrrr_ensure_fd_no_transports  z-BaseSelectorEventLoop._ensure_fd_no_transportc Gs|jtj|||}y|jj|}Wn1tk rh|jj|tj|dfYnSX|j|j }\}}|jj ||tjB||f|dk r|j dS)N) _check_closedrHandler*rrregisterr EVENT_READrNmodifycancel) r/rcallbackargshandlermaskreaderwriterrrrrLs    z!BaseSelectorEventLoop._add_readerc Cs|jrdSy|jj|}Wntk r>dSYn{X|j|j}\}}|tjM}|s|jj|n|jj ||d|f|dk r|j dSdSdS)NFT) rAr*rrrrNr rt unregisterrurv)r/rrrzr{r|rrrrFs     z$BaseSelectorEventLoop._remove_readerc Gs|jtj|||}y|jj|}Wn1tk rh|jj|tjd|fYnSX|j|j }\}}|jj ||tjB||f|dk r|j dS)N) rqrrrr*rrrsr EVENT_WRITErNrurv) r/rrwrxryrrzr{r|rrr _add_writer(s    z!BaseSelectorEventLoop._add_writerc Cs|jrdSy|jj|}Wntk r>dSYn{X|j|j}\}}|tjM}|s|jj|n|jj |||df|dk r|j dSdSdS)zRemove a writer callback.FNT) rAr*rrrrNr r~r}rurv)r/rrrzr{r|rrr_remove_writer7s     z$BaseSelectorEventLoop._remove_writercGs |j||j|||S)zAdd a reader callback.)rprL)r/rrwrxrrr add_readerNs z BaseSelectorEventLoop.add_readercCs|j||j|S)zRemove a reader callback.)rprF)r/rrrr remove_readerSs z#BaseSelectorEventLoop.remove_readercGs |j||j|||S)zAdd a writer callback..)rpr)r/rrwrxrrr add_writerXs z BaseSelectorEventLoop.add_writercCs|j||j|S)zRemove a writer callback.)rpr)r/rrrr remove_writer]s z#BaseSelectorEventLoop.remove_writercCsM|jr'|jdkr'td|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. rzthe socket must be non-blockingF)rV gettimeout ValueErrorrk _sock_recv)r/r"nfutrrr sock_recvbs   zBaseSelectorEventLoop.sock_recvcCs|j}|r|j||jr/dSy|j|}Wnhttfk r{|j||j|d||Yn?tk r}z|j |WYdd}~XnX|j |dS)NT) rHr cancelledrPrRrQrrrl set_exception set_result)r/r registeredr"rrrNrirrrrqs   # z BaseSelectorEventLoop._sock_recvcCsc|jr'|jdkr'td|j}|rR|j|d||n |jd|S)aSend 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. rzthe socket must be non-blockingFN)rVrrrk _sock_sendallr)r/r"rNrrrr sock_sendalls    z"BaseSelectorEventLoop.sock_sendallcCs|j}|r|j||jr/dSy|j|}WnSttfk rbd}Yn6tk r}z|j|dSWYdd}~XnX|t|kr|j dn5|r||d}|j ||j |d||dS)NrT) rHrrrTrRrQrlrlenrrr)r/rrr"rNrrrirrrrs"     z#BaseSelectorEventLoop._sock_sendallccs|jr'|jdkr'tdttd sI|jtjkrtj|d|jd|j d|}|j s|EdH|j d\}}}}}|j }|j ||||EdHS)zTConnect to a remote socket at address. This method is a coroutine. rzthe socket must be non-blockingAF_UNIXrrloopN)rVrrhasattrrrrrZ_ensure_resolvedrdoneresultrk _sock_connect)r/r"r>Zresolvedrfrrrr sock_connects "!   z"BaseSelectorEventLoop.sock_connectcCs|j}y|j|Wnttfk ro|jtj|j||j||j |||Yn?t k r}z|j |WYdd}~XnX|j ddS)N) rHconnectrRrQadd_done_callback functoolspartial_sock_connect_doner_sock_connect_cbrlrr)r/rr"r>rrirrrrs   z#BaseSelectorEventLoop._sock_connectcCs|j|dS)N)r)r/rrrrrrsz(BaseSelectorEventLoop._sock_connect_donecCs|jrdSy>|jtjtj}|dkrMt|d|fWnIttfk rhYn?tk r}z|j |WYdd}~XnX|j ddS)NrzConnect call failed %s) r getsockoptr SOL_SOCKETSO_ERRORrUrRrQrlrr)r/rr"r>errrirrrrs   z&BaseSelectorEventLoop._sock_connect_cbcCsJ|jr'|jdkr'td|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. rzthe socket must be non-blockingF)rVrrrk _sock_accept)r/r"rrrr sock_accepts   z!BaseSelectorEventLoop.sock_acceptcCs|j}|r|j||jr/dSy#|j\}}|jdWnettfk r|j||j|d|YnEt k r}z|j |WYdd}~XnX|j ||fdS)NFT) rHrrrarKrRrQrrrlrr)r/rrr"rrgr>rirrrrs     z"BaseSelectorEventLoop._sock_acceptcCsx|D]\}}|j|j}\}}|tj@rk|dk rk|jr^|j|n |j||tj@r|dk r|jr|j|q|j|qWdS)N) fileobjrNr rtZ _cancelledrFZ _add_callbackr~r)r/Z event_listrrzrr{r|rrr_process_events s   z%BaseSelectorEventLoop._process_eventscCs!|j|j|jdS)N)rFrHrC)r/r"rrr _stop_servingsz#BaseSelectorEventLoop._stop_serving))r) __module__ __qualname____doc__r%r5r;r8r?rCrErBr+rOrMrWr\rYr rerprLrFrrrrrrrrrrrrrrrrrrrr)r(rr6sV          (#                  cseZdZdZeZdZddfddZddZdd Z d d Z d d Z ddZ ddZ ejrddZdddZddZddZddZS)_SelectorTransportiNc stj||||jd<|j|jdz<%s> )r(r)rappendrr_looprArr*r rtr~get_write_buffer_sizejoin)r/inforstatebufsizerrr__repr__>s*        z_SelectorTransport.__repr__cCs|jddS)N) _force_close)r/rrrabortZsz_SelectorTransport.abortcCs ||_dS)N)r)r/r3rrr set_protocol]sz_SelectorTransport.set_protocolcCs|jS)N)r)r/rrr get_protocol`sz_SelectorTransport.get_protocolcCs|jS)N)r)r/rrrrncsz_SelectorTransport.is_closingcCsn|jr dSd|_|jj|j|jsj|jd7_|jj|j|jj|jddS)NTr) rrrFrrrr call_soon_call_connection_lost)r/rrrrCfs   z_SelectorTransport.closecCs4|jdk r0tjd|t|jjdS)Nzunclosed transport %r)rwarningswarnResourceWarningrC)r/rrr__del__tsz_SelectorTransport.__del__zFatal error on transportc Csyt|tjr=|jjrhtjd||ddn+|jjd|d|d|d|ji|j |dS)Nz%r: %srSTr]r^rjr3) isinstancerZ_FATAL_ERROR_IGNOREr get_debugr r'rdrr)r/rir]rrr _fatal_errorys z_SelectorTransport._fatal_errorcCs|jr dS|jr6|jj|jj|j|js[d|_|jj|j|jd7_|jj|j |dS)NTr) rrclearrrrrrFrr)r/rirrrrs     z_SelectorTransport._force_closec Csuz|jr|jj|Wd|jjd|_d|_d|_|j}|dk rp|jd|_XdS)N)rrZconnection_lostrrCrrZ_detach)r/rir1rrrrs        z(_SelectorTransport._call_connection_lostcCs t|jS)N)rr)r/rrrrsz(_SelectorTransport.get_write_buffer_sizei)r)rrmax_size bytearrayrrr%rrrrrnrCrZPY34rrrrrrr)r(rrs         rcseZdZdddfddZddZddZdd Zd d Zd d ZddZ ddZ S)r2Ncstj|||||d|_d|_t|j|jj|jj ||jj|jj |j |j |dk r|jjt j|ddS)NF)r$r%_eof_pausedr#rrrrconnection_maderLr _read_readyr_set_result_unless_cancelled)r/rr"r3r4r0r1)r(rrr%s    z!_SelectorSocketTransport.__init__cCsi|jrtd|jr*tdd|_|jj|j|jjretjd|dS)Nz#Cannot pause_reading() when closingzAlready pausedTz%r pauses reading) rr@rrrFrrr r')r/rrr pause_readings     z&_SelectorSocketTransport.pause_readingcCsg|jstdd|_|jr+dS|jj|j|j|jjrctj d|dS)Nz Not pausedFz%r resumes reading) rr@rrrLrrrr r')r/rrrresume_readings    z'_SelectorSocketTransport.resume_readingcCs|jr dSy|jj|j}WnLttfk r@Yntk rt}z|j|dWYdd}~XnnX|r|jj |nT|j j rt j d||jj}|r|j j|jn |jdS)Nz$Fatal read error on socket transportz%r received EOF)rrrPrrRrQrlrr data_receivedrrr r' eof_receivedrFrrC)r/rNri keep_openrrrrs  #z$_SelectorSocketTransport._read_readycCsNt|tttfs1tdt|j|jrFtd|sPdS|j r|j t j krxt j d|j d7_ dS|js0y|jj|}WnPttfk rYnStk r}z|j|ddSWYdd}~XnX||d}|sdS|jj|j|j|jj||jdS)Nz1data argument must be a bytes-like object, not %rz%Cannot call write() after write_eof()zsocket.send() raised exception.rz%Fatal write error on socket transport)rbytesr memoryview TypeErrorrr)rr@rr!LOG_THRESHOLD_FOR_CONNLOST_WRITESr warningrrrTrRrQrlrrrr _write_readyextend_maybe_pause_protocol)r/rNrrirrrwrites4     z_SelectorSocketTransport.writecCs|jstd|jr"dSy|jj|j}Wnlttfk rUYntk r}z5|jj |j |jj |j |dWYdd}~XnrX|r|jd|=|j |js|jj |j |jr|jdn|jr|jjtjdS)NzData should not be emptyz%Fatal write error on socket transport)rAssertionErrorrrrTrRrQrlrrrrr_maybe_resume_protocolrrrshutdownrSHUT_WR)r/rrirrrr s(  #    z%_SelectorSocketTransport._write_readycCs6|jr dSd|_|js2|jjtjdS)NT)rrrrrr)r/rrr write_eof"s    z"_SelectorSocketTransport.write_eofcCsdS)NTr)r/rrr can_write_eof)sz&_SelectorSocketTransport.can_write_eof) r)rrr%rrrrrrrrr)r(rr2s   #  r2cseZdZeZdddddfddZdddZddZd d Zd d Z d dZ ddZ ddZ ddZ S)r<NFc stdkrtd|s0tj||}d|ddi} |rY| rY|| d<|j|| } tj|| ||| d|_||_||_ ||_ d|_ |j j d||jjrtjd||jj} nd} |j| dS)Nzstdlib ssl module not availabler6Zdo_handshake_on_connectFr7r:z%r starts SSL handshake)sslr@r Z_create_transport_contextZ wrap_socketr$r%r_server_hostname_waiter _sslcontextrrupdaterrr r'time _on_handshake) r/rr9r3r:r4r6r7r0r1Z wrap_kwargsZsslsock start_time)r(rrr%1s*          z_SelectorSslTransport.__init__cCs^|jdkrdS|jjsQ|dk rA|jj|n|jjdd|_dS)N)rrrr)r/rirrr_wakeup_waiterUs z$_SelectorSslTransport._wakeup_waiterc%Csy|jjWntjk rH|jj|j|j|dSYntjk r||jj |j|j|dSYnt k r}z|jj rt j d|dd|jj|j|jj|j|jj|j|t|trdSWYdd}~XnX|jj|j|jj|j|jj}t|jds|jr|jjtjkrytj||jWnhtk r}zH|jj rt j d|dd|jj|j|dSWYdd}~XnX|jjd|d|jjd|jjd |jd |_d |_ |jj|j|j!d|_"|jj#|j$j%||jj#|j|jj r|jj&|}t j'd ||d dS) Nz%r: SSL handshake failedrSTZcheck_hostnamez1%r: SSL handshake failed on matching the hostnamepeercertcipher compressionZ ssl_objectFz%r: SSL handshake took %.1f msg@@)(rZ do_handshakerSSLWantReadErrorrrLrrSSLWantWriteErrorr BaseExceptionrr rrFrrCrrrlZ getpeercertrrrZ verify_modeZ CERT_NONEZmatch_hostnamerrrr_read_wants_write_write_wants_readrrrrrrr')r/rrirZdtrrrr_sb               z#_SelectorSslTransport._on_handshakecCsi|jrtd|jr*tdd|_|jj|j|jjretjd|dS)Nz#Cannot pause_reading() when closingzAlready pausedTz%r pauses reading) rr@rrrFrrr r')r/rrrrs     z#_SelectorSslTransport.pause_readingcCsg|jstdd|_|jr+dS|jj|j|j|jjrctj d|dS)Nz Not pausedFz%r resumes reading) rr@rrrLrrrr r')r/rrrrs    z$_SelectorSslTransport.resume_readingcCsr|jr dS|jrKd|_|j|jrK|jj|j|jy|jj|j }Wnt t t j fk rYnt jk rd|_|jj|j|jj|j|jYntk r}z|j|dWYdd}~XnmX|r|jj|nSzE|jjr=tjd||jj}|r_tjdWd|jXdS)NFTz!Fatal read error on SSL transportz%r received EOFz?returning true from eof_received() has no effect when using ssl)rrrrrrrrrPrrRrQrrrrrFrlrrrrr r'rrrC)r/rNrirrrrrs4      #z!_SelectorSslTransport._read_readycCs|jr dS|jrTd|_|j|jp8|jsT|jj|j|j|jrAy|j j |j}Wnt t t jfk rd}Ynt jk rd}|jj|jd|_YnYtk r*}z9|jj|j|jj|j|ddSWYdd}~XnX|rA|jd|=|j|js}|jj|j|jr}|jddS)NFrTz"Fatal write error on SSL transport)rrrrrrrLrrrrTrRrQrrrrrrlrrrr)r/rrirrrrs8           z"_SelectorSslTransport._write_readycCst|tttfs1tdt|j|s;dS|jrv|jtj krct j d|jd7_dS|j s|j j|j|j|j j||jdS)Nz1data argument must be a bytes-like object, not %rzsocket.send() raised exception.r)rrrrrrr)rrrr rrrrrrrr)r/rNrrrrs   z_SelectorSslTransport.writecCsdS)NFr)r/rrrrsz#_SelectorSslTransport.can_write_eof)r)rrrrr%rrrrrrrrrr)r(rr<-s " ?  " # r<csgeZdZejZdddfddZddZddZddd Z d d Z S) r=Ncstj||||||_|jj|jj||jj|jj|j|j |dk r|jjt j |ddS)N) r$r%_addressrrrrrLrrrr)r/rr"r3r>r4r0)r(rrr%s  z#_SelectorDatagramTransport.__init__cCstdd|jDS)Ncss!|]\}}t|VqdS)N)r).0rNrfrrr 'szC_SelectorDatagramTransport.get_write_buffer_size..)sumr)r/rrrr&sz0_SelectorDatagramTransport.get_write_buffer_sizecCs|jr dSy|jj|j\}}Wnttfk rFYn|tk rz}z|jj|WYdd}~XnHt k r}z|j |dWYdd}~XnX|jj ||dS)Nz&Fatal read error on datagram transport) rrrecvfromrrRrQrUrerror_receivedrlrZdatagram_received)r/rNrhrirrrr)s "#z&_SelectorDatagramTransport._read_readycCst|tttfs1tdt|j|s;dS|jro|d|jfkrotd|jf|j r|jr|j t j krt j d|j d7_ dS|jsy7|jr|jj|n|jj||dSWnttfk r&|jj|j|jYnqtk r^}z|jj|dSWYdd}~Xn9tk r}z|j|ddSWYdd}~XnX|jjt||f|jdS)Nz1data argument must be a bytes-like object, not %rz#Invalid address: must be None or %szsocket.send() raised exception.rz'Fatal write error on datagram transport)rrrrrrr)rrrrrr rrrrTsendtorRrQrrr _sendto_readyrUrrrlrrr)r/rNrhrirrrr7s<    z!_SelectorDatagramTransport.sendtocCs:x|jr|jj\}}y3|jr@|jj|n|jj||Wqttfk r|jj||fPYqt k r}z|j j |dSWYdd}~Xqt k r}z|j |ddSWYdd}~XqXqW|j|js6|jj|j|jr6|jddS)Nz'Fatal write error on datagram transport)rpopleftrrrTrrRrQ appendleftrUrrrlrrrrrrr)r/rNrhrirrrr^s*      z(_SelectorDatagramTransport._sendto_ready) r)rr collectionsdequerr%rrrrrr)r(rr=s    'r=)"r__all__r rcrrrr,r ImportErrorrrrrrr r r Z coroutinesr logr rrr#Z BaseEventLooprZ_FlowControlMixinZ Transportrr2r<r=rrrrs@