Ë
    Û�ðiqâ  ã                   ó|  — 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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  G d„ d	«      Zd
„ Zd„ Zi ZdZdada ed«      D � ci c]  } | | d›d�j9                  d«      “Œ c} ZdZ G d„ d«      Zd„ Z d„ Z! G d„ d«      Z" G d„ d«      Z# G d„ dejH                  «      Z%yc c} w )z�
ASGI protocol handler for gunicorn.

Implements asyncio.Protocol to handle HTTP/1.x and HTTP/2 connections
and dispatch to ASGI applications.
é    N)ÚAsyncUnreader)ÚPythonProtocolÚCallbackRequestÚ
ParseErrorÚLimitRequestLineÚLimitRequestHeadersÚInvalidChunkExtension)ÚAsyncUWSGIRequest)Ú
NoMoreData)ÚUWSGIParseExceptionc                   ó   — e Zd ZdZdZd„ Zy)Ú_RequestTimezçLightweight request time container compatible with logging atoms.

    Uses time.monotonic() elapsed seconds instead of datetime.now() syscalls.
    Provides .seconds and .microseconds attributes for glogging.py compatibility.
    )ÚsecondsÚmicrosecondsc                 ód   — t        |«      | _        t        || j                  z
  dz  «      | _        y )Ni@B )Úintr   r   )ÚselfÚelapseds     úQ/var/www/html/Extract/venv/lib/python3.12/site-packages/gunicorn/asgi/protocol.pyÚ__init__z_RequestTime.__init__$   s(   € Ü˜7“|ˆŒÜ ¨4¯<©<Ñ!7¸9Ñ DÓEˆÕó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   © r   r   r   r      s   „ ñð ,€IóFr   r   c                 ó&   — | rt        | dd «      S dS )z÷Normalize socket address to ASGI-compatible (host, port) tuple.

    ASGI spec requires server/client to be (host, port) tuples.
    IPv6 sockets return 4-tuples (host, port, flowinfo, scope_id),
    so we extract just the first two elements.
    Né   )Útuple)Úsockaddrs    r   Ú_normalize_sockaddrr"   )   s   € ñ #+Œ5�˜"˜1�ÓÐ4°Ð4r   c                 óš   — t        | t        «      syd|v ry	 t        j                  | d   «      }|D ]  }||v sŒ y y# t        $ r Y yw xY w)z‚Check if peer address is in the trusted proxy list.

    Cached at connection start to avoid repeated IP parsing per request.
    FÚ*Tr   )Ú
isinstancer    Ú	ipaddressÚ
ip_addressÚ
ValueError)Ú	peer_addrÚ
allow_listÚnetworksÚipÚnetworks        r   Ú_check_trusted_proxyr.   3   si   € ô
 �i¤Ô'ØØ
ˆjÑØðÜ×!Ñ! )¨A¡,Ó/ˆð ò ˆØ�Š=Ùðð øô ò Ùðús   ˜> ¾	A
Á	A
s   Server: gunicorn/asgi
r   g        i @  Úxú
úlatin-1i   c                   ó8   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
y	)
ÚFlowControlz®Manage transport-level write flow control.

    Blocks send() when transport buffer exceeds high water mark,
    preventing memory issues with large streaming responses.
    )Ú
_transportÚread_pausedÚwrite_pausedÚ_is_writable_eventc                 ó”   — || _         d| _        d| _        t        j                  «       | _        | j
                  j                  «        y ©NF)r4   r5   r6   ÚasyncioÚEventr7   Úset)r   Ú	transports     r   r   zFlowControl.__init__]   s9   € Ø#ˆŒØ ˆÔØ!ˆÔÜ")§-¡-£/ˆÔØ×Ñ×#Ñ#Õ%r   c              ƒ   óT   K  — | j                   j                  «       ƒ d{  –—†  y7 Œ­w)z!Wait until transport is writable.N)r7   Úwait©r   s    r   ÚdrainzFlowControl.draind   s   è ø€ à×%Ñ%×*Ñ*Ó,×,Ò,ús   ‚( &¡(c                 ó`   — | j                   s"d| _         | j                  j                  «        y y ©NT)r5   r4   Úpause_readingr@   s    r   rD   zFlowControl.pause_readingh   s(   € Ø×ÒØ#ˆDÔØ�O‰O×)Ñ)Õ+ð  r   c                 ó`   — | j                   r"d| _         | j                  j                  «        y y r9   )r5   r4   Úresume_readingr@   s    r   rF   zFlowControl.resume_readingm   s(   € Ø×ÒØ$ˆDÔØ�O‰O×*Ñ*Õ,ð r   c                 ó`   — | j                   s"d| _         | j                  j                  «        y y rC   )r6   r7   Úclearr@   s    r   Úpause_writingzFlowControl.pause_writingr   s*   € Ø× Ò Ø $ˆDÔØ×#Ñ#×)Ñ)Õ+ð !r   c                 ó`   — | j                   r"d| _         | j                  j                  «        y y r9   )r6   r7   r<   r@   s    r   Úresume_writingzFlowControl.resume_writingw   s*   € Ø×ÒØ %ˆDÔØ×#Ñ#×'Ñ'Õ)ð r   N)r   r   r   r   r   r   rA   rD   rF   rI   rK   r   r   r   r3   r3   U   s-   „ ñð
 T€Iò&ò-ò,ò
-ò
,ó
*r   r3   c                  ó–   — t        j                   «       } | t        z
  dk\  r$ddlm} d |d¬«      › d�j	                  d«      a| at
        S )	z1Get cached Date header, updating once per second.ç      ð?r   )Ú
formatdatezDate: T)Úusegmtr0   r1   )ÚtimeÚ_cached_date_timeÚemail.utilsrN   ÚencodeÚ_cached_date_header)ÚnowrN   s     r   Ú_get_cached_date_headerrV   }   sL   € ô �)‰)‹+€CØ
ÔÑ #Ò%å*Ø &¡z¸Ô'>Ð&?¸tÐD×KÑKÈIÓVÐØÐÜÐr   c           	      ó†   — | |f}|t         vr-d| d   › d| d   › d|› d|› d�	}|j                  d«      t         |<   t         |   S )zGet cached status line bytes.úHTTP/r   ú.é   ú r0   r1   )Ú_CACHED_STATUS_LINESrS   )ÚversionÚstatusÚreasonÚkeyÚlines        r   Ú_get_cached_status_linerb   ‰   s\   € à�FÐ
€CØ
Ô&Ñ&Ø�w˜q‘z�l ! G¨A¡J <¨q°°¸¸&¸ÀÐFˆØ$(§K¡K°	Ó$:Ô˜SÑ!Ü Ñ$Ð$r   c                   ó   — e Zd ZdZd„ Zy)ÚASGIResponseInfoz;Simple container for ASGI response info for access logging.c                 ó   — || _         || _        g | _        |D ]d  \  }}t        |t        «      r|j                  d«      }t        |t        «      r|j                  d«      }| j                  j                  ||f«       Œf y )Nr1   )r^   ÚsentÚheadersr%   ÚbytesÚdecodeÚappend)r   r^   rg   rf   ÚnameÚvalues         r   r   zASGIResponseInfo.__init__•   sp   € ØˆŒØˆŒ	àˆŒØ"ò 	/‰KˆD�%Ü˜$¤Ô&Ø—{‘{ 9Ó-�Ü˜%¤Ô'ØŸ™ YÓ/�Ø�L‰L×Ñ  u Õ.ñ	/r   N)r   r   r   r   r   r   r   r   rd   rd   ’   s
   „ ÙEó
/r   rd   c                   óJ   — e 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y)ÚBodyReceiverzºBody receiver for callback-based parsers.

    Body chunks are fed directly via the feed() method from parser callbacks.
    Uses Future-based waiting for efficient async receive().
    )Ú_chunksÚ	_completeÚ_body_finishedÚ_closedÚ_waiterÚrequestÚprotocolc                 óf   — || _         || _        g | _        d| _        d| _        d| _        d | _        y r9   )rt   ru   ro   rp   rq   rr   rs   )r   rt   ru   s      r   r   zBodyReceiver.__init__¬   s4   € ØˆŒØ ˆŒØˆŒØˆŒØ#ˆÔØˆŒØˆ�r   c                 ó`   — |r,| j                   j                  |«       | j                  «        yy)z7Feed a body chunk directly (called by parser callback).N)ro   rj   Ú_wake_waiter©r   Úchunks     r   ÚfeedzBodyReceiver.feedµ   s(   € áØ�L‰L×Ñ Ô&Ø×ÑÕð r   c                 ó2   — d| _         | j                  «        y)z1Mark body as complete (called when message ends).TN)rp   rx   r@   s    r   Úset_completezBodyReceiver.set_complete»   s   € àˆŒØ×ÑÕr   c                 ó2   — d| _         | j                  «        y)z%Signal that connection has been lost.TN)rr   rx   r@   s    r   Úsignal_disconnectzBodyReceiver.signal_disconnectÀ   s   € àˆŒØ×ÑÕr   c                 óŠ   — | j                   �7| j                   j                  «       s| j                   j                  d«       yyy)z#Wake up any pending receive() call.N)rs   ÚdoneÚ
set_resultr@   s    r   rx   zBodyReceiver._wake_waiterÅ   s6   € à�<‰<Ð#¨D¯L©L×,=Ñ,=Ô,?Ø�L‰L×#Ñ# DÕ)ð -@Ð#r   c              ƒ   ó  K  — | j                   s| j                  rddiS | j                  r| j                  «       S | j                  rd| _        ddddœS | j
                  j                  dk(  r*| j
                  j                  sd| _        d| _        ddddœS | j                  j                   rd| _         ddiS 	 | j                  «       ƒ d	{  –—†  | j                  «       S 7 Œ# t        j                  $ r ddicY S w xY w­w)
z:ASGI receive callable - returns body chunks or disconnect.Útypeúhttp.disconnectTúhttp.requestr   F©r„   ÚbodyÚ	more_bodyr   N)rr   rq   ro   Ú
_pop_chunkrp   rt   Úcontent_lengthÚchunkedru   Ú_wait_for_dataÚ_build_receive_resultr:   ÚCancelledErrorr@   s    r   ÚreceivezBodyReceiver.receiveÊ   s   è ø€ ð �<Š<˜4×.Ò.ØÐ-Ð.Ð.ð �<Š<Ø—?‘?Ó$Ð$ð �>Š>Ø"&ˆDÔØ*°CÀeÑLÐLð �<‰<×&Ñ&¨!Ò+°D·L±L×4HÒ4HØ!ˆDŒNØ"&ˆDÔØ*°CÀeÑLÐLð �=‰=× Ò ØˆDŒLØÐ-Ð.Ð.ð	/Ø×%Ñ%Ó'×'Ð'Ø×-Ñ-Ó/Ð/ð (ùä×%Ñ%ò 	/ØÐ-Ð.Ò.ð	/üs<   ‚B6D Â9C# ÃC!ÃC# Ã D Ã!C# Ã#C=Ã:D Ã<C=Ã=D c                 óž   — | j                   j                  d«      }t        | j                   «      xs | j                   }|sd| _        d||dœS )z/Pop a chunk and return the appropriate message.r   Tr†   r‡   )ro   ÚpopÚboolrp   rq   )r   rz   Úmores      r   rŠ   zBodyReceiver._pop_chunkë   sH   € à—‘× Ñ  Ó#ˆÜ�D—L‘LÓ!Ò7¨¯©Ð%7ˆÙØ"&ˆDÔØ&°ÀDÑIÐIr   c                 ót   — | j                   rddiS | j                  r| j                  «       S d| _        ddddœS )z,Build receive result after waiting for data.r„   r…   Tr†   r   Fr‡   )rr   ro   rŠ   rq   r@   s    r   rŽ   z"BodyReceiver._build_receive_resultó   s@   € à�<Š<ØÐ-Ð.Ð.à�<Š<Ø—?‘?Ó$Ð$ð #ˆÔØ&°À%ÑHÐHr   c              ƒ   óX  K  — | j                   s| j                  s| j                  ryt        j                  «       }|j                  «       | _        	 t        j                  | j                  d¬«      ƒ d{  –—†  d| _        y7 Œ# t        j                  $ r Y Œw xY w# d| _        w xY w­w)z*Wait for body data to arrive via callback.Nç      >@©Útimeout)	ro   rp   rr   r:   Úget_event_loopÚcreate_futurers   Úwait_forÚTimeoutError)r   Úloops     r   r�   zBodyReceiver._wait_for_data   sŠ   è ø€ à�<Š<˜4Ÿ>š>¨T¯\ª\Øô ×%Ñ%Ó'ˆØ×)Ñ)Ó+ˆŒð	 ä×"Ñ" 4§<¡<¸Ô>×>Ð>ð  ˆD�Lð	 ?ùÜ×#Ñ#ò 	Ùð	ûð  ˆD�LüsH   ‚AB*Á$B Á6BÁ7B Á;B*ÂB ÂBÂB ÂBÂB Â	B'Â'B*N)r   r   r   r   r   r   r{   r}   r   rx   r�   rŠ   rŽ   r�   r   r   r   rn   rn   ¢   s>   „ ñð(€Iòò òò
ò
*ò
/òBJòIó r   rn   c                   ó  — e Zd ZdZdZdZdZdZd„ Zd„ Z	e
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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+d"„Z'd#„ Z(d$„ Z)d%„ Z*d&„ Z+d'„ Z,d(„ Z-d)„ Z.d*„ Z/y),ÚASGIProtocolzùHTTP/1.1 protocol handler for ASGI applications.

    Handles connection lifecycle, request parsing, and ASGI app invocation.
    Uses callback-based parsing (H1CProtocol/PythonProtocol) for efficient
    incremental parsing in data_received().
    NFc                 óf  — || _         |j                  | _        |j                  | _        |j                  | _        d | _        d | _        d | _        d | _        d| _	        d| _
        d | _        d | _        d| _        d| _        d | _        d | _        d | _        d | _        d| _        d | _        d | _        y )Nr   Fi   )ÚworkerÚcfgÚlogÚasgiÚappr=   ÚreaderÚwriterÚ_taskÚ	req_countrr   Ú_body_receiverÚ_response_bufferÚ_reading_pausedÚ_max_buffer_sizeÚ_keepalive_handleÚ_callback_parserÚ_request_readyÚ_current_requestÚ_is_sslÚ_flow_controlÚ
_websocket)r   r¢   s     r   r   zASGIProtocol.__init__   s¸   € ØˆŒØ—:‘:ˆŒØ—:‘:ˆŒØ—;‘;ˆŒàˆŒØˆŒØˆŒØˆŒ
ØˆŒð ˆŒØ"ˆÔð !%ˆÔð  %ˆÔØ )ˆÔð "&ˆÔð !%ˆÔØ"ˆÔØ $ˆÔØˆŒð "ˆÔð ˆ�r   c                 óŽ  — || _         | j                  xj                  dz  c_        |j                  d«      }|rut	        |d«      ri|j                  «       }|dk(  rTt        j                  «       | _        | j                  j                  j                  | j                  ||«      «      | _        y|du| _        || _        t        |«      | _        |j#                  t$        ¬«       t        j&                  «       | _        | j+                  «        | j                  j                  j                  | j-                  «       «      | _        y)z(Called when a connection is established.rZ   Ú
ssl_objectÚselected_alpn_protocolÚh2N)Úhigh)r=   r¢   Únr_connsÚget_extra_infoÚhasattrr¸   r:   ÚStreamReaderr§   rž   Úcreate_taskÚ_handle_http2_connectionr©   r³   r¨   r3   r´   Úset_write_buffer_limitsÚHIGH_WATER_LIMITr;   r±   Ú_setup_callback_parserÚ_handle_connection)r   r=   r·   Úalpns       r   Úconnection_madezASGIProtocol.connection_madeF  s
  € à"ˆŒØ�‰×Ò Ñ!Õð ×-Ñ-¨lÓ;ˆ
Ùœ' *Ð.FÔGØ×4Ñ4Ó6ˆDØ�tŠ|ä%×2Ñ2Ó4�”Ø!Ÿ[™[×-Ñ-×9Ñ9Ø×1Ñ1°)¸ZÓHó�”
ð ð "¨Ð-ˆŒØˆŒô )¨Ó3ˆÔØ×)Ñ)Ô/?Ð)Ô@ô &Ÿm™m›oˆÔØ×#Ñ#Ô%Ø—[‘[×%Ñ%×1Ñ1°$×2IÑ2IÓ2KÓLˆ�
r   c                 ó  — | j                   €H	 ddl}ddlm} d| _         || _        t	        |d«      | _        t        |dd«      | _        | j                   S | j                   S # t        $ r d| _         d| _        Y | j                   S w xY w)z:Check if H1CProtocol is available (cached at class level).Nr   )ÚH1CProtocolTr   r	   F)	Ú_h1c_availableÚgunicorn_h1crÈ   Ú_h1c_protocol_classr½   Ú_h1c_has_limitsÚgetattrÚ_h1c_invalid_chunk_extensionÚImportError)ÚclsrÊ   rÈ   s      r   Ú_check_h1c_protocol_availablez*ASGIProtocol._check_h1c_protocol_availabled  s–   € ð ×ÑÐ%ð,Û#Ý4Ø%)�Ô"Ø*5�Ô'ä&-¨lÐ<NÓ&O�Ô#ä3:Ø Ð"9¸4ó4�Ô0ð ×!Ñ!Ð!ˆs×!Ñ!Ð!øô ò ,Ø%*�Ô"Ø&+�Õ#Ø×!Ñ!Ð!ð,ús   Ž;A! Á!BÂB)Úpermit_obsolete_foldingÚstrip_header_spacesc           
      ó\  — t        | j                  dd«      }g }| j                  D ]+  }t        | j                  |d«      sŒ|j                  |«       Œ- |dk(  rt        }n¤|dk(  rf| j                  «       st        d«      ‚t        j                  st        d«      ‚|rt        dd	j                  |«      z  «      ‚t        j                  }n9| j                  «       r#t        j                  r|st        j                  }nt        }| j                  j                  }|d
k(  r|t        k7  rd} || j                  | j                  | j                  || j                  j                  | j                  j                   | j                  j"                  | j                  j$                  ¬«      | _        y)aC  Create callback parser based on http_parser setting.

        Parser selection:
        - auto: Use H1CProtocol if available (>= 0.4.1) and no incompatible flags, else PythonProtocol
        - fast: Require H1CProtocol >= 0.4.1 (error if unavailable or incompatible flags)
        - python: Use PythonProtocol only
        Úhttp_parserÚautoFÚpythonÚfastz,gunicorn_h1c required for http_parser='fast'zigunicorn_h1c >= 0.4.1 required for http_parser='fast'. Please upgrade: pip install --upgrade gunicorn_h1czqhttp_parser='fast' is incompatible with compatibility flags: %s. Use http_parser='python' or disable these flags.z, r   i   )Úon_headers_completeÚon_bodyÚon_message_completeÚlimit_request_lineÚlimit_request_fieldsÚlimit_request_field_sizeÚ!permit_unconventional_http_methodÚ"permit_unconventional_http_versionN)rÍ   r£   Ú_FAST_PARSER_INCOMPATIBLE_FLAGSrj   r   rÑ   ÚRuntimeErrorr    rÌ   ÚjoinrË   rÜ   Ú_on_headers_completeÚ_on_bodyÚ_on_message_completerÝ   rÞ   rß   rà   r°   )r   Úparser_settingÚincompatibleÚflagÚparser_classrÜ   s         r   rÃ   z#ASGIProtocol._setup_callback_parser~  s~  € ô ! §¡¨=¸&ÓAˆð ˆØ×8Ñ8ò 	*ˆDÜ�t—x‘x  uÕ-Ø×#Ñ# DÕ)ð	*ð ˜XÒ%Ü)‰LØ˜vÒ%Ø×5Ñ5Ô7Ü"Ð#QÓRÐRÜ×/Ò/Ü"ðIóð ñ Ü"ðGà—i‘i Ó-ñ.óð ô
 (×;Ñ;‰Là×2Ñ2Ô4Ü ×0Ò0¹Ü+×?Ñ?‘ä-�ð "ŸX™X×8Ñ8ÐØ Ò" |´~Ò'EØ!,Ðñ !-Ø $× 9Ñ 9Ø—M‘MØ $× 9Ñ 9Ø1Ø!%§¡×!>Ñ!>Ø%)§X¡X×%FÑ%FØ.2¯h©h×.XÑ.XØ/3¯x©x×/ZÑ/Zô	!
ˆÕr   c                 ó  — t        j                  | j                  | j                  ¬«      | _        t        | j                  | «      | _        | j                  r| j                  j                  «        | j                  j                  dk(  S )z'Callback: request headers are complete.)Úis_ssls   HEAD)
r   Úfrom_parserr°   r³   r²   rn   r«   r±   r<   Úmethodr@   s    r   rä   z!ASGIProtocol._on_headers_complete¸  ss   € ô !0× ;Ñ ;Ø×!Ñ!¨$¯,©,ô!
ˆÔô
 +¨4×+@Ñ+@À$ÓGˆÔð ×ÒØ×Ñ×#Ñ#Ô%ð ×$Ñ$×+Ñ+¨wÑ6Ð6r   c                 óT   — | j                   r| j                   j                  |«       yy)z#Callback: received body data chunk.N)r«   r{   ry   s     r   rå   zASGIProtocol._on_bodyÉ  s$   € à×ÒØ×Ñ×$Ñ$ UÕ+ð r   c                 óR   — | j                   r| j                   j                  «        yy)z$Callback: request is fully received.N)r«   r}   r@   s    r   ræ   z!ASGIProtocol._on_message_completeÎ  s"   € à×ÒØ×Ñ×,Ñ,Õ.ð r   c                 óð  — | j                   r| j                   j                  |«       y| j                  r| j                  j                  |«       n(| j                  r	 | j                  j	                  |«       | j                   s"| j#                  «       r| j%                  «        yyy# t
        $ r5}| j                  dt        |«      «       | j                  «        Y d}~yd}~wt        $ r5}| j                  dt        |«      «       | j                  «        Y d}~yd}~wt        $ r5}| j                  dt        |«      «       | j                  «        Y d}~yd}~wt        $ r5}| j                  dt        |«      «       | j                  «        Y d}~yd}~wt        $ rT}t        j                  }|�<t        ||«      r0| j                  dt        |«      «       | j                  «        Y d}~y‚ d}~ww xY w)z/Called when data is received on the connection.Néž  i¯  é�  )rµ   Ú	feed_datar§   r°   r{   r   Ú_send_error_responseÚstrÚ_close_transportr   r	   r   Ú	Exceptionr    rÎ   r%   r­   Ú_is_buffer_fullÚ_pause_reading)r   ÚdataÚeÚh1c_excs       r   Údata_receivedzASGIProtocol.data_receivedÓ  s…  € à�?Š?à�O‰O×%Ñ% dÔ+ØØ�;Š;à�K‰K×!Ñ! $Õ'Ø×"Ò"ðØ×%Ñ%×*Ñ*¨4Ô0ð8 ×#Ò#¨×(<Ñ(<Ô(>Ø×ÑÕ!ð )?Ð#øô7 $ò Ø×)Ñ)¨#¬s°1«vÔ6Ø×%Ñ%Ô'ÜûÜ&ò Ø×)Ñ)¨#¬s°1«vÔ6Ø×%Ñ%Ô'ÜûÜ(ò Ø×)Ñ)¨#¬s°1«vÔ6Ø×%Ñ%Ô'ÜûÜò Ø×)Ñ)¨#¬s°1«vÔ6Ø×%Ñ%Ô'ÜûÜò ä&×CÑC�àÐ&¬:°a¸Ô+AØ×-Ñ-¨c´3°q³6Ô:Ø×)Ñ)Ô+ÜØûðúsO   ÁB( Â(	G5Â1+C!Ã!G5Ã-+DÄG5Ä)+EÅG5Å%+FÆG5Æ!A	G0Ç/G0Ç0G5c                 ó    — | j                   rBt        | j                   d«      r,t        | j                   j                  «      | j                  kD  S y)z/Check if internal buffer is full (HTTP/2 only).Ú_bufferF)r§   r½   Úlenr   r®   r@   s    r   rù   zASGIProtocol._is_buffer_fullþ  s9   € à�;Š;œ7 4§;¡;°	Ô:Ü�t—{‘{×*Ñ*Ó+¨d×.CÑ.CÑCÐCØr   c                 ó¦   — | j                   s0| j                  r#d| _         	 | j                  j                  «        yyy# t        t        f$ r Y yw xY w)z1Pause reading from transport due to backpressure.TN)r­   r=   rD   ÚAttributeErrorrâ   r@   s    r   rú   zASGIProtocol._pause_reading  sO   € à×#Ò#¨¯ªØ#'ˆDÔ ðØ—‘×,Ñ,Õ.ð )7Ð#øô #¤LÐ1ò Ùðúó   ¡> ¾AÁAc                 ó¦   — | j                   r0| j                  r#d| _         	 | j                  j                  «        yyy# t        t        f$ r Y yw xY w)zResume reading from transport.FN)r­   r=   rF   r  râ   r@   s    r   Ú_resume_readingzASGIProtocol._resume_reading  sO   € à×Ò D§N¢NØ#(ˆDÔ ðØ—‘×-Ñ-Õ/ð %3Ðøô #¤LÐ1ò Ùðúr  c                 óò   — | j                   r| j                   j                  «        | j                  j                  }|dkD  r6| j                  j
                  j                  || j                  «      | _         yy)z6Arm keepalive timeout timer after response completion.r   N)r¯   Úcancelr£   Ú	keepaliver¢   rž   Ú
call_laterÚ_keepalive_timeout)r   Úkeepalive_timeouts     r   Ú_arm_keepalive_timerz!ASGIProtocol._arm_keepalive_timer  sb   € à×!Ò!Ø×"Ñ"×)Ñ)Ô+Ø ŸH™H×.Ñ.ÐØ˜qÒ Ø%)§[¡[×%5Ñ%5×%@Ñ%@Ø! 4×#:Ñ#:ó&ˆDÕ"ð !r   c                 ó`   — | j                   r"| j                   j                  «        d| _         yy)z0Cancel keepalive timer when new request arrives.N)r¯   r  r@   s    r   Ú_cancel_keepalive_timerz$ASGIProtocol._cancel_keepalive_timer   s*   € à×!Ò!Ø×"Ñ"×)Ñ)Ô+Ø%)ˆDÕ"ð "r   c                 ó$   — | j                  «        y)z&Called when keepalive timeout expires.N)r÷   r@   s    r   r  zASGIProtocol._keepalive_timeout&  s   € à×ÑÕr   c                 óŒ  — | j                   ryd| _         | j                  xj                  dz  c_        | j                  «        | j                  r| j                  j                  «        | j                  r| j                  j                  «        | j                  �| j                  j                  «        | j                  rƒ| j                  j                  «       sht        | j                  dd«      }|dkD  r1| j                  j                  j                  || j                  «       y| j                  j!                  «        yyy)aŒ  Called when the connection is lost or closed.

        Instead of immediately cancelling the task, we signal a disconnect
        event and send an http.disconnect message to the receive queue.
        This allows the ASGI app to clean up resources (like database
        connections) gracefully before the task is cancelled.

        See: https://github.com/benoitc/gunicorn/issues/3484
        NTrZ   Úasgi_disconnect_grace_periodé   r   )rr   r¢   r»   r  r§   Úfeed_eofrµ   r«   r   r©   r�   rÍ   r£   rž   r
  Ú_cancel_task_if_pendingr  )r   ÚexcÚgrace_periods      r   Úconnection_lostzASGIProtocol.connection_lost*  sö   € ð �<Š<ØàˆŒØ�‰×Ò Ñ!Õð 	×$Ñ$Ô&à�;Š;Ø�K‰K× Ñ Ô"ð �?Š?Ø�O‰O×$Ñ$Ô&ð ×ÑÐ*Ø×Ñ×1Ñ1Ô3ð �:Š:˜dŸj™jŸo™oÔ/Ü" 4§8¡8Ð-KÈQÓOˆLØ˜aÒØ—‘× Ñ ×+Ñ+Ø Ø×0Ñ0õð —
‘
×!Ñ!Õ#ð 0ˆ:r   c                 óˆ   — | j                   r6| j                   j                  «       s| j                   j                  «        yyy)z9Cancel the task if it's still pending after grace period.N)r©   r�   r  r@   s    r   r  z$ASGIProtocol._cancel_task_if_pendingU  s-   € à�:Š:˜dŸj™jŸo™oÔ/Ø�J‰J×ÑÕð 0ˆ:r   c                 óR   — | j                   r| j                   j                  «        yy)z>Called by transport when write buffer exceeds high water mark.N)r´   rI   r@   s    r   rI   zASGIProtocol.pause_writingZ  s"   € à×ÒØ×Ñ×,Ñ,Õ.ð r   c                 óR   — | j                   r| j                   j                  «        yy)zBCalled by transport when write buffer drains below low water mark.N)r´   rK   r@   s    r   rK   zASGIProtocol.resume_writing_  s"   € à×ÒØ×Ñ×-Ñ-Õ/ð r   c                 ó>  — 	 | j                   j                  |«       y# t        $ re}|j                  t        j                  t        j
                  t        j                  fvr | j                  j                  d«       Y d}~yY d}~yd}~wt        t        f$ r Y yw xY w)ax  Write data to transport, handling connection errors gracefully.

        Catches exceptions that occur when the client has disconnected:
        - OSError with errno EPIPE, ECONNRESET, ENOTCONN
        - RuntimeError when transport is closing/closed
        - AttributeError when transport is None

        These are silently ignored since the client is already gone.
        zSocket error writing response.N)r=   ÚwriteÚOSErrorÚerrnoÚEPIPEÚ
ECONNRESETÚENOTCONNr¤   Ú	exceptionrâ   r  )r   rû   rü   s      r   Ú_safe_writezASGIProtocol._safe_writed  sw   € ð	Ø�N‰N× Ñ  Õ&øÜò 	EØ�w‰wœuŸ{™{¬E×,<Ñ,<¼e¿n¹nÐMÑMØ—‘×"Ñ"Ð#C×DÑDô NûäœnÐ-ò 	áð	ús   ‚ ž	B§ABÂBÂBc              ƒ   ó2  K  — 	 | j                   j                  d«      }| j                   j                  d«      }t        | j                  dd«      }|dk(  r,| j	                  ||«      ƒ d{  –—†  	 | j                  «        y| j                  �s÷| xj                  dz  c_        | j                  «        | j                  j                  «       s#	 | j                  j                  «       ƒ d{  –—†  | j                  s| j                  €�n{| j                  }| j                  |«      r| j!                  |||«      ƒ d{  –—†  �nA| j#                  |||«      ƒ d{  –—† }| j$                  xj&                  dz  c_        | j$                  j&                  | j$                  j(                  k\  r.| j*                  j-                  d«       d	| j$                  _        d	}|r| j$                  j.                  sn“| j                  j0                  sn|| j3                  «        | j4                  r| j4                  j7                  «        d| _        d| _        | j                  j;                  «        | j=                  «        | j                  s�Œ÷| j                  «        y7 �Œ,7 �Œ®# t        j                  $ r Y Œ,w xY w7 �Œx7 �Œ^# t        j                  $ r Y ŒKt>        $ r&}| j*                  jA                  d
|«       Y d}~Œtd}~ww xY w# | j                  «        w xY w­w)aB  Main request handling loop using callback-based parser.

        Uses synchronous parsing in data_received(), avoiding the async
        overhead of pull-based parsing. The parser fires callbacks when
        headers and body data are available, and this loop waits on
        events rather than actively parsing.
        ÚpeernameÚsocknameru   ÚhttpÚuwsgiNrZ   ú,Autorestarting worker after current request.FzError handling connection: %s)!r=   r¼   rÍ   r£   Ú_handle_connection_uwsgir÷   rr   rª   r  r±   Úis_setr?   r:   r�   r²   Ú_is_websocket_upgradeÚ_handle_websocketÚ_handle_http_requestr¢   ÚnrÚmax_requestsr¤   ÚinfoÚaliver	  r  r°   Úresetr«   rH   r  rø   r#  )r   r&  r'  Úprotocol_typert   r	  rü   s          r   rÄ   zASGIProtocol._handle_connectionw  s¡  è ø€ ðI	$Ø—~‘~×4Ñ4°ZÓ@ˆHØ—~‘~×4Ñ4°ZÓ@ˆHô $ D§H¡H¨j¸&ÓAˆMØ Ò'Ø×3Ñ3°H¸hÓG×GÐGØðB ×!Ñ!Õ#ð —l“lØ—’ !Ñ#•Ø×,Ñ,Ô.ð ×*Ñ*×1Ñ1Ô3ðØ"×1Ñ1×6Ñ6Ó8×8Ð8ð —<’< 4×#8Ñ#8Ð#@Ùà×/Ñ/�ð ×-Ñ-¨gÔ6Ø×0Ñ0°¸(ÀHÓM×MÐMÙð #'×";Ñ";Ø˜X xó#÷ �	ð
 —‘—’ !Ñ#•ð —;‘;—>‘> T§[¡[×%=Ñ%=Ò=Ø—H‘H—M‘MÐ"PÔQØ(-�D—K‘KÔ%Ø %�Iá ¨¯©×(9Ò(9Øð —x‘x×)Ò)Øð ×$Ñ$Ô&ð ×(Ò(Ø×)Ñ)×/Ñ/Ô1ð )-�Ô%Ø&*�Ô#Ø×#Ñ#×)Ñ)Ô+ð ×)Ñ)Ô+ðq —l”lð~ ×!Ñ!Õ#ðE Hùð 9úÜ"×1Ñ1ò Ùðúð NùðúôF ×%Ñ%ò 	ÙÜò 	CØ�H‰H×ÑÐ>À×BÑBûð	Cûð ×!Ñ!Õ#üs¼   ‚L„A'J< Á+JÁ,J< Á1LÂAJ< ÃJ Ã,JÃ-J Ã1AJ< Ä>J6Ä?J< ÅJ9ÅD(J< ÊLÊJ< ÊJ ÊJ3Ê0J< Ê2J3Ê3J< Ê9J< Ê<K?ËL ËK?ËK:Ë5L Ë:K?Ë?L ÌLÌLc              ƒ   ó¤  K  — t        | j                  «      }| j                  �sc| xj                  dz  c_        	 t	        j
                  | j                  ||| j                  «      ƒ d{  –—† }| j                  |«      r| j                  |||«      ƒ d{  –—†  y| j                  |||«      ƒ d{  –—† }| j                  xj                  dz  c_        | j                  j                  | j                  j                   k\  r.| j                  j#                  d«       d| j                  _        d}|r| j                  j$                  sy| j                  j&                  sy|j)                  «       ƒ d{  –—†  | j                  s�Œbyy7 �Œ# t        $ r Y yt        $ r&}| j                  j                  d|«       Y d}~yd}~ww xY w7 �Œ27 �Œ7 ŒY­w)z0Handle uWSGI protocol connections (legacy path).rZ   NzuWSGI parse error: %sr*  F)r   r§   rr   rª   r
   Úparser£   r   r   r¤   Údebugr-  r.  r/  r¢   r0  r1  r2  r3  r	  Ú
drain_body)r   r&  r'  Úunreaderrt   rü   r	  s          r   r+  z%ASGIProtocol._handle_connection_uwsgiÊ  sz  è ø€ ä  §¡Ó-ˆà—,“,Ø�NŠN˜aÑ�NðÜ 1× 7Ñ 7Ø—H‘HØØØ—N‘Nó	!÷ �ð ×)Ñ)¨'Ô2Ø×,Ñ,¨W°hÀÓI×IÐIØð #×7Ñ7Ø˜ 8ó÷ ˆIð
 �K‰K�NŠN˜aÑ�Nð �{‰{�~‰~ §¡×!9Ñ!9Ò9Ø—‘—‘ÐLÔMØ$)�—‘Ô!Ø!�	á D§K¡K×$5Ò$5Øà—8‘8×%Ò%Øà×$Ñ$Ó&×&Ð&ðS —,–,ðúô ò ÙÜ&ò Ø—‘—‘Ð6¸Ô:Üûðúð Jùðùð& 'úsƒ   ‚8G»/F Á*F	Á+F Á/'GÂGÂGÂ2GÂ3CGÅ4GÅ5GÆGÆ	F Æ	GÆGÆGÆG Æ;GÇ GÇGÇGÇGc                 óÈ   — |j                   dk7  ryd}d}|j                  D ]1  \  }}|dk(  r|j                  «       }Œ|dk(  sŒ"|j                  «       }Œ3 |dk(  xr |xr d|v S )a	  Check if request is a WebSocket upgrade.

        Per RFC 6455 Section 4.1, the opening handshake requires:
        - HTTP method MUST be GET
        - Upgrade header MUST be "websocket" (case-insensitive)
        - Connection header MUST contain "Upgrade"
        ÚGETFNÚUPGRADEÚ
CONNECTIONÚ	websocketÚupgrade)rî   rg   Úlower)r   rt   r@  Ú
connectionrk   rl   s         r   r-  z"ASGIProtocol._is_websocket_upgradeù  sv   € ð �>‰>˜UÒ"ØàˆØˆ
Ø"Ÿ?™?ò 	+‰KˆD�%Ø�yÒ ØŸ+™+›-‘Ø˜Ó%Ø"Ÿ[™[›]‘
ð		+ð
 ˜+Ñ%ÒP¨*ÒP¸ÀjÐ9PÐPr   c              ƒ   óà   K  — ddl m} d| _        | j                  |||«      } || j                  || j
                  | j                  «      }|| _        |j                  «       ƒ d{  –—†  y7 Œ­w)z!Handle WebSocket upgrade request.r   )ÚWebSocketProtocolN)	Úgunicorn.asgi.websocketrD  r°   Ú_build_websocket_scoper=   r¦   r¤   rµ   Úrun)r   rt   r'  r&  rD  ÚscopeÚws_protocols          r   r.  zASGIProtocol._handle_websocket  s_   è ø€ å=ð !%ˆÔà×+Ñ+¨G°X¸xÓHˆÙ'Ø�N‰N˜E 4§8¡8¨T¯X©Xó
ˆð
 &ˆŒà�o‰oÓ×Òús   ‚A$A.Á&A,Á'A.c           	   ƒ   ó"	  ‡ ‡‡‡‡‡‡‡‡K  — ‰ j                  ‰||«      }dŠdŠdŠdŠd‰ _        dŠg ŠdŠ‰ j                  }ˆˆˆˆˆˆˆˆ ˆf	d„}‰ j                  j                  }	 t        j                  «       }‰ j                  j                  ‰ j                  ‰«       ‰ j                  ||j                  |«      ƒ d{  –—†  ‰�‰‚‰s‰ j                  dd«       dŠd‰ _        	 t!        t        j                  «       |z
  «      }	|r?‰ j#                  ‰||«      }
t%        ‰‰‰«      }‰ j                  j'                  |‰|
|	«       nd}
d}‰ j                  j)                  ‰ j                  ‰|
|«       ‰j/                  «       ry‰ j                  j0                  xr ‰ j                  j2                  S 7 Œò# t        j                  $ rÝ ‰ j                  j                  d«       Y d‰ _        	 t!        t        j                  «       z
  «      }	|r?‰ j#                  ‰||«      }
t%        ‰‰‰«      }‰ j                  j'                  |‰|
|	«       nd}
d}‰ j                  j)                  ‰ j                  ‰|
|«       y# t*        $ r ‰ j                  j-                  d«       Y yw xY wt*        $ ró ‰ j                  j-                  d	«       ‰s‰ j                  dd«       dŠY d‰ _        	 t!        t        j                  «       z
  «      }	|r?‰ j#                  ‰||«      }
t%        ‰‰‰«      }‰ j                  j'                  |‰|
|	«       nd}
d}‰ j                  j)                  ‰ j                  ‰|
|«       y# t*        $ r ‰ j                  j-                  d«       Y yw xY ww xY w# t*        $ r ‰ j                  j-                  d«       Y �ŒUw xY w# d‰ _        	 t!        t        j                  «       z
  «      }	|r?‰ j#                  ‰||«      }
t%        ‰‰‰«      }‰ j                  j'                  |‰|
|	«       nd}
d}‰ j                  j)                  ‰ j                  ‰|
|«       w # t*        $ r ‰ j                  j-                  d«       Y w w xY wxY w­w)
zHandle a single HTTP request.FNéô  r   c              “   ó¸  •	K  — ‰j                   ry | d   }|dk(  r7| j                  d«      }| j                  dg «      }‰j                  ||‰«       y |dk(  ro‰rt        d«      Šy dŠ| d   Š| j                  dg «      Š
t	        d„ ‰
D «       «      }|s ‰j
                  d	k\  rdŠt        ‰
«      d
gz   Š
‰j                  ‰‰
‰«       y |dk(  �r‰st        d«      Šy ‰	rt        d«      Šy | j                  dd«      }| j                  dd«      }|rO‰j                  |‰¬«       ‰t        |«      z  Š‰j                  r"‰j                  j                  «       ƒ d {  –—†  |sw‰rD‰j                  r&‰j                  ‰j                  dz   «       d ‰_        n@‰j                  d«       n.‰j                  r"‰j                  ‰j                  «       d ‰_        dŠ	y y y 7 Œ­w)Nr„   úhttp.response.informationalr^   rg   úhttp.response.startúResponse already startedTc              3   óò   K  — | ]o  \  }}t        |t        «      r|j                  «       n|j                  «       d k(  xs3 t        |t        «      r|j                  «       n|j                  «       dk(  –— Œq y­w)s   content-lengthzcontent-lengthN)r%   rö   rA  )Ú.0rk   Ú_s      r   ú	<genexpr>zBASGIProtocol._handle_http_request.<locals>.send.<locals>.<genexpr>M  sg   è ø€ ò )ñ  ˜˜aô &0°´cÔ%:�T—Z‘Z”\ÀÇ
Á
ÃÐQbÑbò eÜ(2°4¼Ô(=˜Ÿ
™
œÀ4Ç:Á:Ã<ÐTdÑdóeñ)ùs   ‚A5A7©rZ   rZ   )s   transfer-encodings   chunkedúhttp.response.bodyúResponse not startedúResponse already completerˆ   r   r‰   F)rŒ   s   0

)rr   ÚgetÚ_send_informationalrâ   Úanyr]   ÚlistÚ_send_response_startÚ
_send_bodyr  r´   rA   r¬   r$  )ÚmessageÚmsg_typeÚinfo_statusÚinfo_headersÚhas_content_lengthrˆ   r‰   Úexc_to_raisert   Úresponse_completeÚresponse_headersÚresponse_sentÚresponse_startedÚresponse_statusr   Úuse_chunkeds          €€€€€€€€€r   Úsendz/ASGIProtocol._handle_http_request.<locals>.send2  sñ  øè ø€ ð �|Š|Øà˜v‘ˆHàÐ8Ò8à%Ÿk™k¨(Ó3�Ø&Ÿ{™{¨9°bÓ9�Ø×(Ñ(¨°lÀGÔLØàÐ0Ò0Ù#Ü#/Ð0JÓ#K�LØØ#'Ð Ø")¨(Ñ"3�Ø#*§;¡;¨y¸"Ó#=Ð ô &)ñ )ð $4ô)ó &Ð"ñ *¨g¯o©oÀÒ.GØ"&�KÜ'+Ð,<Ó'=ÐAcÐ@dÑ'dÐ$à×)Ñ)¨/Ð;KÈWÕUàÐ1Ó1Ù'Ü#/Ð0FÓ#G�LØÙ$Ü#/Ð0KÓ#L�LØà—{‘{ 6¨3Ó/�Ø#ŸK™K¨°UÓ;�	áØ—O‘O D°+�OÔ>Ø!¤S¨£YÑ.�Mà×)Ò)Ø"×0Ñ0×6Ñ6Ó8×8Ð8á Ù"à×0Ò0Ø ×,Ñ,¨T×-BÑ-BÀ\Ñ-QÔRØ48˜DÕ1à ×,Ñ,¨\Õ:Ø×.Ò.à×(Ñ(¨×)>Ñ)>Ô?Ø04˜Ô-Ø(,Ñ%ð !ð% 2ð  9ús   ƒEGÅGÅB GúInternal Server Errorz'Request cancelled (client disconnected)úException in post_request hookúError in ASGI application)Ú_build_http_scoper¬   r«   r¤   Úaccess_log_enabledrP   Ú	monotonicr£   Úpre_requestr¢   r¦   r�   rõ   r:   r�   r8  r   Ú_build_environrd   ÚaccessÚpost_requestrø   r#  Úshould_closer3  r	  )r   rt   r'  r&  rH  Úbody_receiverrj  ro  Úrequest_startÚrequest_timeÚenvironÚresprc  rd  re  rf  rg  rh  ri  s   ``          @@@@@@@r   r/  z!ASGIProtocol._handle_http_request  s1  ÿøè ø€ à×&Ñ& w°¸(ÓCˆØ ÐØ!ÐØˆØˆð !%ˆÔð ˆØÐØˆð ×+Ñ+ˆ÷F	-ô F	-ðR "ŸX™X×8Ñ8Ðð(	EÜ ŸN™NÓ,ˆMØ�H‰H× Ñ  §¡¨gÔ6à—(‘(˜5 -×"7Ñ"7¸Ó>×>Ð>àÐ'Ø"Ð"ñ $Ø×)Ñ)¨#Ð/FÔGØ"%�ð #'ˆDÔðEÜ+¬D¯N©NÓ,<¸}Ñ,LÓM�á%Ø"×1Ñ1°'¸8ÀXÓN�GÜ+¨OÐ=MÈ}Ó]�DØ—H‘H—O‘O D¨'°7¸LÕIà"�GØ�DØ—‘×%Ñ% d§k¡k°7¸GÀTÔJð
 ×ÑÔ!Øà�{‰{× Ñ Ò7 T§X¡X×%7Ñ%7Ð7ðU ?ùô ×%Ñ%ò 	à�H‰H�N‰NÐDÔEØð #'ˆDÔðEÜ+¬D¯N©NÓ,<¸}Ñ,LÓM�á%Ø"×1Ñ1°'¸8ÀXÓN�GÜ+¨OÐ=MÈ}Ó]�DØ—H‘H—O‘O D¨'°7¸LÕIà"�GØ�DØ—‘×%Ñ% d§k¡k°7¸GÀTÕJøÜò EØ—‘×"Ñ"Ð#CÖDðEúô+ ò 	Ø�H‰H×ÑÐ:Ô;Ù#Ø×)Ñ)¨#Ð/FÔGØ"%�Øð #'ˆDÔðEÜ+¬D¯N©NÓ,<¸}Ñ,LÓM�á%Ø"×1Ñ1°'¸8ÀXÓN�GÜ+¨OÐ=MÈ}Ó]�DØ—H‘H—O‘O D¨'°7¸LÕIà"�GØ�DØ—‘×%Ñ% d§k¡k°7¸GÀTÕJøÜò EØ—‘×"Ñ"Ð#CÖDðEúð+	ûô* ò EØ—‘×"Ñ"Ð#C×DðEûð #'ˆDÔðEÜ+¬D¯N©NÓ,<¸}Ñ,LÓM�á%Ø"×1Ñ1°'¸8ÀXÓN�GÜ+¨OÐ=MÈ}Ó]�DØ—H‘H—O‘O D¨'°7¸LÕIà"�GØ�DØ—‘×%Ñ% d§k¡k°7¸GÀTÕJøÜò EØ—‘×"Ñ"Ð#CÖDðEÿsõ   ‹ARÁ$AF3 Â>F1Â?F3 ÃRÃ%BN  Å2?RÆ1F3 Æ3.NÇ!O Ç"RÇ*BI8 É7RÉ8$JÊRÊJÊRÊ"9NËO ËRË$BM2 Í1RÍ2$NÎRÎNÎRÎNÎO Î $OÏRÏOÏRÏRÏBQ"Ñ!RÑ"$R	ÒRÒR	Ò	RÒRc                 ó,  — t        |dd«      }t        |t        «      rt        |«      }nUg }|j                  D ]D  \  }}|j	                  |j                  «       j                  d«      |j                  d«      f«       ŒF t        |«      }t        |«      }	ddddœ|j                  d   › d	|j                  d
   › �|j                  |j                  |j                  |j                  r|j                  nd|j                  r|j                  j                  d«      nd| j                  j                  xs d|||	dœ}
t!        | j"                  d«      r| j"                  j$                  |
d<   t!        |d«      rd|j&                  |j(                  dœi|
d<   |
S )z*Build ASGI HTTP scope from parsed request.Úheaders_bytesNr1   r(  ú3.0ú2.4©r]   Úspec_versionr   rY   rZ   r   Ú ©r„   r¥   Úhttp_versionrî   ÚschemeÚpathÚraw_pathÚquery_stringÚ	root_pathrg   ÚserverÚclientÚstateÚpriority_weightúhttp.response.priority©ÚweightÚ
depends_onÚ
extensions)rÍ   r%   r[  rg   rj   rA  rS   r"   r]   rî   r„  r…  r†  Úqueryr£   rˆ  r½   r¢   r‹  rŒ  Úpriority_depends_on)r   rt   r'  r&  r|  rg   rk   rl   r‰  rŠ  rH  s              r   rn  zASGIProtocol._build_http_scope­  sv  € ô   ¨¸$Ó?ˆÜ�m¤TÔ*Ü˜=Ó)‰GàˆGØ&Ÿ™ò Z‘��eØ—‘ §
¡
£× 3Ñ 3°IÓ >ÀÇÁÈYÓ@WÐXÕYðZô % XÓ.ˆÜ$ XÓ.ˆð Ø %°uÑ=Ø&Ÿ™¨qÑ1Ð2°!°G·O±OÀAÑ4FÐ3GÐHØ—n‘nØ—n‘nØ—L‘LØ,3×,<Ò,<˜×(Ò(À#Ø?F¿}º}˜GŸM™M×0Ñ0°Ô;ÐRUØŸ™×+Ñ+Ò1¨rØØØñ
ˆô  �4—;‘; Ô(Ø!Ÿ[™[×.Ñ.ˆE�'‰Nô �7Ð-Ô.à(Ø%×5Ñ5Ø")×"=Ñ"=ñ+ð#ˆE�,Ñð ˆr   c           	      ó  — |j                   |j                  |j                  |j                  xs dd|j                  d   › d|j                  d   › �|r|d   nddœ}|j
                  D ]  \  }}d|j                  dd	«      z   }|||<   Œ! |S )
z8Build minimal WSGI-like environ dict for access logging.r�  rX   r   rY   rZ   ú-©ÚREQUEST_METHODÚRAW_URIÚ	PATH_INFOÚQUERY_STRINGÚSERVER_PROTOCOLÚREMOTE_ADDRÚHTTP_rR  )rî   Úurir…  r’  r]   rg   Úreplace©r   rt   r'  r&  ry  rk   rl   r`   s           r   rr  zASGIProtocol._build_environÚ  s™   € ð &Ÿn™nØ—{‘{Ø Ÿ™Ø#ŸM™MÒ/¨RØ!& w§¡°qÑ'9Ð&:¸!¸G¿O¹OÈAÑ<NÐ;OÐPÙ*2˜8 Aš;¸ñ
ˆð #Ÿ?™?ò 	!‰KˆD�%Ø˜DŸL™L¨¨cÓ2Ñ2ˆCØ ˆG�CŠLð	!ð ˆr   c                 ó  — g }|j                   D ]D  \  }}|j                  |j                  «       j                  d«      |j                  d«      f«       ŒF g }|j                   D ]8  \  }}|dk(  sŒ|j	                  d«      D �cg c]  }|j                  «       ‘Œ }} n t        |«      }	t        |«      }
ddddœ|j                  d   › d	|j                  d
   › �|j                  dk(  rdnd|j                  |j                  r|j                  nd|j                  r|j                  j                  d«      nd| j                  j                  xs d||	|
|dœ}t        | j                  d«      r| j                  j                   |d<   |S c c}w )z/Build ASGI WebSocket scope from parsed request.r1   zSEC-WEBSOCKET-PROTOCOLú,r?  r}  r~  r  r   rY   rZ   ÚhttpsÚwssÚwsr   r�  )r„   r¥   rƒ  r„  r…  r†  r‡  rˆ  rg   r‰  rŠ  Úsubprotocolsr‹  )rg   rj   rA  rS   ÚsplitÚstripr"   r]   r„  r…  r†  r’  r£   rˆ  r½   r¢   r‹  )r   rt   r'  r&  rg   rk   rl   r¦  Úsr‰  rŠ  rH  s               r   rF  z#ASGIProtocol._build_websocket_scopeì  sv  € ð ˆØ"Ÿ?™?ò 	V‰KˆD�%Ø�N‰N˜DŸJ™J›L×/Ñ/°	Ó:¸E¿L¹LÈÓ<SÐTÕUð	Vð ˆØ"Ÿ?™?ò 	‰KˆD�%ØÐ/Ó/Ø38·;±;¸sÓ3CÖD¨a §¡¥	ÐD�ÐDÙð	ô
 % XÓ.ˆÜ$ XÓ.ˆð  Ø %°uÑ=Ø&Ÿ™¨qÑ1Ð2°!°G·O±OÀAÑ4FÐ3GÐHØ&Ÿ~™~°Ò8‘e¸dØ—L‘LØ,3×,<Ò,<˜×(Ò(À#Ø?F¿}º}˜GŸM™M×0Ñ0°Ô;ÐRUØŸ™×+Ñ+Ò1¨rØØØØ(ñ
ˆô  �4—;‘; Ô(Ø!Ÿ[™[×.Ñ.ˆE�'‰Nàˆùò3  Es   ÂF	c           	      ó�  — |j                   dk  ry| j                  |«      }d|j                   d   › d|j                   d   › d|› d|› d�	}|D ]R  \  }}t        |t        «      r|j	                  d	«      }t        |t        «      r|j	                  d	«      }||› d
|› d�z  }ŒT |dz  }| j                  |j                  d	«      «       y)ao  Send an informational response (1xx) such as 103 Early Hints.

        Args:
            status: HTTP status code (100-199)
            headers: List of (name, value) header tuples
            request: The parsed request object

        Note: Informational responses are only sent for HTTP/1.1 or later.
        HTTP/1.0 clients do not support 1xx responses.
        rT  NrX   r   rY   rZ   r[   r0   r1   z: )r]   Ú_get_reason_phraser%   rh   ri   r$  rS   )r   r^   rg   rt   r_   Úresponserk   rl   s           r   rY  z ASGIProtocol._send_informational  sÕ   € ð �?‰?˜VÒ#Øà×(Ñ(¨Ó0ˆØ˜7Ÿ?™?¨1Ñ-Ð.¨a°·±ÀÑ0BÐ/CÀ1ÀVÀHÈAÈfÈXÐUYÐZˆà"ò 	/‰KˆD�%Ü˜$¤Ô&Ø—{‘{ 9Ó-�Ü˜%¤Ô'ØŸ™ YÓ/�Ø˜4˜&  5 '¨Ð.Ñ.‰Hð	/ð 	�FÑˆØ×Ñ˜Ÿ™¨Ó3Õ4r   c                 óò  — | j                  |«      }t        |j                  ||«      }|g}d}d}|D ]ê  \  }	}
t        |	t        «      r"|	j                  «       }|j                  |	«       n?|	j                  «       j                  d«      }|j                  |	j                  d«      «       |j                  d«       t        |
t        «      r|j                  |
«       n |j                  |
j                  d«      «       |j                  d«       |dk(  rd}Œã|dk(  sŒéd}Œì |s|j                  t        «       |s|j                  t        «       «       |j                  d«       dj                  |«      | _        y	)
z¨Send HTTP response status and headers.

        Uses cached status lines and headers for common cases to avoid
        repeated string formatting and encoding.
        Fr1   s   : ó   
s   dateTs   serverr   N)r«  rb   r]   r%   rh   rA  rj   rS   Ú_CACHED_SERVER_HEADERrV   rã   r¬   )r   r^   rg   rt   r_   Ústatus_lineÚpartsÚhas_dateÚ
has_serverrk   rl   Ú
name_lowers               r   r\  z!ASGIProtocol._send_response_start.  s:  € ð ×(Ñ(¨Ó0ˆÜ-¨g¯o©o¸vÀvÓNˆð �ˆàˆØˆ
à"ò 	"‰KˆD�%Ü˜$¤Ô&Ø!ŸZ™Z›\�
Ø—‘˜TÕ"à!ŸZ™Z›\×0Ñ0°Ó;�
Ø—‘˜TŸ[™[¨Ó3Ô4à�L‰L˜Ôä˜%¤Ô'Ø—‘˜UÕ#à—‘˜UŸ\™\¨)Ó4Ô5à�L‰L˜Ô!ð ˜WÒ$Ø‘Ø˜yÓ(Ø!‘
ð+	"ñ0 Ø�L‰LÔ.Ô/ÙØ�L‰LÔ0Ó2Ô3à�‰�WÔð !$§¡¨£ˆÕr   c                 óª  — |r‹|r@t        |«      }t        j                  |«      xs |d›d�j                  d«      }||z   dz   }nd}| j                  r&| j                  | j                  |z   «       d| _        y|r| j                  |«       yy| j                  r&| j                  | j                  |z   «       d| _        y|r| j                  |«       yy)zySend response body chunk.

        Combines buffered headers with first body chunk for efficient write batching.
        r/   r0   r1   r®  r   N)r  Ú_CHUNK_PREFIXESrX  rS   r¬   r$  )r   rˆ   rŒ   ÚsizeÚprefixÚ
chunk_datas         r   r]  zASGIProtocol._send_body`  sÔ   € ñ
 Ùô ˜4“y�Ü(×,Ñ,¨TÓ2ÒW¸¸a¸À°o×6LÑ6LÈYÓ6W�Ø# d™]¨WÑ4‘
à �
ð ×$Ò$Ø× Ñ  ×!6Ñ!6¸Ñ!CÔDØ(,�Õ%ÙØ× Ñ  Õ,ð ð ×$Ò$Ø× Ñ  ×!6Ñ!6¸Ñ!=Ô>Ø(,�Õ%ÙØ× Ñ  Õ&ð r   c                 ó²   — |j                  d«      }d|› d|› dt        |«      › d�}| j                  |j                  d«      «       | j                  |«       y)zSend an error response.zutf-8z	HTTP/1.1 r[   z,
Content-Type: text/plain
Content-Length: z
Connection: close

r1   N)rS   r  r$  )r   r^   r^  rˆ   r¬  s        r   rõ   z!ASGIProtocol._send_error_response}  sa   € à�~‰~˜gÓ&ˆà˜�x˜q  	ð *ä" 4›y˜kð *ðð 	ð 	×Ñ˜Ÿ™¨Ó3Ô4Ø×Ñ˜Õr   c                 óô   — i dd“dd“dd“dd“d	d
“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd “d!d"“i d#d$“d%d&“d'd(“d)d*“d+d,“d-d.“d/d0“d1d2“d3d4“d5d6“d7d8“d9d:“d;d<“d=d>“d?d@“dAdB“¥}|j                  |dC«      S )Dz'Get HTTP reason phrase for status code.éd   ÚContinueée   zSwitching Protocolség   zEarly HintséÈ   ÚOKéÉ   ÚCreatedéÊ   ÚAcceptedéÌ   z
No ContentéÎ   zPartial Contenti-  zMoved Permanentlyi.  ÚFoundi/  z	See Otheri0  zNot Modifiedi3  zTemporary Redirecti4  zPermanent Redirectró   zBad Requesti‘  ÚUnauthorizedi“  Ú	Forbiddeni”  z	Not Foundi•  zMethod Not Allowedi˜  zRequest Timeouti™  ÚConflictiš  ÚGonei›  zLength Requiredi�  zPayload Too Largerò   zURI Too LongiŸ  zUnsupported Media Typei¦  zUnprocessable Entityi­  zToo Many RequestsrK  rk  iõ  zNot Implementediö  zBad Gatewayi÷  zService Unavailableiø  zGateway TimeoutÚUnknown)rX  )r   r^   Úreasonss      r   r«  zASGIProtocol._get_reason_phraseŠ  s¹  € ð"
Ø�ð"
àÐ&ð"
ð �ð"
ð �ð	"
ð
 �ð"
ð �ð"
ð �ð"
ð Ð"ð"
ð Ð$ð"
ð �ð"
ð �ð"
ð �ð"
ð Ð%ð"
ð Ð%ð"
ð �ð"
ð  �ð!"
ð" �ñ#"
ð$ �ð%"
ð& Ð%ð'"
ð( Ð"ð)"
ð* �ð+"
ð, �ð-"
ð. Ð"ð/"
ð0 Ð$ð1"
ð2 �ð3"
ð4 Ð)ð5"
ð6 Ð'ð7"
ð8 Ð$ð9"
ð: Ð(ð;"
ð< Ð"ð="
ð> �ð?"
ð@ Ð&ðA"
ðB Ð"ñC"
ˆðF �{‰{˜6 9Ó-Ð-r   c                 ó  — | j                   rd| j                  sW	 | j                   j                  «       r| j                   j                  «        | j                   j	                  «        d| _        yyy# t
        $ r Y Œw xY w)z°Close the transport safely.

        Calls write_eof() first if supported to signal end of writing,
        which helps ensure buffered data is flushed before closing.
        TN)r=   rr   Úcan_write_eofÚ	write_eofÚcloserø   r@   s    r   r÷   zASGIProtocol._close_transport±  sj   € ð �>Š> $§,¢,ðà—>‘>×/Ñ/Ô1Ø—N‘N×,Ñ,Ô.Ø—‘×$Ñ$Ô&ð  ˆD�Lð #/ˆ>øô ò Ùðús   šAA2 Á2	A>Á=A>c           	   ƒ   ó†  K  — 	 ddl m} |j                  d«      }|j                  d«      }| j                  }t	        j
                  |«      }t	        j                  |||| j                  j                  «      } || j                  |||«      }	|	j                  «       ƒ d{  –—†  |	| _        |	j                  �s!| j                  j                  �r
	 |	j                  d¬«      ƒ d{  –—† }
|
D ]D  }	 | j'                  ||	||«      ƒ d{  –—†  |	j3                  |j,                  j.                  «       ŒF | j                  xj4                  t7        |
«      z  c_        | j                  j4                  | j                  j8                  k\  r-| j"                  j;                  d«       d| j                  _        n$|	j                  s| j                  j                  r�Œ
t?        | d«      r#	 | j                  jA                  «       ƒ d{  –—†  | jC                  «        y7 �Œz7 �Œ7# t        j                  $ r Y �ŒŠt         $ r&}| j"                  j%                  d|«       Y d}~Œ…d}~ww xY w7 �Œ_# t         $ rp}| j"                  j)                  d	«       	 |	j+                  |j,                  j.                  d
t1        |«      «      ƒ d{  –—†7   n# t         $ r Y nw xY wY d}~�ŒÑd}~ww xY w# |	j3                  |j,                  j.                  «       w xY w# t        j<                  $ r Y �ŒLt         $ r'}| j"                  j)                  d|«       Y d}~�Œvd}~ww xY w7 �ŒT# t         $ r Y �Œ^w xY w# t?        | d«      r4	 | j                  jA                  «       ƒ d{  –—†7   n# t         $ r Y nw xY w| jC                  «        w xY w­w)zHandle an HTTP/2 connection.r   )ÚAsyncHTTP2Connectionr&  r'  NrM   r˜   zHTTP/2 receive error: %szError handling HTTP/2 requestrK  r*  FzHTTP/2 connection error: %sÚ_h2_conn)"Úgunicorn.http2.async_connectionrÔ  r¼   r§   r:   ÚStreamReaderProtocolÚStreamWriterr¢   rž   r£   Úinitiate_connectionrÕ  Ú	is_closedr3  Úreceive_datar�   rø   r¤   r8  Ú_handle_http2_requestr#  Ú
send_errorÚstreamÚ	stream_idrö   Úcleanup_streamr0  r  r1  r2  r�   r½   rÒ  r÷   )r   r=   r·   rÔ  r&  r'  r§   ru   r¨   Úh2_connÚrequestsrü   Úreqs                r   rÀ   z%ASGIProtocol._handle_http2_connectionÁ  s0  è ø€ ðC	$ÝLà ×/Ñ/°
Ó;ˆHØ ×/Ñ/°
Ó;ˆHð —[‘[ˆFÜ×3Ñ3°FÓ;ˆHÜ×)Ñ)Ø˜8 V¨T¯[©[×-=Ñ-=óˆFñ
 +Ø—‘˜& &¨(óˆGð ×-Ñ-Ó/×/Ð/à#ˆDŒMð ×'Ó'¨D¯K©K×,=Ó,=ðØ%,×%9Ñ%9À#Ð%9Ó%F×F�Hð $ò E�CðEØ"×8Ñ8Ø ¨(°Hó÷ ð ð  ×.Ñ.¨s¯z©z×/CÑ/CÕDðEð" —‘—’¤# h£-Ñ/•ð —;‘;—>‘> T§[¡[×%=Ñ%=Ò=Ø—H‘H—M‘MÐ"PÔQØ(-�D—K‘KÔ%ØðA ×'Ò'¨D¯K©K×,=Ô,=ôN �t˜ZÔ(ðØŸ-™-×-Ñ-Ó/×/Ð/ð ×!Ñ!Õ#ðc 0ùð  GúÜ×+Ñ+ò ÚÜ ò Ø—H‘H—N‘NÐ#=¸qÔAÜûðúðúô %ò !ØŸ™×*Ñ*Ð+JÔKð!Ø")×"4Ñ"4Ø #§
¡
× 4Ñ 4°c¼3¸q»6ó#÷ ò øô  )ò !Ù ð!ÿüð!ûð  ×.Ñ.¨s¯z©z×/CÑ/CÕDûô ×%Ñ%ò 	ÚÜò 	AØ�H‰H×ÑÐ<¸a×@Ò@ûð	Aúð
 0úÜ ò Úðûô �t˜ZÔ(ðØŸ-™-×-Ñ-Ó/×/Ò/øÜ ò Ùðúà×!Ñ!Õ#üs€  ‚O„BL Â!HÂ"/L ÃH! Ã'HÃ(H! Ã,L Ã2I+Ä	I(Ä
I+ÄCL ÇOÇ(M ÈMÈM È
OÈL ÈH! È!I%È4L È7I%È?I ÉL É I%É%L É(I+É+	K$É4KÊ3K
ËKËK
Ë	KË
	KËKËKËKËK'ËK$Ë$K'Ë''LÌL ÌMÌ$M, Ì'MÌ/MÍM, ÍMÍM, ÍM Í	M)Í%OÍ(M)Í)OÍ,N>Í:NÎNÎNÎN>Î	N*Î'N>Î)N*Î*N>Î>Oc                 óä   — g }|D ]h  \  }}t        |t        «      r|j                  d«      }t        |t        «      r|j                  d«      }|j                  |j	                  «       |f«       Œj |S )z?Convert ASGI headers to HTTP/2 format (lowercase string names).r1   )r%   rh   ri   rj   rA  )r   rg   Úresultrk   rl   s        r   Ú_convert_h2_headersz ASGIProtocol._convert_h2_headers  sh   € àˆØ"ò 	1‰KˆD�%Ü˜$¤Ô&Ø—{‘{ 9Ó-�Ü˜%¤Ô'ØŸ™ YÓ/�Ø�M‰M˜4Ÿ:™:›<¨Ð/Õ0ð	1ð ˆr   c           
   ƒ   óÒ  ‡ ‡‡‡‡‡‡‡‡‡‡‡K  — |j                   j                  Š‰j                  j                  ‰«      Š‰ j	                  |||«      }dŠdŠdŠdŠdŠg ŠdŠdŠˆˆfd„}ˆˆˆˆˆˆˆˆˆ ˆf
d„}‰ j
                  j                  }t        j                  «       }		 ‰ j                  j                  ‰ j                  |«       ‰ j                  |||«      ƒ d{  –—†  ‰�‰‚‰s‰j                  ‰dd«      ƒ d{  –—†  dŠn˜‰s–‰ j                  ‰«      }
dt        ‰«      fg}|j!                  |
«       ‰j                  j                  ‰«      Š‰rI‰j"                  j%                  ‰|d	¬
«       ‰j%                  |d	¬
«       ‰j'                  «       ƒ d{  –—†  	 t-        t        j                  «       |	z
  «      }|r?‰ j/                  |||«      }t1        ‰‰‰«      }‰ j
                  j3                  ||||«       nd}d}‰ j                  j5                  ‰ j                  |||«       y7 �ŒP7 �Œ27 Œ™# t(        $ r> ‰ j
                  j+                  d«       ‰s‰j                  ‰dd«      ƒ d{  –—†7   dŠY ŒÝw xY w# t(        $ r ‰ j
                  j+                  d«       Y yw xY w# 	 t-        t        j                  «       |	z
  «      }|r?‰ j/                  |||«      }t1        ‰‰‰«      }‰ j
                  j3                  ||||«       nd}d}‰ j                  j5                  ‰ j                  |||«       w # t(        $ r ‰ j
                  j+                  d«       Y w w xY wxY w­w)zûHandle a single HTTP/2 request with streaming support.

        Streams both request and response body chunks immediately,
        avoiding buffering entire uploads and enabling SSE, streaming
        downloads, and other real-time use cases.
        FNrK  r   c               “   óš  •K  — ‰�‰j                   j                  dk(  rddiS ‰s0‰j                  r$‰j                  sdŠ‰j	                  «       } d| ddœS 	 t        j                  ‰j                  «       d¬	«      ƒ d {  –—† }|€dŠdd
ddœS ‰j                  rdŠd|‰j                   dœS 7 Œ-# t
        j                  $ r ddicY S w xY w­w)NÚCLOSEDr„   r…   Tr†   Fr‡   r—   r˜   r   )
r‹  rk   Úrequest_completeÚ_body_chunksÚget_request_bodyr:   rœ   Úread_body_chunkr�   Ú_body_complete)rˆ   rz   Úbody_receivedrÞ  s     €€r   r�   z3ASGIProtocol._handle_http2_request.<locals>.receive)  s  øè ø€ ð ˆ~ §¡×!2Ñ!2°hÒ!>ØÐ 1Ð2Ð2ñ ! V×%<Ò%<ÀV×EXÒEXØ $�Ø×.Ñ.Ó0�à*Ø Ø!&ñð ð3Ü%×.Ñ.Ø×*Ñ*Ó,Ø ô÷ �ð ˆ}Ø $�à*ØØ!&ñð ð ×$Ò$Ø $�ð 'ØØ!'×!6Ñ!6Ð6ñð ð%ùô ×'Ñ'ò 3ØÐ 1Ð2Ò2ð3üs<   ƒACÁ(B. Á>B,Á?B. Â)CÂ,B. Â.CÃCÃCÃCc              “   óN  •
K  — | d   }|dk(  rP| j                  d«      }| j                  dg «      }‰j                  |«      }‰j                  ‰||«      ƒ d {  –—†  y |dk(  r(‰rt        d«      Šy dŠ| d   Š| j                  dg «      Šy |dk(  �r7‰st        d	«      Šy ‰rt        d
«      Šy | j                  dd«      }| j                  dd«      }‰s¤‰j                  ‰«      }dt	        ‰«      fg}|j                  |«       ‰j                  j                  ‰«      }|€t        d«      Šy ‰j                  j                  ‰|d¬«       |j                  |d¬«       ‰j                  «       ƒ d {  –—†  dŠ|r+‰j                  ‰|| ¬«      ƒ d {  –—†  ‰t        |«      z  Š|s!|s‰j                  ‰dd¬«      ƒ d {  –—†  dŠy y |dk(  rL‰st        d«      Šy | j                  dg «      }	‰j                  |	«      }
‰j                  ‰|
«      ƒ d {  –—†  y y 7 �ŒÂ7 Œ¬7 Œ�7 Œa7 Œ­w)Nr„   rM  r^   rg   rN  rO  TrU  rV  rW  rˆ   r   r‰   Fú:statuszStream closed©Ú
end_streamúhttp.response.trailersz)Cannot send trailers before body complete)rX  ræ  Úsend_informationalrâ   rö   ÚextendÚstreamsrá  Úsend_headersÚ_send_pending_dataÚ	send_datar  Úsend_trailers)r^  r_  r`  ra  rg   rˆ   r‰   Úresponse_hdrsrÞ  Útrailer_headersÚtrailersrc  rá  Úheaders_sentrd  re  rf  rg  rh  r   rß  s              €€€€€€€€€€r   rj  z0ASGIProtocol._handle_http2_request.<locals>.sendT  sd  øè ø€ ð ˜v‘ˆHàÐ8Ò8à%Ÿk™k¨(Ó3�Ø&Ÿ{™{¨9°bÓ9�Ø×2Ñ2°<Ó@�Ø×0Ñ0°¸KÈÓQ×QÐQØàÐ0Ò0Ù#Ü#/Ð0JÓ#K�LØØ#'Ð Ø")¨(Ñ"3�Ø#*§;¡;¨y¸"Ó#=Ñ ð Ð1Ó1Ù'Ü#/Ð0FÓ#G�LØÙ$Ü#/Ð0KÓ#L�LØà—{‘{ 6¨3Ó/�Ø#ŸK™K¨°UÓ;�	ñ $Ø"×6Ñ6Ð7GÓH�GØ&/´°_Ó1EÐ%FÐ$G�MØ!×(Ñ(¨Ô1ð %Ÿ_™_×0Ñ0°Ó;�FØ�~Ü'3°OÓ'D˜ØØ—O‘O×0Ñ0°¸MÐV[Ð0Ô\Ø×'Ñ'¨À%Ð'ÔHØ!×4Ñ4Ó6×6Ð6Ø#'�Lñ Ø!×+Ñ+¨I°tÈIÈÐ+ÓV×VÐVØ!¤S¨£YÑ.�Má Ùà%×/Ñ/°	¸3È4Ð/ÓP×PÐPØ(,Ñ%ð	 !ð Ð5Ò5Ù(Ü#/Ð0[Ó#\�LØØ")§+¡+¨i¸Ó"<�Ø×3Ñ3°OÓD�Ø×+Ñ+¨I°xÓ@×@Ñ@ð 6ðe RùðH 7øð
 Wøð Qøð Aús\   ƒAH%ÁHÁDH%Å0HÅ1 H%ÆHÆ-H%Æ?H!Ç AH%ÈH#ÈH%ÈH%ÈH%È!H%È#H%rk  rñ  Trò  rm  rl  )rÞ  rß  r÷  rX  Ú_build_http2_scoper¤   ro  rP   rp  r£   rq  r¢   r¦   rÝ  ræ  rö   rö  rá  rø  rù  rø   r#  r   Ú_build_http2_environrd   rs  rt  )r   rt   rá  r'  r&  rH  r�   rj  ro  rw  rg   rü  rx  ry  rz  rï  rc  rÿ  rd  re  rf  rg  rh  rÞ  rß  s   ` `            @@@@@@@@@@r   rÜ  z"ASGIProtocol._handle_http2_request  s5  ÿûè ø€ ð —N‘N×,Ñ,ˆ	Ø—‘×$Ñ$ YÓ/ˆØ×'Ñ'¨°¸8ÓDˆà ÐØ!ÐØˆØˆØˆØÐØˆð ˆõ)	÷VC	Aõ C	AðL "ŸX™X×8Ñ8ÐÜŸ™Ó(ˆð,	EØ�H‰H× Ñ  §¡¨gÔ6Ø—(‘(˜5 '¨4Ó0×0Ð0àÐ'Ø"Ð"ñ $Ø×(Ñ(¨°CÐ9PÓQ×QÐQØ"%‘ñ "à×2Ñ2Ð3CÓD�Ø"+¬S°Ó-AÐ!BÐ C�Ø×$Ñ$ WÔ-Ø Ÿ™×,Ñ,¨YÓ7�ÙØ—O‘O×0Ñ0°¸MÐVZÐ0Ô[Ø×'Ñ'¨À$Ð'ÔGØ!×4Ñ4Ó6×6Ð6ðEÜ+¬D¯N©NÓ,<¸}Ñ,LÓM�á%Ø"×7Ñ7¸ÀÈ8ÓT�GÜ+Ø'Ð)9¸=ó�Dð —H‘H—O‘O D¨'°7¸LÕIà"�GØ�DØ—‘×%Ñ% d§k¡k°7¸GÀTÕJðQ 1ùð Rùð 7ùäò 	&Ø�H‰H×ÑÐ:Ô;ÙØ×(Ñ(¨°CÐ9PÓQ×QÑQØ"%�ùð		&ûô& ò EØ—‘×"Ñ"Ð#CÖDðEûðEÜ+¬D¯N©NÓ,<¸}Ñ,LÓM�á%Ø"×7Ñ7¸ÀÈ8ÓT�GÜ+Ø'Ð)9¸=ó�Dð —H‘H—O‘O D¨'°7¸LÕIà"�GØ�DØ—‘×%Ñ% d§k¡k°7¸GÀTÕJøÜò EØ—‘×"Ñ"Ð#CÖDðEÿs½   ŽBM'Â"<H6 ÃH.Ã H6 Ã?H1Ä BH6 ÆH4ÆH6 Æ BJ  È-M'È.H6 È1H6 È4H6 È6<I=É2I5É3I=É:J* É<I=É=J* Ê $J'Ê$M'Ê&J'Ê'M'Ê*M$Ê,BL:Ì9M$Ì:$M!ÍM$Í M!Í!M$Í$M'c                 óì  — g }|j                   D ]D  \  }}|j                  |j                  «       j                  d«      |j                  d«      f«       ŒF t	        |«      }t	        |«      }ddddœd|j
                  |j                  |j                  t        |dd«      xs) |j                  r|j                  j                  d«      nd	|j                  r|j                  j                  d«      nd	| j                  j                  xs d
|||dœ}	t        | j                  d«      r| j                  j                  |	d<   i }
t        |d«      r|j                  |j                   dœ|
d<   i |
d<   |
|	d<   |	S )z*Build ASGI HTTP scope from HTTP/2 request.r1   r(  r}  r~  r  Ú2r†  Nr   r�  r‚  r‹  rŒ  rŽ  r�  rô  r‘  )rg   rj   rA  rS   r"   rî   r„  r…  rÍ   r’  r£   rˆ  r½   r¢   r‹  rŒ  r“  )r   rt   r'  r&  rg   rk   rl   r‰  rŠ  rH  r‘  s              r   r   zASGIProtocol._build_http2_scopeË  sd  € àˆØ"Ÿ?™?ò 	‰KˆD�%Ø�N‰NØ—
‘
“×#Ñ# IÓ.Ø—‘˜YÓ'ðõ ð	ô % XÓ.ˆÜ$ XÓ.ˆð Ø %°uÑ=ØØ—n‘nØ—n‘nØ—L‘LÜ ¨°TÓ:ÒwÐah×amÒam¸w¿|¹|×?RÑ?RÐS\Ô?]ÐsvØ?F¿}º}˜GŸM™M×0Ñ0°Ô;ÐRUØŸ™×+Ñ+Ò1¨rØØØñ
ˆô �4—;‘; Ô(Ø!Ÿ[™[×.Ñ.ˆE�'‰Nð ˆ
Ü�7Ð-Ô.à!×1Ñ1Ø%×9Ñ9ñ4ˆJÐ/Ñ0ð
 02ˆ
Ð+Ñ,Ø(ˆˆlÑàˆr   c                 óÚ   — |j                   |j                  |j                  |j                  xs dd|r|d   nddœ}|j                  D ]  \  }}d|j                  dd«      z   }|||<   Œ! |S )z.Build minimal environ dict for access logging.r�  zHTTP/2r   r•  r–  r�  rR  )rî   rž  r…  r’  rg   rŸ  r   s           r   r  z!ASGIProtocol._build_http2_environö  sx   € ð &Ÿn™nØ—{‘{Ø Ÿ™Ø#ŸM™MÒ/¨RØ'Ù*2˜8 Aš;¸ñ
ˆð #Ÿ?™?ò 	!‰KˆD�%Ø˜DŸL™L¨¨cÓ2Ñ2ˆCØ ˆG�CŠLð	!ð ˆr   )F)0r   r   r   r   rÉ   rË   rÌ   rÎ   r   rÆ   ÚclassmethodrÑ   rá   rÃ   rä   rå   ræ   rþ   rù   rú   r  r  r  r  r  r  rI   rK   r$  rÄ   r+  r-  r.  r/  rn  rr  rF  rY  r\  r]  rõ   r«  r÷   rÀ   ræ  rÜ  r   r  r   r   r   r    r      s	  „ ñð €NØÐØ€OØ#'Ð ò$òLMð< ñ"ó ð"ð('Ð#ò
8
òt7ò",ò
/ò
)"òVòòòò*ò ò)$òV ò
/ò
0ò
ò&Q$òf-'ò^Qò* ò"L8ò\+òZò$$òL5ò800ód'ò:ò%.òN ò E$òN	òvEòp)óVr   r    )&r   r:   r  r&   rP   Úgunicorn.asgi.unreaderr   Úgunicorn.asgi.parserr   r   r   r   r   r	   Úgunicorn.asgi.uwsgir
   Úgunicorn.http.errorsr   Úgunicorn.uwsgi.errorsr   r   r"   r.   r\   r¯  rT   rQ   ÚrangerS   r¶  rÂ   r3   rV   rb   rd   rn   ÚProtocolr    )Úis   0r   ú<module>r     sà   ðñ
ó Û Û Û å 0÷÷ õ 2Ý +Ý 5÷Fñ Fò5òð( Ð Ø4Ð ð Ð ØÐ ñ ?DÀE»lÖK¸�1˜˜1˜˜T�l×)Ñ)¨)Ó4Ñ4ÒK€ð Ð ÷%*ñ %*òP	ò%÷/ñ /÷ m ñ m ô`s�7×#Ñ#õ sùòG Ls   ÁB9