U
    EZh2                     @  s2  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Zd dlmZ d dlmZ d dlmZ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re#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	Generator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   U/home/aprabhat/apps/x.techxrdev.in/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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ejd!dd"d#Zdd$dd%d&d'ZdS )-Serverr	   r   )configr   c                 C  s0   || _ t | _d| _d| _d| _d| _g | _d S )NFg        )r"   r   server_statestartedshould_exit
force_exitlast_notified_captured_signals)r   r"   r   r   r   r   4   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(   |    | |I d H  W 5 Q R X d S )N)capture_signals_server.   r   r   r   r-   C   s    
zServer.servec                   s   t  }| j}|js|  ||| _d}dtjddd d }t	j
||d|id | j|d	I d H  | jrrd 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clickstyleloggerinfostartupr%   	main_loopshutdown)r   r)   Z
process_idr"   messager3   r   r   r   r0   G   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_staterB   )Zhttp_protocol_classr#   r9   state)rB   r"   r   r   r   create_protocolf   s    z'Server.startup.<locals>.create_protocolzsocket.SocketType)sockr   c                 S  s"   ddl m} | t }||S )Nr   )	fromshare)socketrG   Zsharer6   r7   )rF   rG   Z	sock_datar   r   r   _share_socketw   s    z%Server.startup.<locals>._share_socketWindows   )rF   sslbacklogi  )pathrL   rM   )hostportrL   rM   )N)'r9   r>   r%   r"   r+   Zget_running_loopserversplatformsystemworkerscreate_serverrL   rM   appendfdrH   fromfdAF_UNIXSOCK_STREAMr)   AssertionErrorudsr6   rN   existsstatst_modeZcreate_unix_serverchmodrO   rP   OSErrorr<   errorr@   sysexit_log_started_messager$   )r   r)   rE   looprI   rF   Z
is_windowsserver	listenersZ	uds_permsexcr   rD   r   r>   ^   sp     

   


zServer.startupzSequence[socket.SocketType])rh   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]:%drK   httpshttpzUvicorn running on z (Press CTRL+C to quit)T)boldr3   r4   )r"   rW   r<   r=   getsocknamer\   rO   rP   rL   r:   r;   )
r   rh   r"   rF   Zaddr_formatrO   rP   Zprotocol_namerA   r3   r   r   r   re      s4    

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   rK   i / 皙?)on_tickr+   sleep)r   counterr%   r   r   r   r?      s    zServer.main_loopintbool)rr   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|krtd| d dS dS )	N
   r   T)usegmts   datezMaximum request limit of z exceeded. Terminating process.F)timer   encoder"   date_headerZencoded_headersr#   r   Zcallback_notifyr'   Ztimeout_notifyr%   Zlimit_max_requestsr   r<   warning)r   rr   current_timeZcurrent_datery   Zmax_requestsr   r   r   rp      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 downro   )timeoutz=Cancel %s running task(s), timeout graceful shutdown exceeded)   	   z2Task cancelled, timeout graceful shutdown exceeded)msg)r<   r=   rQ   closelistr#   r   r@   r+   rq   wait_for_wait_tasks_to_completer"   Ztimeout_graceful_shutdownTimeoutErrorrb   lenr   rc   version_infocancelr&   r9   )r   r)   rg   rF   
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)ro   z@Waiting for background tasks to complete. (CTRL+C to force quit))
r#   r   r&   r<   r=   r+   rq   r   rQ   Zwait_closed)r   r   rg   r   r   r   r   (  s    


zServer._wait_tasks_to_completezGenerator[(None, None, None)]c                 #  sv   t  t  k	rd V  d S  fddtD }z
d V  W 5 | D ]\}}t|| q@X t jD ]}t| qbd S )Nc                   s   i | ]}|t  | jqS r   )signalhandle_exit).0sigr   r   r   
<dictcomp>B  s      z*Server.capture_signals.<locals>.<dictcomp>)		threadingcurrent_threadmain_threadHANDLED_SIGNALSitemsr   reversedr(   raise_signal)r   Zoriginal_handlersr   handlerZcaptured_signalr   r   r   r/   :  s    
zServer.capture_signalszFrameType | None)r   framer   c                 C  s.   | j | | jr$|tjkr$d| _nd| _d S )NT)r(   rV   r%   r   SIGINTr&   )r   r   r   r   r   r   r   N  s    zServer.handle_exit)N)N)N)N)N)r   r   r   r   r,   r-   r0   r>   re   r?   rp   r@   r   
contextlibcontextmanagerr/   r   r   r   r   r   r!   3   s   ]#	#r!   ))
__future__r   r+   r   loggingr6   rR   r   rH   rc   r   rw   email.utilsr   typesr   typingr   r   r   r   r:   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	getLoggerr<   r   r!   r   r   r   r   <module>   s:   
