U
    &%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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 )    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   M/var/www/html/Darija-Ai-API/env/lib/python3.8/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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(   
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	rt	j
t	j
ddd}g _|D ]N}t dk} jd	kr|r||}|j|| j jd
I d H }j| qv|}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rZt 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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#   r5   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)socketrE   sharer2   r3   )rD   rE   Z	sock_datar   r   r   _share_socketq   s    z%Server.startup.<locals>._share_socketWindows   )rD   sslbacklogi  )pathrK   rL   )hostportrK   rL   )N)+r5   r;   r%   r"   r   r*   AbstractEventLoopProtocolget_running_looprF   
SocketTypeserversplatformsystemworkerscreate_serverrK   rL   appendfdfromfdAF_UNIXSOCK_STREAMr(   AssertionErrorudsr2   rM   existsstatst_modecreate_unix_serverchmodrN   rO   OSErrorr9   errorr=   sysexit_log_started_messager$   )r   r(   rC   looprH   rD   Z
is_windowsserver	listenersZ	uds_permsexcr   rB   r   r;   X   s     

         


zServer.startup)rl   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]:%drJ   httpshttpzUvicorn running on z (Press CTRL+C to quit)T)boldr/   r0   )r"   rZ   r9   r:   getsocknamer_   rN   rO   rK   r7   r8   )
r   rl   r"   rD   Zaddr_formatrN   rO   Zprotocol_namer?   r/   r   r   r   ri      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   rJ   i / 皙?)on_tickr*   sleep)r   counterr%   r   r   r   r<      s    zServer.main_loop)rv   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   rv   current_timeZcurrent_dater{   r   r   r   rt      s"    
zServer.on_tickc                    s  t d | jD ]}|  q|p$g D ]}|  q&| jD ]}| I d H  q:t| jjD ]}|  qZt	
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 downrs   )timeoutz=Cancel %s running task(s), timeout graceful shutdown exceeded)   	   z2Task cancelled, timeout graceful shutdown exceeded)msg)r9   r:   rT   closewait_closedlistr#   r   r=   r*   ru   wait_for_wait_tasks_to_completer"   Ztimeout_graceful_shutdownTimeoutErrorrf   lenr   rg   version_infocancelr&   r5   )r   r(   rk   rD   
connectiontr   r   r   r=     s4    








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  qXd S )Nz8Waiting for connections to close. (CTRL+C to force quit)rs   z@Waiting for background tasks to complete. (CTRL+C to force quit))r#   r   r&   r9   r:   r*   ru   r   )r   r   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*   get_event_loopHANDLED_SIGNALSadd_signal_handlerhandle_exitNotImplementedErrorsignal)r   rj   sigr   r   r   r6   ;  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   J  s    zServer.handle_exit)N)N)N)N)r   r   r   r   r   r   r   rF   r+   r,   r;   r   rS   ri   r<   intboolrt   r=   r   r6   r   r   r   r   r   r   r!   1   s   	a)	%r!   ))r*   loggingr2   rU   r   rF   rg   r   ry   email.utilsr   typesr   typingr   r   r   r   r   r	   r
   r7   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	getLoggerr9   r   r!   r   r   r   r   <module>   s6   $

