
    8Cfb,                       d dl mZ d dlmZ d dlmZmZ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rd 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.m/Z/ d dl0m1Z1m2Z2 	 d dl3m4Z5 dZ6d	d	d	dd	e/ddddd	 e*       d	d	ejp                  f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ4	 	 	 	 	 	 	 	 	 	 d dZ9d Z:d Z;	 	 d!	 	 	 d"dZ<	 	 	 	 	 	 d#dZ=y	# e7$ r dZ6Y hw xY w)$    )annotations)
SSLContext)TYPE_CHECKINGDictOptionalType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)Signal)AsyncioServer)Http3ProtocolHttpProtocol)bind_unix_socketremove_unix_socket)serveTFd   c                0   |s+|s)t        j                         }t        j                  |       |j                  r|j	                  |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_loopdebug	set_debugasgir   	VERSION_3_serve_http_3_serve_http_1)hostportappsslsockunix
reuse_portloopprotocolbacklogregister_sys_signalsrun_multiple	run_asyncconnectionsr   stateasyncio_server_kwargsversions                     T/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/sanic/server/runners.pyr!   r!   )   s    d T%%'t$
yysyy!CH$.. T4dC88#     c                   t        t        t               t        t        t               dt        j
                  d<   |rKt        rt        |        y t        t        fD ])  }|j                  |t        | j                  d             + y y )NtrueSANIC_WORKER_PROCESSF)	terminate)signal_funcr   r   r   osenvironr   r   add_signal_handlerr   stop)r/   r8   r7   r4   _signals        r>   _setup_system_signalsrJ      sl      !)/BJJ%&(-"G, ''WSXX?	 r?   c                t   t        j                         }	 t        j                  d|       | j	                          t        j                  d|       | j                   |              |r |        | j                   |              t        |       | j                          t        j                  d|       y # t        j                  d|       | j                   |              |r |        | j                   |              t        |       | j                          t        j                  d|       w xY w)NzStarting worker [%s]zStopping worker [%s]zWorker complete [%s])rE   getpidr   inforun_foreverrun_until_completer    close)r4   before_stop
after_stopcleanupr2   pids         r>   _run_server_foreverrU      s    
))+C8137137.I
-4 

137 	137.I
-4 

137s   &B9 9A>D7c           
        n	t               t        |j                        }t        |f||d|}|r|ni }t        r=|r;t        j                         }|j                  |      }t        j                  |      }n|rt        ||	      } j                  ||rd n| |rd n|f||||	d|}t               |rt        |      S j                  j                                j                  j!                  dd             j#                          	 j                  |      fd
}t+        ||
       j                  j!                  dd             j-                  d       t/        t        j                   dd      t        j                   dd      ||       y # t$        $ r t'        j(                  dd	       Y y w xY w)N)r4   r:   r   r/   r;   r2   )r6   )r0   r3   r1   r6   )r/   r4   
serve_coror:   initbeforezUnable to start serverT)exc_infoc                 "   j                          j                  j                                d_        D ]  } | j	                           j
                  j                  }d}r6||k  r1j                  t        j                  d             |dz   }r||k  r1j                  ||z
         D ]G  }t        |d      r)|j                  r|j                  j                  d       8|j                          I j                  d       y )NTr   g?	websocketi  )codeF)rP   rO   wait_closedstoppedclose_if_idleconfigGRACEFUL_SHUTDOWN_TIMEOUTr$   sleepshutdown_taskshasattrr\   fail_connectionabortset_serving)	
connectiongracefulstart_shutdownconnr/   r:   http_serverr4   r   s	       r>   _cleanupz_serve_http_1.<locals>._cleanup
  s     7 7 9: % 	'J$$&	' ::77 !~8##GMM#$67+c1N ~8 	8n45   	Dt[)dnn..D.9

		 	r?   aftershutdown)set_build_protocol_kwargsra   r   r   rE   rL   sharesocket	fromsharer   create_serverr   r   rO   _startup_server_eventackBaseExceptionr   	exceptionrJ   rh   rU   )r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r   r;   r<   protocol_kwargsserverrT   server_coroutinern   rm   s     `    `     ``       @r>   r,   r,      s   & "-!8+ceK,XszzBO		 	F "7B  iikzz#%	g6)t))$$	 	  	 cN'#	
 	
 	CLLN+C--fh?@GGI--.>?
 @ #|-A4HC--fg>?OOD!!:x8!!:w7O  7$Gs   $F8 8 GGc                T   t         st        d      t        t        |      }t	               }t        ||      }	t        ||	      }
t        | ||
||j                  |j                        }t        |||g       }|j                  |j                                |j                  |j                                |j                          |j                  |       t        ||||       |j                  |j!                                d }t#        ||j$                  |j&                  |d        y )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   rO   startupbefore_startry   rJ   after_startrU   rQ   rR   )r-   r.   r/   r4   r0   r7   r8   r5   ticket_storessl_contextra   coror}   rS   s                 r>   r+   r+   6  s    B
 	
 }#.H%'L!#s+K[)F +//+//D 3dB/FFNN,-F//12GGIF##|-A4HF..01 Gf  &"3"3Wdr?   c                f    t        | d      r$|j                  |j                  |j                  dS i S )Nwebsocket_handshake)websocket_max_sizewebsocket_ping_timeoutwebsocket_ping_interval)re   WEBSOCKET_MAX_SIZEWEBSOCKET_PING_TIMEOUTWEBSOCKET_PING_INTERVAL)r5   ra   s     r>   rr   rr   ^  s;     x./"(";";&,&C&C'-'E'E
 	

 Ir?   )r/   r   r0   zOptional[SSLContext]r1   zOptional[socket.socket]r2   zOptional[str]r3   boolr5   Type[asyncio.Protocol]r6   intr7   r   r8   r   r9   r   )
r/   r   r8   r   r7   r   r4   zasyncio.AbstractEventLoopreturnNone)TF)r7   r   r8   r   )r5   r   ra   r
   r   zDict[str, Union[int, float]])>
__future__r   r0   r   typingr   r   r   r   r	   sanic.configr
   sanic.exceptionsr   sanic.http.constantsr   sanic.http.tlsr   	sanic.appr   r$   rE   rt   	functoolsr   r   r   r   r   rD   sanic.application.extr   sanic.compatr   r   sanic.http.http3r   r   	sanic.logr   r   sanic.models.server_typesr   sanic.server.async_serverr   $sanic.server.protocols.http_protocolr   r   sanic.server.socketr   r    aioquic.asyncior!   r   r   ModuleNotFoundError	VERSION_1rJ   rU   r,   r+   rr    r?   r>   <module>r      s   "  = =  ( % *   	   + + ( + D ; 1 , 3 L D3O !%$(	'3!%8
NN%p 
p 
	p
 "p p p %p p p p pf	  $	
 
(8&pr "&% % %P	$	.4	!	s	  Os   C? ?D	D	