o
    NK&h,                     @  s  d dl mZ d dlmZ d dlmZmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ er6d dlmZ d d	lZd d	lZd d	lZd d
lmZ d dlmZ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"m#Z# d dl$m%Z%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z.m/Z/ d dl0m1Z1m2Z2 z
d dl3m4Z5 dZ6W n e7y   dZ6Y nw d	d	d	dd	e/ddddd	e* d	d	ej8fd>d+d,Z4d?d1d2Z9d3d4 Z:d5d6 Z;		d@dAd7d8Z<dBd<d=Z=d	S )C    )annotations)
SSLContext)TYPE_CHECKINGOptionalUnion)Config)ServerError)HTTP)get_ssl_context)SanicN)partial)SIG_IGNSIGINTSIGTERM)signal)	setup_ext)OS_IS_WINDOWSctrlc_workaround_for_windows)SessionTicketStore
get_config)error_loggerserver_logger)setup_logging)Signal)AsyncioServer)Http3ProtocolHttpProtocol)bind_unix_socketremove_unix_socket)serveTFd   appr   sslOptional[SSLContext]sockOptional[socket.socket]unixOptional[str]
reuse_portboolprotocoltype[asyncio.Protocol]backlogintregister_sys_signalsrun_multiple	run_asyncc                 C  s   |s|st  }t | t|j|jj |jr||j d|_|t	j
u r.t| ||||S t| |||||||||	|
||||||S )a:  Start asynchronous HTTP Server on an individual process.

    :param host: Address to host on
    :param port: Port to host on
    :param before_start: function to be executed before the server starts
                         listening. Takes arguments `app` instance and `loop`
    :param after_start: function to be executed after the server starts
                        listening. Takes  arguments `app` instance and `loop`
    :param before_stop: function to be executed when a stop signal is
                        received before it is respected. Takes arguments
                        `app` instance and `loop`
    :param after_stop: function to be executed when a stop signal is
                       received after it is respected. Takes arguments
                       `app` instance and `loop`
    :param ssl: SSLContext
    :param sock: Socket for the server to accept connections from
    :param unix: Unix socket to listen on instead of TCP port
    :param reuse_port: `True` for multiple workers
    :param loop: asyncio compatible event loop
    :param run_async: bool: Do not create a new event loop for the server,
                      and return an AsyncServer object rather than running it
    :param asyncio_server_kwargs: key-value args for asyncio/uvloop
                                  create_server method
    :return: Nothing

    Args:
        host (str): Address to host on
        port (int): Port to host on
        app (Sanic): Sanic app instance
        ssl (Optional[SSLContext], optional): SSLContext. Defaults to `None`.
        sock (Optional[socket.socket], optional): Socket for the server to
            accept connections from. Defaults to `None`.
        unix (Optional[str], optional): Unix socket to listen on instead of
            TCP port. Defaults to `None`.
        reuse_port (bool, optional): `True` for multiple workers. Defaults
            to `False`.
        loop: asyncio compatible event loop. Defaults
            to `None`.
        protocol (Type[asyncio.Protocol], optional): Protocol to use. Defaults
            to `HttpProtocol`.
        backlog (int, optional): The maximum number of queued connections
            passed to socket.listen(). Defaults to `100`.
        register_sys_signals (bool, optional): Register SIGINT and SIGTERM.
            Defaults to `True`.
        run_multiple (bool, optional): Run multiple workers. Defaults
            to `False`.
        run_async (bool, optional): Return an AsyncServer object.
            Defaults to `False`.
        connections: Connections. Defaults to `None`.
        signal (Signal, optional): Signal. Defaults to `Signal()`.
        state: State. Defaults to `None`.
        asyncio_server_kwargs (Optional[Dict[str, Union[int, float]]], optional):
            key-value args for asyncio/uvloop create_server method. Defaults
            to `None`.
        version (str, optional): HTTP version. Defaults to `HTTP.VERSION_1`.

    Raises:
        ServerError: Cannot run HTTP/3 server without aioquic installed.

    Returns:
        AsyncioServer: AsyncioServer object if `run_async` is `True`.
    F)asyncionew_event_loopset_event_loopr   debugconfigNO_COLOR	set_debugasgir	   	VERSION_3_serve_http_3_serve_http_1)hostportr!   r"   r$   r&   r(   loopr*   r,   r.   r/   r0   connectionsr   stateasyncio_server_kwargsversion rC   G/var/www/html/venv/lib/python3.10/site-packages/sanic/server/runners.pyr   *   s8   R

r   r>   asyncio.AbstractEventLoopreturnNonec                 C  s^   t tt t tt dtjd< |r+trt|  d S ttfD ]}||t	| j
dd qd S d S )NtrueSANIC_WORKER_PROCESSF)	terminate)signal_funcr   r   r   osenvironr   r   add_signal_handlerr   stop)r!   r/   r.   r>   _signalrC   rC   rD   _setup_system_signals   s   


rQ   c              
   C  s   t  }z2td| |   W td| | |  |r!|  | |  t| |   td| d S td| | |  |rH|  | |  t| |   td| w )NzStarting worker [%s]zStopping worker [%s]zWorker complete [%s])rL   getpidr   inforun_foreverrun_until_completer   close)r>   before_stop
after_stopcleanupr&   pidrC   rC   rD   _run_server_forever   s(   
r[   c              	     s  d urnt  t| j}t|f ||d|}|r"|ni }tr7|r7t }||}t	|}n|r?t
||	d}j||rFd n| |rKd n|f||||	d|}t  |ret |dS     dd    z|W n ty   tjddd	 Y d S w  fd
d}t ||
  dd  d tt jddt jdd|| d S )N)r>   r?   r   r!   r@   r&   )r,   )r"   r(   r$   r,   )r!   r>   
serve_coror?   initbeforezUnable to start serverT)exc_infoc                    s        d_D ]} |   q jj}d}r5||k r5td |d }r5||k s# 	||  D ]}t
|drP|jrP|jjdd q>|  q> d d S )NTr   g?	websocketi  )codeF)rV   rU   wait_closedstoppedclose_if_idler5   GRACEFUL_SHUTDOWN_TIMEOUTr1   sleepshutdown_taskshasattrr`   fail_connectionabortset_serving)
connectiongracefulstart_shutdownconnr!   r?   http_serverr>   r   rC   rD   _cleanup  s"   

z_serve_http_1.<locals>._cleanupaftershutdown)set_build_protocol_kwargsr5   r   r   rL   rR   sharesocket	fromsharer   create_serverr   r   rU   _startup_server_eventackBaseExceptionr   	exceptionrQ   rk   r[   )r<   r=   r!   r"   r$   r&   r(   r>   r*   r,   r.   r/   r0   r?   r   r@   rA   protocol_kwargsserverrZ   server_coroutinerr   rC   rp   rD   r;      s|   



 
r;   c                 C  s   t stdtt|d}t }t||}	t||	}
t| ||
||j|j	d}t
|||g }||  ||  |  || t|||| ||  d }t||j|j|d  d S )Nz4Cannot run HTTP/3 server without aioquic installed. )r!   )configurationcreate_protocolsession_ticket_fetchersession_ticket_handler)HTTP3_AVAILABLEr   r   r   r   r
   r   
quic_servepopaddr   rU   startupbefore_startr}   rQ   after_startr[   rW   rX   )r<   r=   r!   r>   r"   r.   r/   r*   ticket_storessl_contextr5   coror   rY   rC   rC   rD   r:   9  s6   	


r:   r5   r   dict[str, Union[int, float]]c                 C  s    t | dr|j|j|jdS i S )Nwebsocket_handshake)websocket_max_sizewebsocket_ping_timeoutwebsocket_ping_interval)rh   WEBSOCKET_MAX_SIZEWEBSOCKET_PING_TIMEOUTWEBSOCKET_PING_INTERVAL)r*   r5   rC   rC   rD   rv   a  s   
rv   )r!   r   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r)   r/   r)   r0   r)   )
r!   r   r/   r)   r.   r)   r>   rE   rF   rG   )TF)r.   r)   r/   r)   )r*   r+   r5   r   rF   r   )>
__future__r   r"   r   typingr   r   r   sanic.configr   sanic.exceptionsr   sanic.http.constantsr	   sanic.http.tlsr
   	sanic.appr   r1   rL   rx   	functoolsr   r   r   r   r   rK   sanic.application.extr   sanic.compatr   r   sanic.http.http3r   r   	sanic.logr   r   sanic.logging.setupr   sanic.models.server_typesr   sanic.server.async_serverr   $sanic.server.protocols.http_protocolr   r   sanic.server.socketr   r   aioquic.asyncior   r   r   ModuleNotFoundError	VERSION_1rQ   r[   r;   r:   rv   rC   rC   rC   rD   <module>   sj    
uy(