o
    h/                     @   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rnd 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ZdS )ServerStatezP
    Shared servers state that is available between all protocol instances.
    returnNc                 C   s    d| _ t | _t | _g | _d S )Nr   )total_requestssetconnectionstasksdefault_headers)self r   D/var/www/html/ai/venv/lib/python3.10/site-packages/uvicorn/server.py__init__*   s   
zServerState.__init__r   N)__name__
__module____qualname____doc__r   r   r   r   r   r   %   s    r   c                   @   s   e Zd ZdeddfddZddeeej  ddfddZddeeej  ddfd	d
Z	ddeeej  ddfddZ
deej ddfddZd ddZdedefddZddeeej  ddfddZd ddZd ddZdedee ddfddZdS )!Serverconfigr   Nc                 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__socketsc                 C   s   | j   t| j|dS )Nr(   )r"   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r>d 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)fg]color_messageextrar)   zFinished server process [%d]zFinished server process [)osgetpidr"   loadedloadlifespan_classlifespaninstall_signal_handlersclickstyleloggerinfostartupr%   	main_loopshutdown)r   r(   
process_idr"   messager1   r   r   r   r-   ?   s$   zServer.servec              
      sR  j  I d H  j jrd_d S j 	 ddttj dtjf fdd}t }|d urjdt	j
dt	j
fdd}g _|D ]'}t d	k} jd
krR|rR||}|j|| j jdI d H }j| q?|}n jd urt	 jt	jt	j}|j|| j jdI d H }|jd usJ |j}|g_n jd urd}	tj jrt jj}	|j| j j jdI d H }t j|	 |jd usJ |j}|g_nHz|j| j  j! j jdI d H }W n% t"y }
 zt#$|
 j % I d H  t&'d
 W Y d }
~
nd }
~
ww |jd usJ |j}|g_|d u r#(| n	 d_)d S )NT_loopr   c                    s    j  jjj| dS )N)r"   r#   	app_staterD   )http_protocol_classr#   r9   state)rD   r"   r   r   r   create_protocol`   s   z'Server.startup.<locals>.create_protocolsockc                 S   s"   ddl m} | t }||S )Nr   )	fromshare)socketrK   sharer4   r5   )rJ   rK   	sock_datar   r   r   _share_socketq   s   z%Server.startup.<locals>._share_socketWindows   )rJ   sslbacklogi  )pathrR   rS   )hostportrR   rS   N)*r9   r?   r%   r"   r   r+   AbstractEventLoopProtocolget_running_looprL   
SocketTypeserversplatformsystemworkerscreate_serverrR   rS   appendfdfromfdAF_UNIXSOCK_STREAMr(   udsr4   rT   existsstatst_modecreate_unix_serverchmodrU   rV   OSErrorr=   errorrA   sysexit_log_started_messager$   )r   r(   rI   looprO   rJ   
is_windowsserver	listeners	uds_permsexcr   rH   r   r?   X   s   









zServer.startuprt   c           
      C   s   | j }|jd ur|d }td|  d S |jd ur$td|j d S d}|jd u r-dn|j}d|v r6d}|j}|dkrE|d  d }|jrJd	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]:%drQ   httpshttpzUvicorn running on z (Press CTRL+C to quit)T)boldr1   r2   )r"   rb   r=   r>   getsocknamerf   rU   rV   rR   r;   r<   )
r   rt   r"   rJ   addr_formatrU   rV   protocol_namerC   r1   r   r   r   rp      sB   


zServer._log_started_messagec                    sV   d}|  |I d H }|s)|d7 }|d }tdI d H  |  |I d H }|rd S d S )Nr   rQ   i / 皙?)on_tickr+   sleep)r   counterr%   r   r   r   r@      s   zServer.main_loopr   c                    s   |d dkrAt   }t|dd }| jjrd|fg}ng }|| jj | j_| jjd urA|| j	 | jj
krA|| _	| j I d H  | jrFdS | jjd urT| jj| jjkS dS )N
   r   T)usegmts   dateF)timer   encoder"   date_headerencoded_headersr#   r   callback_notifyr'   timeout_notifyr%   limit_max_requestsr   )r   r   current_timecurrent_dater   r   r   r   r      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 n+ tjyk   t dt| jj | jjD ]}tjdk rb|  qV|jdd qVY nw | jsy| j I d H  d S d S )NzShutting downr~   )timeoutz=Cancel %s running task(s), timeout graceful shutdown exceeded)   	   z2Task cancelled, timeout graceful shutdown exceeded)msg)r=   r>   r\   closelistr#   r   rA   r+   r   wait_for_wait_tasks_to_completer"   timeout_graceful_shutdownTimeoutErrorrm   lenr   rn   version_infocancelr&   r9   )r   r(   rs   rJ   
connectiontr   r   r   rA     s8   







zServer.shutdownc                    s   | j jr%| js%d}t| | j jr%| js%tdI d H  | j jr%| jr| j jrI| jsId}t| | j jrI| jsItdI d H  | j jrI| jr:| jD ]	}|	 I d H  qLd S )Nz8Waiting for connections to close. (CTRL+C to force quit)r~   z@Waiting for background tasks to complete. (CTRL+C to force quit))
r#   r   r&   r=   r>   r+   r   r   r\   wait_closed)r   r   rs   r   r   r   r   *  s    


zServer._wait_tasks_to_completec                 C   sl   t  t  ur
d S t }ztD ]}||| j|d  qW d S  ty5   tD ]	}t		|| j q(Y d S w rW   )
	threadingcurrent_threadmain_threadr+   get_event_loopHANDLED_SIGNALSadd_signal_handlerhandle_exitNotImplementedErrorsignal)r   rq   sigr   r   r   r:   <  s   zServer.install_signal_handlersr   framec                 C   s$   | j r|tjkrd| _d S d| _ d S )NT)r%   r   SIGINTr&   )r   r   r   r   r   r   r   K  s   

zServer.handle_exitrW   r   )r   r   r   r   r   r   r   rL   r,   r-   r?   r   r[   rp   r@   intboolr   rA   r   r:   r   r   r   r   r   r   r!   1   s    	a
)	
#
r!   ))r+   loggingr4   r]   r   rL   rn   r   r   email.utilsr   typesr   typingr   r   r   r   r   r	   r
   r;   uvicorn.configr   uvicorn.protocols.http.h11_implr   %uvicorn.protocols.http.httptools_implr   ,uvicorn.protocols.websockets.websockets_implr   )uvicorn.protocols.websockets.wsproto_implr   	Protocolsr   SIGTERMr   SIGBREAK	getLoggerr=   r   r!   r   r   r   r   <module>   s8    $

