§
    …ßjÉ)  ã                   óh   — d Z ddlZddlZddlZddlZddlmZ ddlmZ  G d„ dej	        ¦  «        Z
dS )zy
ASGI worker for gunicorn.

Provides native asyncio-based ASGI support using gunicorn's own
HTTP parsing infrastructure.
é    N)Úbase©ÚASGIProtocolc                   ó–   ‡ — e Zd ZdZˆ fd„Zed„ ¦   «         Zˆ fd„Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZS )Ú
ASGIWorkerzÓASGI 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          ¦   «         j        |i |¤Ž | j        j        | _        d | _        g | _        d| _        d | _        i | _        d| _	        d S )Nr   F)
ÚsuperÚ__init__ÚcfgÚworker_connectionsÚloopÚserversÚnr_connsÚlifespanÚstateÚ_quick_shutdown)ÚselfÚargsÚkwargsÚ	__class__s      €úI/var/www/html/venv/lib/python3.11/site-packages/gunicorn/workers/gasgi.pyr
   zASGIWorker.__init__   s]   ø€ Ø�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ø"&¤(Ô"=ˆÔØˆŒ	ØˆŒØˆŒØˆŒØˆŒ
Ø$ˆÔÐÐó    c                 óJ   — |j         dk    r|                     d¦  «         dS dS )z'Validate configuration for ASGI worker.é   zOASGI worker does not use threads configuration. Use worker_connections instead.N)ÚthreadsÚwarning)Úclsr   Úlogs      r   Úcheck_configzASGIWorker.check_config)   s;   € ð Œ;˜Š?ˆ?Ø�KŠKð :ñ ;ô ;ð ;ð ;ð ;ð ˆ?r   c                 óp   •— |                       ¦   «          t          ¦   «                              ¦   «          dS )zInitialize the worker process.N)Ú_setup_event_loopr	   Úinit_process)r   r   s    €r   r"   zASGIWorker.init_process0   s3   ø€ ð 	×ÒÑ Ô Ð Ý‰Œ×ÒÑÔÐÐÐr   c                 ó
  — t          | j        dd¦  «        }|dk    r	 ddl}d}n# t          $ r d}Y nw xY w|dk    r{	 ddl}|                     ¦   «         | _        | j                             d¦  «         nt# t          $ r5 | j                             d¦  «         t          j        ¦   «         | _        Y n6w xY wt          j        ¦   «         | _        | j                             d	¦  «         t          j
        | j        ¦  «         dS )
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!   zASGIWorker._setup_event_loop6   s%  € å˜DœH k°6Ñ:Ô:ˆ	à˜ÒÐð&Ø���Ø$�	�	øÝð &ð &ð &Ø%�	�	�	ð&øøøð ˜Ò Ð ð5Ø���Ø"×1Ò1Ñ3Ô3�”	Ø”—’Ð8Ñ9Ô9Ð9Ð9øÝð 5ð 5ð 5Ø”× Ò Ð!PÑQÔQÐQÝ#Ô2Ñ4Ô4�”	�	�	ð5øøøõ  Ô.Ñ0Ô0ˆDŒIØŒH�NŠNÐ5Ñ6Ô6Ð6åÔ˜tœyÑ)Ô)Ð)Ð)Ð)s   ž% ¥4³4¾7A6 Á6<B5Â4B5c                 ó  — 	 | j                              ¦   «         | _        dS # t          $ rY}| j        j        s‚ | j                             |¦  «         |                      t          |¦  «        ¦  «        | _        Y d}~dS d}~ww xY w)zLoad the ASGI application.N)
ÚappÚwsgiÚasgiÚSyntaxErrorr   Úreloadr   Ú	exceptionÚ_make_error_appÚstr©r   Úes     r   Ú	load_wsgizASGIWorker.load_wsgiO   s‡   € ð	5ØœŸš™œˆDŒIˆIˆIøÝð 	5ð 	5ð 	5Ø”8”?ð ØØŒH×Ò˜qÑ!Ô!Ð!Ø×,Ò,­S°©V¬VÑ4Ô4ˆDŒIˆIˆIˆIˆIˆIˆIøøøøð		5øøøs   ‚" ¢
B¬AB Â Bc                 ó   ‡— ˆfd„}|S )z9Create an error ASGI app for syntax errors during reload.c              “   ó‚  •K  — | d         dk    rA |dddgdœ¦  «        ƒ d {V —†  |dd‰› �                      ¦   «         d	œ¦  «        ƒ d {V —† d S | d         d
k    r` |¦   «         ƒ d {V —†}|d         dk    r |ddi¦  «        ƒ d {V —†  |¦   «         ƒ d {V —†}|d         dk    r |ddi¦  «        ƒ d {V —† d S d S d S )NÚtypeÚhttpzhttp.response.startiô  )s   content-types
   text/plain)r<   ÚstatusÚheaderszhttp.response.bodyzApplication error: )r<   Úbodyr   zlifespan.startupzlifespan.startup.completezlifespan.shutdownzlifespan.shutdown.complete)Úencode)ÚscopeÚreceiveÚsendÚmessageÚ	error_msgs       €r   Ú	error_appz-ASGIWorker._make_error_app.<locals>.error_app[   s…  øè è € Ø�VŒ} Ò&Ð&Ø�dØ1Ø!Ø @ÐAðð ñ ô ð ð ð ð ð ð ð ð
 �dØ0Ø=°)Ð=Ð=×DÒDÑFÔFðð ñ ô ð ð ð ð ð ð ð ð ð ð �v” *Ò,Ð,Ø ' ¡	¤	˜/˜/˜/˜/˜/˜/�Ø˜6”?Ð&8Ò8Ð8Ø˜$ Ð(CÐDÑEÔEÐEÐEÐEÐEÐEÐEÐEØ ' ¡	¤	˜/˜/˜/˜/˜/˜/�Ø˜6”?Ð&9Ò9Ð9Ø˜$ Ð(DÐEÑFÔFÐFÐFÐFÐFÐFÐFÐFÐFÐFð -Ð,ð
 :Ð9r   © )r   rF   rG   s    ` r   r5   zASGIWorker._make_error_appY   s)   ø€ ð	Gð 	Gð 	Gð 	Gð 	Gð$ Ðr   c                 óP  — | j         D ]!}t          j        |t          j        ¦  «         Œ"| j                             t          j        | j        ¦  «         | j                             t          j        | j        ¦  «         | j                             t          j	        | j        ¦  «         | j                             t          j
        | j        ¦  «         | j                             t          j        | j        ¦  «         | j                             t          j        | j        ¦  «         dS )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_signalszASGIWorker.init_signalso   sâ   € ð ”ð 	-ð 	-ˆAÝŒM˜!�Vœ^Ñ,Ô,Ð,Ð,ð 	Œ	×$Ò$¥V¤^°TÔ5LÑMÔMÐMØŒ	×$Ò$¥V¤^°TÔ5LÑMÔMÐMØŒ	×$Ò$¥V¤]°DÔ4KÑLÔLÐLØŒ	×$Ò$¥V¤^°TÔ5LÑMÔMÐMØŒ	×$Ò$¥V¤_°dÔ6NÑOÔOÐOØŒ	×$Ò$¥V¤^°TÔ5MÑNÔNÐNÐNÐNr   c                 óh   — d| _         | j        sdS d| _        | j                             | ¦  «         dS )z+Handle SIGQUIT/SIGINT - immediate shutdown.TNF)r   Úaliver   Ú
worker_int©r   s    r   rO   zASGIWorker.handle_quit_signal}   s<   € à#ˆÔØŒzð 	àˆFØˆŒ
ØŒ×Ò˜DÑ!Ô!Ð!Ð!Ð!r   c                 ó   — d| _         dS )z#Handle SIGTERM - graceful shutdown.FN)r\   r^   s    r   rQ   zASGIWorker.handle_exit_signal†   s   € àˆŒ
ˆ
ˆ
r   c                 ó8   — | j                              ¦   «          dS )z"Handle SIGUSR1 - reopen log files.N)r   Úreopen_filesr^   s    r   rT   zASGIWorker.handle_usr1_signalŠ   s   € àŒ×ÒÑÔÐÐÐr   c                 ó:   — | j                              d¦  «         dS )z$Handle SIGWINCH - ignored in worker.zworker: SIGWINCH ignored.N)r   r+   r^   s    r   rV   zASGIWorker.handle_winch_signalŽ   s   € àŒ�ŠÐ2Ñ3Ô3Ð3Ð3Ð3r   c                 óp   — d| _         | j                             | ¦  «         t          j        d¦  «         dS )zHandle SIGABRT - abort.Fr   N)r\   r   Úworker_abortÚsysÚexitr^   s    r   rX   zASGIWorker.handle_abort_signal’   s0   € àˆŒ
ØŒ×Ò˜dÑ#Ô#Ð#ÝŒ�‰Œˆˆˆr   c                 ó   — 	 | j                              |                      ¦   «         ¦  «         n2# t          $ r%}| j                             d|¦  «         Y d}~nd}~ww xY w|                      ¦   «          dS # |                      ¦   «          w xY w)z Main entry point for the worker.zWorker exception: %sN)r   Úrun_until_completeÚ_serveÚ	Exceptionr   r4   Ú_cleanupr7   s     r   ÚrunzASGIWorker.run˜   s”   € ð	ØŒI×(Ò(¨¯ª©¬Ñ7Ô7Ð7Ð7øÝð 	:ð 	:ð 	:ØŒH×ÒÐ5°qÑ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9øøøøð	:øøøð �MŠM‰OŒOˆOˆOˆOøˆD�MŠM‰OŒOˆOˆOøøøs+   ‚,/ ®A7 ¯
A¹AÁA7 ÁAÁA7 Á7Bc              ƒ   óŒ  ‡ K  — t          ‰ j        dd¦  «        }|dk    r¨ddlm}  |‰ j        ‰ j        ‰ j        ¦  «        ‰ _        	 ‰ j                             ¦   «         ƒ d{V —† n`# t          $ rS}|dk    r!‰ j         
                    d|¦  «         Y d}~dS ‰ j                             d	|¦  «         d‰ _        Y d}~nd}~ww xY w‰                      ¦   «         }‰ j        D ]˜}	 ‰ j                             ˆ fd
„|j        |dd¬¦  «        ƒ d{V —†}‰ j                             |¦  «         ‰ j                             d|¦  «         Œf# t          $ r&}‰ j         
                    d||¦  «         Y d}~Œ‘d}~ww xY w‰ j        s‰ j         
                    d¦  «         dS 	 ‰ j        rm‰                      ¦   «          ‰ j        t/          j        ¦   «         k    r‰ j                             d‰ ¦  «         n!t3          j        d¦  «        ƒ d{V —† ‰ j        °mn# t2          j        $ r Y nw xY w‰                      ¦   «         ƒ d{V —† dS )zMain async serving loop.Úasgi_lifespanr%   Úoffr   )ÚLifespanManagerNÚonz ASGI lifespan startup failed: %sz&ASGI lifespan not supported by app: %sc                  ó"   •— t          ‰ ¦  «        S )Nr   r^   s   €r   ú<lambda>z#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.lifespanrp   r1   r   r   r   Ústartuprj   Úerrorr+   Ú_get_ssl_contextÚsocketsr   Úcreate_serverrt   r   ÚappendÚinfor\   ÚnotifyÚppidÚosÚgetppidr'   ÚsleepÚCancelledErrorÚ	_shutdown)r   Úlifespan_moderp   r8   Ússl_contextrt   Úservers   `      r   ri   zASGIWorker._serve¡   sè  øè è € õ   ¤¨/¸6ÑBÔBˆØ˜EÒ!Ð!Ø>Ð>Ð>Ð>Ð>Ð>Ø+˜O¨D¬I°t´xÀÄÑLÔLˆDŒMð	)Ø”m×+Ò+Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-øÝð )ð )ð )Ø  DÒ(Ð(Ø”H—N’NÐ#EÀqÑIÔIÐIØ�F�F�F�F�Fð ”H—N’NÐ#KÈQÑOÔOÐOØ$(�D”M�M�M�M�M�Møøøøð)øøøð ×+Ò+Ñ-Ô-ˆà”Lð 	Mð 	MˆDðMØ#œy×6Ò6Ø.Ð.Ð.Ð.ØœØ#Ø"&Ø"&ð  7ñ  ô  ð ð ð ð ð ð �ð ”×#Ò# FÑ+Ô+Ð+Ø”—’Ð;¸TÑBÔBÐBÐBøÝð Mð Mð MØ”—’ÐBÀDÈ!ÑLÔLÐLÐLÐLÐLÐLÐLøøøøðMøøøð Œ|ð 	ØŒH�NŠNÐ8Ñ9Ô9Ð9ØˆFð	Ø”*ð )Ø—’‘”�ð ”9¥¤
¡¤Ò,Ð,Ø”H—M’MÐ"EÀtÑLÔLÐLØõ
 ”m CÑ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ð ”*ð )øøõ Ô%ð 	ð 	ð 	ØˆDð	øøøð �nŠnÑÔÐÐÐÐÐÐÐÐÐsJ   ÁA( Á(
CÁ2!C Â"C Ã CÃ&A"E	Å	
E9ÅE4Å4E9Æ A4H ÈH'È&H'c              ƒ   ó$  K  — | j                              d¦  «         | j        D ]}|                     ¦   «          Œ| j        sW| j        D ]O}| j        r nE	 t          j        |                     ¦   «         d¬¦  «        ƒ d{V —† Œ;# t
          j        $ r Y ŒLw xY w| j	        dk    �r| j        sÿ| j
        j        }| j                              d| j	        ¦  «         | j                             ¦   «         |z   }| j	        dk    r�| j                             ¦   «         |k     rd| j        r| j                              d¦  «         nBt          j        d¦  «        ƒ d{V —† | j	        dk    r| j                             ¦   «         |k     °d| j	        dk    r | j                              d	| j	        ¦  «         | j        r\| j        sW	 | j                             ¦   «         ƒ d{V —† dS # t$          $ r&}| j                              d
|¦  «         Y d}~dS d}~ww xY wdS dS )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   Úshutdownrj   r{   )r   rŠ   r’   Údeadliner8   s        r   r‡   zASGIWorker._shutdownÝ   s�  è è € àŒ�ŠÐ/Ñ0Ô0Ð0ð ”lð 	ð 	ˆFØ�LŠL‰NŒNˆNˆNð Ô#ð 	Øœ,ð ð �ØÔ'ð Ø�EðÝ!Ô*¨6×+=Ò+=Ñ+?Ô+?ÈÐMÑMÔMÐMÐMÐMÐMÐMÐMÐMÐMøÝÔ+ð ð ð Ø�Dðøøøð Œ=˜1ÒÑ TÔ%9ÐØ#œxÔ8ÐØŒH�MŠMÐCÀTÄ]ÑSÔSÐSØ”y—~’~Ñ'Ô'Ð*:Ñ:ˆHØ”- !Ò#Ð#¨¬	¯ªÑ(8Ô(8¸8Ò(CÐ(CØÔ'ð Ø”H—M’MÐ"<Ñ=Ô=Ð=ØÝ”m CÑ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ð	 ”- !Ò#Ð#¨¬	¯ªÑ(8Ô(8¸8Ò(CÐ(Cð Œ}˜qÒ Ð Ø”× Ò Ð!BÀDÄMÑRÔRÐRð Œ=ð 	F Ô!5ð 	FðFØ”m×,Ò,Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.øÝð Fð Fð FØ”—’ÐAÀ1ÑEÔEÐEÐEÐEÐEÐEÐEÐEøøøøðFøøøð	Fð 	Fð 	Fð 	Fs*   Á.BÂBÂBÆ:G Ç
HÇ%HÈHc                 óÆ   — | j         j        sdS 	 ddlm} |                     | j         ¦  «        S # t
          $ r&}| j                             d|¦  «         Y d}~dS d}~ww xY w)zGet SSL context if configured.Nr   )rt   z Failed to create SSL context: %s)r   Úis_sslÚgunicornrt   r‰   rj   r   r{   )r   rt   r8   s      r   r|   zASGIWorker._get_ssl_context  sƒ   € àŒxŒð 	Ø�4ð	Ø%Ð%Ð%Ð%Ð%Ð%Ø×#Ò# D¤HÑ-Ô-Ð-øÝð 	ð 	ð 	ØŒH�NŠNÐ=¸qÑAÔAÐAØ�4�4�4�4�4øøøøð	øøøs   �0 °
A ºAÁA c                 óˆ  — 	 t          j        | j        ¦  «        }|D ]}|                     ¦   «          Œ|r‘t          j        |ddiŽ}| j        r_	 | j                             t          j        |d¬¦  «        ¦  «         nI# t           j        $ r | j	         
                    d¦  «         Y nw xY w| j                             |¦  «         | j                             ¦   «          n2# t          $ r%}| j	         
                    d|¦  «         Y d}~nd}~ww xY w| j        D ]'}	 |                     ¦   «          Œ# t          $ r Y Œ$w xY wdS )zClean up resources on exit.Úreturn_exceptionsTrx   rŒ   z#Timeout waiting for tasks to cancelzCleanup error: %sN)r'   Ú	all_tasksr   ÚcancelÚgatherr   rh   r�   r‘   r   r+   rŽ   rj   r}   )r   ÚpendingÚtaskr�   r8   rY   s         r   rk   zASGIWorker._cleanup  sš  € ð	3åÔ'¨¬	Ñ2Ô2ˆGØð ð �Ø—’‘”��ð ð 9Ý œ¨ÐIÀDÐIÐI�ØÔ'ð 	9ðNØœ	×4Ò4Ý#Ô,¨V¸SÐAÑAÔAñô ð ð øõ #Ô/ð Nð Nð NØœŸšÐ'LÑMÔMÐMÐMÐMðNøøøð ”I×0Ò0°Ñ8Ô8Ð8àŒI�OŠOÑÔÐÐøÝð 	3ð 	3ð 	3ØŒH�NŠNÐ.°Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2øøøøð	3øøøð ”ð 	ð 	ˆAðØ—’‘	”	�	�	øÝð ð ð Ø�ðøøøð	ð 	sN   ‚AC! Á.A> Á=C! Á>)B*Â'C! Â)B*Â*6C! Ã!
DÃ+DÄDÄD2Ä2
D?Ä>D?)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   Úclassmethodr   r"   r!   r9   r5   rZ   rO   rQ   rT   rV   rX   rl   ri   r‡   r|   rk   Ú__classcell__)r   s   @r   r   r      sP  ø€ € € € € ðð ð%ð %ð %ð %ð %ð ð;ð ;ñ „[ð;ðð ð ð ð ð*ð *ð *ð25ð 5ð 5ðð ð ð,Oð Oð Oð"ð "ð "ðð ð ð ð  ð  ð4ð 4ð 4ðð ð ðð ð ð:ð :ð :ðx%Fð %Fð %FðN
ð 
ð 
ðð ð ð ð ð ð r   r   )r£   r'   rƒ   rK   re   Úgunicorn.workersr   Úgunicorn.asgi.protocolr   ÚWorkerr   rH   r   r   ú<module>r©      s™   ðð
ð ð €€€Ø 	€	€	€	Ø €€€Ø 
€
€
€
à !Ð !Ð !Ð !Ð !Ð !Ø /Ð /Ð /Ð /Ð /Ð /ðZð Zð Zð Zð Z�”ñ Zô Zð Zð Zð Zr   