a
    ze!                    @   s  d dl 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d dl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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lmZ ddlmZ ddlm Z  dZ!dZ"dZ#e$edZ%dZ&e' Z(dd Z)dd Z*dd Z+d,ddZ,d-ddZ-dd Z.e$ed rd!d" Z/nd#d" Z/d$d% Z0G d&d' d'ej1Z2G d(d) d)ej3Z4G d*d+ d+ej5Z6dS ).    N   )	constants)
coroutines)events)
exceptions)futures)	protocols)sslproto)	staggered)tasks)
transports)trsock)logger)BaseEventLoopServerd   g      ?AF_INET6iQ c                 C   s0   | j }tt|dd tjr$t|jS t| S d S )N__self__)	_callback
isinstancegetattrr   Taskreprr   str)handlecb r   )/usr/lib/python3.9/asyncio/base_events.py_format_handleJ   s    
r   c                 C   s(   | t jkrdS | t jkrdS t| S d S )Nz<pipe>z<stdout>)
subprocessPIPESTDOUTr   )fdr   r   r   _format_pipeS   s
    

r#   c                 C   sJ   t tdstdn2z| tjtjd W n tyD   tdY n0 d S )NSO_REUSEPORTz)reuse_port not supported by socket moduler   zTreuse_port not supported by socket module, SO_REUSEPORT defined but not implemented.)hasattrsocket
ValueError
setsockopt
SOL_SOCKETr$   OSErrorsockr   r   r   _set_reuseport\   s    

r-   c           	   	   C   s  t tdsd S |dtjtjhvs(| d u r,d S |tjkr>tj}n|tjkrPtj}nd S |d u rbd}nVt|trz|dkrzd}n>t|tr|dkrd}n&zt	|}W n t
tfy   Y d S 0 |tjkrtjg}tr|tj n|g}t| tr| d} d| v rd S |D ]r}zVt||  trH|tjkrH|||d| |||ffW   S |||d| |ffW   S W n tyv   Y n0 qd S )N	inet_ptonr        Zidna%)r%   r&   IPPROTO_TCPIPPROTO_UDPSOCK_STREAM
SOCK_DGRAMr   bytesr   int	TypeErrorr'   	AF_UNSPECAF_INET	_HAS_IPv6appendr   decoder.   r*   )	hostportfamilytypeprotoZflowinfoZscopeidZafsafr   r   r   _ipaddr_infog   sN    







rD   c                 C   s   t  }| D ]*}|d }||vr(g ||< || | qt| }g }|dkr|||d d |d   |d d |d = |dd tjtj	| D  |S )Nr   r   c                 s   s   | ]}|d ur|V  qd S Nr   ).0ar   r   r   	<genexpr>   s   z(_interleave_addrinfos.<locals>.<genexpr>)
collectionsOrderedDictr<   listvaluesextend	itertoolschainfrom_iterablezip_longest)Z	addrinfosZfirst_address_family_countZaddrinfos_by_familyaddrr@   Zaddrinfos_listsZ	reorderedr   r   r   _interleave_addrinfos   s"    
rS   c                 C   s4   |   s"|  }t|ttfr"d S t|   d S rE   )	cancelled	exceptionr   
SystemExitKeyboardInterruptr   Z	_get_loopstop)futexcr   r   r   _run_until_complete_cb   s
    r[   TCP_NODELAYc                 C   s@   | j tjtjhv r<| jtjkr<| jtjkr<| tjtj	d d S Nr   )
r@   r&   r:   r   rA   r4   rB   r2   r(   r\   r+   r   r   r   _set_nodelay   s    

r^   c                 C   s   d S rE   r   r+   r   r   r   r^      s    c                 C   s    t d urt| t jrtdd S )Nz"Socket cannot be of type SSLSocket)sslr   Z	SSLSocketr8   r+   r   r   r   _check_ssl_socket   s    r`   c                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )_SendfileFallbackProtocolc                 C   sh   t |tjstd|| _| | _| | _|j	| _
|  ||  | j
r^| jj | _nd | _d S )Nz.transport should be _FlowControlMixin instance)r   r   Z_FlowControlMixinr8   
_transportZget_protocol_protoZ
is_reading_should_resume_readingZ_protocol_paused_should_resume_writingpause_readingset_protocol_loopcreate_future_write_ready_fut)selftranspr   r   r   __init__   s    


z"_SendfileFallbackProtocol.__init__c                    s2   | j  rtd| j}|d u r$d S |I d H  d S )NzConnection closed by peer)rb   
is_closingConnectionErrorrj   )rk   rY   r   r   r   drain   s    
z_SendfileFallbackProtocol.drainc                 C   s   t dd S )Nz?Invalid state: connection should have been established already.RuntimeError)rk   	transportr   r   r   connection_made   s    z)_SendfileFallbackProtocol.connection_madec                 C   s@   | j d ur0|d u r$| j td n| j | | j| d S )NzConnection is closed by peer)rj   set_exceptionro   rc   connection_lost)rk   rZ   r   r   r   rv      s    
z)_SendfileFallbackProtocol.connection_lostc                 C   s    | j d urd S | jj | _ d S rE   )rj   rb   rh   ri   rk   r   r   r   pause_writing   s    
z'_SendfileFallbackProtocol.pause_writingc                 C   s$   | j d u rd S | j d d | _ d S )NF)rj   
set_resultrw   r   r   r   resume_writing   s    
z(_SendfileFallbackProtocol.resume_writingc                 C   s   t dd S Nz'Invalid state: reading should be pausedrq   )rk   datar   r   r   data_received  s    z'_SendfileFallbackProtocol.data_receivedc                 C   s   t dd S r{   rq   rw   r   r   r   eof_received  s    z&_SendfileFallbackProtocol.eof_receivedc                    sF   | j | j | jr| j   | jd ur2| j  | jrB| j  d S rE   )	rb   rg   rc   rd   resume_readingrj   cancelre   rz   rw   r   r   r   restore	  s    


z!_SendfileFallbackProtocol.restoreN)__name__
__module____qualname__rm   rp   rt   rv   rx   rz   r}   r~   r   r   r   r   r   ra      s   ra   c                   @   sx   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
edd Zdd Zdd Zdd Zdd ZdS )r   c                 C   s@   || _ || _d| _g | _|| _|| _|| _|| _d| _d | _	d S )Nr   F)
rh   _sockets_active_count_waiters_protocol_factory_backlog_ssl_context_ssl_handshake_timeout_serving_serving_forever_fut)rk   loopsocketsprotocol_factoryZssl_contextbacklogssl_handshake_timeoutr   r   r   rm     s    zServer.__init__c                 C   s   d| j j d| jdS )N<z	 sockets=>)	__class__r   r   rw   r   r   r   __repr__%  s    zServer.__repr__c                 C   s   |  j d7  _ d S r]   )r   rw   r   r   r   _attach(  s    zServer._attachc                 C   s.   |  j d8  _ | j dkr*| jd u r*|   d S )Nr   r   )r   r   _wakeuprw   r   r   r   _detach,  s    zServer._detachc                 C   s,   | j }d | _ |D ]}| s|| qd S rE   )r   donery   )rk   waiterswaiterr   r   r   r   2  s
    zServer._wakeupc              	   C   sJ   | j r
d S d| _ | jD ].}|| j | j| j|| j| | j| j qd S NT)	r   r   listenr   rh   _start_servingr   r   r   )rk   r,   r   r   r   r   9  s    


zServer._start_servingc                 C   s   | j S rE   )rh   rw   r   r   r   get_loopC  s    zServer.get_loopc                 C   s   | j S rE   )r   rw   r   r   r   
is_servingF  s    zServer.is_servingc                 C   s"   | j d u rdS tdd | j D S )Nr   c                 s   s   | ]}t |V  qd S rE   )r   ZTransportSocket)rF   sr   r   r   rH   M  r/   z!Server.sockets.<locals>.<genexpr>)r   tuplerw   r   r   r   r   I  s    
zServer.socketsc                 C   sn   | j }|d u rd S d | _ |D ]}| j| qd| _| jd urX| j sX| j  d | _| jdkrj|   d S )NFr   )	r   rh   Z_stop_servingr   r   r   r   r   r   )rk   r   r,   r   r   r   closeO  s    


zServer.closec                    s   |    tdI d H  d S )Nr   )r   r   sleeprw   r   r   r   start_servingb  s    zServer.start_servingc              	      s   | j d urtd| d| jd u r4td| d|   | j | _ zRz| j I d H  W n6 tjy   z|   | 	 I d H  W  n 0 Y n0 W d | _ nd | _ 0 d S )Nzserver z, is already being awaited on serve_forever()z
 is closed)
r   rr   r   r   rh   ri   r   CancelledErrorr   wait_closedrw   r   r   r   serve_foreverh  s     


zServer.serve_foreverc                    s<   | j d u s| jd u rd S | j }| j| |I d H  d S rE   )r   r   rh   ri   r<   )rk   r   r   r   r   r   }  s
    
zServer.wait_closedN)r   r   r   rm   r   r   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r     s   

r   c                   @   sh  e Zd Zdd Zdd Zdd Zddd	d
Zdd Zdd ZddddddZ	ddddddddddZ
dddZdddZdddZdddZdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zejfd=d>Z d?d@ Z!dAdB Z"ddCdDdEZ#ddCdFdGZ$ddCdHdIZ%dJdK Z&dLdM Z'dNdO Z(ddCdPdQZ)dRdS Z*dTdU Z+dVdW Z,dXdXdXdXdYdZd[Z-dd\d]Z.ddd^d_d`Z/dadb Z0dcdd Z1dedf Z2ddgdhZ3dddXdXdXdddddddi
djdkZ4ddldmZ5ddd^dndoZ6dpdq Z7drds Z8ddddtdudvZ9ddXdXdXe:ddddwdxdyZ;dXe<j=dXdXdYdzd{Z>d|d} Z?de<j@e<jAdd~dddddd	ddZBdddddZCdd ZDdd ZEdd ZFeGjHeGjHeGjHdddXdddd	ddZIeGjHeGjHeGjHdddXdddd	ddZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdS )r   c                 C   s   d| _ d| _d| _t | _g | _d | _d| _d | _	t
dj| _d | _| t  d| _d | _d | _d| _d | _t | _d| _d| _d S )Nr   F	monotonicg?)_timer_cancelled_count_closed	_stoppingrI   deque_ready
_scheduled_default_executorZ_internal_fds
_thread_idtimeget_clock_infoZ
resolution_clock_resolution_exception_handler	set_debugr   Z_is_debug_modeslow_callback_duration_current_handle_task_factory"_coroutine_origin_tracking_enabled&_coroutine_origin_tracking_saved_depthweakrefWeakSet
_asyncgens_asyncgens_shutdown_called_executor_shutdown_calledrw   r   r   r   rm     s&    

zBaseEventLoop.__init__c              	   C   s.   d| j j d|   d|   d|   d	S )Nr   z	 running=z closed=z debug=r   )r   r   
is_running	is_closed	get_debugrw   r   r   r   r     s    zBaseEventLoop.__repr__c                 C   s   t j| dS )Nr   )r   Futurerw   r   r   r   ri     s    zBaseEventLoop.create_futureN)namec                C   sN   |    | jd u r2tj|| |d}|jrJ|jd= n| | |}t|| |S )N)r   r   )_check_closedr   r   r   _source_tracebackZ_set_task_name)rk   coror   Ztaskr   r   r   create_task  s    

zBaseEventLoop.create_taskc                 C   s"   |d urt |std|| _d S )Nz'task factory must be a callable or None)callabler8   r   )rk   factoryr   r   r   set_task_factory  s    
zBaseEventLoop.set_task_factoryc                 C   s   | j S rE   )r   rw   r   r   r   get_task_factory  s    zBaseEventLoop.get_task_factory)extraserverc                C   s   t d S rE   NotImplementedError)rk   r,   protocolr   r   r   r   r   r   _make_socket_transport  s    z$BaseEventLoop._make_socket_transportFT)server_sideserver_hostnamer   r   r   call_connection_madec                C   s   t d S rE   r   )rk   Zrawsockr   
sslcontextr   r   r   r   r   r   r   r   r   r   _make_ssl_transport  s    z!BaseEventLoop._make_ssl_transportc                 C   s   t d S rE   r   )rk   r,   r   addressr   r   r   r   r   _make_datagram_transport  s    z&BaseEventLoop._make_datagram_transportc                 C   s   t d S rE   r   rk   piper   r   r   r   r   r   _make_read_pipe_transport  s    z'BaseEventLoop._make_read_pipe_transportc                 C   s   t d S rE   r   r   r   r   r   _make_write_pipe_transport  s    z(BaseEventLoop._make_write_pipe_transportc	           
         s   t d S rE   r   )
rk   r   argsshellstdinstdoutstderrbufsizer   kwargsr   r   r   _make_subprocess_transport  s    z(BaseEventLoop._make_subprocess_transportc                 C   s   t d S rE   r   rw   r   r   r   _write_to_self  s    zBaseEventLoop._write_to_selfc                 C   s   t d S rE   r   )rk   
event_listr   r   r   _process_events  s    zBaseEventLoop._process_eventsc                 C   s   | j rtdd S )NzEvent loop is closed)r   rr   rw   r   r   r   r     s    zBaseEventLoop._check_closedc                 C   s   | j rtdd S )Nz!Executor shutdown has been called)r   rr   rw   r   r   r   _check_default_executor  s    z%BaseEventLoop._check_default_executorc                 C   s*   | j | |  s&| | j|  d S rE   )r   discardr   call_soon_threadsafer   acloserk   agenr   r   r   _asyncgen_finalizer_hook	  s    z&BaseEventLoop._asyncgen_finalizer_hookc                 C   s.   | j rtjd|dt| d | j| d S )Nzasynchronous generator z3 was scheduled after loop.shutdown_asyncgens() callsource)r   warningswarnResourceWarningr   addr   r   r   r   _asyncgen_firstiter_hook  s    
z&BaseEventLoop._asyncgen_firstiter_hookc                    s   d| _ t| jsd S t| j}| j  tjdd |D d| dI d H }t||D ]*\}}t|t	rT| 
d|||d qTd S )NTc                 S   s   g | ]}|  qS r   )r   )rF   Zagr   r   r   
<listcomp>$  r/   z4BaseEventLoop.shutdown_asyncgens.<locals>.<listcomp>)Zreturn_exceptionsr   z;an error occurred during closing of asynchronous generator )messagerU   Zasyncgen)r   lenr   rK   clearr   _gatherzipr   	Exceptioncall_exception_handler)rk   Zclosing_agensresultsresultr   r   r   r   shutdown_asyncgens  s&    



z BaseEventLoop.shutdown_asyncgensc                    s\   d| _ | jd u rd S |  }tj| j|fd}|  z|I d H  W |  n
|  0 d S )NT)targetr   )r   r   ri   	threadingThread_do_shutdownstartjoin)rk   futurethreadr   r   r   shutdown_default_executor1  s    
z'BaseEventLoop.shutdown_default_executorc              
   C   sX   z | j jdd | |jd  W n2 tyR } z| |j| W Y d }~n
d }~0 0 d S )NTwait)r   shutdownr   ry   r  ru   )rk   r  exr   r   r   r
  >  s
    zBaseEventLoop._do_shutdownc                 C   s(   |   rtdt d ur$tdd S )Nz"This event loop is already runningz7Cannot run the event loop while another loop is running)r   rr   r   Z_get_running_looprw   r   r   r   _check_runningE  s    zBaseEventLoop._check_runningc              	   C   s   |    |   | | j t | _t }tj	| j
| jd zJt|  |   | jrLq^qLW d| _d | _td  | d tj	|  n,d| _d | _td  | d tj	|  0 d S )N)	firstiter	finalizerF)r   r  _set_coroutine_origin_tracking_debugr  	get_identr   sysget_asyncgen_hooksset_asyncgen_hooksr   r   r   Z_set_running_loop	_run_oncer   )rk   Zold_agen_hooksr   r   r   run_foreverL  s.    





zBaseEventLoop.run_foreverc              	   C   s   |    |   t| }tj|| d}|r4d|_|t zFz| 	  W n*   |rp|
 rp| sp|   Y n0 W |t n|t 0 |
 std| S )Nr   Fz+Event loop stopped before Future completed.)r   r  r   Zisfuturer   Zensure_futureZ_log_destroy_pendingadd_done_callbackr[   r  r   rT   rU   Zremove_done_callbackrr   r  )rk   r  Znew_taskr   r   r   run_until_completec  s"    

z BaseEventLoop.run_until_completec                 C   s
   d| _ d S r   )r   rw   r   r   r   rX     s    zBaseEventLoop.stopc                 C   sp   |   rtd| jrd S | jr,td|  d| _| j  | j  d| _	| j
}|d urld | _
|jdd d S )Nz!Cannot close a running event loopzClose %rTFr  )r   rr   r   r  r   debugr   r   r   r   r   r  rk   executorr   r   r   r     s    

zBaseEventLoop.closec                 C   s   | j S rE   )r   rw   r   r   r   r     s    zBaseEventLoop.is_closedc                 C   s0   |   s,|d| t| d |  s,|   d S )Nzunclosed event loop r   )r   r   r   r   )rk   _warnr   r   r   __del__  s    zBaseEventLoop.__del__c                 C   s
   | j d uS rE   )r   rw   r   r   r   r     s    zBaseEventLoop.is_runningc                 C   s   t  S rE   )r   r   rw   r   r   r   r     s    zBaseEventLoop.time)contextc                G   s4   | j |  | |g|R d|i}|jr0|jd= |S )Nr&  r   )call_atr   r   )rk   delaycallbackr&  r   timerr   r   r   
call_later  s    zBaseEventLoop.call_laterc                G   sZ   |    | jr"|   | |d t|||| |}|jrB|jd= t| j	| d|_	|S )Nr'  r   T)
r   r  _check_thread_check_callbackr   ZTimerHandler   heapqheappushr   )rk   whenr)  r&  r   r*  r   r   r   r'    s    zBaseEventLoop.call_atc                G   sB   |    | jr"|   | |d | |||}|jr>|jd= |S )N	call_soonr   )r   r  r,  r-  
_call_soonr   rk   r)  r&  r   r   r   r   r   r1    s    
zBaseEventLoop.call_soonc                 C   sD   t |st |r$td| dt|s@td| d|d S )Nzcoroutines cannot be used with z()z"a callable object was expected by z(), got )r   ZiscoroutineZiscoroutinefunctionr8   r   )rk   r)  methodr   r   r   r-    s    

zBaseEventLoop._check_callbackc                 C   s.   t ||| |}|jr|jd= | j| |S )Nr   )r   Handler   r   r<   )rk   r)  r   r&  r   r   r   r   r2    s
    zBaseEventLoop._call_soonc                 C   s,   | j d u rd S t }|| j kr(tdd S )NzMNon-thread-safe operation invoked on an event loop other than the current one)r   r  r  rr   )rk   Z	thread_idr   r   r   r,  	  s    	

zBaseEventLoop._check_threadc                G   sB   |    | jr| |d | |||}|jr6|jd= |   |S )Nr   r   )r   r  r-  r2  r   r   r3  r   r   r   r     s    z"BaseEventLoop.call_soon_threadsafec                 G   sh   |    | jr| |d |d u rL| j}|   |d u rLtjjdd}|| _tj|j	|g|R  | dS )Nrun_in_executorZasyncio)Zthread_name_prefixr   )
r   r  r-  r   r   
concurrentr   ThreadPoolExecutorZwrap_futuresubmit)rk   r#  funcr   r   r   r   r6  %  s    zBaseEventLoop.run_in_executorc                 C   s&   t |tjjstdtd || _d S )Nz{Using the default executor that is not an instance of ThreadPoolExecutor is deprecated and will be prohibited in Python 3.9   )r   r7  r   r8  r   r   DeprecationWarningr   r"  r   r   r   set_default_executor5  s    z"BaseEventLoop.set_default_executorc                 C   s   | d|g}|r$| d| |r8| d| |rL| d| |r`| d| d|}td| |  }t||||||}	|  | }
d| d	|
d
 dd|	}|
| jkrt| n
t| |	S )N:zfamily=ztype=zproto=zflags=, zGet address info %szGetting address info z took g     @@z.3fzms: )	r<   r  r   r!  r   r&   getaddrinfor   info)rk   r>   r?   r@   rA   rB   flagsmsgt0addrinfodtr   r   r   _getaddrinfo_debug>  s&    


z BaseEventLoop._getaddrinfo_debugr   r@   rA   rB   rB  c             
      s2   | j r| j}ntj}| d |||||||I d H S rE   )r  rG  r&   r@  r6  )rk   r>   r?   r@   rA   rB   rB  Zgetaddr_funcr   r   r   r@  V  s    zBaseEventLoop.getaddrinfoc                    s   |  d tj||I d H S rE   )r6  r&   getnameinfo)rk   ZsockaddrrB  r   r   r   rI  `  s    
zBaseEventLoop.getnameinfo)fallbackc             
      s   | j r| dkrtdt| | |||| z| ||||I d H W S  tjyv } z|sb W Y d }~n
d }~0 0 | ||||I d H S )Nr   zthe socket must be non-blocking)	r  
gettimeoutr'   r`   _check_sendfile_params_sock_sendfile_nativer   SendfileNotAvailableError_sock_sendfile_fallback)rk   r,   fileoffsetcountrJ  rZ   r   r   r   sock_sendfiled  s    zBaseEventLoop.sock_sendfilec                    s   t d|d|dd S )Nz-syscall sendfile is not available for socket z
 and file z combinationr   rN  rk   r,   rP  rQ  rR  r   r   r   rM  s  s
    z#BaseEventLoop._sock_sendfile_nativec           
   
      s   |r| | |rt|tjntj}t|}d}z|rNt|| |}|dkrNqt|d | }| d |j|I d H }	|	szq| ||d |	 I d H  ||	7 }q2|W |dkrt	|dr| ||  S n&|dk rt	|d r| ||  0 d S )Nr   seek)
rV  minr   Z!SENDFILE_FALLBACK_READBUFFER_SIZE	bytearray
memoryviewr6  readintoZsock_sendallr%   )
rk   r,   rP  rQ  rR  	blocksizebuf
total_sentviewreadr   r   r   rO  z  s6    

 z%BaseEventLoop._sock_sendfile_fallbackc                 C   s   dt |ddvrtd|jtjks,td|d urbt|tsLtd||dkrbtd|t|tsztd||dk rtd|d S )Nbmodez$file should be opened in binary modez+only SOCK_STREAM type sockets are supportedz+count must be a positive integer (got {!r})r   z0offset must be a non-negative integer (got {!r}))	r   r'   rA   r&   r4   r   r7   r8   formatrU  r   r   r   rL    s2    

z$BaseEventLoop._check_sendfile_paramsc                    sD  g }| | |\}}}}}	d }
ztj|||d}
|
d |d ur|D ]t\}}}}}z|
| W  qW qH ty } z8d|d|j  }t|j|}| | W Y d }~qHd }~0 0 qH| | 	|
|	I d H  |
W S  ty  } z*| | |
d ur
|

   W Y d }~n(d }~0    |
d ur8|

   Y n0 d S )Nr@   rA   rB   Fz*error while attempting to bind on address : )r<   r&   setblockingbindr*   strerrorlowererrnopopsock_connectr   )rk   r   Z	addr_infoZlocal_addr_infosZmy_exceptionsr@   type_rB   _r   r,   laddrrZ   rC  r   r   r   _connect_sock  sB    



"


zBaseEventLoop._connect_sock)
r_   r@   rB   rB  r,   
local_addrr   r   happy_eyeballs_delay
interleavec       
      	      sz  |
d ur|st d|
d u r0|r0|s,t d|}
|d urD|sDt d|d urTt| |d urh|d u rhd}|d usz|d ur |d urt dj||f|tj||dI d H }|std|	d urj|	|tj||dI d H stdnd |rt||}g  |d u rV|D ]B}z  |I d H }W  qW n tyN   Y qY n0 qn.tj	 fdd	|D |d
I d H \}}}|d u r.dd  D  t
 dkr d nJt d tfdd	 D r d tdddd	  D n.|d u rt d|jtjkr.t d|j||||
|dI d H \}}jrr|d}td||||| ||fS )Nz+server_hostname is only meaningful with sslz:You must set server_hostname when using ssl without a host1ssl_handshake_timeout is only meaningful with sslr   8host/port and sock can not be specified at the same timer@   rA   rB   rB  r   !getaddrinfo() returned empty listc                 3   s    | ]}t j |V  qd S rE   )	functoolspartialro  )rF   rE  )r   laddr_infosrk   r   r   rH   !  s   z2BaseEventLoop.create_connection.<locals>.<genexpr>r   c                 S   s   g | ]}|D ]}|qqS r   r   )rF   subrZ   r   r   r   r   '  r/   z3BaseEventLoop.create_connection.<locals>.<listcomp>r   c                 3   s   | ]}t | kV  qd S rE   r   rF   rZ   )modelr   r   rH   -  r/   zMultiple exceptions: {}r?  c                 s   s   | ]}t |V  qd S rE   r{  r|  r   r   r   rH   2  r/   z5host and port was not specified and no sock specified"A Stream Socket was expected, got )r   r&   z%r connected to %s:%r: (%r, %r))r'   r`   _ensure_resolvedr&   r4   r*   rS   ro  r
   Zstaggered_racer   r   allrb  r  rA   _create_connection_transportr  get_extra_infor   r!  )rk   r   r>   r?   r_   r@   rB   rB  r,   rp  r   r   rq  rr  infosrE  rm  rs   r   r   )r   ry  r}  rk   r   create_connection  s    









zBaseEventLoop.create_connectionc              	      s   | d | }|  }|rHt|tr*d n|}	| j|||	||||d}
n| |||}
z|I d H  W n   |
   Y n0 |
|fS )NFr   r   r   )re  ri   r   boolr   r   r   )rk   r,   r   r_   r   r   r   r   r   r   rs   r   r   r   r  M  s"    
z*BaseEventLoop._create_connection_transportc             
      s   |  rtdt|dtjj}|tjju r:td||tjju rz| ||||I d H W S  tj	y } z|sv W Y d }~n
d }~0 0 |std|| 
||||I d H S )NzTransport is closingZ_sendfile_compatiblez(sendfile is not supported for transport zHfallback is disabled and native sendfile is not supported for transport )rn   rr   r   r   Z_SendfileModeZUNSUPPORTEDZ
TRY_NATIVE_sendfile_nativer   rN  _sendfile_fallback)rk   rs   rP  rQ  rR  rJ  ra  rZ   r   r   r   sendfileg  s4    zBaseEventLoop.sendfilec                    s   t dd S )Nz!sendfile syscall is not supportedrT  )rk   rl   rP  rQ  rR  r   r   r   r    s    zBaseEventLoop._sendfile_nativec              
      s|  |r| | |rt|dnd}t|}d}t|}z|rt|| |}|dkr|W |dkrvt|drv| ||  | I d H  S t|d | }	| d |j|	I d H }
|
s|W |dkrt|dr| ||  | I d H  S |	 I d H  |
|	d |
  ||
7 }q8W |dkr4t|dr4| ||  | I d H  n4|dkrht|drh| ||  | I d H  0 d S )Ni @  r   rV  )rV  rW  rX  ra   r%   r   rY  r6  rZ  rp   write)rk   rl   rP  rQ  rR  r[  r\  r]  rB   r^  r_  r   r   r   r    s@    
	z BaseEventLoop._sendfile_fallbackr  c             
      s   t d u rtdt|t js*td|t|ddsFtd|d|  }tj| ||||||dd}|	  |
| | |j|}	| |j}
z|I d H  W n, ty   |  |	  |
   Y n0 |jS )Nz"Python ssl module is not availablez@sslcontext is expected to be an instance of ssl.SSLContext, got Z_start_tls_compatibleFz
transport z  is not supported by start_tls())r   r   )r_   rr   r   Z
SSLContextr8   r   ri   r	   ZSSLProtocolrf   rg   r1  rt   r   BaseExceptionr   r   Z_app_transport)rk   rs   r   r   r   r   r   r   Zssl_protocolZ
conmade_cbZ	resume_cbr   r   r   	start_tls  s>    	

zBaseEventLoop.start_tls)r@   rB   rB  reuse_address
reuse_portallow_broadcastr,   c                    s  |
d ur|
j tjkr"td|
 s>s>|s>|s>|s>|s>|	r~t ||||||	d}ddd | D }td| d|
d d }n ss|d	krtd
||fdff}nttdr|tj	kr fD ]}|d urt
|tstdqڈ rx d	 dvrxz"tt jr.t  W nF tyD   Y n4 tyv } ztd | W Y d }~n
d }~0 0 ||f fff}ni }d	 fdffD ]\}}|d urt
|trt|dkstd| j||tj||| dI d H }|s td|D ]:\}}}}}||f}||vr0d d g||< ||| |< qq fdd| D }|sjtdg }|tur|rtdntjdtdd |D ]\\}}\}}d }
d }zxtj|tj|d}
|rt|
 |	r|
tjtj d |
d  r|
!| r*|	s&| "|
|I d H  |}W n` tyn } z(|
d urP|
#  |$| W Y d }~n.d }~0    |
d ur|
#   Y n0  qq|d	 | }| % }| &|
|||}| j'r rt(d || nt)d|| z|I d H  W n   |#   Y n0 ||fS )NzA UDP Socket was expected, got )rp  remote_addrr@   rB   rB  r  r  r  r?  c                 s   s$   | ]\}}|r| d | V  qdS )=Nr   )rF   kvr   r   r   rH     r/   z9BaseEventLoop.create_datagram_endpoint.<locals>.<genexpr>zKsocket modifier keyword arguments can not be used when sock is specified. ()Fr   zunexpected address family)NNAF_UNIXzstring is expected)r    z2Unable to check or remove stale UNIX socket %r: %rr   r;  z2-tuple is expectedru  rv  c                    s8   g | ]0\}} r|d  du sr,|d du s||fqS )r   Nr   r   )rF   keyZ	addr_pairrp  r  r   r   r   &  s   z:BaseEventLoop.create_datagram_endpoint.<locals>.<listcomp>zcan not get address informationz~Passing `reuse_address=True` is no longer supported, as the usage of SO_REUSEPORT in UDP poses a significant security concern.zdThe *reuse_address* parameter has been deprecated as of 3.5.10 and is scheduled for removal in 3.11.)
stacklevelrc  z@Datagram endpoint local_addr=%r remote_addr=%r created: (%r, %r)z2Datagram endpoint remote_addr=%r created: (%r, %r))*rA   r&   r5   r'   dictr  itemsre  r%   r  r   r   r8   statS_ISSOCKosst_moderemoveFileNotFoundErrorr*   r   errorr   r   r  _unsetr   r   r<  r-   r(   r)   SO_BROADCASTrf  rk  r   r<   ri   r   r  rA  r!  ) rk   r   rp  r  r@   rB   rB  r  r  r  r,   ZoptsZproblemsZr_addrZaddr_pairs_inforR   errZ
addr_infosidxr  Zfamrm  Zpror   r  r   Zlocal_addressZremote_addressrZ   r   r   rs   r   r  r   create_datagram_endpoint  s   











z&BaseEventLoop.create_datagram_endpointc          
         s^   |d d \}}t |||||g|dd  R  }	|	d ur>|	gS |j||||||dI d H S d S )Nr;  rH  )rD   r@  )
rk   r   r@   rA   rB   rB  r   r>   r?   rA  r   r   r   r  t  s     zBaseEventLoop._ensure_resolvedc                    s8   | j ||f|tj|| dI d H }|s4td|d|S )N)r@   rA   rB  r   zgetaddrinfo(z) returned empty list)r  r&   r4   r*   )rk   r>   r?   r@   rB  r  r   r   r   _create_server_getaddrinfo  s    z(BaseEventLoop._create_server_getaddrinfor   )	r@   rB  r,   r   r_   r  r  r   r   c       	            s  t |trtd|d ur*|d u r*td|d ur:t| |d usLd urL|d ur\td|	d u rxtjdkovtjdk}	g }|dkrd g}n$t |t	st |t
jjs|g}n|} fdd|D }tj|d	iI d H }ttj|}d
}z8|D ]}|\}}}}}zt|||}W n6 tjyV   jrNtjd|||dd Y qY n0 || |	rz|tjtjd |
rt| tr|tjkrttdr|tj tj!d z|"| W q t#y } z(t#|j$d||j%& f d W Y d }~qd }~0 0 qd}W |sJ|D ]}|'  qn|sH|D ]}|'  q80 n4|d u r^td|j(tj)krztd||g}|D ]}|*d
 qt+|||||}|r|,  t-dI d H  jrt.d| |S )Nz*ssl argument must be an SSLContext or Noners  rt  posixcygwinr0   c                    s   g | ]}j | d qS ))r@   rB  )r  )rF   r>   r@   rB  r?   rk   r   r   r     s   
z/BaseEventLoop.create_server.<locals>.<listcomp>r   Fz:create_server() failed to create socket.socket(%r, %r, %r)Texc_infoIPPROTO_IPV6z0error while attempting to bind on address %r: %sz)Neither host/port nor sock were specifiedr~  r   z%r is serving)/r   r  r8   r'   r`   r  r   r  platformr   rI   abcIterabler   r   setrN   rO   rP   r&   r  r  r   warningr<   r(   r)   SO_REUSEADDRr-   r;   r   r%   r  IPV6_V6ONLYrf  r*   ri  rg  rh  r   rA   r4   re  r   r   r   rA  )rk   r   r>   r?   r@   rB  r,   r   r_   r  r  r   r   r   Zhostsfsr  Z	completedresrC   socktyperB   	canonnamesar  r   r   r  r   create_server  s    






zBaseEventLoop.create_server)r_   r   c                   s   |j tjkrtd||d ur.|s.td|d ur>t| | j|||dd|dI d H \}}| jr~|d}t	d||| ||fS )Nr~  rs  r0   T)r   r   r&   z%r handled: (%r, %r))
rA   r&   r4   r'   r`   r  r  r  r   r!  )rk   r   r,   r_   r   rs   r   r   r   r   connect_accepted_socket   s     

z%BaseEventLoop.connect_accepted_socketc                    sd   | }|   }| |||}z|I d H  W n   |   Y n0 | jr\td| || ||fS )Nz Read pipe %r connected: (%r, %r))ri   r   r   r  r   r!  filenork   r   r   r   r   rs   r   r   r   connect_read_pipe   s    
zBaseEventLoop.connect_read_pipec                    sd   | }|   }| |||}z|I d H  W n   |   Y n0 | jr\td| || ||fS )Nz!Write pipe %r connected: (%r, %r))ri   r   r   r  r   r!  r  r  r   r   r   connect_write_pipe0  s    
z BaseEventLoop.connect_write_pipec                 C   s   |g}|d ur"| dt|  |d urJ|tjkrJ| dt|  n8|d urf| dt|  |d ur| dt|  td| d S )Nzstdin=zstdout=stderr=zstdout=zstderr= )r<   r#   r   r!   r   r!  r  )rk   rC  r   r   r   rA  r   r   r   _log_subprocess@  s    zBaseEventLoop._log_subprocess)	r   r   r   universal_newlinesr   r   encodingerrorstextc       	            s   t |ttfstd|r"td|s.td|dkr>td|rJtd|	d urZtd|
d urjtd| }d }| jrd	| }| |||| | j||d
||||fi |I d H }| jr|d urtd|| ||fS )Nzcmd must be a string universal_newlines must be Falsezshell must be Truer   bufsize must be 0text must be Falseencoding must be Noneerrors must be Nonezrun shell command %rT%s: %r)	r   r6   r   r'   r  r  r   r   rA  )rk   r   cmdr   r   r   r  r   r   r  r  r  r   r   	debug_logrs   r   r   r   subprocess_shellM  s6    zBaseEventLoop.subprocess_shellc       	            s   |rt d|rt d|dkr(t d|r4t d|	d urDt d|
d urTt d|f| }| }d }| jrd|}| |||| | j||d	||||fi |I d H }| jr|d urtd
|| ||fS )Nr  zshell must be Falser   r  r  r  r  zexecute program Fr  )r'   r  r  r   r   rA  )rk   r   Zprogramr   r   r   r  r   r   r  r  r  r   r   Z
popen_argsr   r  rs   r   r   r   subprocess_execq  s6    

zBaseEventLoop.subprocess_execc                 C   s   | j S rE   )r   rw   r   r   r   get_exception_handler  s    z#BaseEventLoop.get_exception_handlerc                 C   s(   |d urt |std||| _d S )Nz+A callable object or None is expected, got )r   r8   r   )rk   handlerr   r   r   set_exception_handler  s
    z#BaseEventLoop.set_exception_handlerc           	      C   s  | d}|sd}| d}|d ur6t|||jf}nd}d|vr`| jd ur`| jjr`| jj|d< |g}t|D ]}|dv r|qn|| }|dkrdt|}d	}||	 7 }n2|dkrdt|}d
}||	 7 }nt
|}|| d|  qntjd||d d S )Nr   z!Unhandled exception in event looprU   FZsource_tracebackZhandle_traceback>   rU   r   r0   z+Object created at (most recent call last):
z+Handle created at (most recent call last):
rd  
r  )getrA   __traceback__r   r   sortedr  	tracebackformat_listrstripr   r<   r   r  )	rk   r&  r   rU   r  Z	log_linesr  valuetbr   r   r   default_exception_handler  s<    

z'BaseEventLoop.default_exception_handlerc                 C   s   | j d u rRz| | W q ttfy0    Y q tyN   tjddd Y q0 nz|  | | W n ttfyz    Y nr ty } zZz| d||d W n6 ttfy    Y n  ty   tjddd Y n0 W Y d }~n
d }~0 0 d S )Nz&Exception in default exception handlerTr  z$Unhandled error in exception handler)r   rU   r&  zeException in default exception handler while handling an unexpected error in custom exception handler)r   r  rV   rW   r  r   r  )rk   r&  rZ   r   r   r   r    s4    
z$BaseEventLoop.call_exception_handlerc                 C   s   |j r
d S | j| d S rE   )
_cancelledr   r<   rk   r   r   r   r   _add_callback  s    zBaseEventLoop._add_callbackc                 C   s   |  | |   d S rE   )r  r   r  r   r   r   _add_callback_signalsafe  s    
z&BaseEventLoop._add_callback_signalsafec                 C   s   |j r|  jd7  _d S r]   )r   r   r  r   r   r   _timer_handle_cancelled!  s    z%BaseEventLoop._timer_handle_cancelledc              	   C   s  t | j}|tkr`| j| tkr`g }| jD ]}|jr<d|_q*|| q*t| || _d| _n4| jr| jd jr|  jd8  _t	| j}d|_q`d }| j
s| jrd}n*| jr| jd j}ttd||   t}| j|}| | |  | j }| jr:| jd }|j|krq:t	| j}d|_| j
| qt | j
}t|D ]}	| j
 }|jrfqL| jrzJ|| _|  }
|  |  |
 }|| jkrtdt|| W d | _nd | _0 n|  qLd }d S )NFr   r   zExecuting %s took %.3f seconds)r   r   _MIN_SCHEDULED_TIMER_HANDLESr   %_MIN_CANCELLED_TIMER_HANDLES_FRACTIONr  r<   r.  heapifyheappopr   r   Z_whenrW  maxr   MAXIMUM_SELECT_TIMEOUT	_selectorselectr   r   rangepopleftr  r   Z_runr   r   r  r   )rk   Zsched_countZnew_scheduledr   timeoutr0  r   end_timeZntodoirD  rF  r   r   r   r  &  sh    






zBaseEventLoop._run_oncec                 C   sH   t |t | jkrd S |r2t | _ttj nt| j || _d S rE   )r  r   r  #get_coroutine_origin_tracking_depthr   #set_coroutine_origin_tracking_depthr   ZDEBUG_STACK_DEPTHrk   Zenabledr   r   r   r  t  s    z,BaseEventLoop._set_coroutine_origin_trackingc                 C   s   | j S rE   )r  rw   r   r   r   r     s    zBaseEventLoop.get_debugc                 C   s    || _ |  r| | j| d S rE   )r  r   r   r  r  r   r   r   r     s    zBaseEventLoop.set_debug)N)N)NNN)NN)NN)N)r   )r   N)N)NN)FN)r   N)NN)NN)Vr   r   r   rm   r   ri   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r  r   rX   r   r   r   r   r%  r   r   r+  r'  r1  r-  r2  r,  r   r6  r=  rG  r@  rI  rS  rM  rO  rL  ro  r  r  r  r  r  r  r  r  r&   r4   r  r  r9   
AI_PASSIVEr  r  r  r  r  r   r    r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r   r   r     s   
 
  
  
 
		&	
	


%    
//  	 z %"29Nr   )r   r   )r   )7rI   collections.abcconcurrent.futuresr7  rw  r.  rN   r  r&   r  r   r  r   r  r  r   r   r_   ImportErrorr0   r   r   r   r   r   r   r	   r
   r   r   r   logr   __all__r  r  r%   r;   r  objectr  r   r#   r-   rD   rS   r[   r^   r`   Protocolra   ZAbstractServerr   ZAbstractEventLoopr   r   r   r   r   <module>   sd   

		
;


Do