
    Gix_                        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r " S	 S
\5      r " S S\5      r  " S S\5      r!Sr"Sr#Sr$Sr%\RL                  " S\RN                  " \%5      -  5      r(\RL                  " S5      r)\RL                  " S5      r*\RL                  " S5      r+S r, " S S5      r- " S S\-5      r.g)    )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_uris   

 
QUIT
c                        \ rS rSrSrSrSrSrg)	PPCommand   zPROXY protocol v2 commands.r       N)__name__
__module____qualname____firstlineno____doc__LOCALPROXY__static_attributes__r       _/var/www/fortnox.synktek.com/backend/venv/lib/python3.13/site-packages/gunicorn/http/message.pyr   r      s    %EEr&   r   c                   (    \ rS rSrSrSrSrSrSrSr	g)	PPFamily"   z#PROXY protocol v2 address families.r   r         r   N)
r   r   r    r!   r"   UNSPECINETINET6UNIXr%   r   r&   r'   r)   r)   "   s    -FDEDr&   r)   c                   $    \ rS rSrSrSrSrSrSrg)
PPProtocol*   z&PROXY protocol v2 transport protocols.r   r   r+   r   N)	r   r   r    r!   r"   r-   STREAMDGRAMr%   r   r&   r'   r2   r2   *   s    0FFEr&   r2   i  i   z!#$%&'*+-.^_`|~z[%s0-9a-zA-Z]+z[a-z#]zHTTP/(\d)\.(\d)z[\0\r\n]c                     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                   <    \ rS rSrS rS rS rS
S jrS rS r	Sr
g	)MessageR   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   r+      )cfg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)selfrH   rI   rJ   max_header_field_sizeunuseds         r'   __init__Message.__init__S   s    "$	!$g&+# %($<$<!%%*,,{:(3D%(+(D(D%((1,,HD) !% = = ]A]"&";";"Q&#(*+#, DMM*V$r&   c                     SU l         g )NT)rR   r\   s    r'   force_closeMessage.force_closer   s	    r&   c                     [        5       eN)NotImplementedError)r\   rI   s     r'   rY   Message.parseu   s    !##r&   c                    U R                   n/ nUR                  S5       Vs/ s H  n[        U5      PM     nnSn0 n/ n	U(       a  On[        U R                  [
        5      (       a7  [        U R                  S   UR                  UR                  5       5      (       a  UR                  nUR                  n	U(       Ga  [        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R/                  S5      /nU(       a  US   R1                  S	5      (       a  U R                   R2                  (       d  [5        U5      eUR                  S5      n
U[        U
5      [        S5      -   -  nXR6                  s=:  a  S:  a  O  O[        S
5      eUR9                  U
R/                  S5      5        U(       a  US   R1                  S	5      (       a  M  SR;                  U5      n[<        R?                  U5      (       a  [!        U5      eXR6                  s=:  a  S:  a  O  O[        S
5      eU(       d>  US:X  a8  URA                  5       S:X  a  U RB                  S:  a  OSU l"        O[G        U5      eX;   a;  XU   :H  nU(       a  SOSnU(       a  XRH                  :w  a
  [K        5       eOSnXl$        SU;   aO  X;   d  SU	;   a  OCU R                   RL                  S:X  a  O(U R                   RL                  S:X  a  GM  [+        U5      eUR9                  X45        U(       a  GM  U$ s  snf )N   
Fr   zlimit request headers fieldsz
:r    	) 	z!limit request headers fields sizez	 rm   EXPECTz100-continuer   r   TrE   rF   _r7   	dangerousdrop)'rH   splitr   
isinstancerJ   tupler@   forwarded_allow_ipsforwarded_allow_networkssecure_scheme_headersforwarder_headerslenrT   r   popfindr   strip_header_spacesrstripTOKEN_RE	fullmatchr	   upperstrip
startswithpermit_obsolete_foldingr   rV   appendjoin!RFC9110_5_5_INVALID_AND_DANGEROUSsearchlowerrL   rS   r   rQ   r   
header_map)r\   datafrom_trailerrH   rM   linelinesscheme_headerry   rz   currheader_lengthnamevaluesecurerQ   s                   r'   parse_headersMessage.parse_headersx   sW   hh 15

70CD0Cd#0CD  " T^^U33"4>>!#4c6M6M#&#?#?#AC C$'$=$=! # 5 5 7|t888)*HII 99Q<DIF3Myy~"#D))**S!,KDxx++{{5)%%d++'-- ::<D[['(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DH$4 ;;=N2||f, 6:3 ,E22,"==$* ,244 - %)M"(K d{,7H0HXX((K7XX((F2  ,D11NND=)o er W Es   O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)NFzCONTENT-LENGTH)reqzTRANSFER-ENCODING,chunkedTidentity)compressdeflategziprp   r   )rM   r   rt   r   r   rc   r   rL   r   r   rI   rO   str	isnumericintr:   r   r   )r\   r   content_lengthr   r   vvalsvals           r'   r[   Message.set_body_reader   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
CONNECTIONrl   closez
keep-aliveFr   r   )rR   rM   r   r   rL   )r\   hr   s      r'   should_closeMessage.should_close&  sa    ??llFQL GGIOOE*<,&  # ||v%%r&   )rS   rO   rH   rM   rV   rT   rX   rR   rJ   rK   rQ   rN   rI   rL   NF)r   r   r    r!   r_   rc   rY   r   r[   r   r%   r   r&   r'   rB   rB   R   s#    >$pd:7x&r&   rB   c                      ^  \ rS rSrSU 4S jjrSS j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$ )Requesti4  c                   > S U l         S U l        S U l        S U l        S U l        UR
                  U l        U R
                  S:  d  U R
                  [        :  a  [        U l        X@l        S U l        [        TU ])  XU5        g Nr   )methoduripathqueryfragmentlimit_request_lineMAX_REQUEST_LINE
req_numberproxy_protocol_infosuperr_   )r\   rH   rI   rJ   r   	__class__s        r'   r_   Request.__init__5  sw    	
 #&"8"8##a'**.>>&6D#$#' 	2r&   c                     UR                  5       nU(       d*  U(       a
  [        5       e[        UR                  5       5      eUR	                  U5        g rf   )readStopIterationr
   getvaluewriter\   rI   bufstopr   s        r'   get_dataRequest.get_dataF  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                  XU R                  5      u  pBU 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        XWS-   S  nU$ )NT)r   offr   r+   rj   s   

r   zmax buffer headersr&   F)r   rG   )	bytearray	read_intorH   proxy_protocolr   _handle_proxy_protocol	read_liner   parse_request_linebytesr}   r{   rX   r   rI   rZ   r   rM   )	r\   rI   r   moder   r   doneidxrets	            r'   rY   Request.parseN  sL   kx40 xx&&5=T__1--hTBC 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_intou  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).rj   r   r+   N)r   r}   r   r{   r   r   )r\   rI   r   limitr   r   s         r'   r   Request.read_line~  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   )r\   rI   r   counts       r'   
read_bytesRequest.read_bytes  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.
   )v2autoN)v1r      s   PROXY )r{   r   PP_V2_SIGNATUREproxy_protocol_access_check_parse_proxy_protocol_v2_parse_proxy_protocol_v1)r\   rI   r   r   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)ru   rJ   rv   r@   rH   proxy_allow_ipsproxy_allow_networksr   rb   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.
rj   Nr+   rm   r   r   r,   )TCP4TCP6zprotocol '%s' not supportedr   r   rG      zinvalid port %sr   i  r   client_addrclient_port
proxy_addr
proxy_port)r   r   r}   r   r   rt   r{   r   socket	inet_ptonAF_INETOSErrorAF_INET6r   r:   r   )r\   rI   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      rG   r+   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*   r   r-   zunsupported address family %d)r{   r   structunpackr   r   r   r#   r$   r   r   r2   r4   r)   r.   r   	inet_ntopr   r/   r   r-   )r\   rI   r   ver_cmd	fam_protolengthrL   commandtotal_header_sizefamilyprotocol	addr_datar  r  r  r  r  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                  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R/                  S5      5      [-        UR/                  S5      5      4U l        SU R0                  s=::  a  S	:  d3  O  U R
                  R2                  (       d  [+        U R0                  5      eg g s  snf ! [          a    [        [        U5      5      ef = f)
N    r+   r,   r      r    r   )r+   r   )rt   r   r{   r   r   rH   !permit_unconventional_http_methodMETHOD_BADCHAR_REr   r   r   r   casefold_http_methodr   r   r   r:   r   r   r   
VERSION_REr   r   grouprL   "permit_unconventional_http_version)r\   
line_bytesbitr   partsmatchs         r'   r   Request.parse_request_lineN  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$\*%=>>	?%dhh/E JJ$"	[[&B
," $$T!W-=$T!W--EKKN+SQ-@A..88>>(66 ? /c HL  	?$\*%=>>	?s   JJ J<c                    > [         TU ]  5         [        U R                  R                  [
        5      (       a%  [        [        U R                  S5      5      U l        g g r   )	r   r[   ru   rO   readerr   r   r   rI   )r\   r   s    r'   r[   Request.set_body_reader  sA    !dii&&	22\$--;<DI 3r&   )rO   r   rM   r   r   r   r   r   r   r   rL   )r   r   )r   )r   r   r    r!   r_   r   rY   r   r   r   r   r   r   r   r   r[   r%   __classcell__)r   s   @r'   r   r   4  sI    3"%N+&:,;;z[2z57n= =r&   r   )/enumr   r8   rer   r  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)   r2   r   rU   rW   RFC9110_5_6_2_TOKEN_SPECIALScompileescaper   r"  r$  r   r@   rB   r   r   r&   r'   <module>r8     s   
   	   K K    ] \ 5 9 F w    #   2 ::'2995Q+RSTJJx( ZZ*+
$&JJ{$; !(_& _&DT=g T=r&   