U
    r\j/                     @  s$  d dl m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mZ d dlmZ d dlmZmZmZ d dlZd dlmZ erd dlmZ d dlmZ d d	lmZ d d
lmZ eeeeef Zejej fZ!ejdkre!ej"f7 Z!e#dZ$G dd dZ%G dd dZ&dS )    )annotationsN)
formatdate)	FrameType)TYPE_CHECKINGSequenceUnion)Config)H11Protocol)HttpToolsProtocol)WebSocketProtocol)
WSProtocolwin32zuvicorn.errorc                   @  s   e Zd ZdZddddZdS )ServerStatezP
    Shared servers state that is available between all protocol instances.
    Nonereturnc                 C  s    d| _ t | _t | _g | _d S )Nr   )total_requestssetconnectionstasksdefault_headers)self r   E/root/pica-gateway/venv/lib/python3.8/site-packages/uvicorn/server.py__init__+   s    zServerState.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r   &   s   r   c                   @  s   e Zd ZdddddZd%dddd	d
Zd&dddddZd'dddddZdddddZddddZdddddZ	d(dddddZ
ddddZdddd Zdd!dd"d#d$ZdS ))Serverr   r   )configr   c                 C  s*   || _ t | _d| _d| _d| _d| _d S )NFg        )r    r   server_statestartedshould_exit
force_exitlast_notified)r   r    r   r   r   r   3   s    zServer.__init__Nzlist[socket.socket] | None)socketsr   c                 C  s   | j   t| j|dS )Nr&   )r    Zsetup_event_loopasynciorunserve)r   r&   r   r   r   r)   <   s    
z
Server.runc                   s   t  }| j}|js|  ||| _|   d}dtj	ddd d }t
j||d|id | j|d	I d H  | jrzd S |  I d H  | j|d	I d H  d
}dtj	ddd d }t
j||d|id d S )NzStarted server process [%d]zStarted server process [z%dcyan)Zfg]color_messageextrar'   zFinished server process [%d]zFinished server process [)osgetpidr    ZloadedloadZlifespan_classlifespaninstall_signal_handlersclickstyleloggerinfostartupr#   	main_loopshutdown)r   r&   Z
process_idr    messager-   r   r   r   r*   @   s"    zServer.servec              
     sH  j  I d H  j jr"d_d S j dddd fdd}t }|d k	rdddd	d
}g _|D ]N}t dk} j	dkr|r||}|j
|| j jdI d H }j| qj|}nf jd k	r t jtjtj}|j
|| j jdI d H }|jd k	st|j}|g_n jd k	rd}	tj jrNt jj}	|j| j j jdI d H }t j|	 |jd k	st|j}|g_nz&|j
| j j j jdI d H }W nH tk
r }
 z(t !|
 j " I d H  t#$d W 5 d }
~
X Y nX |jd k	st|j}|g_|d kr>%| n d_&d S )NTz asyncio.AbstractEventLoop | Nonezasyncio.Protocol)_loopr   c                   s    j  jjj| dS )N)r    r!   Z	app_stater=   )Zhttp_protocol_classr!   r3   state)r=   r    r   r   r   create_protocola   s    z'Server.startup.<locals>.create_protocolzsocket.SocketType)sockr   c                 S  s"   ddl m} | t }||S )Nr   )	fromshare)socketrB   Zsharer0   r1   )rA   rB   Z	sock_datar   r   r   _share_socketr   s    z%Server.startup.<locals>._share_socketWindows   )rA   sslbacklogi  )pathrG   rH   )hostportrG   rH   )N)'r3   r9   r#   r    r(   Zget_running_loopserversplatformsystemworkerscreate_serverrG   rH   appendfdrC   fromfdAF_UNIXSOCK_STREAMr&   AssertionErrorudsr0   rI   existsstatst_modeZcreate_unix_serverchmodrJ   rK   OSErrorr7   errorr;   sysexit_log_started_messager"   )r   r&   r@   looprD   rA   Z
is_windowsserver	listenersZ	uds_permsexcr   r?   r   r9   Y   s     

         


zServer.startupzSequence[socket.SocketType])rc   r   c           
      C  s   | j }|jd k	r*|d }td|  n|jd k	rDtd|j nd}|jd krVdn|j}d|krhd}|j}|dkr|d  d }|jrd	nd
}d| d}dt	j
|dd d }	tj||||d|	id d S )Nr   z3Uvicorn running on socket %s (Press CTRL+C to quit)z8Uvicorn running on unix socket %s (Press CTRL+C to quit)z
%s://%s:%dz0.0.0.0:z%s://[%s]:%drF   httpshttpzUvicorn running on z (Press CTRL+C to quit)T)boldr-   r.   )r    rR   r7   r8   getsocknamerW   rJ   rK   rG   r5   r6   )
r   rc   r    rA   Zaddr_formatrJ   rK   Zprotocol_namer<   r-   r   r   r   r`      sD    

 zServer._log_started_messager   c                   sN   d}|  |I d H }|sJ|d7 }|d }tdI d H  |  |I d H }qd S )Nr   rF   i / 皙?)on_tickr(   sleep)r   counterr#   r   r   r   r:      s    zServer.main_loopintbool)rm   r   c                   s   |d dkrt   }t|dd }| jjr8d|fg}ng }|| jj | j_| jjd k	r|| j	 | jj
kr|| _	| j I d H  | jrdS | jjd k	r| jj| jjkS dS )N
   r   T)usegmts   dateF)timer   encoder    date_headerZencoded_headersr!   r   Zcallback_notifyr%   Ztimeout_notifyr#   Zlimit_max_requestsr   )r   rm   current_timeZcurrent_datert   r   r   r   rk      s"    
zServer.on_tickc                   s   t d | jD ]}|  q|p$g D ]}|  q&t| jjD ]}|  q@t	dI d H  z tj
|  | jjdI d H  W nX tjk
r   t dt| jj | jjD ]$}tjdk r|  q|jdd qY nX | js| j I d H  d S )NzShutting downrj   )timeoutz=Cancel %s running task(s), timeout graceful shutdown exceeded)   	   z2Task cancelled, timeout graceful shutdown exceeded)msg)r7   r8   rL   closelistr!   r   r;   r(   rl   wait_for_wait_tasks_to_completer    Ztimeout_graceful_shutdownTimeoutErrorr]   lenr   r^   version_infocancelr$   r3   )r   r&   rb   rA   
connectiontr   r   r   r;     s0    







zServer.shutdownc                   s   | j jr<| js<d}t| | j jr<| js<tdI d H  q| j jrx| jsxd}t| | j jrx| jsxtdI d H  qX| jD ]}|	 I d H  q~d S )Nz8Waiting for connections to close. (CTRL+C to force quit)rj   z@Waiting for background tasks to complete. (CTRL+C to force quit))
r!   r   r$   r7   r8   r(   rl   r   rL   Zwait_closed)r   ry   rb   r   r   r   r}   +  s    


zServer._wait_tasks_to_completec                 C  sn   t  t  k	rd S t }z tD ]}||| j|d  q"W n, tk
rh   tD ]}t		|| j qPY nX d S )N)
	threadingcurrent_threadmain_threadr(   Zget_event_loopHANDLED_SIGNALSZadd_signal_handlerhandle_exitNotImplementedErrorsignal)r   ra   sigr   r   r   r4   =  s    zServer.install_signal_handlerszFrameType | None)r   framer   c                 C  s"   | j r|tjkrd| _nd| _ d S )NT)r#   r   SIGINTr$   )r   r   r   r   r   r   r   L  s    zServer.handle_exit)N)N)N)N)r   r   r   r   r)   r*   r9   r`   r:   rk   r;   r}   r4   r   r   r   r   r   r   2   s   	a)	#r   )'
__future__r   r(   loggingr0   rM   r   rC   r^   r   rr   email.utilsr   typesr   typingr   r   r   r5   Zuvicorn.configr   Zuvicorn.protocols.http.h11_implr	   Z%uvicorn.protocols.http.httptools_implr
   Z,uvicorn.protocols.websockets.websockets_implr   Z)uvicorn.protocols.websockets.wsproto_implr   Z	Protocolsr   SIGTERMr   ZSIGBREAK	getLoggerr7   r   r   r   r   r   r   <module>   s8   

