
    (j                     
   S SK Jr  S SKrS SKrS SKrS SKrS SKJrJrJ	r	J
r
  S SKJrJrJrJrJrJrJrJrJrJrJr  S SKJrJrJr  S SKJr  S SKJrJr  SqSqSr S	 r!S
r" " S S\5      r# " S S\5      r$ " S S\5      r%Sr&Sr'Sr(Sr)\RT                  " S\RV                  " \)5      -  5      r,\RT                  " S5      r-\RT                  " S5      r.\RT                  " S5      r/\0" S5      r1S r2 " S S5      r3 " S S\35      r4g)    )IntEnumN)ChunkedReaderLengthReader	EOFReaderBody)InvalidHeaderInvalidHeaderName
NoMoreDataInvalidRequestLineInvalidRequestMethodInvalidHTTPVersionLimitRequestLineLimitRequestHeadersUnsupportedTransferCodingObsoleteFoldingExpectationFailed)InvalidProxyLineInvalidProxyHeaderForbiddenProxyRequest)InvalidSchemeHeaders)bytes_to_strsplit_request_uri)permit_obsolete_foldingstrip_header_spacesc                    [        U SS5      nUS:X  a  g[        c	   SSKnSqUq[        (       d  US:X  a  [        S	5      e[        (       d  g[        [        S
5      (       d  US:X  a  [        S5      eg/ n[         H'  n[        XS5      (       d  M  UR                  U5        M)     U(       a$  US:X  a  [        SSR                  U5      -  5      egg! [         a    Sq Nf = f)a  Check if fast C parser is available and should be used.

Returns False if:
- http_parser='python' is explicitly set
- gunicorn_h1c is not installed (in 'auto' mode)
- gunicorn_h1c < 0.4.1 (in 'auto' mode)
- Incompatible compatibility flags are enabled (in 'auto' mode)

Raises RuntimeError if:
- http_parser='fast' but gunicorn_h1c is not installed
- http_parser='fast' but gunicorn_h1c < 0.4.1
- http_parser='fast' but incompatible flags are enabled
http_parserautopythonFNr   Tfastz1gunicorn_h1c not installed but http_parser='fast'r   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, )
getattr_fast_parser_availablegunicorn_h1c_fast_parser_moduleImportErrorRuntimeErrorhasattr_FAST_PARSER_INCOMPATIBLE_FLAGSappendjoin)cfgparser_settingr"   incompatibleflags        M/var/www/html/KUNJ/venv/lib/python3.13/site-packages/gunicorn/http/message.py_check_fast_parserr/   #   s	     S-8N!%	+%)"". "!n&>NOO!! &(:;;V#E 
  L/3e$$% 0 V#C))L)*  G  	+%*"	+s   C C"!C"s   

 
QUIT
c                        \ rS rSrSrSrSrSrg)	PPCommandf   zPROXY protocol v2 commands.r       N)__name__
__module____qualname____firstlineno____doc__LOCALPROXY__static_attributes__r4       r.   r1   r1   f   s    %EEr=   r1   c                   (    \ rS rSrSrSrSrSrSrSr	g)	PPFamilyl   z#PROXY protocol v2 address families.r   r3         r4   N)
r5   r6   r7   r8   r9   UNSPECINETINET6UNIXr<   r4   r=   r.   r?   r?   l   s    -FDEDr=   r?   c                   $    \ rS rSrSrSrSrSrSrg)
PPProtocolt   z&PROXY protocol v2 transport protocols.r   r3   rA   r4   N)	r5   r6   r7   r8   r9   rC   STREAMDGRAMr<   r4   r=   r.   rH   rH   t   s    0FFEr=   rH   i  i   z!#$%&'*+-.^_`|~z[%s0-9a-zA-Z]+z[a-z#]zHTTP/(\d)\.(\d)z[\x00-\x08\x0a-\x1f\x7f])HOSTCONTENT-LENGTHTRANSFER-ENCODINGTRAILERAUTHORIZATIONTEc                     SU;   a  g [         R                  " U 5      nU H
  nX4;   d  M
    g   g! [         a     gf = f)zCheck if IP address is in the allow list.

Args:
    ip_str: The IP address string to check
    allow_list: The original allow list (strings, may contain "*")
    networks: Pre-computed ipaddress.ip_network objects from config
*TF)	ipaddress
ip_address
ValueError)ip_str
allow_listnetworksipnetworks        r.   _ip_in_allow_listr\      sQ     j!!&) =    s   0 
==c                   N    \ rS rSrS rS rS rS r SS jrSS jr	S r
S	 rS
rg)Message   c                    Xl         X l        X0l        X0l        S U l        / U l        / U l        S U l        UR                  (       a  SOSU l	        SU l
        SU l        UR                  U l        U R                  S::  d  U R                  [        :  a  [        U l        UR                  U l        U R                  S::  a  [        U l        U R                  =(       d    [        nU R                  US-   -  S-   U l        U R#                  U R                  5      nU R                  R%                  U5        U R'                  5         g )NhttpshttpFr   rA      )r*   unreader	peer_addrremote_addrversionheaderstrailersbodyis_sslscheme
must_close_expected_100_continuelimit_request_fieldsMAX_HEADERSlimit_request_field_sizeDEFAULT_MAX_HEADERFIELD_SIZEmax_buffer_headersparseunreadset_body_reader)selfr*   rd   re   max_header_field_sizeunuseds         r.   __init__Message.__init__   s    "$	!$g&+# %($<$<!%%*,,{:(3D%(+(D(D%((A-,HD) !% = = ]A]"&";";"Q&#(*+#, DMM*V$r=   c                     SU l         g )NT)rm   rw   s    r.   force_closeMessage.force_close   s	    r=   c                     [        5       eN)NotImplementedError)rw   rd   s     r.   rt   Message.parse   s    !##r=   c                     U R                   n[        U R                  [        5      (       a7  [	        U R                  S   UR
                  UR                  5       5      (       a  UR                  UR                  4$ 0 / 4$ )a  Return the (secure_scheme_headers, forwarder_headers) the peer is allowed to set.

When the peer's address is not in ``forwarded_allow_ips`` (or networks),
configured forwarding/secure-scheme policy must be ignored to prevent
spoofing.  Returns ``({}, [])`` when the peer is untrusted.
r   )	r*   
isinstancere   tupler\   forwarded_allow_ipsforwarded_allow_networkssecure_scheme_headersforwarder_headers)rw   r*   s     r.   _peer_trusted_for_forwarded#Message._peer_trusted_for_forwarded   sl     hh4>>511$T^^A%68O8O%(%A%A%CE E,,c.C.CCC2vr=   c                    U(       d>  US:X  a8  UR                  5       S:X  a  U R                  S:  a  OSU l        O[        U5      eX;   aA  X$U   :H  nU(       a  SOSnUS   (       a  XR                  :w  a
  [        5       eOSUS'   Xl        SU;   aS  X;   d  S	U;   a   X4$ U R                  R                  S
:X  a   X4$ U R                  R                  S:X  a  g[        U5      eX4$ )a  Apply per-header policy shared between Python and fast parsers.

Mutates ``self._expected_100_continue`` and ``self.scheme`` as needed.
``scheme_state`` is a single-element list used as a mutable sentinel
so the caller can detect repeated scheme headers.

Returns the (name, value) pair to retain, or ``None`` to drop the
header (per ``header_map='drop'``).  Raises the same exceptions the
Python path raises so behavior is identical regardless of parser.
EXPECTz100-continuer3   r3   Tra   rb   r   _rS   	dangerousdropN)	lowerrg   rn   r   rl   r   r*   
header_mapr	   )	rw   namevaluescheme_stater   r   from_trailersecurerl   s	            r.   _apply_header_policyMessage._apply_header_policy   s     0 {{}.<<&( 26D/ (..(D99F &WFFA[[(.00 ) #'Q$ $;(C3D,D } $$3 } $$.  (--}r=   c           	         / nUR                  S5       Vs/ s H  n[        U5      PM     nnS/nU(       a  0 / pOU R                  5       u  pxU(       Gas  [        U5      U R                  :  a  [        S5      eUR                  S5      n	[        U	5      [        S5      -   n
U	R                  S5      S::  a  [        U	5      eU	R                  SS5      u  pU R                  R                  (       a  UR                  S5      n[        R                  U5      (       d  [        U5      eUR                  5       nU(       a  U[         ;   a  [        U5      eUR#                  S5      /nU(       a  US   R%                  S	5      (       a  U R                  R&                  (       d  [)        U5      eUR                  S5      n	U
[        U	5      [        S5      -   -  n
XR*                  s=:  a  S:  a  O  O[        S
5      eUR-                  U	R#                  S5      5        U(       a  US   R%                  S	5      (       a  M  SR/                  U5      n[0        R3                  U5      (       a  [        U5      eXR*                  s=:  a  S:  a  O  O[        S
5      eU R5                  XUXxUS9nUc  GM`  UR-                  U5        U(       a  GMs  U$ s  snf )N   
Fzlimit request headers fieldsr   z
:r3    	) 	z!limit request headers fields sizez	 r   r   )splitr   r   lenro   r   popfindr   r*   r   rstripTOKEN_RE	fullmatchr	   upperRFC9110_6_5_1_FORBIDDEN_TRAILERstrip
startswithr   r   rq   r(   r)   !RFC9110_5_5_INVALID_AND_DANGEROUSsearchr   )rw   datar   rh   linelinesr   r   r   currheader_lengthr   r   kepts                 r.   parse_headersMessage.parse_headers  sn    15

70CD0Cd#0CD w 8:2#47;7W7W7Y4! 7|t888)*HII 99Q<DIF3Myy~"#D))**S!,KDxx++{{5)%%d++'-- ::<D (G G'--[['(E E!H//<<xx77)$//yy|TS[!88 #@#@D1D- /< = =TZZ./ E!H//<< HHUOE077>>#D))<<@q@)*MNN,,\%) - D
 |NN4 k en I Es   K
c                     SnS nU R                    H  u  p4US:X  a  Ub
  [        SU S9eUnM  US:X  d  M$  UR                  S5       Vs/ s H  oUR                  5       PM     nnU H  nUR	                  5       S:X  a  U(       a
  [        SU S9eSnM,  UR	                  5       S:X  a  U(       a
  [        SU S9eMS  UR	                  5       S	;   a#  U(       a
  [        SU S9eU R                  5         M  [        U5      e   M     U(       aK  U R                  S
:  a
  [        SU S9eUb
  [        SU S9e[        [        X R                  5      5      U l        g Ubj   [        U5      R                  5       (       a  [        U5      nO
[        SU S9eUS:  a
  [        SU S9e[        [!        U R                  U5      5      U l        g [        [#        U R                  5      5      U l        g s  snf ! [         a    [        SU S9ef = f)NFrM   )reqrN   ,chunkedTidentity)compressdeflategzipr   r   )rh   r   r   r   r   r~   r   rg   r   r   rd   rj   str	isnumericintrV   r   r   )rw   r   content_lengthr   r   vvalsvals           r.   rv   Message.set_body_readere  s   !\\MT''!-'(8dCC!&,, ,1;;s+;<+;a	+;<Cyy{i/""/0C"NN"&
2 #"/0C"NN #(GG""/0C"NN((*7>>#   *8  ||f$#$7TBB) $$4$??]4?@DI'@~&0022%(%8N'(8dCC !#$4$??\$--HIDIYt}}56DI] =L  @#$4$??@s   G#)G(  
G( (G=c                     U R                   (       a  gU R                   H<  u  pUS:X  d  M  UR                  5       R                  S5      nUS:X  a    gUS:X  a    g  O   U R                  S:*  $ )NT
CONNECTIONr   closez
keep-aliveFr3   r   )rm   rh   r   r   rg   )rw   hr   s      r.   should_closeMessage.should_close  sa    ??llFQL GGIOOE*<,&  # ||v%%r=   )rn   rj   r*   rh   rq   ro   rs   rm   re   rf   rl   ri   rd   rg   NF)r5   r6   r7   r8   rz   r~   rt   r   r   r   rv   r   r<   r4   r=   r.   r^   r^      s3    >$  +0:xHT:7x&r=   r^   c                      ^  \ rS rSrSU 4S jjrSS jrS rS rS rSS jr	SS jr
S	 rS
 rS rS rS rS rU 4S jrSrU =r$ )Requesti  c                   > S U l         S U l        S U l        S U l        S U l        UR
                  U l        U R
                  S:  a  [        U l        U R
                  S:X  a  SU l        O<U R
                  [        :  a  [        U l        [        U l        OU R
                  U l        X@l        S U l	        [        U5      U l        [        TU ]5  XU5        g )Nr   i   )methoduripathqueryfragmentlimit_request_lineMAX_REQUEST_LINE_fast_limit_request_line
req_numberproxy_protocol_infor/   	_use_fastsuperrz   )rw   r*   rd   re   r   	__class__s        r.   rz   Request.__init__  s    	
 #&"8"8""Q&&6D# ""a',7D)$$(88,<D)&6D#,0,C,CD)$#'  ,C0	2r=   c                     UR                  5       nU(       d*  U(       a
  [        5       e[        UR                  5       5      eUR	                  U5        g r   )readStopIterationr
   getvaluewriterw   rd   bufstopr   s        r.   get_dataRequest.get_data  s7    }}#o%S\\^,,		$r=   c                    [        5       nU R                  XSS9  U R                  R                  nUS:w  a"  U R                  S:X  a  U R                  XU5      nU R                  (       a  U R                  X5      $ U R                  X5      $ )NT)r   offr3   )		bytearray	read_intor*   proxy_protocolr   _handle_proxy_protocolr   _parse_fast_parse_pythonrw   rd   r   modes       r.   rt   Request.parse  sy    kx40 xx&&5=T__1--hTBC >>##H22!!(00r=   c           
      ~   [        U5      nSn  [        R                  UUU R                  U R                  U R
                  U R                  R                  U R                  R                  S9n [-        US   5      U l        [-        US   5      U l        U R                  R2                  (       a  U R.                  R5                  5       U l        [        U R0                  5      S:X  a  [+        U R0                  5      e [7        U R0                  5      nUR:                  =(       d    SU l        UR<                  =(       d    SU l        UR>                  =(       d    SU l        SUS	   4U l         / U l!        S
/nU RE                  5       u  pUS    H\  u  p[-        U5      R5                  5       n[-        U5      nU RG                  XUX5      nUc  MA  U RB                  RI                  U5        M^     US   nUUS $ ! [        R                   a\    [        U5      nU R                  X5        [        U5      n[        U5      U R                  U R                  -   :  a  [        S5      e GO1[        R                   a  n[        [        U5      5      eSnAf[        R                   a  n[        [        U5      5      eSnAf[        R                    a  n[!        [        U5      5      eSnAf[        R"                   a  n[#        [        U5      5      eSnAf[        R$                   a  n[%        [        U5      5      eSnAf[        R&                   a  n['        [        U5      5      eSnAf[        R(                   a  n[+        [        U5      5      eSnAff = fGM  ! [8         a    [+        U R0                  5      ef = f)z:Parse request using fast C parser (gunicorn_h1c >= 0.4.1).r   )last_lenr   ro   rq   !permit_unconventional_http_method"permit_unconventional_http_versionmax buffer headersNr   r    r3   minor_versionFrh   consumed)%bytesr#   parse_requestr   ro   rq   r*   r   r   IncompleteErrorr   r   rs   r   r   r   r   r   r	   r   
ParseErrorr   r   r   r   casefold_http_methodr   r   rV   r   r   r   rg   rh   r   r   r(   )rw   rd   r   r   r   resultepartsr   r   r   
name_bytesvalue_bytesr   r   r   r   s                    r.   r   Request._parse_fast  s,    Sz 1 -::%'+'D'D)-)B)B-1-J-J6:hh6`6`7;xx7b7b ;  . #6(#34v/ 88((++++-DK txx=A$TXX..	/%dhh/E JJ$"	[[&B
," 6/23 w373S3S3U0'-i'8#J
+113D -E,,\%D |LL% (9 *%HIC '66 Dt9x-Szt9t669V9VVV-.BCC W&77 /&s1v..&:: 2)#a&11&;; 3*3q622&99 1(Q00&88 0'A//&44 ,#CF++&11 1(Q001A `  	/$TXX..	/ss   AG9 ?N 9A,N(N;JN&J::NK%%N<LN'L;;NM&&N=NN N<c                    U R                  XU R                  5      u  p2U R                  U5        [        U5      nUSS S:H  n UR	                  S5      nUSS S:H  nUS:  aH  U(       dA  U R                  X5        [        U5      n[        U5      U R                  :  a  [        S5      eOOMj  U(       a  U R                  R                  USS 5        gU R                  USU SS	9U l        XFS
-   S nU$ )z'Parse request using pure Python parser.NrA   r   s   

r   r   r=   Fr   rc   )	read_liner   parse_request_liner   r   r   r   rs   r   rd   ru   r   rh   )rw   rd   r   r   r   doneidxrets           r.   r   Request._parse_python;  s     NN8$2I2IJ	% SzBQx7"))K(C8w&DQwtx-Szt9t666-.BCC 7   MM  ab*))$t*5)I78n
r=   c                     UR                  5       nU(       d%  U(       a
  [        5       e[        [        U5      5      eUR	                  U5        g)z7Read data from unreader and append to bytearray buffer.N)r   r   r
   r   extendr   s        r.   r   Request.read_into[  s6    }}#o%U3Z((

4r=   c                 F   [        U5      n UR                  S5      nUS:  a  XSs=:  a  S:  a  O  O[        XS5      eOO[        U5      S-
  Us=:  a  S:  a  O  O[        [        U5      U5      eU R	                  X5        [        U5      nM  USU [        XES-   S 5      4$ )z<Read a line from buffer, returning (line, remaining_buffer).r   r   rA   N)r   r   r   r   r   r   )rw   rd   r   limitr   r  s         r.   r
  Request.read_lined  s    Sz))G$Cax??*3664y1}u(q(&s4y%88NN8):D  Tc
$Qwx.)+ 	+r=   c                     [        U5      U:  a"  U R                  X5        [        U5      U:  a  M"  [        USU 5      [        X#S 5      4$ )z.Read exactly count bytes from buffer/unreader.N)r   r   r   r   )rw   rd   r   counts       r.   
read_bytesRequest.read_bytesw  sG    #hNN8) #hS%[!9S[#999r=   c                 0   [        U5      S:  a"  U R                  X5        [        U5      S:  a  M"  US;   a.  USS [        :X  a!  U R                  5         U R	                  X5      $ US;   a*  USS S:X  a!  U R                  5         U R                  X5      $ U$ )zdHandle PROXY protocol detection and parsing.

Returns the buffer with proxy protocol data consumed.
   )v2r   N)v1r      s   PROXY )r   r   PP_V2_SIGNATUREproxy_protocol_access_check_parse_proxy_protocol_v2_parse_proxy_protocol_v1r   s       r.   r   Request._handle_proxy_protocol}  s     #hmNN8) #hm >!c#2h/&A,,.00?? >!c"1g&:,,.00?? 
r=   c                 
   [        U R                  [        5      (       ad  [        U R                  S   U R                  R
                  U R                  R                  5       5      (       d  [        U R                  S   5      egg)z2Check if proxy protocol is allowed from this peer.r   N)r   re   r   r\   r*   proxy_allow_ipsproxy_allow_networksr   r}   s    r.   r   #Request.proxy_protocol_access_check  sh    t~~u--%dnnQ&79Q9Q&*hh&C&C&EG G'q(9::G .r=   c                    [        U5      nSU;  a$  U R                  X5        [        U5      nSU;  a  M$  UR                  S5      n[        USU 5      n[	        X4S-   S 5      nUR                  S5      n[        U5      S:w  a  [        U5      eUS   nUS   n	US   n
US;  a  [        S	U-  5      eUS
:X  aL   [        R                  " [        R                  U	5        [        R                  " [        R                  U
5        OQUS:X  aK   [        R                  " [        R                  U	5        [        R                  " [        R                  U
5         [        US   5      n[        US   5      nSUs=::  a  S::  a  O  OSUs=::  a  S::  d  O  [        SU-  5      eUU	UU
US.U l        U$ ! [         a    [        U5      ef = f! [         a    [        U5      ef = f! [         a    [        SU-  5      ef = f)zPParse PROXY protocol v1 (text format).

Returns buffer with v1 header consumed.
r   NrA   r   r  r3   rB   )TCP4TCP6zprotocol '%s' not supportedr)  r*  rc      zinvalid port %sr   i  r   client_addrclient_port
proxy_addr
proxy_port)r   r   r   r   r   r   r   r   socket	inet_ptonAF_INETOSErrorAF_INET6r   rV   r   )rw   rd   r   r   r  r   	remainingbitsprotos_addrd_addrs_portd_ports                r.   r"   Request._parse_proxy_protocol_v1  s    SzT!NN8):D T! ii D#J'd78n-	zz#t9>"4(( Qaa (("#@5#HIIF?-  8  8 f_-  &9  &9	=a\Fa\F f%%A,@5,@"#4t#;<< $!!  $
  7  -&t,,-  -&t,,-  	="#4t#;<<	=s&   :A
F/ A
G G! /GG!G:c                     [        U5      S:  a"  U R                  X5        [        U5      S:  a  M"  US   nUS   n[        R                  " S[	        USS 5      5      S   nUS-  S-	  nUS	:w  a  [        S
U-  5      eUS-  nU[        R                  [        R                  4;  a  [        SU-  5      eSU-   n[        U5      U:  a"  U R                  X5        [        U5      U:  a  M"  U[        R                  :X  a  SSSSSS.U l	        [        X(S 5      $ US-  S-	  n	US-  n
U
[        R                  :w  a  [        S5      e[	        USSU-    5      nU	[        R                  :X  a  US:  a  [        S5      e[        R                   " [        R"                  USS 5      n[        R                   " [        R"                  USS 5      n[        R                  " SUSS 5      S   n[        R                  " SUSS 5      S   nSnOU	[        R$                  :X  a  US:  a  [        S5      e[        R                   " [        R&                  USS 5      n[        R                   " [        R&                  USS 5      n[        R                  " SUSS 5      S   n[        R                  " SUSS 5      S   nSnO<U	[        R(                  :X  a  SSSSSS.U l	        [        X(S 5      $ [        SU	-  5      eUUUUUS.U l	        [        X(S 5      $ )zRParse PROXY protocol v2 (binary format).

Returns buffer with v2 header consumed.
   r     z>H   r      rc   rA   zunsupported version %d   zunsupported command %dr:   Nr,  zonly TCP protocol is supportedz"insufficient address data for IPv4   
   r)  $   z"insufficient address data for IPv6    "   r*  rC   zunsupported address family %d)r   r   structunpackr   r   r1   r:   r;   r   r   rH   rJ   r?   rD   r1  	inet_ntopr3  rE   r5  rC   )rw   rd   r   ver_cmd	fam_protolengthrg   commandtotal_header_sizefamilyprotocol	addr_datar9  r:  r;  r<  r8  s                    r.   r!   Request._parse_proxy_protocol_v2  s    #hmNN8) #hm b'G	tU3r":%67: T>a'a<$%=%GHH D.9??IOO<<$%=%GHH K#h**NN8) #h** ioo%")##""(D$ S!3455 d"q(t# z((($%EFF#bf-.	X]]"{()MNN%%fnni!nEF%%fnni!nEF]]41R9!<F]]42b)9:1=FEx~~%{()MNN%%fooy2GF%%fooyB7GHF]]42b)9:1=F]]42b)9:1=FEx& #+##""(D$ S!3455 %%Dv%MNN $!!  $
  /011r=   c                    UR                  SS5       Vs/ s H  n[        U5      PM     nn[        U5      S:w  a  [        [        U5      5      eUS   U l        U R
                  R                  (       di  [        R                  U R                  5      (       a  [        U R                  5      eS[        US   5      s=::  a  S::  d  O  [        U R                  5      e[        R                  U R                  5      (       d  [        U R                  5      eU R
                  R                  (       a  U R                  R                  5       U l        US   U l        [        U R                  5      S:X  a  [        [        U5      5      eU R                  S:X  a$  U R                  S:w  a  [        [        U5      5      eU R                  S	:w  aT  U R                  S:w  aD  U R                  R                  S
5      (       d$  SU R                  ;  a  [        [        U5      5      e [!        U R                  5      nUR$                  =(       d    SU l        UR&                  =(       d    SU l        UR(                  =(       d    SU l        [*        R                  US   5      nUc  [-        US   5      e[/        UR1                  S5      5      [/        UR1                  S5      5      4U l        SU R2                  s=::  a  S:  d3  O  U R
                  R4                  (       d  [-        U R2                  5      eg g s  snf ! ["         a    [        [        U5      5      ef = f)N    rA   rB   r      r3   rS   OPTIONSCONNECT/z://r   r   )rA   r   )r   r   r   r   r   r*   r   METHOD_BADCHAR_REr   r   r   r   r  r   r   r   r   rV   r   r   r   
VERSION_REr   r   grouprg   r   )rw   
line_bytesbitr7  r  matchs         r.   r  Request.parse_request_line4  s   -7-=-=dA-FG-FcS!-FGt9>$\*%=>> 1g xx99 ''44*4;;77DG***4;;77!!$++..&t{{33 88((++++-DK 7 txx=A$\*%=>> 88s?t{{i7$\*%=>>
 KK9$HHO++C00)$\*%=>>	?%dhh/E JJ$"	[[&B
," $$T!W-=$T!W--EKKN+SQ-@A..88>>(66 ? /} Hf  	?$\*%=>>	?s   L0 L5 5Mc                    > [         TU ]  5         [        U R                  R                  [
        5      (       a%  [        [        U R                  S5      5      U l        g g )Nr   )	r   rv   r   rj   readerr   r   r   rd   )rw   r   s    r.   rv   Request.set_body_readerx  sA    !dii&&	22\$--;<DI 3r=   )r   r   rj   r   rh   r   r   r   r   r   r   r   rg   )r3   r   )r   )r5   r6   r7   r8   rz   r   rt   r   r   r   r
  r  r   r   r"  r!  r  rv   r<   __classcell__)r   s   @r.   r   r     sV    3:1Un@+&:,;;z[2zB7H= =r=   r   )5enumr   rT   rer1  rI  gunicorn.http.bodyr   r   r   r   gunicorn.http.errorsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   gunicorn.utilr   r   r!   r#   r'   r/   r  r1   r?   rH   r   rp   rr   RFC9110_5_6_2_TOKEN_SPECIALScompileescaper   r[  r\  r   	frozensetr   r\   r^   r   r4   r=   r.   <module>ro     s"  
   	   K K    ] \ 5 9   # <@ F w    #   2 ::'2995Q+RSTJJx( ZZ*+
 %'JJ/J$K !
 #, - # (A& A&HL=g L=r=   