
     i)                     j    S r SSKrSSKrSSKrSSKrSSKJr  SSKJr   " S S\R                  5      r
g)zy
ASGI worker for gunicorn.

Provides native asyncio-based ASGI support using gunicorn's own
HTTP parsing infrastructure.
    N)baseASGIProtocolc                      ^  \ rS rSrSrU 4S jr\S 5       rU 4S jrS r	S r
S rS	 rS
 rS rS rS rS rS rS rS rS rS rSrU =r$ )
ASGIWorker   zASGI worker using asyncio event loop.

Supports:
- HTTP/1.1 with keepalive
- WebSocket connections
- Lifespan protocol (startup/shutdown hooks)
- Optional uvloop for improved performance
c                    > [         TU ]  " U0 UD6  U R                  R                  U l        S U l        / U l        SU l        S U l        0 U l        SU l	        g )Nr   F)
super__init__cfgworker_connectionsloopserversnr_connslifespanstate_quick_shutdown)selfargskwargs	__class__s      H/var/www/ias/venv/lib/python3.13/site-packages/gunicorn/workers/gasgi.pyr   ASGIWorker.__init__   sR    $)&)"&(("="=	
$    c                 H    UR                   S:  a  UR                  S5        gg)z'Validate configuration for ASGI worker.   zOASGI worker does not use threads configuration. Use worker_connections instead.N)threadswarning)clsr   logs      r   check_configASGIWorker.check_config)   s%     ;;?KK : ; r   c                 B   > U R                  5         [        TU ]	  5         g)zInitialize the worker process.N)_setup_event_loopr
   init_process)r   r   s    r   r%   ASGIWorker.init_process0   s     	 r   c                    [        U R                  SS5      nUS:X  a   SSKnSnUS:X  a6   SSKnUR	                  5       U l        U R                  R                  S5        O5[        R                  " 5       U l        U R                  R                  S	5        [        R                  " U R
                  5        g! [         a    Sn Nf = f! [         a8    U R                  R                  S5        [        R                  " 5       U l         Ntf = f)
zSetup the asyncio event loop.	asgi_loopautor   NuvloopasynciozUsing uvloop event loopz-uvloop not available, falling back to asynciozUsing asyncio event loop)getattrr   r*   ImportErrornew_event_loopr   r    debugr   r+   set_event_loop)r   	loop_typer*   s      r   r$   ASGIWorker._setup_event_loop6   s    DHHk6:	&$	  5"113	89
  ..0DIHHNN56tyy)  &%	&  5  !PQ#224	5s"   B7 4C	 7CC	?D
Dc                     U R                   R                  5       U l        g! [         a`  nU R                  R
                  (       d  e U R                  R                  U5        U R                  [        U5      5      U l         SnAgSnAff = f)zLoad the ASGI application.N)
appwsgiasgiSyntaxErrorr   reloadr    	exception_make_error_appstrr   es     r   	load_wsgiASGIWorker.load_wsgiO   s`    	5DI 	588??HHq!,,SV4DII		5s   " 
BABBc                    ^ U4S jnU$ )z9Create an error ASGI app for syntax errors during reload.c                 j  >#    U S   S:X  a:  U" SSS/S.5      I S h  vN   U" SST 3R                  5       S	.5      I S h  vN   g U S   S
:X  aV  U" 5       I S h  vN nUS   S:X  a  U" SS05      I S h  vN   U" 5       I S h  vN nUS   S:X  a  U" SS05      I S h  vN   g g g  N Ng NP N7 N* N7f)Ntypehttpzhttp.response.starti  )s   content-types
   text/plain)rB   statusheaderszhttp.response.bodyzApplication error: )rB   bodyr   zlifespan.startupzlifespan.startup.completezlifespan.shutdownzlifespan.shutdown.complete)encode)scopereceivesendmessage	error_msgs       r   	error_app-ASGIWorker._make_error_app.<locals>.error_app[   s     V}&1! @A   
 01)=DDF    v*, '	/6?&88(CDEEE '	/6?&99(DEFFF : -

 *E)Fsi   B3B'#B3B)B3B+B35B-6B3B/B3B1 B3)B3+B3-B3/B31B3 )r   rL   rM   s    ` r   r:   ASGIWorker._make_error_appY   s    	G$ r   c                    U R                    H(  n[        R                  " U[        R                  5        M*     U R                  R	                  [        R
                  U R                  5        U R                  R	                  [        R                  U R                  5        U R                  R	                  [        R                  U R                  5        U R                  R	                  [        R                  U R                  5        U R                  R	                  [        R                  U R                  5        U R                  R	                  [        R                  U R                  5        g)z'Initialize signal handlers for asyncio.N)SIGNALSsignalSIG_DFLr   add_signal_handlerSIGQUIThandle_quit_signalSIGTERMhandle_exit_signalSIGINTSIGUSR1handle_usr1_signalSIGWINCHhandle_winch_signalSIGABRThandle_abort_signal)r   ss     r   init_signalsASGIWorker.init_signalso   s     AMM!V^^,  			$$V^^T5L5LM		$$V^^T5L5LM		$$V]]D4K4KL		$$V^^T5L5LM		$$V__d6N6NO		$$V^^T5M5MNr   c                 z    SU l         U R                  (       d  gSU l        U R                  R                  U 5        g)z+Handle SIGQUIT/SIGINT - immediate shutdown.TNF)r   aliver   
worker_intr   s    r   rW   ASGIWorker.handle_quit_signal}   s-    #zz
D!r   c                     SU l         g)z#Handle SIGTERM - graceful shutdown.FN)re   rg   s    r   rY   ASGIWorker.handle_exit_signal   s	    
r   c                 8    U R                   R                  5         g)z"Handle SIGUSR1 - reopen log files.N)r    reopen_filesrg   s    r   r\   ASGIWorker.handle_usr1_signal   s    r   c                 :    U R                   R                  S5        g)z$Handle SIGWINCH - ignored in worker.zworker: SIGWINCH ignored.N)r    r/   rg   s    r   r^   ASGIWorker.handle_winch_signal   s    23r   c                 t    SU l         U R                  R                  U 5        [        R                  " S5        g)zHandle SIGABRT - abort.Fr   N)re   r   worker_abortsysexitrg   s    r   r`   ASGIWorker.handle_abort_signal   s&    
d#r   c                     U R                   R                  U R                  5       5        U R                  5         g! [         a&  nU R                  R                  SU5         SnAN<SnAff = f! U R                  5         f = f)z Main entry point for the worker.zWorker exception: %sN)r   run_until_complete_serve	Exceptionr    r9   _cleanupr<   s     r   runASGIWorker.run   s`    	II((7 MMO  	:HH5q99	: MMOs'   )< 
A,A'"A/ 'A,,A/ /Bc           	      6  ^ #    [        T R                  SS5      nUS:w  aV  SSKJn  U" T R                  T R
                  T R                  5      T l         T R                  R                  5       I Sh  vN   T R                  5       nT R                   Hn  n T R                  R                  U 4S
 jUR                   USSS9I Sh  vN nT R"                  R%                  U5        T R
                  R'                  SU5        Mp     T R"                  (       d  T R
                  R                  S5        g T R(                  (       a  T R+                  5         T R,                  [.        R0                  " 5       :w  a  T R
                  R'                  ST 5        O1[2        R4                  " S5      I Sh  vN   T R(                  (       a  M  T R9                  5       I Sh  vN   g GNl! [         aU  nUS:X  a!  T R
                  R                  SU5         SnAgT R
                  R                  S	U5        ST l         SnAGNSnAff = f GN~! [         a(  nT R
                  R                  SXS5         SnAGM  SnAff = f N! [2        R6                   a     Nf = f N7f)zMain async serving loop.asgi_lifespanr)   offr   )LifespanManagerNonz ASGI lifespan startup failed: %sz&ASGI lifespan not supported by app: %sc                     > [        T 5      $ )Nr   rg   s   r   <lambda>#ASGIWorker._serve.<locals>.<lambda>   s
    L.r   T)socksslreuse_addressstart_servingzASGI server listening on %sz!Failed to create server on %s: %szNo servers could be startedz!Parent changed, shutting down: %s      ?)r,   r   gunicorn.asgi.lifespanr   r6   r    r   r   startuprx   errorr/   _get_ssl_contextsocketsr   create_serverr   r   appendinfore   notifyppidosgetppidr+   sleepCancelledError	_shutdown)r   lifespan_moder   r=   ssl_contextr   servers   `      r   rw   ASGIWorker._serve   s      /6BE!>+DIItxxLDM	)mm++--- ++-LLDM#yy66.#"&"&  7    ##F+;TB ! ||HHNN89	** 99

,HHMM"EtL
 mmC((( ***" nne . ) D(HHNN#EqI HHNN#KQO$(DMM)  MBDLLM( )%% 		 	s   AJG! 2G3G! 7J.II;I1J3A I= JI= -I;.I= JJJG! !
I +"H;J#H;5J;I  JI
I8I3,J3I88J;I= =JJJJc                 >  #    U R                   R                  S5        U R                   H  nUR                  5         M     U R                  (       dR  U R                   HB  nU R                  (       a    O0 [
        R                  " UR                  5       SS9I Sh  vN   MD     U R                  S:  GaJ  U R                  (       Gd8  U R                  R                  nU R                   R                  SU R                  5        U R                  R                  5       U-   nU R                  S:  a  U R                  R                  5       U:  a{  U R                  (       a  U R                   R                  S5        ON[
        R                  " S5      I Sh  vN   U R                  S:  a   U R                  R                  5       U:  a  M{  U R                  S:  a&  U R                   R                  S	U R                  5        U R                   (       a6  U R                  (       d$   U R                   R#                  5       I Sh  vN   ggg GN! [
        R                   a     GM  f = f N N(! [$         a&  nU R                   R'                  S
U5         SnAgSnAff = f7f)zPerform graceful shutdown.zWorker shutting down...g      ?timeoutNr   z'Waiting for %d connections to finish...zQuick shutdown requestedg?zForcing close of %d connectionsz ASGI lifespan shutdown error: %s)r    r   r   closer   r+   wait_forwait_closedTimeoutErrorr   r   graceful_timeoutr   timer   r   r   shutdownrx   r   )r   r   r   deadliner=   s        r   r   ASGIWorker._shutdown   s    /0 llFLLN # ##,,''!**6+=+=+?MMM	 ' ==1T%9%9%9#xx88HHMMCT]]Syy~~'*::H--!#		(88(C''HHMM"<=mmC(((	 --!#		(88(C }}q   !BDMMR ==!5!5Fmm,,... "6=' N++  ) / FA1EEFs   A2J5&I
II
 C4JI&2J	AJ"I* ?I( I* JI

I#J"I##J(I* *
J4JJJJc                     U R                   R                  (       d  g SSKJn  UR	                  U R                   5      $ ! [
         a&  nU R                  R                  SU5         SnAgSnAff = f)zGet SSL context if configured.Nr   )r   z Failed to create SSL context: %s)r   is_sslgunicornr   r   rx   r    r   )r   r   r=   s      r   r   ASGIWorker._get_ssl_context  sS    xx	%##DHH-- 	HHNN=qA	s    ? 
A/	A**A/c                     [         R                  " U R                  5      nU H  nUR                  5         M     U(       ar  [         R                  " USS06nU R
                  (       a0   U R                  R                  [         R                  " USS95        OU R                  R                  U5        U R                  R                  5         U R                   H  n UR                  5         M     g! [         R                   a    U R                  R                  S5         Npf = f! [         a&  nU R                  R                  SU5         SnANSnAff = f! [         a     M  f = f)zClean up resources on exit.return_exceptionsTr   r   z#Timeout waiting for tasks to cancelzCleanup error: %sN)r+   	all_tasksr   cancelgatherr   rv   r   r   r    r/   r   rx   r   )r   pendingtaskr   r=   ra   s         r   ry   ASGIWorker._cleanup  s   	3''		2G    IDI''N		44#,,VSA II008IIOO
 A	  #// N'LMN  	3HHNN.22	3  sN   A'D( *.C3 6D( E3/D%"D( $D%%D( (
E2EE
E)(E))	r   re   r6   r   r   r   r   r   r   )__name__
__module____qualname____firstlineno____doc__r   classmethodr!   r%   r$   r>   r:   rb   rW   rY   r\   r^   r`   rz   rw   r   r   ry   __static_attributes____classcell__)r   s   @r   r   r      su    % ; ;*25,O" 4:x%FN
 r   r   )r   r+   r   rS   rr   gunicorn.workersr   gunicorn.asgi.protocolr   Workerr   rO   r   r   <module>r      s0   
  	  
 ! /Z Zr   