
    +h.                     ,   d dl Z d dlZd dlZd dlmZmZmZmZ d dlm	Z	m
Z
mZmZmZmZmZmZ d dlmZmZ d dlmZ d dlmZmZ dZdZdZ ej4                  d	      Z ej4                  d
      Z ej4                  d      Z G d de      Z G d de      Z y)    N)ChunkedReaderLengthReader	EOFReaderBody)InvalidHeaderInvalidHeaderName
NoMoreDataInvalidRequestLineInvalidRequestMethodInvalidHTTPVersionLimitRequestLineLimitRequestHeaders)InvalidProxyLineForbiddenProxyRequest)InvalidSchemeHeaders)bytes_to_strsplit_request_urii  i   z%[\x00-\x1F\x7F()<>@,;:\[\]={} \t\\\"]z[A-Z0-9$-_.]{3,20}zHTTP/(\d+)\.(\d+)c                   *    e Zd Zd Zd Zd Zd Zd Zy)Messagec                 X   || _         || _        || _        || _        d | _        g | _        g | _        d | _        |j                  rdnd| _	        |j                  | _
        | j                  dk  s| j                  t        kD  rt        | _
        |j                  | _        | j                  dk  rt        | _        | j                  xs t        }| j                  |dz   z  dz   | _        | j                  | j                        }| j                  j!                  |       | j#                          y )Nhttpshttpr         )cfgunreader	peer_addrremote_addrversionheaderstrailersbodyis_sslschemelimit_request_fieldsMAX_HEADERSlimit_request_field_sizeDEFAULT_MAX_HEADERFIELD_SIZEmax_buffer_headersparseunreadset_body_reader)selfr   r   r   max_header_field_sizeunuseds         H/var/www/html/venv/lib/python3.12/site-packages/gunicorn/http/message.py__init__zMessage.__init__   s    "$	!$g %($<$<!%%*,,{:(3D%(+(D(D%((1,,HD) !% = = ]A]"&";";"Q&#(*+#, DMM*V$    c                     t               N)NotImplementedError)r-   r   s     r0   r*   zMessage.parse;   s    !##r2   c                 R   | j                   }g }|j                  d      D cg c]  }t        |      dz    }}d}i }d|j                  v s5t	        | j
                  t              r| j
                  d   |j                  v r|j                  }|rt        |      | j                  k\  rt        d      |j                  d      }t        |      }	|j                  d      dk  rt        |j                               |j                  dd      \  }
}| j                   j                  r |
j!                  d	      j#                         }
n|
j#                         }
t$        j'                  |
      rt)        |
      |
j                         |j+                         g}}
|r||d   j-                  d
      rh|j                  d      }|	t        |      z  }	|	| j.                  cxkD  rdkD  rt        d       |j1                  |       |r|d   j-                  d
      rhdj3                  |      j!                         }|	| j.                  cxkD  rdkD  rt        d       |
|v r2|||
   k(  }|rdnd}|r|| j4                  k7  rt7               d}|| _        |j1                  |
|f       |r|S c c}w )N   
z
F*r   zlimit request headers fields:   z 	) 	z!limit request headers fields size r   r   T)r   splitr   forwarded_allow_ips
isinstancer   tuplesecure_scheme_headerslenr%   r   popfindr   stripstrip_header_spacesrstripupper	HEADER_REsearchr   lstrip
startswithr'   appendjoinr$   r   )r-   datar   r    linelinesscheme_headerrB   currheader_lengthnamevaluesecurer$   s                 r0   parse_headerszMessage.parse_headers>   s~   hh :>G9LMd#f,MM  "3***4>>51>>!$(?(??$'$=$=! 7|t888)*HII 99Q<DIMyy~!#DJJL11**S!,KD%xx++{{5)//1zz|%'--**,(8%D E!H//<yy|T* 4#@#@D1D- /< = = E T" E!H//< GGEN))+Et<<@q@)*MNN A ,,"7"==$* ,244$(M"(DKNND%=)U X q Ns   J$c                 <   d}d }| j                   D ]8  \  }}|dk(  r|t        d|       |}|dk(  s#|j                         dk(  s7d}: |r%t        t	        | | j
                              | _        y |k	 t        |      j                         rt        |      }nt        d|       	 |dk  rt        d|       t        t        | j
                  |            | _        y t        t        | j
                              | _        y # t        $ r t        d|       w xY w)NFzCONTENT-LENGTH)reqzTRANSFER-ENCODINGchunkedTr   )r    r   lowerr   r   r   r"   str	isnumericint
ValueErrorr   r   )r-   r\   content_lengthrV   rW   s        r0   r,   zMessage.set_body_reader}   s   !\\ 	#MT5''!-'(8dCC!&,,;;=I-"G	# ]4?@DI'@~&002%(%8N'(8dCC # !#$4$??\$--HIDIYt}}56DI  @#$4$??@s   62D Dc                     | j                   D ]8  \  }}|dk(  s|j                         j                         }|dk(  r y|dk(  r y n | j                  dk  S )N
CONNECTIONcloseTz
keep-aliveF)r:   r   )r    r]   rF   r   )r-   hvs      r0   should_closezMessage.should_close   s\    ll 	FQL GGIOO%<,& 	 ||v%%r2   N)__name__
__module____qualname__r1   r*   rY   r,   rh    r2   r0   r   r      s    :$=~7>	&r2   r   c                   X     e Zd Zd
 fd	ZddZd ZddZd Zd Zd Z	d Z
 fd	Z xZS )Requestc                    d | _         d | _        d | _        d | _        d | _        |j
                  | _        | j
                  dk  s| j
                  t        k\  rt        | _        || _        d | _        t        | )  |||       y Nr   )methoduripathqueryfragmentlimit_request_lineMAX_REQUEST_LINE
req_numberproxy_protocol_infosuperr1   )r-   r   r   r   rx   	__class__s        r0   r1   zRequest.__init__   s{    	
 #&"8"8##a'**.>>&6D#$#' h	2r2   c                     |j                         }|s%|r
t               t        |j                               |j	                  |       y r4   )readStopIterationr	   getvaluewrite)r-   r   bufstoprP   s        r0   get_datazRequest.get_data   s7    }}#o%S\\^,,		$r2   c                 j   t        j                         }| j                  ||d       | j                  ||| j                        \  }}| j                  t        |            rEt        j                         }|j                  |       | j                  ||| j                        \  }}| j                  |       t        j                         }|j                  |       |j                         }|j                  d      }|d d dk(  }	 |j                  d      }|d d dk(  }|dk  rG|sE| j                  ||       |j                         }t        |      | j                  kD  rt        d      ng|r| j                  j                  |dd         y| j!                  |d |       | _        ||d	z   d  }d }|S )
NT)r   s   

r   r7   r   zmax buffer headersr2   r   )ioBytesIOr   	read_linerv   proxy_protocolr   r   parse_request_liner   rE   rC   r)   r   r   r+   rY   r    )	r-   r   r   rQ   rbufrP   idxdonerets	            r0   r*   zRequest.parse   s   jjlh$/ ^^Hc43J3JK
d |D12**,CIIdO#t7N7NOJD$%jjl		$ ||~ii$BQx7"))K(C8w&DQwth,||~t9t666-.BCC  MM  ab*))$t*5378n
r2   c                 D   |j                         }	 |j                  d      }|dk\  r||cxkD  rdkD  rn nt        ||      nRt        |      dz
  |cxkD  rdkD  rn nt        t        |      |      | j	                  ||       |j                         }|d | ||dz   d  fS )Nr7   r   r   )r   rE   r   rC   r   )r-   r   r   limitrP   r   s         r0   r   zRequest.read_line   s    ||~))G$Cax??*3664y1}u(q(&s4y%88MM(C(<<>D  Tc
S1WX  	 r2   c                     | j                   j                  sy| j                  dk7  ry|j                  d      sy| j	                          | j                  |       y)z        Detect, check and parse proxy protocol.

        :raises: ForbiddenProxyRequest, InvalidProxyLine.
        :return: True for proxy protocol line else False
        Fr:   PROXYT)r   r   rx   rM   proxy_protocol_access_checkparse_proxy_protocol)r-   rQ   s     r0   r   zRequest.proxy_protocol  sO     xx&&??aw'((*!!$'r2   c                     d| j                   j                  vrYt        | j                  t              r>| j                  d   | j                   j                  vrt        | j                  d         y y y )Nr8   r   )r   proxy_allow_ipsr@   r   rA   r   )r-   s    r0   r   z#Request.proxy_protocol_access_check  sa    txx///t~~u-q!)A)AA'q(9:: B . 0r2   c                 6   |j                         }t        |      dk7  rt        |      |d   }|d   }|d   }|dvrt        d|z        |dk(  rJ	 t        j                  t        j
                  |       t        j                  t        j
                  |       nN|dk(  rI	 t        j                  t        j                  |       t        j                  t        j                  |       	 t        |d	         }t        |d
         }d|cxk  rdk  rn nd|cxk  rdk  sn t        d|z        |||||d| _
        y # t        j                  $ r t        |      w xY w# t        j                  $ r t        |      w xY w# t        $ r t        d|z        w xY w)N   r:   r      )TCP4TCP6zprotocol '%s' not supportedr   r   r      zinvalid port %sr   i  )r   client_addrclient_port
proxy_addr
proxy_port)r>   rC   r   socket	inet_ptonAF_INETerrorAF_INET6r`   ra   ry   )r-   rQ   bitsprotos_addrd_addrs_portd_ports           r0   r   zRequest.parse_proxy_protocol  s   zz|t9>"4(( Qaa (("#@5#HIIF?-  8  8 f_-  &9  &9	=a\Fa\F f%%A,@5,@"#4t#;<< $!!  $
 ' << -&t,,- << -&t,,-  	="#4t#;<<	=s&   AD<  AE )F  <EE= Fc                    |j                  d d      D cg c]  }t        |       }}t        |      dk7  rt        t        |            t        j                  |d         st        |d         |d   j                         | _        |d   | _	        	 t        | j                        }|j                  xs d| _        |j                  xs d| _        |j                  xs d| _        t        j                  |d         }|t!        |d         t#        |j%                  d            t#        |j%                  d            f| _        y c c}w # t        $ r t        t        |            w xY w)Nr   r   r   r:   r=   )r>   r   rC   r
   METH_REmatchr   rI   rq   rr   r   ra   rs   rt   ru   
VERSION_REr   r`   groupr   )r-   
line_bytesbitr   partsr   s         r0   r   zRequest.parse_request_lineJ  s=   -7-=-=dA-FGcS!GGt9>$\*%=>> }}T!W%&tAw//1gmmo 7	?%dhh/E JJ$"	[[&B
,"   a)=$T!W--EKKN+SQ-@A1 H  	?$\*%=>>	?s   E
E E-c                     t         |           t        | j                  j                  t
              r%t        t        | j                  d            | _        y y rp   )	rz   r,   r@   r"   readerr   r   r   r   )r-   r{   s    r0   r,   zRequest.set_body_readere  s>    !dii&&	2\$--;<DI 3r2   )r:   )F)r   )ri   rj   rk   r1   r   r*   r   r   r   r   r   r,   __classcell__)r{   s   @r0   rn   rn      s8    3"+Z $*;+
ZB6= =r2   rn   )!r   rer   gunicorn.http.bodyr   r   r   r   gunicorn.http.errorsr   r   r	   r
   r   r   r   r   r   r   r   gunicorn.utilr   r   rw   r&   r(   compilerJ   r   r   objectr   rn   rl   r2   r0   <module>r      s    
 	  K K  
 I 5 9 # BJJ?@	
"***
+RZZ,-
H&f H&V@=g @=r2   