o
    [Þhô2  ã                   @  sR  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mZ d dlmZ d dlmZ d dlmZmZ d dlZd dlmZ d dl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$ e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)Ú	GeneratorÚSequence)Ú
formatdate)Ú	FrameType)ÚTYPE_CHECKINGÚUnion)Úasyncio_run)ÚConfig)ÚH11Protocol)ÚHttpToolsProtocol)ÚWebSocketProtocol)ÚWebSocketsSansIOProtocol)Ú
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.
    ÚreturnÚNonec                 C  s    d| _ tƒ | _tƒ | _g | _d S )Nr   )Útotal_requestsÚsetÚconnectionsÚtasksÚdefault_headers©Úself© r   úN/var/www/html/premium_crap/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   *   s    r   c                   @  s”   e Zd Zd)dd„Zd*d+d
d„Zd*d+dd„Zd*d+dd„Zd*d+dd„Zd,dd„Zd-dd„Z	d.dd„Z
d*d+dd„Zd-dd „Zejd/d"d#„ƒZd0d'd(„ZdS )1Ú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   7   s   
zServer.__init__NÚsocketsúlist[socket.socket] | Nonec                 C  s   t | j|d�| j ¡ d�S )N©r+   )Úloop_factory)r	   Úserver$   Úget_loop_factory©r   r+   r   r   r   ÚrunB   s   z
Server.runc                 Ã  s@   �|   ¡ � |  |¡I d H  W d   ƒ d S 1 sw   Y  d S ©N)Úcapture_signalsÚ_server1   r   r   r   r/   E   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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ÚclickÚstyleÚloggerÚinfoÚstartupr'   Ú	main_loopÚshutdown)r   r+   Ú
process_idr$   Úmessager9   r   r   r   r5   I   s"   €zServer._servec              
   ƒ  s4  �ˆj  ¡ I d H  ˆj jrdˆ_d S ˆ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" #d¡ W Y d }
~
nd }
~
ww |jd u�sJ ‚|j}|gˆ_|d u �rˆ $|¡ n	 dˆ_%d S )NTÚ_loopú asyncio.AbstractEventLoop | Noner   úasyncio.Protocolc                   s   ˆ j ˆ ˆjˆjj| d�S )N)r$   r%   Ú	app_staterK   )Úhttp_protocol_classr%   rA   Ústate)rK   ©r$   r   r   r   Úcreate_protocolh   s   üz'Server.startup.<locals>.create_protocolÚsockúsocket.SocketTypec                 S  s"   ddl m} |  t ¡ ¡}||ƒS )Nr   )Ú	fromshare)ÚsocketrU   Úsharer<   r=   )rS   rU   Ú	sock_datar   r   r   Ú_share_sockety   s   z%Server.startup.<locals>._share_socketÚWindowsé   )rS   ÚsslÚbacklogi¶  )Úpathr\   r]   )ÚhostÚportr\   r]   r3   )rK   rL   r   rM   )rS   rT   r   rT   )&rA   rF   r'   r$   ÚasyncioÚget_running_loopÚserversÚplatformÚsystemÚworkersÚcreate_serverr\   r]   ÚappendÚfdrV   ÚfromfdÚAF_UNIXÚSOCK_STREAMr+   Úudsr<   r^   ÚexistsÚstatÚst_modeÚcreate_unix_serverÚchmodr_   r`   ÚOSErrorrD   ÚerrorrH   ÚsysÚexitÚ_log_started_messager&   )r   r+   rR   ÚlooprY   rS   Ú
is_windowsÚserverÚ	listenersÚ	uds_permsÚexcr   rQ   r   rF   `   sr   €ÿ





ÿ
û
€ý

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	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]:%dr[   ÚhttpsÚhttpzUvicorn running on z (Press CTRL+C to quit)T)Úboldr9   r:   )r$   ri   rD   rE   Úgetsocknamerm   r_   r`   r\   rB   rC   )
r   r{   r$   rS   Úaddr_formatr_   r`   Úprotocol_namerJ   r9   r   r   r   rw   ½   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   r[   i / çš™™™™™¹?)Úon_tickra   Úsleep)r   Úcounterr'   r   r   r   rG   à   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j}|d ur_| jj|kr_t d|› d�¡ dS dS )	Né
   r   T)Úusegmts   datezMaximum request limit of z exceeded. Terminating process.F)Útimer   Úencoder$   Údate_headerÚencoded_headersr%   r   Úcallback_notifyr)   Útimeout_notifyr'   Úlimit_max_requestsr   rD   Úwarning)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)rD   rE   rc   ÚcloseÚlistr%   r   rH   ra   rˆ   Úwait_forÚ_wait_tasks_to_completer$   Útimeout_graceful_shutdownÚTimeoutErrorrt   Úlenr   Úcancelr(   rA   )r   r+   rz   rS   Ú
connectionÚtr   r   r   rH     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(   rD   rE   ra   rˆ   r   rc   Úwait_closed)r   rš   rz   r   r   r   rž   '  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>A  s    z*Server.capture_signals.<locals>.<dictcomp>)	Ú	threadingÚcurrent_threadÚmain_threadÚHANDLED_SIGNALSÚitemsr§   Úreversedr*   Úraise_signal)r   Úoriginal_handlersrª   ÚhandlerÚcaptured_signalr   r   r   r4   9  s   €ÿÿÿzServer.capture_signalsrª   ÚframeúFrameType | Nonec                 C  s0   | j  |¡ | jr|tjkrd| _d S d| _d S )NT)r*   rh   r'   r§   ÚSIGINTr(   )r   rª   r¶   r   r   r   r¨   M  s   

zServer.handle_exit)r$   r
   r   r   r3   )r+   r,   r   r   )r{   r~   r   r   r   )r‰   rŠ   r   r‹   )r   r¦   )rª   rŠ   r¶   r·   r   r   )r   r    r!   r   r2   r/   r5   rF   rw   rG   r‡   rH   rž   Ú
contextlibÚcontextmanagerr4   r¨   r   r   r   r   r#   6   s    

]
#
	
 r#   ).Ú
__future__r   ra   r¹   Úloggingr<   rd   r§   rV   ru   r¬   rŽ   Úcollections.abcr   r   Úemail.utilsr   Útypesr   Útypingr   r   rB   Úuvicorn._compatr	   Úuvicorn.configr
   Úuvicorn.protocols.http.h11_implr   Ú%uvicorn.protocols.http.httptools_implr   Ú,uvicorn.protocols.websockets.websockets_implr   Ú3uvicorn.protocols.websockets.websockets_sansio_implr   Ú)uvicorn.protocols.websockets.wsproto_implr   Ú	Protocolsr¸   ÚSIGTERMr¯   ÚSIGBREAKÚ	getLoggerrD   r   r#   r   r   r   r   Ú<module>   sB    þ

