o
    òT·j‰5  ã                   @  s¦  U 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Zd dlZd dlmZmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZmZ er­d d
lm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z. e"e$B e(B e&B e B e.B e*B e,B Z/de0d< e	j1e	j2fZ3ejdkr¾e3e	j4f7 Z3e 5d¡Z6G dd„ dƒZ7G dd„ dƒZ8dS )é    )ÚannotationsN)Ú	GeneratorÚSequence)Ú
formatdate)Ú	FrameType)ÚTYPE_CHECKINGÚ	TypeAlias)Ústyle)Úasyncio_run)ÚSTARTUP_FAILUREÚConfig)ÚAutoZttpProtocol)ÚH11Protocol)ÚHttpToolsProtocol)ÚZttpH2Protocol)ÚZttpProtocol)ÚWebSocketProtocol)ÚWebSocketsSansIOProtocol)Ú
WSProtocolr   Ú	ProtocolsÚ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.
    ÚreturnÚNonec                 C  s    d| _ tƒ | _tƒ | _g | _d S ©Nr   )Útotal_requestsÚsetÚconnectionsÚtasksÚdefault_headers©Úself© r"   úQ/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/uvicorn/server.pyÚ__init__<   s   
zServerState.__init__N©r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r"   r"   r"   r#   r   7   s    r   c                   @  s¤   e Zd Zd,dd„Zejd-dd	„ƒZd.d/dd„Zd.d/dd„Zd.d/dd„Z	d.d/dd„Z
d0dd„Zd1dd„Zd2dd„Zd.d/d d!„Zd1d"d#„Zejd3d%d&„ƒZd4d*d+„Zd
S )5ÚServerÚconfigr   r   r   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$   D   s   
zServer.__init__ú
int | Nonec                 C  s(   | j jd u rd S | j jt d| j j¡ S r   )r+   Úlimit_max_requestsÚrandomÚrandintÚlimit_max_requests_jitterr    r"   r"   r#   r3   O   s   zServer.limit_max_requestsNÚsocketsúlist[socket.socket] | Nonec                 C  s   t | j|d�| j ¡ d�S )N©r7   )Úloop_factory)r
   Úserver+   Úget_loop_factory©r!   r7   r"   r"   r#   ÚrunU   s   z
Server.runc                 Ã  s@   �|   ¡ � |  |¡I d H  W d   ƒ d S 1 sw   Y  d S ©N)Úcapture_signalsÚ_server=   r"   r"   r#   r;   X   s   €
"ÿzServer.servec                 Ã  sÈ   �t  ¡ }| j}|js| ¡  | |¡| _d}dtddd� d }tj	||d|id� | j
|d	�I d H  | js>|  ¡ I d H  | jrb| j|d	�I d H  d
}dtddd� d }tj	||d|id� d S d S )NzStarted server process [%d]zStarted server process [z%dÚcyan)Úfgú]Úcolor_message©Úextrar9   zFinished server process [%d]zFinished server process [)ÚosÚgetpidr+   ÚloadedÚloadÚlifespan_classÚlifespanr	   ÚloggerÚinfoÚstartupr.   Ú	main_loopr-   Úshutdown)r!   r7   Ú
process_idr+   ÚmessagerE   r"   r"   r#   rA   \   s$   €ûzServer._servec              
   ƒ  s4  �ˆj  ¡ I d H  ˆj jrt t¡ ˆj‰ 	 dd‡ ‡fdd„}t ¡ }|d ur\dd	d
„}g ˆ_	|D ]'}t
 ¡ dk}ˆ jdkrD|rD||ƒ}|j||ˆ jˆ jd�I d H }ˆj	 |¡ q1|}n­ˆ jd urˆt ˆ jtjtj¡}|j||ˆ jˆ jd�I d H }|jd us€J ‚|j}|gˆ_	n�ˆ jd urÂd}	tj ˆ j¡r�t ˆ j¡j}	|j|ˆ jˆ jˆ jd�I d H }t ˆ j|	¡ |jd usºJ ‚|j}|gˆ_	nGz|j|ˆ jˆ j ˆ jˆ jd�I d H }W n$ t!yù }
 zt" #|
¡ ˆj  $¡ I d H  t t¡ W Y d }
~
nd }
~
ww |jd u�sJ ‚|j}|gˆ_	|d u �rˆ %|¡ n	 dˆ_&d S )NÚ_loopú asyncio.AbstractEventLoop | Noner   úasyncio.Protocolc                   s   ˆ j ˆ ˆjˆjj| d�S )N)r+   r,   Ú	app_staterU   )Úhttp_protocol_classr,   rM   Ústate)rU   ©r+   r!   r"   r#   Úcreate_protocolz   s   üz'Server.startup.<locals>.create_protocolÚsockúsocket.SocketTypec                 S  s"   ddl m} |  t ¡ ¡}||ƒS )Nr   )Ú	fromshare)Úsocketr_   ÚsharerH   rI   )r]   r_   Ú	sock_datar"   r"   r#   Ú_share_socket‹   s   z%Server.startup.<locals>._share_socketÚWindowsé   )r]   ÚsslÚbacklogi¶  )Úpathrf   rg   )ÚhostÚportrf   rg   Tr?   )rU   rV   r   rW   )r]   r^   r   r^   )'rM   rP   r.   ÚsysÚexitr   r+   ÚasyncioÚget_running_loopÚserversÚplatformÚsystemÚworkersÚcreate_serverrf   rg   ÚappendÚfdr`   ÚfromfdÚAF_UNIXÚSOCK_STREAMr7   ÚudsrH   rh   ÚexistsÚstatÚst_modeÚcreate_unix_serverÚchmodri   rj   ÚOSErrorrN   ÚerrorrR   Ú_log_started_messager-   )r!   r7   r\   Úlooprc   r]   Ú
is_windowsÚserverÚ	listenersÚ	uds_permsÚexcr"   r[   r#   rP   s   sp   €
ÿ





ÿ
û
€ý

zServer.startupr…   úSequence[socket.SocketType]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	|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]:%dre   ÚhttpsÚhttpzUvicorn running on z (Press CTRL+C to quit)T)ÚboldrE   rF   )
r+   ru   rN   rO   Úgetsocknamery   ri   rj   rf   r	   )
r!   r…   r+   r]   Úaddr_formatri   rj   Úprotocol_namerT   rE   r"   r"   r#   r�   Ï   s4   
þ

û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   re   i / çš™™™™™¹?)Úon_tickrm   Úsleep)r!   Úcounterr.   r"   r"   r#   rQ   ò   s   €üzServer.main_loopr“   ÚintÚboolc                 Ã  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}|d ur[| jj|kr[t d|¡ dS dS )Né
   r   T)Úusegmts   datez:Maximum request limit of %d exceeded. Terminating process.F)Útimer   Úencoder+   Údate_headerÚencoded_headersr,   r   Úcallback_notifyr0   Útimeout_notifyr.   r3   r   rN   rO   )r!   r“   Úcurrent_timeÚcurrent_daterš   Úmax_requestsr"   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ya   t  dt| jjƒ¡ | jjD ]}|jdd� qVY nw | jso| j ¡ I d H  d S d S )NzShutting downr�   )Útimeoutz=Cancel %s running task(s), timeout graceful shutdown exceededz2Task cancelled, timeout graceful shutdown exceeded)Úmsg)rN   rO   ro   ÚcloseÚlistr,   r   rR   rm   r’   Úwait_forÚ_wait_tasks_to_completer+   Útimeout_graceful_shutdownÚTimeoutErrorr€   Úlenr   Úcancelr/   rM   )r!   r7   r„   r]   Ú
connectionÚtr"   r"   r#   rR     s4   €




þ
þÿû	ÿ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/   rN   rO   rm   r’   r   ro   Úwait_closed)r!   r¢   r„   r"   r"   r#   r¦   9  s    €
ÿ
ÿ
ÿzServer._wait_tasks_to_completeúGenerator[None, None, None]c                 #  s–   � t  ¡ t  ¡ urd V  d S ‡ fdd„tD ƒ}zd V  W | ¡ D ]
\}}t ||¡ q n| ¡ D ]
\}}t ||¡ q0w tˆ jƒD ]}t |¡ qAd S )Nc                   s   i | ]
}|t   |ˆ j¡“qS r"   )ÚsignalÚhandle_exit)Ú.0Úsigr    r"   r#   Ú
<dictcomp>S  s    z*Server.capture_signals.<locals>.<dictcomp>)	Ú	threadingÚcurrent_threadÚmain_threadÚHANDLED_SIGNALSÚitemsr¯   Úreversedr1   Úraise_signal)r!   Úoriginal_handlersr²   ÚhandlerÚcaptured_signalr"   r    r#   r@   K  s   €ÿÿÿzServer.capture_signalsr²   ÚframeúFrameType | Nonec                 C  s0   | j  |¡ | jr|tjkrd| _d S d| _d S )NT)r1   rt   r.   r¯   ÚSIGINTr/   )r!   r²   r¾   r"   r"   r#   r°   _  s   

zServer.handle_exit)r+   r   r   r   )r   r2   r?   )r7   r8   r   r   )r…   rˆ   r   r   r%   )r“   r”   r   r•   )r   r®   )r²   r”   r¾   r¿   r   r   )r&   r'   r(   r$   Ú	functoolsÚcached_propertyr3   r>   r;   rA   rP   r�   rQ   r‘   rR   r¦   Ú
contextlibÚcontextmanagerr@   r°   r"   r"   r"   r#   r*   C   s     

\
#
	
 r*   )9Ú
__future__r   rm   rÃ   rÁ   ÚloggingrH   rp   r4   r¯   r`   rk   r´   r˜   Úcollections.abcr   r   Úemail.utilsr   Útypesr   Útypingr   r   Úuvicorn._ansir	   Úuvicorn._compatr
   Úuvicorn.configr   r   Ú%uvicorn.protocols.http.auto_zttp_implr   Úuvicorn.protocols.http.h11_implr   Ú%uvicorn.protocols.http.httptools_implr   Ú#uvicorn.protocols.http.zttp_h2_implr   Ú uvicorn.protocols.http.zttp_implr   Ú,uvicorn.protocols.websockets.websockets_implr   Ú3uvicorn.protocols.websockets.websockets_sansio_implr   Ú)uvicorn.protocols.websockets.wsproto_implr   r   Ú__annotations__rÀ   ÚSIGTERMr·   ÚSIGBREAKÚ	getLoggerrN   r   r*   r"   r"   r"   r#   Ú<module>   sj    ÿþýüûúù
ÿþ

