a 7dg5}@sTdZdZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl m Z ddl m Z dd l mZdd l mZdd l mZdd l mZdd lmZddZGdddejejZGdddeejZGdddeejZGdddeZGdddeZGdddeeejZGdddeeejZ Gddde j!Z"dS) zEvent loop using a proactor and related classes. A proactor is a "notify-on-completion" multiplexer. Currently a proactor is only implemented on Windows with IOCP. )BaseProactorEventLoopN) base_events) constants)futures) exceptions) protocols)sslproto) transports)trsock)loggercCst||jd<z||jd<Wn.tjyP|jrLtj d|ddYn0d|jvrz| |jd<Wntjyd|jd<Yn0dS)NsocketZsocknamezgetsockname() failed on %rTexc_infopeername) r TransportSocket_extra getsocknamer error_loop get_debugr warning getpeername) transportsockr3/usr/local/lib/python3.9/asyncio/proactor_events.py_set_socket_extras   rcseZdZdZdfdd ZddZddZd d Zd d Zd dZ ddZ e j fddZ dddZddZddZddZZS)_ProactorBasePipeTransportz*Base class for pipe and socket transports.Ncst||||||_||||_d|_d|_d|_d|_ d|_ d|_ d|_ |jdurl|j |j|jj||dur|jtj|ddS)NrF)super__init__ _set_extra_sock set_protocol_server_buffer _read_fut _write_fut_pending_write _conn_lost_closing _eof_writtenZ_attachr call_soon _protocolZconnection_maderZ_set_result_unless_cancelledselflooprprotocolwaiterextraserver __class__rrr 2s&     z#_ProactorBasePipeTransport.__init__cCs|jjg}|jdur |dn|jr0|d|jdurP|d|j|jdurl|d|j|jdur|d|j|jr|dt |j|j r|dd d |S) Nclosedclosingzfd=zread=zwrite=zwrite_bufsize=z EOF writtenz<{}> ) r6__name__r"appendr*filenor&r'r%lenr+formatjoin)r/inforrr__repr__Hs         z#_ProactorBasePipeTransport.__repr__cCs||jd<dS)Npipe)rr/rrrrr!Zsz%_ProactorBasePipeTransport._set_extracCs ||_dSNr-)r/r1rrrr#]sz'_ProactorBasePipeTransport.set_protocolcCs|jSrDrEr/rrr get_protocol`sz'_ProactorBasePipeTransport.get_protocolcCs|jSrD)r*rFrrr is_closingcsz%_ProactorBasePipeTransport.is_closingcCs\|jr dSd|_|jd7_|js>|jdur>|j|jd|jdurX|jd|_dS)NTr) r*r)r%r'rr,_call_connection_lostr&cancelrFrrrclosefs  z _ProactorBasePipeTransport.closecCs*|jdur&|d|t|d|dS)Nzunclosed transport )source)r"ResourceWarningrK)r/_warnrrr__del__qs z"_ProactorBasePipeTransport.__del__Fatal error on pipe transportc Cs`zNt|tr*|jrBtjd||ddn|j||||jdW||n ||0dS)Nz%r: %sTr)message exceptionrr1) isinstanceOSErrorrrr debugcall_exception_handlerr- _force_close)r/excrQrrr _fatal_errorvs   z'_ProactorBasePipeTransport._fatal_errorcCs|jdur6|js6|dur*|jdn |j||jr@dSd|_|jd7_|jrj|jd|_|jr|jd|_d|_ d|_ |j |j |dS)NTrr) _empty_waiterdone set_result set_exceptionr*r)r'rJr&r(r%rr,rI)r/rXrrrrWs"   z'_ProactorBasePipeTransport._force_closec CszV|j|Wt|jdr*|jtj|jd|_|j}|dur| d|_nHt|jdrr|jtj|jd|_|j}|dur| d|_0dS)Nshutdown) r-Zconnection_losthasattrr"r^r SHUT_RDWRrKr$Z_detach)r/rXr4rrrrIs$    z0_ProactorBasePipeTransport._call_connection_lostcCs"|j}|jdur|t|j7}|SrD)r(r%r=)r/sizerrrget_write_buffer_sizes z0_ProactorBasePipeTransport.get_write_buffer_size)NNN)rP)r: __module__ __qualname____doc__r rAr!r#rGrHrKwarningswarnrOrYrWrIrb __classcell__rrr5rr.s  rcsTeZdZdZdfdd ZddZddZd d Zd d Zd dZ dddZ Z S)_ProactorReadPipeTransportzTransport for read pipes.Ncs:d|_d|_t|||||||j|jd|_dS)NTF) _pending_data_pausedrr rr, _loop_readingr.r5rrr s z#_ProactorReadPipeTransport.__init__cCs|j o|j SrD)rkr*rFrrr is_readingsz%_ProactorReadPipeTransport.is_readingcCs0|js |jrdSd|_|jr,td|dS)NTz%r pauses reading)r*rkrrr rUrFrrr pause_readings   z(_ProactorReadPipeTransport.pause_readingcCsn|js |jsdSd|_|jdur0|j|jd|j}d|_|durT|j|j||jrjt d|dS)NFz%r resumes reading) r*rkr&rr,rlrj_data_receivedrr rUr/datarrrresume_readings   z)_ProactorReadPipeTransport.resume_readingc Cs~|jrtd|z|j}WnHttfy<Yn2tyl}z| |dWYd}~dSd}~00|sz| dS)Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.) rrr rUr-Z eof_received SystemExitKeyboardInterrupt BaseExceptionrYrK)r/Z keep_openrXrrr _eof_receiveds  z(_ProactorReadPipeTransport._eof_receivedc Cs|jr||_dS|s |dSt|jtjrzt|j|Wqtt fyXYqt y}z| |dWYd}~dSd}~00n |j |dS)Nz3Fatal error: protocol.buffer_updated() call failed.) rkrjrvrSr-rZBufferedProtocolZ_feed_data_to_buffered_protorsrtrurYZ data_received)r/rqrXrrrros"z)_ProactorReadPipeTransport._data_receivedc Csd}zz|dur2d|_|r*|}n||jrVd}WW|durR||dS|dkrxWW|durt||dS|js|jj |j d|_Wnt y}z8|js| |dn|j rtjdddWYd}~nd}~0ty}z||WYd}~nnd}~0tyB}z| |dWYd}~n>d}~0tjy`|js\Yn0|jsx|j|jW|dur||n|dur||0dS)Niz"Fatal read error on pipe transportz*Read error on pipe transport while closingTr)r&r[resultrJr*rorkr _proactorrecvr"ConnectionAbortedErrorrYrr rUConnectionResetErrorrWrTrCancelledErroradd_done_callbackrl)r/futrqrXrrrrlsP       z(_ProactorReadPipeTransport._loop_reading)NNN)N) r:rcrdrer rmrnrrrvrorlrhrrr5rris rics^eZdZdZdZfddZddZddd Zd d Zd d Z ddZ ddZ ddZ Z S)_ProactorBaseWritePipeTransportzTransport for write pipes.Tcstj|i|d|_dSrD)rr rZr/argskwr5rrr Gsz(_ProactorBaseWritePipeTransport.__init__cCst|tttfs$tdt|j|jr2td|j durDtd|sLdS|j rz|j t j krht d|j d7_ dS|jdur|jt|dn.|jst||_|n|j||dS)Nz/data argument must be a bytes-like object, not zwrite_eof() already calledz(unable to write; sendfile is in progresszsocket.send() raised exception.r)rq)rSbytes bytearray memoryview TypeErrortyper:r+ RuntimeErrorrZr)r!LOG_THRESHOLD_FOR_CONNLOST_WRITESr rr' _loop_writingr%_maybe_pause_protocolextendrprrrwriteKs0       z%_ProactorBaseWritePipeTransport.writeNc CsZz|dur |jdur |jr WdSd|_d|_|r8||durL|j}d|_|s|jrf|j|jd|jrz|j t j | nN|jj|j ||_|jst||_|j|j|n|j|j|jdur|jdur|jdWn`ty$}z||WYd}~n:d}~0tyT}z||dWYd}~n d}~00dS)Nrz#Fatal write error on pipe transport)r'r*r(rxr%rr,rIr+r"r^r SHUT_WR_maybe_resume_protocolrysendr[r=r~rrrZr\r|rWrTrY)r/frqrXrrrrqs8    z-_ProactorBaseWritePipeTransport._loop_writingcCsdSNTrrFrrr can_write_eofsz-_ProactorBaseWritePipeTransport.can_write_eofcCs |dSrD)rKrFrrr write_eofsz)_ProactorBaseWritePipeTransport.write_eofcCs|ddSrDrWrFrrrabortsz%_ProactorBaseWritePipeTransport.abortcCs:|jdurtd|j|_|jdur4|jd|jS)NzEmpty waiter is already set)rZrrZ create_futurer'r\rFrrr_make_empty_waiters     z2_ProactorBaseWritePipeTransport._make_empty_waitercCs d|_dSrD)rZrFrrr_reset_empty_waitersz3_ProactorBaseWritePipeTransport._reset_empty_waiter)NN)r:rcrdreZ_start_tls_compatibler rrrrrrrrhrrr5rrAs & )rcs$eZdZfddZddZZS)_ProactorWritePipeTransportcs8tj|i||jj|jd|_|j|jdS)N) rr rryrzr"r&r~ _pipe_closedrr5rrr sz$_ProactorWritePipeTransport.__init__cCs@|r dS|jrdSd|_|jdur4|tn|dSrD) cancelledr*r&r'rWBrokenPipeErrorrK)r/rrrrrs z(_ProactorWritePipeTransport._pipe_closed)r:rcrdr rrhrrr5rrs rcsXeZdZdZdfdd ZddZddZd d Zdd d Zdd dZ dddZ Z S)_ProactorDatagramTransportiNcs>||_d|_tj|||||dt|_|j|j dS)N)r2r3) _addressrZrr collectionsdequer%rr,rl)r/r0rr1addressr2r3r5rrr s  z#_ProactorDatagramTransport.__init__cCst||dSrDrrCrrrr!sz%_ProactorDatagramTransport._set_extracCstdd|jDS)Ncss|]\}}t|VqdSrD)r=).0rq_rrr rwzC_ProactorDatagramTransport.get_write_buffer_size..)sumr%rFrrrrbsz0_ProactorDatagramTransport.get_write_buffer_sizecCs|ddSrDrrFrrrrsz _ProactorDatagramTransport.abortcCst|tttfstdt||s&dS|jdurN|d|jfvrNtd|j|jr|jr|jt j krpt d|jd7_dS|j t||f|jdur||dS)Nz,data argument must be bytes-like object (%r)z!Invalid address: must be None or z!socket.sendto() raised exception.r)rSrrrrrr ValueErrorr)rrr rr%r;r'rr)r/rqaddrrrrsendtos&     z!_ProactorDatagramTransport.sendtoc Csz|jrWdSd|_|r ||jr2|jrN|jrN|jrH|j|jdWdS|j \}}|jdur||jj |j ||_n|jj j |j ||d|_Wn^ty}z|j|WYd}~nNd}~0ty}z||dWYd}~n d}~00|j|j|dS)N)rz'Fatal write error on datagram transport)r)r'rxr%rr*rr,rIpopleftryrr"rrTr-error_received ExceptionrYr~rr)r/rrqrrXrrrrs2     "z(_ProactorDatagramTransport._loop_writingc Cs|d}zZz|jr*WW|r&|j||dSd|_|dur|}|jrdd}WW|r`|j||dS|jdur|||j}}n|\}}|jrWW|r|j||dS|jdur|jj |j |j |_n|jj |j |j |_WnPt y}z|j|WYd}~nBd}~0tjy.|js*Yn0|jdurJ|j|jW|rx|j||n|rv|j||0dSrD)r)r-Zdatagram_receivedr&rxr*rrryrzr"max_sizerecvfromrTrrr}r~rl)r/rrqrresrXrrrrlsT$       z(_ProactorDatagramTransport._loop_reading)NNN)N)N)N) r:rcrdrr r!rbrrrrlrhrrr5rrs   !rc@s eZdZdZddZddZdS)_ProactorDuplexPipeTransportzTransport for duplex pipes.cCsdS)NFrrFrrrrJsz*_ProactorDuplexPipeTransport.can_write_eofcCstdSrD)NotImplementedErrorrFrrrrMsz&_ProactorDuplexPipeTransport.write_eofN)r:rcrdrerrrrrrrEsrcsBeZdZdZejjZd fdd ZddZ ddZ d d Z Z S) _ProactorSocketTransportz Transport for connected sockets.Ncs$t||||||t|dSrD)rr rZ _set_nodelayr.r5rrr Xsz!_ProactorSocketTransport.__init__cCst||dSrDrrCrrrr!]sz#_ProactorSocketTransport._set_extracCsdSrrrFrrrr`sz&_ProactorSocketTransport.can_write_eofcCs2|js |jrdSd|_|jdur.|jtjdSr)r*r+r'r"r^r rrFrrrrcs   z"_ProactorSocketTransport.write_eof)NNN) r:rcrdrerZ _SendfileModeZ TRY_NATIVEZ_sendfile_compatibler r!rrrhrrr5rrQsrcseZdZfddZd3ddZd4dddddddd Zd5d d Zd6d d Zd7ddZd8ddZ fddZ ddZ ddZ ddZ ddZddZddZd d!Zd"d#Zd$d%Zd9d&d'Zd(d)Zd:d+d,Zd-d.Zd/d0Zd1d2ZZS);rcshttd|jj||_||_d|_i|_ | || t t urdt|jdS)NzUsing proactor: %s)rr r rUr6r:ry _selector_self_reading_future_accept_futuresZset_loop_make_self_pipe threadingcurrent_thread main_threadsignal set_wakeup_fd_csockr<)r/Zproactorr5rrr ms  zBaseProactorEventLoop.__init__NcCst||||||SrD)r)r/rr1r2r3r4rrr_make_socket_transportzs z,BaseProactorEventLoop._make_socket_transportF) server_sideserver_hostnamer3r4ssl_handshake_timeoutc Cs0tj||||||| d} t||| ||d| jS)N)rr3r4)r Z SSLProtocolrZ_app_transport) r/Zrawsockr1 sslcontextr2rrr3r4rZ ssl_protocolrrr_make_ssl_transportsz)BaseProactorEventLoop._make_ssl_transportcCst||||||SrD)r)r/rr1rr2r3rrr_make_datagram_transports z.BaseProactorEventLoop._make_datagram_transportcCst|||||SrD)rr/rr1r2r3rrr_make_duplex_pipe_transportsz1BaseProactorEventLoop._make_duplex_pipe_transportcCst|||||SrD)rirrrr_make_read_pipe_transportsz/BaseProactorEventLoop._make_read_pipe_transportcCst|||||SrD)rrrrr_make_write_pipe_transportsz0BaseProactorEventLoop._make_write_pipe_transportcsj|rtd|rdSttur6td|| |j d|_ d|_ t dS)Nz!Cannot close a running event loop)Z is_runningr is_closedrrrrr_stop_accept_futures_close_self_piperyrKrrrFr5rrrKs  zBaseProactorEventLoop.closecs|j||IdHSrD)ryrz)r/rnrrr sock_recvszBaseProactorEventLoop.sock_recvcs|j||IdHSrD)ry recv_into)r/rbufrrrsock_recv_intosz$BaseProactorEventLoop.sock_recv_intocs|j||IdHSrD)ryr)r/rrqrrr sock_sendallsz"BaseProactorEventLoop.sock_sendallcs|j||IdHSrD)ryconnect)r/rrrrr sock_connectsz"BaseProactorEventLoop.sock_connectcs|j|IdHSrD)ryacceptrCrrr sock_acceptsz!BaseProactorEventLoop.sock_acceptc s>z |}Wn4ttjfy@}ztdWYd}~n d}~00zt|j}Wnt yntdYn0|rx|n|}|sdSt |d}|rt |||n|} t ||}d} zpt | ||}|dkr| W| dkr| |S|j ||||IdH||7}| |7} qW| dkr:| |n| dkr8| |0dS)Nznot a regular filerl)r<AttributeErrorioUnsupportedOperationrZSendfileNotAvailableErrorosfstatst_sizerTminseekrysendfile) r/rfileoffsetcountr<errfsize blocksizeZend_pos total_sentrrr_sock_sendfile_natives:          z+BaseProactorEventLoop._sock_sendfile_nativecsn|}||IdHz4|j|j|||ddIdHW||rP|Sn||rh|0dS)NF)fallback)rmrnrZ sock_sendfiler"rrr)r/Ztransprrrrrrrr_sendfile_natives" z&BaseProactorEventLoop._sendfile_nativecCsL|jdur|jd|_|jd|_|jd|_|jd8_dS)Nr)rrJ_ssockrKr _internal_fdsrFrrrrs    z&BaseProactorEventLoop._close_self_pipecCs:t\|_|_|jd|jd|jd7_dS)NFr)r socketpairrr setblockingrrFrrrrs  z%BaseProactorEventLoop._make_self_pipec Csz4|dur||j|ur"WdS|j|jd}Wn`tjyJYdSttfy`YnHt y}z| d||dWYd}~nd}~00||_| |j dS)Niz.Error on reading from the event loop self pipe)rQrRr0) rxrryrzrrr}rsrtrurVr~_loop_self_reading)r/rrXrrrrs$ z(BaseProactorEventLoop._loop_self_readingcCsL|j}|durdSz|dWn&tyF|jrBtjdddYn0dS)Nz3Fail to write a null byte into the self-pipe socketTr)rrrT_debugr rU)r/Zcsockrrr_write_to_selfs z$BaseProactorEventLoop._write_to_selfdcs(dfdd dS)Nc s,z|durn|\}}jr,td||}durXj||dd|idnj||d|idr|WdSj}Wnt y}zP dkrȈ d|t dnjrtjd dd WYd}~n>d}~0tjyYn0|j <|dS) Nz#%r got a new connection from %r: %rTr)rr3r4rrrzAccept failed on a socket)rQrRr zAccept failed on socket %rr)rxrr rUrrrryrrTr<rVr rrKrr}rr~)rconnrr1rXr0protocol_factoryr/r4rrrrrr0/sJ   z2BaseProactorEventLoop._start_serving..loop)N)r,)r/rrrr4backlogrrrr_start_serving+s%z$BaseProactorEventLoop._start_servingcCsdSrDr)r/Z event_listrrr_process_eventsVsz%BaseProactorEventLoop._process_eventscCs&|jD] }|q |jdSrD)rvaluesrJclear)r/futurerrrrZs z*BaseProactorEventLoop._stop_accept_futurescCs6|j|d}|r||j||dSrD)rpopr<rJry _stop_servingrK)r/rrrrrr_s  z#BaseProactorEventLoop._stop_serving)NNN)N)NNN)NN)NN)NN)N)NNrN)r:rcrdr rrrrrrrKrrrrrrrrrrrrrrrrhrrr5rrksN            +r)#re__all__rrr rfrrrrrrrrr r r logr rZ_FlowControlMixinZ BaseTransportrZ ReadTransportriZWriteTransportrrrZ TransportrrZ BaseEventLooprrrrrsR           n