B
    åCeÎ/  ã               @   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	m
Z
 d dlmZ d dlmZmZmZmZmZmZmZ d dlZd dlmZ erÜd 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rþe#ej$f7 Z#e %d¡Z&G dd„ dƒZ'G dd„ dƒZ(dS )é    N)Ú
formatdate)Ú	FrameType)ÚTYPE_CHECKINGÚListÚOptionalÚSequenceÚSetÚTupleÚ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.
    N)Úreturnc             C   s    d| _ tƒ | _tƒ | _g | _d S )Nr   )Útotal_requestsÚsetÚconnectionsÚtasksÚdefault_headers)Úself© r   úb/var/www/downstreamdata.science/rtclock/rtclock-venv/lib/python3.7/site-packages/uvicorn/server.pyÚ__init__*   s    zServerState.__init__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   %   s   r   c               @   sò   e Zd Zeddœdd„Zdeeej  ddœdd„Zdeeej  ddœdd	„Z	d eeej  ddœd
d„Z
eej ddœdd„Zddœdd„Zeedœdd„Zd!eeej  ddœdd„Zddœdd„Zddœdd„Zeee ddœdd„ZdS )"ÚServerN)Ú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   2   s    zServer.__init__)Ú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)Úextra)r'   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       
   
   ƒ   sT  ˆj  ¡ I d H  ˆj jr"dˆ_d S ˆj‰ dttj tjdœ‡ ‡fdd„}t ¡ }|d k	rÎt	j
t	j
dœdd„}g ˆ_xR|D ]J}ˆ jdkršt ¡ d	krš||ƒ}|j||ˆ jˆ jd
I d H }ˆj |¡ qxW |}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	r¦d}tj ˆ j¡rZt ˆ j¡j}|j|ˆ jˆ jˆ jdI d H }t  ˆ j|¡ |jd k	s–t‚|j}|gˆ_nŽy&|j|ˆ j!ˆ j"ˆ jˆ jdI d H }W nH t#k
r }	 z(t$ %|	¡ ˆj  &¡ I d H  t' (d¡ W d d }	~	X Y nX |jd k	s&t‚|j}|gˆ_|d krJˆ )|¡ n dˆ_*d S )NT)Ú_loopr   c                s   ˆ j ˆ ˆjˆjj| dS )N)r!   r"   Z	app_stater<   )Zhttp_protocol_classr"   r2   Ústate)r<   )r!   r   r   r   Úcreate_protocol`   s
    z'Server.startup.<locals>.create_protocol)Úsockr   c             S   s"   ddl m} |  t ¡ ¡}||ƒS )Nr   )Ú	fromshare)Úsocketr@   Zsharer/   r0   )r?   r@   Z	sock_datar   r   r   Ú_share_socketq   s    z%Server.startup.<locals>._share_socketé   ÚWindows)r?   ÚsslÚbacklogi¶  )ÚpathrE   rF   )ÚhostÚportrE   rF   )N)+r2   r8   r$   r!   r   r(   ÚAbstractEventLoopÚProtocolÚget_running_looprA   Ú
SocketTypeÚserversÚworkersÚplatformÚsystemÚcreate_serverrE   rF   ÚappendÚfdÚfromfdÚAF_UNIXÚSOCK_STREAMr'   ÚAssertionErrorÚudsr/   rG   ÚexistsÚstatÚst_modeÚcreate_unix_serverÚchmodrH   rI   ÚOSErrorr6   Úerrorr:   ÚsysÚexitÚ_log_started_messager#   )
r   r'   r>   ÚlooprB   r?   ÚserverÚ	listenersZ	uds_permsÚexcr   )r!   r   r   r8   X   sl    




zServer.startup)rf   r   c       
      C   sÒ   | j }|jd k	r*|d }t d| ¡ ¡ n¤|jd k	rDt d|j¡ nŠd}|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]:%drC   ÚhttpsÚhttpzUvicorn running on z (Press CTRL+C to quit)T)Úboldr-   )r.   )r!   rT   r6   r7   ÚgetsocknamerY   rH   rI   rE   r4   r5   )
r   rf   r!   r?   Zaddr_formatrH   rI   Zprotocol_namer;   r-   r   r   r   rc   º   s2    

zServer._log_started_message)r   c             Ã   sR   d}|   |¡I d H }x8|sL|d7 }|d }t d¡I d H  |   |¡I d H }qW d S )Nr   rC   i / gš™™™™™¹?)Úon_tickr(   Úsleep)r   Úcounterr$   r   r   r   r9   ã   s    zServer.main_loop)ro   r   c             Ã   sª   |d dkr€t   ¡ }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rŠd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   ro   Úcurrent_timeZcurrent_datert   r   r   r   rm   ì   s     zServer.on_tickc             Ã   s$  t  d¡ x| jD ]}| ¡  qW x|p*g D ]}| ¡  q,W x| jD ]}| ¡ I d H  qDW xt| jjƒD ]}| ¡  qhW t	 
d¡I d H  y t	j|  ¡ | jjdI d H  W n^ t	jk
r   t  dt| jjƒ¡ x0| jjD ]$}tjdk rò| ¡  qÚ|jdd qÚW Y nX | js | j ¡ I d H  d S )NzShutting downgš™™™™™¹?)Útimeoutz=Cancel %s running task(s), timeout graceful shutdown exceeded)é   é	   z2Task cancelled, timeout graceful shutdown exceeded)Úmsg)r6   r7   rN   ÚcloseÚwait_closedÚlistr"   r   r:   r(   rn   Úwait_forÚ_wait_tasks_to_completer!   Ztimeout_graceful_shutdownÚTimeoutErrorr`   Úlenr   ra   Úversion_infoÚcancelr%   r2   )r   r'   re   r?   Ú
connectionÚtr   r   r   r:     s0    


zServer.shutdownc             Ã   s„   | j jr@| js@d}t |¡ x"| j jr>| js>t d¡I d H  qW | j jr€| js€d}t |¡ x"| j jr~| js~t d¡I d H  q^W d S )Nz8Waiting for connections to close. (CTRL+C to force quit)gš™™™™™¹?z@Waiting for background tasks to complete. (CTRL+C to force quit))r"   r   r%   r6   r7   r(   rn   r   )r   ry   r   r   r   r~   -  s    

zServer._wait_tasks_to_completec             C   sv   t  ¡ t  ¡ k	rd S t ¡ }y$xtD ]}| || j|d ¡ q$W W n0 tk
rp   xtD ]}t	 	|| j¡ qVW Y nX d S )N)
Ú	threadingÚcurrent_threadÚmain_threadr(   Úget_event_loopÚHANDLED_SIGNALSÚadd_signal_handlerÚhandle_exitÚNotImplementedErrorÚsignal)r   rd   Úsigr   r   r   r3   <  s    

zServer.install_signal_handlers)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‹   K  s    zServer.handle_exit)N)N)N)N)r   r   r   r   r   r   r   rA   r)   r*   r8   r   rM   rc   r9   ÚintÚboolrm   r:   r~   r3   r   r‹   r   r   r   r   r    1   s   	b)	%r    ))r(   Úloggingr/   rP   r   rA   ra   r…   rr   Úemail.utilsr   Útypesr   Útypingr   r   r   r   r   r	   r
   r4   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Ú	getLoggerr6   r   r    r   r   r   r   Ú<module>   s4   $

