§
    …ßjÍg  ã                   ó  — 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	m
Z
 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 ddlmZ ddlmZ  e¦   «         ZdZ G d„ d¦  «        Z G d„ d¦  «        Z G d„ dej        ¦  «        ZdS )é    )ÚfuturesN)Údeque)Údatetime)Úpartialé   )Úbaseé   )Úhttp)Úutil)Úsock)Úwsgig      @c                   ó.   — e Zd Zd„ Zd„ Zd„ Zd„ Zdd„ZdS )	ÚTConnc                 ó¸   — || _         || _        || _        || _        d | _        d | _        d| _        d| _        d| _        | j         	                    d¦  «         d S )NF)
Úcfgr   ÚclientÚserverÚtimeoutÚparserÚinitializedÚis_http2Ú
data_readyÚsetblocking)Úselfr   r   r   r   s        úK/var/www/html/venv/lib/python3.11/site-packages/gunicorn/workers/gthread.pyÚ__init__zTConn.__init__+   s`   € ØˆŒØˆŒ	ØˆŒØˆŒàˆŒØˆŒØ ˆÔØˆŒàˆŒð 	Œ	×Ò˜eÑ$Ô$Ð$Ð$Ð$ó    c                 ó8  — | j         rd S d| _         | j                             d¦  «         | j        €è| j        j        r°t          j        | j        | j        ¦  «        | _        | j        j        s| j                             ¦   «          t          j	        | j        ¦  «        rNd| _
        t          j        | j        | j        | j        d¬¦  «        | _        | j                             ¦   «          d S t          j        | j        | j        | j        ¦  «        | _        d S d S )NT)Úhttp2_connection)r   r   r   r   r   Úis_sslÚssl_wrap_socketÚdo_handshake_on_connectÚdo_handshakeÚis_http2_negotiatedr   r
   Ú
get_parserr   Úinitiate_connection©r   s    r   Úinitz
TConn.init;   s  € àÔð 	ØˆFØˆÔØŒ	×Ò˜dÑ#Ô#Ð#àŒ;ÐàŒxŒð Ý Ô0°´¸D¼HÑEÔE�”	ð ”xÔ7ð -Ø”I×*Ò*Ñ,Ô,Ð,õ Ô+¨D¬IÑ6Ô6ð Ø$(�D”MÝ"&¤/Øœ $¤)¨T¬[È4ð#ñ #ô #�D”Kð ”K×3Ò3Ñ5Ô5Ð5Ø�Fõ œ/¨$¬(°D´I¸t¼{ÑKÔKˆDŒKˆKˆKð) Ðr   c                 óP   — t          j        ¦   «         | j        j        z   | _        d S ©N)ÚtimeÚ	monotonicr   Ú	keepaliver   r'   s    r   Úset_timeoutzTConn.set_timeoutX   s   € å”~Ñ'Ô'¨$¬(Ô*<Ñ<ˆŒˆˆr   c                 óª  — | j         rdS t          j        ¦   «         }	 |                     | j        t          j        ¦  «         |                     |¬¦  «        }|rd| _         	 |                     ¦   «          dS 	 |                     ¦   «          dS # t          t          f$ r Y |                     ¦   «          dS w xY w# |                     ¦   «          w xY w)a‚  Wait for data to be available on the socket.

        Uses selectors to wait for the socket to become readable within
        the given timeout. This prevents slow clients from blocking
        thread pool slots indefinitely.

        Args:
            timeout: Maximum time to wait in seconds.

        Returns:
            True if data is available, False if timeout expired.
        T©r   F)
r   Ú	selectorsÚDefaultSelectorÚregisterr   Ú
EVENT_READÚselectÚcloseÚOSErrorÚ
ValueError)r   r   ÚselÚeventss       r   Úwait_for_datazTConn.wait_for_data\   sÜ   € ð Œ?ð 	Ø�4õ Ô'Ñ)Ô)ˆð	Ø�LŠL˜œ¥IÔ$8Ñ9Ô9Ð9Ø—Z’Z¨�ZÑ0Ô0ˆFØð Ø"&�”Øð �IŠI‰KŒKˆKˆKˆKð ð
 �IŠI‰KŒKˆKˆKˆKøõ	 �Ð$ð 	ð 	ð 	àà�IŠI‰KŒKˆKˆKˆKð		øøøøð �IŠI‰KŒKˆKˆKøøøs$   žAB ÂB9Â!B< Â8B9Â9B< Â<CFc                 ó¦   — |r5| j                              d¦  «         t          j        | j         ¦  «         d S t          j        | j         ¦  «         d S )NT)r   r   r   Úclose_gracefulr6   )r   Úgracefuls     r   r6   zTConn.close{   sQ   € Øð 	"ØŒI×!Ò! $Ñ'Ô'Ð'ÝÔ ¤	Ñ*Ô*Ð*Ð*Ð*åŒJ�t”yÑ!Ô!Ð!Ð!Ð!r   N)F)Ú__name__Ú
__module__Ú__qualname__r   r(   r.   r;   r6   © r   r   r   r   )   sg   € € € € € ð%ð %ð %ð Lð Lð Lð:=ð =ð =ðð ð ð>"ð "ð "ð "ð "ð "r   r   c                   ó8   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd
d„Z	d	S )ÚPollableMethodQueuea¦  Thread-safe queue that can wake up a selector.

    Uses a pipe to allow worker threads to signal the main thread
    when work is ready, enabling lock-free coordination.

    This approach is compatible with all POSIX systems including
    Linux, macOS, FreeBSD, OpenBSD, and NetBSD. The pipe is set to
    non-blocking mode to prevent worker threads from blocking if
    the pipe buffer fills up under extreme load.
    c                 ó0   — d | _         d | _        d | _        d S r*   )Ú_read_fdÚ	_write_fdÚ_queuer'   s    r   r   zPollableMethodQueue.__init__�   s   € ØˆŒØˆŒØˆŒˆˆr   c                 óÞ   — t          j        ¦   «         \  | _        | _        t          j        | j        d¦  «         t          j        | j        d¦  «         t          j        ¦   «         | _        dS )zInitialize the pipe and queue.FN)ÚosÚpiperF   rG   Úset_blockingÚqueueÚSimpleQueuerH   r'   s    r   r(   zPollableMethodQueue.init”   sT   € å(*¬©	¬	Ñ%ˆŒ�t”~õ 	Œ˜œ uÑ-Ô-Ð-Ý
Œ˜œ¨Ñ.Ô.Ð.ÝÔ'Ñ)Ô)ˆŒˆˆr   c                 óÒ   — | j         �+	 t          j        | j         ¦  «         n# t          $ r Y nw xY w| j        �-	 t          j        | j        ¦  «         dS # t          $ r Y dS w xY wdS )z Close the pipe file descriptors.N)rF   rJ   r6   r7   rG   r'   s    r   r6   zPollableMethodQueue.closež   s“   € àŒ=Ð$ðÝ”˜œÑ'Ô'Ð'Ð'øÝð ð ð Ø�ðøøøàŒ>Ð%ðÝ”˜œÑ(Ô(Ð(Ð(Ð(øÝð ð ð Ø��ðøøøð &Ð%s   ‰# £
0¯0»A Á
A$Á#A$c                 ó   — | j         S )z>Return the readable file descriptor for selector registration.)rF   r'   s    r   ÚfilenozPollableMethodQueue.fileno«   s
   € àŒ}Ðr   c                 ó¨   — | j                              t          |g|¢R Ž ¦  «         	 t          j        | j        d¦  «         dS # t          $ r Y dS w xY w)aD  Queue a callback to be run on the main thread.

        The callback is added to the queue first, then a wake-up byte
        is written to the pipe. If the pipe write fails (buffer full),
        it's safe to ignore because the main thread will eventually
        drain the queue when it reads other wake-up bytes.
        ó    N)rH   Úputr   rJ   ÚwriterG   r7   )r   ÚcallbackÚargss      r   ÚdeferzPollableMethodQueue.defer¯   sk   € ð 	Œ�Š� Ð0¨4Ð0Ð0Ð0Ñ1Ô1Ð1ð	ÝŒH�T”^ WÑ-Ô-Ð-Ð-Ð-øÝð 	ð 	ð 	ð ˆDˆDð	øøøs   §A Á
AÁAé2   c                 ó@  — 	 t          j        | j        |¦  «        }n# t          $ r Y dS w xY wd}|t	          |¦  «        dz   k     rX	 | j                             ¦   «         } |¦   «          |dz  }n# t          j        $ r Y dS w xY w|t	          |¦  «        dz   k     °VdS dS )zÚRun queued callbacks. Called when the pipe is readable.

        Drains all available wake-up bytes and runs corresponding callbacks.
        The max_callbacks limit prevents starvation of other event sources.
        Nr   é
   r   )	rJ   ÚreadrF   r7   ÚlenrH   Ú
get_nowaitrM   ÚEmpty)r   Ú_fileobjÚmax_callbacksÚdataÚcallbacks_runrV   s         r   Úrun_callbacksz!PollableMethodQueue.run_callbacks¿   sÐ   € ð	Ý”7˜4œ=¨-Ñ8Ô8ˆDˆDøÝð 	ð 	ð 	ØˆFˆFð	øøøð
 ˆØ�c $™iœi¨"™nÒ,Ð,ðØœ;×1Ò1Ñ3Ô3�Ø�‘
”
�
Ø Ñ"��øÝ”;ð ð ð Ø��ðøøøð �c $™iœi¨"™nÒ,Ð,Ð,Ð,Ð,Ð,s   ‚ �
+ª+Á(A0 Á0BÂBN)rY   )
r?   r@   rA   Ú__doc__r   r(   r6   rQ   rX   rd   rB   r   r   rD   rD   ƒ   s}   € € € € € ð	ð 	ðð ð ð
*ð *ð *ðð ð ðð ð ðð ð ð ð ð ð ð ð r   rD   c                   ó®   ‡ — e Zd Zˆ fd„Zed„ ¦   «         Zˆ fd„Zd„ Z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d„ Zˆ xZS )ÚThreadWorkerc                 óB  •—  t          ¦   «         j        |i |¤Ž | j        j        | _        | j        j        | j        j        z
  | _        d | _        d | _        t          ¦   «         | _	        t          ¦   «         | _        t          ¦   «         | _        d| _        d| _        d S )Nr   F)Úsuperr   r   Úworker_connectionsÚthreadsÚmax_keepalivedÚtpoolÚpollerrD   Úmethod_queuer   Úkeepalived_connsÚpending_connsÚnr_connsÚ
_accepting)r   rW   ÚkwargsÚ	__class__s      €r   r   zThreadWorker.__init__Ù   s‰   ø€ Ø�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ø"&¤(Ô"=ˆÔØ"œhÔ9¸D¼HÔ<LÑLˆÔàˆŒ
ØˆŒÝ/Ñ1Ô1ˆÔÝ %¡¤ˆÔå"™WœWˆÔØˆŒØˆŒˆˆr   c                 óp   — |j         |j        z
  }|dk    r|j        r|                     d¦  «         d S d S d S )Nr   z]No keepalived connections can be handled. Check the number of worker connections and threads.)rj   rk   r-   Úwarning)Úclsr   Úlogrl   s       r   Úcheck_configzThreadWorker.check_configç   s\   € àÔ/°#´+Ñ=ˆà˜QÒÐ 3¤=ÐØ�KŠKð Nñ Oô Oð Oð Oð Oð ÐÐÐr   c                 óÜ   •— |                       ¦   «         | _        t          j        ¦   «         | _        | j                             ¦   «          t          ¦   «                              ¦   «          d S r*   )	Úget_thread_poolrm   r1   r2   rn   ro   r(   ri   Úinit_process)r   ru   s    €r   r}   zThreadWorker.init_processï   sW   ø€ Ø×)Ò)Ñ+Ô+ˆŒ
ÝÔ/Ñ1Ô1ˆŒØÔ×ÒÑ Ô Ð Ý‰Œ×ÒÑÔÐÐÐr   c                 ó@   — t          j        | j        j        ¬¦  «        S )z@Override this method to customize how the thread pool is created)Úmax_workers)r   ÚThreadPoolExecutorr   rk   r'   s    r   r|   zThreadWorker.get_thread_poolõ   s   € åÔ)°d´hÔ6FÐGÑGÔGÐGr   c                 ó\   — | j         r$d| _         | j                             d„ ¦  «         dS dS )z)Handle SIGTERM - begin graceful shutdown.Fc                  ó   — d S r*   rB   rB   r   r   ú<lambda>z*ThreadWorker.handle_exit.<locals>.<lambda>þ   s   € ¨D€ r   N)Úalivero   rX   )r   ÚsigÚframes      r   Úhandle_exitzThreadWorker.handle_exitù   s<   € àŒ:ð 	2ØˆDŒJàÔ×#Ò# L LÑ1Ô1Ð1Ð1Ð1ð	2ð 	2r   c                 ó‚   •— | j                              d¬¦  «         t          ¦   «                              ||¦  «         dS )z$Handle SIGQUIT - immediate shutdown.F©ÚwaitN)rm   Úshutdownri   Úhandle_quit)r   r…   r†   ru   s      €r   rŒ   zThreadWorker.handle_quit   s<   ø€ àŒ
×Ò ÐÑ'Ô'Ð'Ý‰Œ×Ò˜C Ñ'Ô'Ð'Ð'Ð'r   c                 óü   — || j         k    rdS | j        D ]_}|rA|                     d¦  «         | j                             |t
          j        | j        ¦  «         ŒE| j                             |¦  «         Œ`|| _         dS )z,Enable or disable accepting new connections.NF)	rs   Úsocketsr   rn   r3   r1   r4   ÚacceptÚ
unregister)r   ÚenabledÚlisteners      r   Úset_accept_enabledzThreadWorker.set_accept_enabled  s‡   € à�d”oÒ%Ð%ØˆFàœð 	1ð 	1ˆHØð 1Ø×$Ò$ UÑ+Ô+Ð+Ø”×$Ò$ X­yÔ/CÀTÄ[ÑQÔQÐQÐQà”×&Ò& xÑ0Ô0Ð0Ð0à!ˆŒˆˆr   c                 ó|   ‡ ‡— ‰ j                              ‰ j        ‰¦  «        }|                     ˆˆ fd„¦  «         dS )z0Submit connection to thread pool for processing.c                 óF   •— ‰j                              ‰j        ‰| ¦  «        S r*   )ro   rX   Úfinish_request)ÚfutÚconnr   s    €€r   rƒ   z*ThreadWorker.enqueue_req.<locals>.<lambda>  s   ø€ ˜Ô)×/Ò/°Ô0CÀTÈ3ÑOÔO€ r   N)rm   ÚsubmitÚhandleÚadd_done_callback)r   r˜   Úfss   `` r   Úenqueue_reqzThreadWorker.enqueue_req  sS   øø€ àŒZ×Ò˜tœ{¨DÑ1Ô1ˆØ
×ÒØOÐOÐOÐOÐOñ	Qô 	Qð 	Qð 	Qð 	Qr   c                 ó‚  — 	 |                      ¦   «         \  }}| xj        dz  c_        |                     d¦  «         t          | j        |||                     ¦   «         ¦  «        }|                      |¦  «         dS # t          $ r6}|j        t          j	        t          j
        t          j        fvr‚ Y d}~dS d}~ww xY w)z/Accept a new connection from a listener socket.r   TN)r�   rr   r   r   r   Úgetsocknamer�   r7   ÚerrnoÚEAGAINÚECONNABORTEDÚEWOULDBLOCK)r   r’   Úclient_sockÚclient_addrr˜   Úes         r   r�   zThreadWorker.accept  sÏ   € ð	Ø'/§¢Ñ'8Ô'8Ñ$ˆK˜ØˆMŒM˜QÑˆMŒMØ×#Ò# DÑ)Ô)Ð)å˜œ ;°¸X×=QÒ=QÑ=SÔ=SÑTÔTˆDð ×Ò˜TÑ"Ô"Ð"Ð"Ð"øÝð 	ð 	ð 	ØŒw�uœ|­UÔ-?ÅÔARÐSÐSÐSØð TÐSÐSÐSÐSÐSøøøøð	øøøs   ‚A:A> Á>
B>Â+B9Â9B>c                 ó˜   — | j                              |¦  «         | j                             |¦  «         |                      |¦  «         dS )z0Handle a keepalive connection becoming readable.N)rn   r�   rp   Úremover�   ©r   r˜   r   s      r   Úon_client_socket_readablez&ThreadWorker.on_client_socket_readable(  sK   € àŒ×Ò˜vÑ&Ô&Ð&ØÔ×$Ò$ TÑ*Ô*Ð*ð 	×Ò˜ÑÔÐÐÐr   c                 ó¦   — | j                              |¦  «         | j                             |¦  «         d|_        |                      |¦  «         dS )z9Handle a pending (deferred) connection becoming readable.TN)rn   r�   rq   r¨   r   r�   r©   s      r   Úon_pending_socket_readablez'ThreadWorker.on_pending_socket_readable0  sT   € àŒ×Ò˜vÑ&Ô&Ð&ØÔ×!Ò! $Ñ'Ô'Ð'ð ˆŒð 	×Ò˜ÑÔÐÐÐr   c                 ó€  — t          j        ¦   «         }| j        r£| j        d         }|j        |z
  }|dk    rdS | j                             ¦   «          	 | j                             |j        ¦  «         n# t          t          t          f$ r Y nw xY w| xj        dz  c_        |                     ¦   «          | j        °¡dS dS )z$Close expired keepalive connections.r   r   N)r+   r,   rp   r   Úpopleftrn   r�   r   r7   ÚKeyErrorr8   rr   r6   ©r   Únowr˜   Údeltas       r   Úmurder_keepalivedzThreadWorker.murder_keepalived;  sÝ   € åŒnÑÔˆØÔ#ð 	ØÔ(¨Ô+ˆDØ”L 3Ñ&ˆEØ�qŠyˆyØ�ð Ô!×)Ò)Ñ+Ô+Ð+ðØ”×&Ò& t¤yÑ1Ô1Ð1Ð1øÝ�X¥zÐ2ð ð ð Ø�ðøøøàˆMŒM˜QÑˆMŒMØ�JŠJ‰LŒLˆLð Ô#ð 	ð 	ð 	ð 	ð 	ó   ÁA4 Á4BÂBc                 ó€  — t          j        ¦   «         }| j        r£| j        d         }|j        |z
  }|dk    rdS | j                             ¦   «          	 | j                             |j        ¦  «         n# t          t          t          f$ r Y nw xY w| xj        dz  c_        |                     ¦   «          | j        °¡dS dS )z=Close expired pending connections (waiting for initial data).r   r   N)r+   r,   rq   r   r®   rn   r�   r   r7   r¯   r8   rr   r6   r°   s       r   Úmurder_pendingzThreadWorker.murder_pendingM  sÝ   € åŒnÑÔˆØÔ ð 	ØÔ% aÔ(ˆDØ”L 3Ñ&ˆEØ�qŠyˆyØ�ð Ô×&Ò&Ñ(Ô(Ð(ðØ”×&Ò& t¤yÑ1Ô1Ð1Ð1øÝ�X¥zÐ2ð ð ð Ø�ðøøøàˆMŒM˜QÑˆMŒMØ�JŠJ‰LŒLˆLð Ô ð 	ð 	ð 	ð 	ð 	r´   c                 óx   — | j         t          j        ¦   «         k    r| j                             d| ¦  «         dS dS )Nz!Parent changed, shutting down: %sFT)ÚppidrJ   Úgetppidry   Úinfor'   s    r   Úis_parent_alivezThreadWorker.is_parent_alive_  s6   € àŒ9�œ
™œÒ$Ð$ØŒH�MŠMÐ=¸tÑDÔDÐDØ�5Øˆtr   c                 óÖ   — 	 | j                              |¦  «        }|D ]\  }}|j        } ||j        ¦  «         ŒdS # t          $ r!}|j        t
          j        k    r‚ Y d}~dS d}~ww xY w)z'Wait for events and dispatch callbacks.N)rn   r5   rb   Úfileobjr7   r    ÚEINTR)r   r   r:   ÚkeyÚ_rV   r¦   s          r   Úwait_for_and_dispatch_eventsz)ThreadWorker.wait_for_and_dispatch_eventsf  sœ   € ð	Ø”[×'Ò'¨Ñ0Ô0ˆFØ ð &ð &‘��QØœ8�Ø�˜œÑ%Ô%Ð%Ð%ð&ð &øõ ð 	ð 	ð 	ØŒw�%œ+Ò%Ð%Øð &Ð%Ð%Ð%Ð%Ð%øøøøð	øøøs   ‚9= ½
A(ÁA#Á#A(c                 óF  — | j                              | j                             ¦   «         t          j        | j        j        ¦  «         |                      d¦  «         | j        rž|  	                    ¦   «          | j
        | j        k     }|| j        k    r|                      |¦  «         |                      d¬¦  «         |                      ¦   «         sn/|                      ¦   «          |                      ¦   «          | j        °ž|                      d¦  «         t#          j        ¦   «         | j        j        z   }| j
        dk    rtt+          |t#          j        ¦   «         z
  d¦  «        }|dk    rnI|                      |¬¦  «         |                      ¦   «          |                      ¦   «          | j
        dk    °t| j                             d¬¦  «         | j                              ¦   «          | j                             ¦   «          | j        D ]}|                     ¦   «          Œd S )NTg      ð?r0   Fr   r‰   )rn   r3   ro   rQ   r1   r4   rd   r“   r„   Únotifyrr   rj   rs   rÁ   r»   r³   r¶   r+   r,   r   Úgraceful_timeoutÚmaxrm   r‹   r6   rŽ   )r   Ú
can_acceptrÄ   Útime_remainingÚss        r   ÚrunzThreadWorker.runq  s  € àŒ×Ò˜TÔ.×5Ò5Ñ7Ô7Ý&Ô1Ø!Ô.Ô<ñ	>ô 	>ð 	>ð
 	×Ò Ñ%Ô%Ð%àŒjð 	"à�KŠK‰MŒMˆMð œ¨Ô)@Ò@ˆJØ˜Tœ_Ò,Ð,Ø×'Ò'¨
Ñ3Ô3Ð3ð ×-Ò-°cÐ-Ñ:Ô:Ð:à×'Ò'Ñ)Ô)ð Øð ×"Ò"Ñ$Ô$Ð$Ø×ÒÑ!Ô!Ð!ð# Œjð 	"ð( 	×Ò Ñ&Ô&Ð&õ  œ>Ñ+Ô+¨d¬hÔ.GÑGÐØŒm˜aÒÐÝ Ð!1µD´NÑ4DÔ4DÑ!DÀaÑHÔHˆNØ Ò"Ð"ØØ×-Ò-°nÐ-ÑEÔEÐEØ×"Ò"Ñ$Ô$Ð$Ø×ÒÑ!Ô!Ð!ð Œm˜aÒÐð 	Œ
×Ò ÐÑ'Ô'Ð'ØŒ×ÒÑÔÐØÔ×ÒÑ!Ô!Ð!à”ð 	ð 	ˆAØ�GŠG‰IŒIˆIˆIð	ð 	r   c                 ó†  — 	 |                      ¦   «         s|                     ¦   «         nd}|t          u r | j        r™|j                             d¦  «         t          j        ¦   «         | j        j	        z   |_
        | j                             |¦  «         | j                             |j        t          j        t#          | j        |¦  «        ¦  «         dS |r�| j        rˆ|j                             d¦  «         |                     ¦   «          | j                             |¦  «         | j                             |j        t          j        t#          | j        |¦  «        ¦  «         dS | xj        dz  c_        |                     d¬¦  «         dS # t0          $ r( | xj        dz  c_        |                     ¦   «          Y dS w xY w)zHHandle completion of a request (called via method_queue on main thread).Fr   T)r>   N)Ú	cancelledÚresultÚ_DEFERr„   r   r   r+   r,   r   r-   r   rq   Úappendrn   r3   r1   r4   r   r¬   r.   rp   rª   rr   r6   Ú	Exception)r   r˜   rœ   rÌ   s       r   r–   zThreadWorker.finish_request¢  s½  € ð	Ø(*¯ª©¬ÐA�R—Y’Y‘[”[�[¸EˆFà�ÐÐ D¤JÐð ”	×%Ò% eÑ,Ô,Ð,å#œ~Ñ/Ô/°$´(Ô2DÑD�”ØÔ"×)Ò)¨$Ñ/Ô/Ð/Ø”×$Ò$ T¤Yµ	Ô0DÝ%,¨TÔ-LÈdÑ%SÔ%SñUô Uð Uð Uð Uàð 	*˜DœJð 	*à”	×%Ò% eÑ,Ô,Ð,Ø× Ò Ñ"Ô"Ð"ØÔ%×,Ò,¨TÑ2Ô2Ð2Ø”×$Ò$ T¤Yµ	Ô0DÝ%,¨TÔ-KÈTÑ%RÔ%RñTô Tð Tð Tð Tð �” Ñ"�”Ø—
’
 D�
Ñ)Ô)Ð)Ð)Ð)øÝð 	ð 	ð 	ØˆMŒM˜QÑˆMŒMØ�JŠJ‰LŒLˆLˆLˆLˆLð	øøøs   ‚CF ÃBF Å&&F Æ.G Æ?G c                 óü  — d}	 |j         s(|j        s!|                     t          ¦  «        st          S |j                             d¦  «         |                     ¦   «          |j        r|  	                    |¦  «        S t          |j        ¦  «        }|sdS |                      ||¦  «        }|r:t          j        ¦   «         t          z   }|j                             |¬¦  «        sdS dS �n# t           j        j        $ r&}| j                             d|¦  «         Y d}~�nÞd}~wt*          $ r&}| j                             d|¦  «         Y d}~�n°d}~wt,          j        $ r–}|j        d         t,          j        k    r4| j                             d¦  «         |j                             ¦   «          n<| j                             d	¦  «         |                      ||j        |j        |¦  «         Y d}~�nd}~wt:          $ rÉ}|j        t<          j        t<          j         t<          j!        fvr| j         "                    d
¦  «         nz|j        t<          j         k    r| j                             d¦  «         nJ|j        t<          j!        k    r| j                             d¦  «         n| j                             d¦  «         Y d}~n<d}~wtF          $ r,}|                      ||j        |j        |¦  «         Y d}~nd}~ww xY wdS )z:Handle a request on a connection. Runs in a worker thread.NTF)Údeadlinez*Ignored premature client disconnection. %szClosing connection. %sr   zssl connection closedzError processing SSL request.z Socket error processing request.zIgnoring connection resetzIgnoring socket not connectedzIgnoring connection epipe)$r   r   r;   ÚDEFAULT_WORKER_DATA_TIMEOUTrÍ   r   r   r(   r   Úhandle_http2Únextr   Úhandle_requestr+   r,   Úfinish_bodyr
   ÚerrorsÚ
NoMoreDatary   ÚdebugÚStopIterationÚsslÚSSLErrorrW   ÚSSL_ERROR_EOFr6   Úhandle_errorr   r7   r    ÚEPIPEÚ
ECONNRESETÚENOTCONNÚ	exceptionrÏ   )r   r˜   Úreqr-   Údrain_deadliner¦   s         r   rš   zThreadWorker.handle¾  s  € àˆð?	>ð
 Ô#ð "¨D¬Oð "à×)Ò)Õ*EÑFÔFð "å!�Mð ŒI×!Ò! $Ñ'Ô'Ð'ð �IŠI‰KŒKˆKð Œ}ð /Ø×(Ò(¨Ñ.Ô.Ð.å�t”{Ñ#Ô#ˆCØð Ø�uð ×+Ò+¨C°Ñ6Ô6ˆIØð 	õ
 "&¤Ñ!1Ô!1Õ4OÑ!O�Ø”{×.Ò.¸Ð.ÑGÔGð !à ˜5Ø�tñ	øõ Œ{Ô%ð 	Lð 	Lð 	LØŒH�NŠNÐGÈÑKÔKÐKÐKÐKÐKÐKÑKøøøøÝð 	8ð 	8ð 	8ØŒH�NŠNÐ3°QÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ñ7øøøøÝŒ|ð 	Bð 	Bð 	BØŒv�aŒy�CÔ-Ò-Ð-Ø”—’Ð6Ñ7Ô7Ð7Ø”	—’Ñ!Ô!Ð!Ð!à”—’Ð>Ñ?Ô?Ð?Ø×!Ò! # t¤y°$´+¸qÑAÔAÐAøøøøùøøøøÝð 		@ð 		@ð 		@ØŒw�uœ{­EÔ,<½e¼nÐMÐMÐMØ”×"Ò"Ð#EÑFÔFÐFÐFà”7�eÔ.Ò.Ð.Ø”H—N’NÐ#>Ñ?Ô?Ð?Ð?Ø”W¥¤Ò.Ð.Ø”H—N’NÐ#BÑCÔCÐCÐCà”H—N’NÐ#>Ñ?Ô?Ð?øøøøøøøøøÝð 	>ð 	>ð 	>Ø×Ò˜c 4¤9¨d¬k¸1Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=øøøøð	>øøøð ˆus\   „.C) ³A	C) Á=C) ÂAC) Ã)K9Ã=DÄK9Ä+EÅK9ÅBG/Ç/K9Ç<B?K Ë K9Ë"K4Ë4K9c           	      óŠ  — |j         }	 |j        �s| j        �r|                     ¦   «         }|D ]Ï}	 |                      |||¦  «         nq# t
          $ rd}| j                             d¦  «         	 |                     |j	        j
        dt          |¦  «        ¦  «         n# t
          $ r Y nw xY wY d}~nd}~ww xY w|                     |j	        j
        ¦  «         Œ¬# |                     |j	        j
        ¦  «         w xY w| j        s|                     ¦   «          n|j        s| j        �°�n# t          j        j        $ r | j                             d¦  «         Y nçt$          j        $ r[}|j        d         t$          j        k    r| j                             d¦  «         n| j                             d|¦  «         Y d}~nƒd}~wt,          $ rN}|j        t.          j        t.          j        t.          j        fvr| j                             d¦  «         Y d}~n-d}~wt
          $ r | j                             d	¦  «         Y nw xY wd
S )a  Handle an HTTP/2 connection. Runs in a worker thread.

        HTTP/2 connections are persistent and multiplex multiple streams.
        We handle all streams until the connection is closed.

        Returns:
            False (HTTP/2 connections don't use keepalive polling)
        zError handling HTTP/2 requestiô  Nz"HTTP/2 connection closed by clientr   zHTTP/2 SSL connection closedzHTTP/2 SSL error: %szHTTP/2 socket errorzHTTP/2 connection errorF)r   Ú	is_closedr„   Úreceive_dataÚhandle_http2_requestrÏ   ry   râ   Ú
send_errorÚstreamÚ	stream_idÚstrÚcleanup_streamr6   r
   r×   rØ   rÙ   rÛ   rÜ   rW   rÝ   r7   r    rß   rà   rá   )r   r˜   Úh2_connÚrequestsrã   r¦   s         r   rÓ   zThreadWorker.handle_http2  s€  € ð ”+ˆð"	:ØÔ'ñ ¨D¬Jñ à"×/Ò/Ñ1Ô1�à#ð Eð E�Cð
EØ×1Ò1°#°t¸WÑEÔEÐEÐEøÝ$ð !ð !ð !Øœ×*Ò*Ð+JÑKÔKÐKð!Ø#×.Ò.¨s¬zÔ/CÀSÍ#ÈaÉ&Ì&ÑQÔQÐQÐQøÝ(ð !ð !ð !Ø ˜Dð!øøøøøøøøøøøøð	!øøøð  ×.Ò.¨s¬zÔ/CÑDÔDÐDÐDø˜×.Ò.¨s¬zÔ/CÑDÔDÐDÐDøøøð ”zð Ø—M’M‘O”O�OØð) Ô'ð ¨D¬Jñ ùøõ, Œ{Ô%ð 	Að 	Að 	AØŒH�NŠNÐ?Ñ@Ô@Ð@Ð@Ð@ÝŒ|ð 	:ð 	:ð 	:ØŒv�aŒy�CÔ-Ò-Ð-Ø”—’Ð=Ñ>Ô>Ð>Ð>à”—’Ð5°qÑ9Ô9Ð9øøøøøøøøøÝð 	:ð 	:ð 	:ØŒw�uœ{­EÔ,<½e¼nÐMÐMÐMØ”×"Ò"Ð#8Ñ9Ô9Ð9øøøøøøøøøÝð 	:ð 	:ð 	:ØŒH×ÒÐ8Ñ9Ô9Ð9Ð9Ð9ð	:øøøð ˆus�   ‰(D, ²A
Á	CÁ

B8ÁB3Á/.BÂB3Â
B+Â(B3Â*B+Â+B3Â.CÂ3B8Â8CÂ; D, Ã!C<Ã<.D, Ä,.I ÅI Å*AG Ç I ÇAHÈ'I È?I c                 óÈ  ‡‡‡— i }d}|j         j        Š	 | j                             | |¦  «         t	          j        ¦   «         }t          j        ||j        |j	        |j
        | j        ¦  «        \  }}d|d<   d|d<   ˆˆfd„}||d<   g Šˆfd„}||d	<   | xj        d
z  c_        | j        | j        k    r(| j        r!| j                             d¦  «         d| _        |                      ||j        ¦  «        }	d}
	 t#          |	d¦  «        r|	D ]	}|r|
|z  }
Œ
t#          |	d¦  «        r|	                     ¦   «          n*# t#          |	d¦  «        r|	                     ¦   «          w w xY w‰�rdt'          |j        ¦  «        fg}|j        D ];\  }}|                     |                     ¦   «         t'          |¦  «        f¦  «         Œ<‰j                             ‰|d¬¦  «         ‰j        ‰         }|                     |d¬¦  «         ‰                     ¦   «          |
rH‰j                             ‰|
d¬¦  «         |                     |
d¬¦  «         ‰                     ¦   «          ‰                     ‰‰¦  «         n"‰                     ‰|j        |j        |
¦  «         t	          j        ¦   «         |z
  }| j                             ||||¦  «         	 | j                              | |||¦  «         dS # tB          $ r | j         "                    d¦  «         Y dS w xY w# 	 | j                              | |||¦  «         w # tB          $ r | j         "                    d¦  «         Y w w xY wxY w)z&Handle a single HTTP/2 request/stream.NTúwsgi.multithreadÚ2ÚHTTP_VERSIONc                 ó6   •— ‰                      ‰d| ¦  «         dS )z!Send 103 Early Hints over HTTP/2.ég   N)Úsend_informational)Úheadersrî   rë   s    €€r   Úsend_early_hints_h2z>ThreadWorker.handle_http2_request.<locals>.send_early_hints_h2F  s!   ø€ à×*Ò*¨9°c¸7ÑCÔCÐCÐCÐCr   zwsgi.early_hintsc                 ó2   •— ‰                      | ¦  «         dS )z.Queue trailers to be sent after response body.N)Úextend)ÚtrailersÚpending_trailerss    €r   Úsend_trailers_h2z;ThreadWorker.handle_http2_request.<locals>.send_trailers_h2O  s   ø€ à ×'Ò'¨Ñ1Ô1Ð1Ð1Ð1r   zgunicorn.http2.send_trailersr   ú,Autorestarting worker after current request.Fr   Ú__iter__r6   z:status)Ú
end_streamúException in post_request hook)#rê   rë   r   Úpre_requestr   r±   r   Úcreater   r   r   ÚnrÚmax_requestsr„   ry   rº   Ústart_responseÚhasattrr6   rì   Ústatus_coder÷   rÎ   Úlowerrî   Úsend_headersÚstreamsÚ_send_pending_dataÚ	send_dataÚsend_trailersÚsend_responseÚaccessÚpost_requestrÏ   râ   )r   rã   r˜   rî   ÚenvironÚrespÚrequest_startrø   rý   ÚrespiterÚresponse_bodyÚitemÚresponse_headersÚnameÚvaluerê   Úrequest_timerü   rë   s      `             @@r   rè   z!ThreadWorker.handle_http2_request5  s#  øøø€ àˆØˆØ”JÔ(ˆ	ðT	EØŒH× Ò   sÑ+Ô+Ð+Ý$œL™NœNˆMõ !œK¨¨T¬Y¸¼Ø(,¬°T´Xñ?ô ?‰MˆD�'à*.ˆGÐ&Ñ'Ø&)ˆG�NÑ#ðDð Dð Dð Dð Dð Dð +>ˆGÐ&Ñ'ð  "Ðð2ð 2ð 2ð 2ð 2ð 7GˆGÐ2Ñ3àˆGŒG�q‰LˆGŒGØŒw˜$Ô+Ò+Ð+Ø”:ð 'Ø”H—M’MÐ"PÑQÔQÐQØ!&�D”Jð —y’y ¨$Ô*=Ñ>Ô>ˆHð  ˆMð%Ý˜8 ZÑ0Ô0ð 2Ø (ð 2ð 2˜Øð 2Ø)¨TÑ1˜Møå˜8 WÑ-Ô-ð %Ø—N’NÑ$Ô$Ð$øøõ ˜8 WÑ-Ô-ð %Ø—N’NÑ$Ô$Ð$Ð$ð%øøøð  ñ ð &/µ°DÔ4DÑ0EÔ0EÐ$FÐ#GÐ Ø#'¤<ð Hð H‘K�D˜%Ø$×+Ò+¨T¯ZªZ©\¬\½3¸u¹:¼:Ð,FÑGÔGÐGÐGð ”×,Ò,¨YÐ8HÐUZÐ,Ñ[Ô[Ð[Ø œ¨Ô3�Ø×#Ò#Ð$4ÀÐ#ÑGÔGÐGØ×*Ò*Ñ,Ô,Ð,ð !ð 1Ø”O×-Ò-¨i¸ÐSXÐ-ÑYÔYÐYØ×$Ò$ ]¸uÐ$ÑEÔEÐEØ×.Ò.Ñ0Ô0Ð0ð ×%Ò% iÐ1AÑBÔBÐBÐBð ×%Ò%ØØÔ$Ø”LØ!ñ	ô ð õ $œ<™>œ>¨MÑ9ˆLØŒH�OŠO˜D # w°Ñ=Ô=Ð=ðEØ”×%Ò% d¨C°¸$Ñ?Ô?Ð?Ð?Ð?øÝð Eð Eð EØ”×"Ò"Ð#CÑDÔDÐDÐDÐDÐDðEøøøøðEØ”×%Ò% d¨C°¸$Ñ?Ô?Ð?Ð?øÝð Eð Eð EØ”×"Ò"Ð#CÑDÔDÐDÐDÐDðEøøøøøøs[   •C#L Ã9D: Ä%L Ä:'E!Å!E+L ËK, Ë,$LÌLÌM!ÌL7Ì6M!Ì7$MÍM!ÍMÍM!c                 ó¼  — i }d }	 | j                              | |¦  «         t          j        ¦   «         }t	          j        ||j        |j        |j        | j         ¦  «        \  }}d|d<   | xj	        dz  c_	        | j	        | j
        k    r<| j        r!| j                             d¦  «         d| _        |                     ¦   «          | j        r| j         j        s|                     ¦   «          n1t!          | j        ¦  «        | j        k    r|                     ¦   «          |                      ||j        ¦  «        }	 t)          ||d         ¦  «        r|                     |¦  «         n|D ]}|                     |¦  «         Œ|                     ¦   «          t          j        ¦   «         |z
  }| j                             ||||¦  «         t3          |d¦  «        r|                     ¦   «          n]# t          j        ¦   «         |z
  }| j                             ||||¦  «         t3          |d¦  «        r|                     ¦   «          w w xY w|                     ¦   «         rf| j                             d¦  «         	 	 | j                              | |||¦  «         dS # t:          $ r | j                             d	¦  «         Y dS w xY wnƒ# t>          $ r" tA          j!        tE          j#        ¦   «         Ž  Y nXt:          $ rL |rH|j$        rA| j                             d
¦  «         tA          j%        |j        ¦  «         tM          ¦   «         ‚‚ w xY w	 | j                              | |||¦  «         nw# t:          $ r | j                             d	¦  «         Y nQw xY w# 	 | j                              | |||¦  «         w # t:          $ r | j                             d	¦  «         Y w w xY wxY wdS )NTrñ   r   rþ   Fzwsgi.file_wrapperr6   zClosing connection.r  zError handling request)'r   r  r   r±   r   r  r   r   r   r  r  r„   ry   rº   Úforce_closer-   r]   rp   rl   r  Ú
isinstanceÚ
write_filerU   r6   r  r  Úshould_closerÙ   r  rÏ   râ   r7   r   ÚreraiseÚsysÚexc_infoÚheaders_sentr=   rÚ   )	r   rã   r˜   r  r  r  r  r  r  s	            r   rÕ   zThreadWorker.handle_request‘  s/  € ØˆØˆð3	EØŒH× Ò   sÑ+Ô+Ð+Ý$œL™NœNˆMÝ œK¨¨T¬Y¸¼Ø(,¬°T´Xñ?ô ?‰MˆD�'à*.ˆGÐ&Ñ'ØˆGŒG�q‰LˆGŒGØŒw˜$Ô+Ò+Ð+Ø”:ð 'Ø”H—M’MÐ"PÑQÔQÐQØ!&�D”JØ× Ò Ñ"Ô"Ð"à”:ð # T¤XÔ%7ð #Ø× Ò Ñ"Ô"Ð"Ð"Ý�TÔ*Ñ+Ô+¨tÔ/BÒBÐBØ× Ò Ñ"Ô"Ð"à—y’y ¨$Ô*=Ñ>Ô>ˆHð%Ý˜h¨Ð0CÔ(DÑEÔEð )Ø—O’O HÑ-Ô-Ð-Ð-à (ð )ð )˜ØŸ
š
 4Ñ(Ô(Ð(Ð(à—
’
‘”�å'œ|™~œ~°Ñ=�Ø”—’  c¨7°LÑAÔAÐAÝ˜8 WÑ-Ô-ð %Ø—N’NÑ$Ô$Ð$øøõ  (œ|™~œ~°Ñ=�Ø”—’  c¨7°LÑAÔAÐAÝ˜8 WÑ-Ô-ð %Ø—N’NÑ$Ô$Ð$Ð$ð%øøøð × Ò Ñ"Ô"ð Ø”—’Ð4Ñ5Ô5Ð5ØðEØ”×%Ò% d¨C°¸$Ñ?Ô?Ð?Ð?Ð?øÝð Eð Eð EØ”×"Ò"Ð#CÑDÔDÐDÐDÐDÐDðEøøøð#øõ ð 	*ð 	*ð 	*åŒL�#œ,™.œ.Ð)Ð)Ð)Ð)Ýð 	ð 	ð 	Øð &˜Ô)ð &ð ”×"Ò"Ð#;Ñ<Ô<Ð<ÝÔ# D¤IÑ.Ô.Ð.Ý#‘o”oÐ%Øð	øøøðEØ”×%Ò% d¨C°¸$Ñ?Ô?Ð?Ð?øÝð Eð Eð EØ”×"Ò"Ð#CÑDÔDÐDÐDÐDðEøøøøðEØ”×%Ò% d¨C°¸$Ñ?Ô?Ð?Ð?øÝð Eð Eð EØ”×"Ò"Ð#CÑDÔDÐDÐDÐDðEøøøøøøð ˆtsŽ   †D2K Ä9AG+ ÆAK Ç+AIÉ1K É8J Ê$J?Ê>J?ËN Ë)MË,N Ë.AMÍN ÍM% Í%$NÎNÎOÎN/Î.OÎ/$OÏOÏOÏO)r?   r@   rA   r   Úclassmethodrz   r}   r|   r‡   rŒ   r“   r�   r�   rª   r¬   r³   r¶   r»   rÁ   rÉ   r–   rš   rÓ   rè   rÕ   Ú__classcell__)ru   s   @r   rg   rg   ×   sš  ø€ € € € € ð ð  ð  ð  ð  ð ðOð Oñ „[ðOðð ð ð ð ðHð Hð Hð2ð 2ð 2ð(ð (ð (ð (ð (ð
"ð "ð "ðQð Qð Qðð ð ðð ð ð	ð 	ð 	ðð ð ð$ð ð ð$ð ð ð	ð 	ð 	ð/ð /ð /ðbð ð ð8Dð Dð DðL/ð /ð /ðbZEð ZEð ZEðx8ð 8ð 8ð 8ð 8ð 8ð 8r   rg   )Ú
concurrentr   r    rJ   rM   r1   rÛ   r"  r+   Úcollectionsr   r   Ú	functoolsr   Ú r   r
   r   r   r   ÚobjectrÍ   rÒ   r   rD   ÚWorkerrg   rB   r   r   ú<module>r-     s¢  ðð Ð Ð Ð Ð Ð Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð 
ˆ‰Œ€ð
 "Ð ðW"ð W"ð W"ð W"ð W"ñ W"ô W"ð W"ðtQð Qð Qð Qð Qñ Qô Qð Qðhrð rð rð rð r�4”;ñ rô rð rð rð rr   