+
    j&                        R t ^ RIt^ RIt^ RIHt  ! R R]4      t ! R R]4      t ! R R]4      tR	t	]
! R(4      t ! R
 R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R  R!]4      t ! R" R#]4      t ! R$ R%4      t ! R& R'4      tR# ))z
HTTP parser for ASGI workers.

Provides callback-based parsing using either the fast C parser (gunicorn_h1c)
or the pure Python PythonProtocol fallback.
N)IntEnumc                       ] tR t^tRtRtR# )
ParseErrorz&Base error raised during HTTP parsing. N__name__
__module____qualname____firstlineno____doc____static_attributes__r       I/var/www/idalgo/venv/lib/python3.14/site-packages/gunicorn/asgi/parser.pyr   r          0r   r   c                       ] tR t^tRtRtR# )InvalidProxyLinezInvalid PROXY protocol v1 line.r   Nr   r   r   r   r   r      s    )r   r   c                       ] tR t^tRtRtR# )InvalidProxyHeaderz!Invalid PROXY protocol v2 header.r   Nr   r   r   r   r   r      s    +r   r   s   

 
QUIT
c                   "    ] tR t^-tRt^ t^tRtR# )	PPCommandzPROXY protocol v2 commands.r   N)r   r   r	   r
   r   LOCALPROXYr   r   r   r   r   r   -   s    %EEr   r   c                   *    ] tR t^3tRt^ t^t^t^tRt	R# )PPFamilyz#PROXY protocol v2 address families.r   N)
r   r   r	   r
   r   UNSPECINETINET6UNIXr   r   r   r   r   r   3   s    -FDEDr   r   c                   &    ] tR t^;tRt^ t^t^tRtR# )
PPProtocolz&PROXY protocol v2 transport protocols.r   N)	r   r   r	   r
   r   r   STREAMDGRAMr   r   r   r   r   r   ;   s    0FFEr   r   c                       ] tR t^BtRtRtR# )LimitRequestLinez&Request line exceeds configured limit.r   Nr   r   r   r   r#   r#   B   r   r   r#   c                       ] tR t^FtRtRtR# )LimitRequestHeadersz+Too many headers or header field too large.r   Nr   r   r   r   r%   r%   F   s    5r   r%   c                       ] tR t^JtRtRtR# )InvalidRequestLinezInvalid request line.r   Nr   r   r   r   r'   r'   J       r   r'   c                       ] tR t^NtRtRtR# )InvalidRequestMethodzInvalid HTTP method.r   Nr   r   r   r   r*   r*   N       r   r*   c                       ] tR t^RtRtRtR# )InvalidHTTPVersionzInvalid HTTP version.r   Nr   r   r   r   r-   r-   R   r(   r   r-   c                       ] tR t^VtRtRtR# )InvalidHeaderNamezInvalid header name.r   Nr   r   r   r   r/   r/   V   r+   r   r/   c                       ] tR t^ZtRtRtR# )InvalidHeaderzInvalid header value.r   Nr   r   r   r   r1   r1   Z   r(   r   r1   c                       ] tR t^^tRtRtR# )UnsupportedTransferCodingz$Unsupported Transfer-Encoding value.r   Nr   r   r   r   r3   r3   ^   s    .r   r3   c                       ] tR t^btRtRtR# )InvalidChunkSizez0Invalid chunk size in chunked transfer encoding.r   Nr   r   r   r   r5   r5   b   s    :r   r5   c                       ] tR t^ftRtRtR# )InvalidChunkExtensionz%Invalid chunk extension per RFC 9112.r   Nr   r   r   r   r7   r7   f   s    /r   r7   c                      a  ] tR t^jt o RtRtRR ltR t]R 4       t	R t
R tR tR	 tR
 tR tR tR tR tR tR tR tR tRtV tR# )PythonProtocola_  Callback-based HTTP/1.1 parser (pure Python fallback).

Mirrors H1CProtocol interface for seamless switching between
the C extension and pure Python implementations.

Callbacks:
    on_message_begin: () -> None - Called when request starts
    on_url: (url: bytes) -> None - Called with request URL/path
    on_header: (name: bytes, value: bytes) -> None - Called for each header
    on_headers_complete: () -> bool - Called when headers done (return True to skip body)
    on_body: (chunk: bytes) -> None - Called with body data chunks
    on_message_complete: () -> None - Called when request is complete
Nc                   Wn         W n        W0n        W@n        WPn        W`n        Wpn        Wn        Wn        Wn	        Wn
        ^ V n        Wn        RV n        VR8H  V n        VR8w  d   RMRV n        \!        4       V n        . V n        RV n        RV n        RV n        . V n        RV n        RV n        RV n        RV n        ^ V n        RV n        RV n        ^ V n        ^ V n        R# )    Noffproxy_protocolrequest_lineFTsize) _on_message_begin_on_url
_on_header_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_version_header_count_proxy_protocol_proxy_protocol_info_proxy_protocol_done_state	bytearray_buffer_headers_listmethodpathhttp_versionheaderscontent_length
is_chunkedshould_keep_aliveis_complete_body_remaining
_skip_body_chunk_state_chunk_size_chunk_remaining)selfon_message_beginon_url	on_header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_versionr=   s   &&&&&&&&&&&&&r   __init__PythonProtocol.__init__   s     "2#$7!$7! $6 %9")A&2S/3U0  .$(!$2e$;! +9E*A&~ { 	 "!%   ! # !r   c                   V P                   P                  V4       V P                   '       d   V P                  R8X  d   V P                  4       '       g   R# K=  V P                  R8X  d   V P	                  4       '       g   R# Kh  V P                  R8X  d   V P                  4       '       g   R# K  V P                  R8X  d   V P                  4       '       g   R# K  V P                  R8X  d   V P                  4       '       g   R# K  R# R# )zProcess data, fire callbacks synchronously.

Args:
    data: bytes or bytearray of incoming data

Raises:
    ParseError: If the HTTP request is malformed
r=   r>   rV   bodychunkedN)rQ   extendrO   _parse_proxy_protocol_parse_request_line_parse_headers_parse_body_parse_chunked_body)r`   datas   &&r   feedPythonProtocol.feed   s     	D!lll{{..1133 4.//11 2	)**,, -&'')) *	)//11 2 # r   c                    V P                   # )z%Return proxy protocol info if parsed.)rM   r`   s   &r   proxy_protocol_info"PythonProtocol.proxy_protocol_info   s     (((r   c                   RV n         V P                  P                  4        . V n        RV n        RV n        RV n        . V n        RV n        RV n	        RV n
        RV n        ^ V n        RV n        RV n        ^ V n        ^ V n        ^ V n        R# )z#Reset for next request (keepalive).r>   NFTr?   )rO   rQ   clearrR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   rK   r{   s   &r   resetPythonProtocol.reset   s    $	 "!%  " !r   c                    V P                   R8X  dH   V P                  R8X  d5   RV n         RV n        V P                  '       d   V P                  4        R# R# R# R# )zMark parsing complete for EOF handling.

Call when no more data will be received. Handles edge cases like
chunked encoding without final trailer CRLF.
rp   trailercompleteTN)rO   r]   rZ   rE   r{   s   &r   finishPythonProtocol.finish   sR     ;;)#(9(9Y(F$DK#D((())+ )	 )G#r   c                6   \        V P                  4      ^8  d   R# V P                  pVR9   d-   V P                  R,          \        8X  d   V P	                  4       # VR9   d)   V P                  R,          R8X  d   V P                  4       # RV n        RV n        R# )	zParse PROXY protocol header if enabled.

Returns True if parsing is complete (or not applicable),
False if more data is needed.
F:N   N:N   Ns   PROXY Tr>   )v2auto)v1r   )lenrQ   rL   PP_V2_SIGNATURE_parse_proxy_protocol_v2_parse_proxy_protocol_v1rN   rO   )r`   modes   & r   rr   $PythonProtocol._parse_proxy_protocol  s     t||r!## >!dll3&7?&J0022 >!dll2&6)&C0022 %)!$r   c           
        V P                   P                  R4      pVR8X  d(   \        V P                   4      ^k8  d   \        R4      hR# \	        V P                   RV 4      P                  R4      pV P                   RV^,           1 VP                  R4      p\        V4      ^8  d   \        R4      hV^,          P                  4       pVR8X  d   R	RR
RRRRRRR/V n        EMVR9   d   \        V4      ^8w  d   \        RV,          4      hV^,          pV^,          pVR8X  d   \        P                  M\        P                  p \        P                  ! Wu4       \        P                  ! Wv4        \        T^,          4      p\        T^,          4      p	^ Tu;8:  d   R8:  d   M M^ T	u;8:  d   R8:  g   M \        R4      hR	TR
TRTRTRT	/T n        M\        RV,          4      hRV n        RV n        R#   \        \        3 d    \        RT,          4      hi ; i  \         d   p
\        RT
,          4      hRp
?
ii ; i)zlParse PROXY protocol v1 (text format).

Format: PROXY <PROTO> <SRC_ADDR> <DST_ADDR> <SRC_PORT> <DST_PORT>

   
zPROXY v1 header too longFNlatin-1 zInvalid PROXY v1 lineUNKNOWNr=   client_addrclient_port
proxy_addr
proxy_portTCP4zInvalid PROXY v1 line for %szInvalid PROXY v1 %s addresszInvalid PROXY v1 port: %si  zInvalid PROXY v1 port rangezUnknown PROXY v1 protocol: %sTr>   )r   TCP6)rQ   findr   r   bytesdecodesplitupperrM   socketAF_INETAF_INET6	inet_ptonOSError
ValueErrorintrN   rO   )r`   idxlinepartsprotos_addrd_addrafs_portd_portes   &          r   r   'PythonProtocol._parse_proxy_protocol_v1  s&    ll("94<< 3&&'ABBT\\$3'(//	:LL#'" 

3u:>"#:;;a I !)ttdd)D% &&5zQ&'E'MNN1XF1XF $)F?BN  ,  ,HU1XU1X (5(Q&-AE-A&'DEE !%vvff)D% ##BU#JKK$(!$1 Z( N&'Du'LMMN  H&'BQ'FGGHs$   ,G: 4$H! :$H!I,H>>Ic           
        \        V P                  4      ^8  d   R# V P                  ^,          pV P                  ^,          p\        P                  ! R\	        V P                  R,          4      4      ^ ,          pV^,          ^,	          pV^8w  d   \        RV,          4      hV^,          pV\        P                  \        P                  39  d   \        RV,          4      h^V,           p\        V P                  4      V8  d   R# \	        V P                  ^V 4      pV P                  RV1 V\        P                  8X  d"   RRR	RR
RRRRR/V n	        RV n
        RV n        R# V^,          ^,	          pV^,          p	V\        P                  \        P                  39   d!   V	\        P                   8w  d   \        R4      hV\        P                  8X  d   \        V4      ^8  d   \        R4      hRP#                  R VR,           4       4      p
RP#                  R VR,           4       4      p\        P                  ! RVR,          4      ^ ,          p\        P                  ! RVR,          4      ^ ,          pRpEM1V\        P                  8X  d   \        V4      ^$8  d   \        R4      h\        P                  ! RVR,          4      p\        P                  ! RVR,          4      pRP#                  R V 4       4      p
RP#                  R V 4       4      p\        P                  ! RVR ,          4      ^ ,          p\        P                  ! RVR!,          4      ^ ,          pR"pMHV\        P$                  8X  d"   RR#R	RR
RRRRR/V n	        RV n
        RV n        R# \        R$V,          4      hRVR	V
R
VRVRV/V n	        RV n
        RV n        R# )%z(Parse PROXY protocol v2 (binary format).Fz>H:      Nz Unsupported PROXY v2 version: %dz Unsupported PROXY v2 command: %dNr=   r   r   r   r   r   Tr>   z1PROXY v2: only TCP (STREAM) protocol is supportedz"Invalid PROXY v2 IPv4 address data.c              3   8   "   T F  p\        V4      x  K  	  R # 5iNstr.0bs   & r   	<genexpr>:PythonProtocol._parse_proxy_protocol_v2.<locals>.<genexpr>  s     <mc!ffm   :N   Nc              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   r   s   & r   r   r     s     =nc!ffnr   :r      N:r   
   N:r   r   Nr   z"Invalid PROXY v2 IPv6 address dataz>8H:Nr   N:r       N:c              3   4   "   T F  pR V,          x  K  	  R# 5iz%xNr   r   ws   & r   r   r          81dQhh   c              3   4   "   T F  pR V,          x  K  	  R# 5ir   r   r   s   & r   r   r     r   r   :r   "   N:r   $   Nr   r   z'Unsupported PROXY v2 address family: %d)r   rQ   structunpackr   r   r   r   r   rM   rN   rO   r   r   r   r   r    joinr   )r`   ver_cmdfam_protlengthversioncommand
total_size	addr_datafamilyprotocolr   r   r   r   r   s_wordsd_wordss   &                r   r   'PythonProtocol._parse_proxy_protocol_v2f  sX    t||r! ,,r"<<#tU4<<+>%?@C T>a'a<$%G'%QRR D.9??IOO<<$%G'%QRR &[
t||z) $,,r*56	LL*% ioo% 'ttdd)D% )-D%(DK T/a'd? hmmX^^44ZEVEV9V$C  X]]"9~"()MNNXX<im<<FXX=in==F]]449!<F]]45)9:1=FEx~~%9~"()MNNmmE9S>:GmmE9U+;<GXX888FXX888F]]45)9:1=F]]45)9:1=FEx& !(ttdd)D% )-D%(DK %%NQW%WXX e66&&%
! %)!$r   c                   V P                   P                  R4      pVR8X  d   R# V P                  ^ 8  d   WP                  8  d   \        R4      h\	        V P                   RV 4      pV P                   RV^,           1 VP                  R^4      p\        V4      ^8w  d   \        R4      hV^ ,          V n        V^,          V n	        V P                  '       gF   V P                  V P                  4      '       g%   \        V P                  P                  R4      4      hV P                  R8X  d   V P                  R	8w  d   \        R4      hV P                  R
8w  dO   V P                  R8w  d>   V P                  P                  R4      '       g   RV P                  9  d   \        R4      hV^,          pVR8X  d	   RV n        MVR8X  d	   RV n        MzV P                   '       g   \#        VP                  R4      4      hVP                  R4      '       d    \%        VR,          4      p^V3V n        M\#        VP                  R4      4      hV P(                  '       d   V P)                  4        V P*                  '       d   V P+                  V P                  4       RV n        R#   \&         d    \#        TP                  R4      4      hi ; i)z,Parse request line, return True if complete.r   FzRequest line is too largeN    zInvalid request liner      *s   OPTIONSs   CONNECT   /s   ://s   HTTP/1.1s   HTTP/1.0s   HTTP/1.:   NNrV   Tr      r   r   r;   )rQ   r   rF   r#   r   r   r   r'   rS   rT   rI   _is_valid_methodr*   r   
startswithrU   rJ   r-   r   r   r@   rA   rO   )r`   r   r   r   r   minors   &     r   rs   "PythonProtocol._parse_request_line  sL   ll("9 ##a'C2J2J,J"#>??T\\$3'(LL#'" 

4#u:?$%;<<Ah!H	 666((55*4;;+=+=i+HII 99
!:$%;<< KK:%II%		,,T22$))+$%;<< (k! &D# &D;;;(	)BCC!!*--H,E)*E
D% )	)BCC!!!""$<<<LL# " H,W^^I-FGGHs   J$ $&K
c                    V P                   P                  R4      pVR8X  d   R# \        V P                   RV 4      pV P                   RV^,           1 V'       g   V P                  4        R# V P                  ^ 8  d-   \        V4      ^,           V P                  8  d   \        R4      hV ;P                  ^,          un        V P                  ^ 8  d'   V P                  V P                  8  d   \        R4      hVP                  R4      pVR8X  d   \        R4      hVRV P                  4       pV P                  V4      '       g   \        VP                  R	4      4      hW#^,           R P                  4       pV P                  V4      '       d   \        R
4      hVP                  4       pV P                   P#                  We34       V P$                  '       g   EK  V P%                  We4       EK  )z3Parse headers, return True if headers are complete.Tr   FNz!Request header field is too largezToo many headers   :zMissing colon in headerr   z"Invalid characters in header valuer   )rQ   r   r   _finalize_headersrH   r   r%   rK   rG   r1   strip_is_valid_tokenr/   r   _has_invalid_header_charslowerrR   appendrB   )r`   r   r   colonnamevalue
name_lowers   &      r   rt   PythonProtocol._parse_headers  s   ,,##G,Cbyds+,DXcAgX&&&( --1c$i!mdFdFd6d)*MNN !#))A-$2D2DtGaGa2a)*<== IIdOE{#$=>><%%'D''--'I(>??$**,E--e44#$HII J%%z&9:
2r   c                   V P                   V n        RpRpV P                   EF?  w  r4VR8X  d2   Ve   \        R4      h \        V4      pT^ 8  d   \        R4      hTpK>  VR8X  d   VP                  R4       Uu. uF  qfP                  4       NK  	  ppV F  pVP                  4       p	V	R	8X  d   V'       d   \        R
4      hRpK1  V	R8X  d   V'       d   \        R4      hKM  V	R9   d   V'       d   \        R4      hRV n        Kp  \        VP                  R4      4      h	  EK  VR8X  g   EK  VP                  4       pRV9   d   RV n        EK.  RV9   g   EK8  RV n        EKB  	  V'       dB   V P                  R8  d   \        R4      hVe   \        R4      hRV n        RV n        RV n        MVe   Wn        Wn        MRV n        ^ V n        V P                  R8X  dj   V P                  '       dX   \        ;QJ d&    R V P                   4       F  '       g   K   RM	  RM! R V P                   4       4      p
V
'       g   RV n        V P                   '       d   V P!                  4       V n        V P"                  '       d5   RV n        RV n        V P(                  '       d   V P)                  4        R# R# V P                  '       d   RV n        RV n        R# V P                  '       d   V P                  ^ 8  d
   RV n        R# RV n        RV n        V P(                  '       d   V P)                  4        R# R#   \         d    \        R4      hi ; iu upi )aA  Called when all headers received.

Validates headers for request smuggling vulnerabilities:
- Rejects duplicate Content-Length headers
- Rejects requests with both Content-Length and Transfer-Encoding
- Rejects chunked Transfer-Encoding in HTTP/1.0
- Rejects stacked chunked encoding
- Validates Transfer-Encoding values
NF   content-lengthzDuplicate Content-Length headerzInvalid Content-Length valuezNegative Content-Length   transfer-encoding   ,s   chunkedzStacked chunked encodingTs   identityz'Invalid Transfer-Encoding after chunkedr   
   connections   close
   keep-alivez(Chunked encoding not allowed in HTTP/1.0z%Content-Length with Transfer-Encodingc              3   f   "   T F'  w  rVR 8H  ;'       d    RVP                  4       9   x  K)  	  R# 5i)r   r   N)r   )r   r   r   s   &  r   r   3PythonProtocol._finalize_headers.<locals>.<genexpr>  s4       #/KD %HH-5;;=*HH#/s   11r   rp   r?   ro   )s   compresss   deflates   gzipr   r   r   )rR   rV   r1   r   r   r   r   r   rY   r3   r   rU   rX   rW   r[   anyrC   r\   rO   rZ   rE   r]   )r`   rW   rp   r   r   cl_valuevvalsval	val_lowerhas_keepalives   &          r   r    PythonProtocol._finalize_headers;  s    )) <<KD((!-'(IJJH"5zH a<'(ABB!)-- ,1;;t+<=+<a	+<=C #		I J.""/0J"KK"&"k1""/0Y"ZZ #"&HH""/0Y"ZZ16. 8

98MNN'  * &kkms?-2D*"c)-1D*W (\   6)#$NOO)#$KLL"DO"&D#%D '"0#1  #'D#$D  &4+A+A+AC  #'<< CCC  #'<<  M !).&$$$"779DO ???$DK#D((())+ )___#DK &D   T%8%81%< DK %DK#D((())+ )k " H'(FGGH >s   L7:M7Mc                   V P                   '       d   V P                  ^ 8:  d   R# \        \        V P                   4      V P                  4      p\	        V P                   RV 4      pV P                   RV1 V ;P                  V,          un        V P
                  '       d   V P                  V4       V P                  ^ 8:  d1   RV n        RV n        V P                  '       d   V P                  4        R# )z$Parse Content-Length delimited body.FNr   T)	rQ   r[   minr   r   rD   rO   rZ   rE   )r`   
chunk_sizechunks   &  r   ru   PythonProtocol._parse_body  s    |||t33q8T\\*D,@,@A
dll;J/0LL*%
*===MM% 1$$DK#D((())+r   c                   V P                   '       EdL   V P                  R8X  Ed"   V P                   P                  R4      pVR8X  d   R# \        V P                   RV 4      pV P                   RV^,           1 VP                  R4      pVR8w  d#   W#^,           R pRV9   d   \	        R4      hVRV pW"P                  4       8w  d   \        R4      hV'       g   \        R	4      hV F  pVR
9  g   K  \        R4      h	   \        V^4      V n        T P                  ^ 8X  d   RT n        EK+  T P                  T n
        RT n        EKF  V P                  R8X  d   V P                   '       g   R# \        \        V P                   4      V P                  4      p\        V P                   RV 4      pV P                   RV1 V ;P                  V,          un
        V P                  '       d   V P                  V4       V P                  ^ 8X  d   RV n        EK  EK  V P                  R8X  d4   \        V P                   4      ^8  d   R# V P                   R RV n        EKY  V P                  R8X  g   EKm  V P                   P                  R4      pVR8X  d   R# \        V P                   RV 4      pV P                   RV^,           1 V'       g3   RV n        RV n        V P                   '       d   V P!                  4        R# VP                  R4      p	V	^ 8  g   EK  VRV	 P                  R4      P#                  4       p
V
\$        9   g   EKD  \'        V
P)                  R4      4      hR#   \         d    \        R4      hi ; i)z Parse chunked transfer encoding.r?   r   FN   ;   zbare CR not allowedzWhitespace in chunk sizezEmpty chunk sizes   0123456789abcdefABCDEFzInvalid character in chunk sizezInvalid chunk sizer   rw   crlf:N   Nr   Tr   s    	r   r   )rQ   r]   r   r   r7   r   r5   r   r^   r   r_   r  r   rD   rO   rZ   rE   r   RFC9110_6_5_1_FORBIDDEN_TRAILERr/   r   )r`   r   	size_line	semicolon	chunk_extcto_readr  r   r   r   s   &          r   rv   "PythonProtocol._parse_chunked_body  s   lll  F*ll''0"9 !$,,t"45	LL#'* &NN40	? )a-. 9I	)34IJJ )*9 5I  11*+EFF *+=>> #A 99./PQQ #A'*9b'9D$ ##q((1D%,0,<,<D)(.D%""f,||| c$,,/1F1FGdll8G45LL'*%%0%===MM%(((A-(.D% . ""f,t||$q( LL$$*!""i/ll''0"9 T\\$3/0LL#'*",DK'+D$000113 		$19<--f5;;=D>>/I0FGGw " A*+?@@As    M! !M8c                    V'       g   R# ^\        V4      u;8:  d
   ^8:  g    R#  R# V F  pVR9   g   K   R# 	  V P                  V4      # )z>Check if method is valid token with conventional restrictions.Fs   abcdefghijklmnopqrstuvwxyz#)r   r   )r`   rS   r  s   && r   r   PythonProtocol._is_valid_method  sM    CK%2% &A22  ##F++r   c                b    V'       g   R# V F  pV^!8  g   V^~8  d    R# VR9   g   K   R# 	  R# )z6Check if data contains only RFC 9110 token characters.Fs   "(),/:;<=>?@[\]{}"Tr   )r`   rw   r  s   && r   r   PythonProtocol._is_valid_token,  s3    A4x1t8**  r   c                \    V F%  pV^8:  g   ^
Tu;8:  d   ^8:  g   M V^8X  g   K$   R# 	  R# )zARFC 9110 section 5.5: only VCHAR, SP, HTAB, and obs-text allowed.TFr   )r`   r   r  s   && r   r   (PythonProtocol._has_invalid_header_chars8  s-    ADyDA--d  r   )r[   rQ   r_   r^   r]   rK   rR   rH   rG   rF   rD   rB   rC   r@   rE   rA   rI   rJ   rL   rN   rM   r\   rO   rW   rV   rU   rX   rZ   rS   rT   rY   )r@   rA   rB   rC   rD   rE   rO   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   rF   rG   rH   rI   rJ   rK   rL   rM   rN   )NNNNNN  d   r"  FFr<   )r   r   r	   r
   r   	__slots__rl   rx   propertyr|   r   r   rr   r   r   rs   rt   r   ru   rv   r   r   r   r   __classdictcell____classdict__s   @r   r9   r9   j   s     I9"v< ) )(,2ENgR>@*3Xm,^*^@,
 r   r9   c                   N   a  ] tR tRt o RtR	tR t]R
R l4       tR t	R t
RtV tR# )CallbackRequesti@  zpRequest object built from callback parser state.

Works with both H1CProtocol (C extension) and PythonProtocol.
c                    R V n         R V n        R V n        R V n        R V n        R V n        . V n        . V n        RV n        RV n	        ^ V n
        RV n        RV n        R V n        RV n        R # )Nhttpr   FrS   urirT   queryfragmentr   rV   headers_bytesschemeraw_pathrW   rp   
must_closer|   _expect_100_continuer{   s   &r   rl   CallbackRequest.__init__M  so    	
#' $)!r   c                   ^ RI Hp V ! 4       pVP                  P                  R4      Vn        VP                  pRV9   dP   VP                  R^4      w  rgWdn        V! V4      P                  RRR7      Vn        VP                  R4      Vn        M+WTn        V! V4      P                  RRR7      Vn        RVn        VP                  R4      Vn        RVn	        VP                  Vn        \        \        VR	R
4      ;'       g    VP                  4      Vn        VP                   UU	u. uF5  w  rVP                  R4      P!                  4       V	P                  R4      3NK7  	  up	pVn        V'       d   RMRVn        VP$                  ;'       g    ^ Vn        VP&                  Vn        VP*                  '       * Vn        VP                   F-  w  rV
R8X  g   K  VP/                  4       R8X  g   K%  RVn         V# 	  V# u up	pi )zBuild request from callback parser state.

Args:
    parser: H1CProtocol or PythonProtocol instance
    is_ssl: Whether connection is SSL/TLS

Returns:
    CallbackRequest instance
)unquote_to_bytesascii   ?zutf-8replace)errorsr    asgi_headersNhttpsr,  s   expects   100-continueT)urllib.parser8  rS   r   rT   r   r3  r/  r.  r0  rU   r   listgetattrrV   r1  r   r2  rW   rX   rp   rY   r4  r   r5  )clsparseris_sslr8  reqraw_url	path_part
query_partnr  r   r   s   &&&         r   from_parserCallbackRequest.from_parser^  s    	2e]]))'2
 ++7?$+MM$$:!I$L'	299')9TCH")))4CI"L'077	7RCHCI..+))
 !!F!X!X&..Y 
& XXi &&(!((9*=>&

 !'WF
#2277a''#555 ">>KDy U[[]o%E+/(
 *
 
!
s   ';G=c                    V P                   '       d   R# V P                   FA  w  rVR8X  g   K  VP                  4       P                  R4      pVR8X  d    R# VR8X  d    R#  M	  V P                  R8*  # )z8Check if connection should be closed after this request.T
CONNECTIONz 	closez
keep-aliveFr   )r4  rV   r   r   r   )r`   r   r   r  s   &   r   should_closeCallbackRequest.should_close  se    ???<<KD|#KKM''.<,&  ( ||v%%r   c                d    VP                  4       pV P                   F  w  r#W!8X  g   K  Vu # 	  R# )z.Get a header value by name (case-insensitive).N)r   rV   )r`   r   hr  s   &&  r   
get_headerCallbackRequest.get_header  s,    zz|LLDAy ! r   )r5  rp   rW   r0  rV   r1  rS   r4  rT   r|   r/  r3  r2  r.  r   Nr-  )F)r   r   r	   r
   r   r$  rl   classmethodrK  rP  rT  r   r&  r'  s   @r   r*  r*  @  s:     
I*" 6 6p& r   r*  )s   hostr   r   s   trailers   authorizations   te)r   r   r   enumr   	Exceptionr   r   r   r   	frozensetr  r   r   r   r#   r%   r'   r*   r-   r/   r1   r3   r5   r7   r9   r*  r   r   r   <module>rZ     s  
   1 1*z *, ,
 F
 #, - #  w  1z 16* 6   :    
  J  /
 /;z ;0J 0S Slk kr   