o
    4ήc*                     @   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	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rrd 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%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)
WSProtocolz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   5/tmp/pip-target-vg8gfxp4/lib/python/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
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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   1   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!   messager0   r   r   r   r,   >   s$   zServer.servec              
      s<  | j  I d H  | j jrd| _d S | j}tj|j|| jd}t	 }|d ur`dt
jdt
jfdd}g | _|D ]%}|jdkrHt dkrH||}|j|||j|jd	I d H }| j| q7|}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| _nGz|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)r!   r"   sockr   c                 S   s"   ddl m} | t }||S )Nr   )	fromshare)socketrD   sharer3   r4   )rC   rD   	sock_datar   r   r   _share_socketi   s   z%Server.startup.<locals>._share_socket   Windows)rC   sslbacklogi  )pathrK   rL   )hostportrK   rL   )+r8   r>   r$   r!   	functoolspartialhttp_protocol_classr"   r*   get_running_looprE   
SocketTypeserversworkersplatformsystemcreate_serverrK   rL   appendfdfromfdAF_UNIXSOCK_STREAMr'   udsr3   rM   existsstatst_modecreate_unix_serverchmodrN   rO   OSErrorr<   errorr@   sysexit_log_started_messager#   )r   r'   r!   create_protocollooprH   rC   server	listeners	uds_permsexcr   r   r   r>   W   s   









zServer.startuprm   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]:%drI   httpshttpzUvicorn running on z (Press CTRL+C to quit)T)boldr0   r1   )r!   r[   r<   r=   getsocknamer_   rN   rO   rK   r:   r;   )
r   rm   r!   rC   addr_formatrN   rO   protocol_namerB   r0   r   r   r   ri      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   rI   i / 皙?)on_tickr*   sleep)r   counterr$   r   r   r   r?      s   zServer.main_looprz   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   rz   current_timecurrent_dater   r   r   r   rx      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 ]}|  q.t	
dI d H  | jjra| jsad}t | | jjra| jsat	
dI d H  | jjra| jrR| jjr| jsd}t | | jjr| jst	
dI d H  | jjr| jrv| js| j I d H  d S d S )NzShutting downrw   z8Waiting for connections to close. (CTRL+C to force quit)z@Waiting for background tasks to complete. (CTRL+C to force quit))r<   r=   rU   closewait_closedlistr"   r   r@   r*   ry   r%   r   r8   )r   r'   rl   rC   
connectionmsgr   r   r   r@      s4   







zServer.shutdownc                 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 N)
	threadingcurrent_threadmain_threadr*   get_event_loopHANDLED_SIGNALSadd_signal_handlerhandle_exitNotImplementedErrorsignal)r   rk   sigr   r   r   r9      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   /  s   

zServer.handle_exitr   r   )r   r   r   r   r   r   r   rE   r+   r,   r   r>   r   rT   ri   r?   intboolrx   r@   r9   r   r   r   r   r   r   r    0   s    	Y
)	
"r    ))r*   rP   loggingr3   rW   r   rE   rg   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   	getLoggerr<   r   r    r   r   r   r   <module>   s6    $
