
    Tf~B                     X   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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d	Z ej        d
 ej        e          z            Z ej        d          Z ej        d          Z  G d de!          Z" G d de"          Z#dS )    N)ChunkedReaderLengthReader	EOFReaderBody)	InvalidHeaderInvalidHeaderName
NoMoreDataInvalidRequestLineInvalidRequestMethodInvalidHTTPVersionLimitRequestLineLimitRequestHeadersUnsupportedTransferCoding)InvalidProxyLineForbiddenProxyRequest)InvalidSchemeHeaders)bytes_to_strsplit_request_urii  i   z!#$%&'*+-.^_`|~z[%s0-9a-zA-Z]+z[a-z#]zHTTP/(\d)\.(\d)c                   4    e Zd Zd Zd Zd Zd	dZd Zd ZdS )
Messagec                 &   || _         || _        || _        || _        d | _        g | _        g | _        d | _        |j        rdnd| _	        d| _
        |j        | _        | j        dk    s| j        t          k    rt          | _        |j        | _        | j        dk     rt          | _        | j        pt          }| j        |dz   z  dz   | _        |                     | j                  }| j                            |           |                                  d S )NhttpshttpFr         )cfgunreader	peer_addrremote_addrversionheaderstrailersbodyis_sslscheme
must_close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         G/var/www/html/env/lib/python3.11/site-packages/gunicorn/http/message.py__init__zMessage.__init__"   s    "$	!$7gg %($<!%**,{::(3D%(+(D%(1,,,HD) !% = ]A]"&";"Q&#(*+#, DM**V$$$    c                     d| _         d S )NT)r&   r/   s    r2   force_closezMessage.force_close@   s    r4   c                     t                      N)NotImplementedError)r/   r   s     r2   r,   zMessage.parseC   s    !###r4   Fc                    | j         }g }d |                    d          D             }d}i }|rn>d|j        v s.t          | j        t
                    r| j        d         |j        v r|j        }|rt          |          | j        k    rt          d          |
                    d          }t          |          t          d          z   }	|                    d          dk    rt          |          |                    dd	          \  }
}| j         j        r|
                    d
          }
t                              |
          st#          |
          |
                                }
|                    d
          g}|r|d                             d          r|
                    d          }|	t          |          t          d          z   z  }	|	| j        cxk    rdk    rn nt          d          |                    |                    d                     |r|d                             d          d                    |          }|	| j        cxk    rdk    rn nt          d          |
|v r7|||
         k    }|rdnd}|r|| j        k    rt5                      n	d}|| _        d|
v r2| j         j        dk    rn!| j         j        dk    rkt#          |
          |                    |
|f           ||S )Nc                 ,    g | ]}t          |          S  r   ).0lines     r2   
<listcomp>z)Message.parse_headers.<locals>.<listcomp>K   s     DDDd##DDDr4      
F*r   zlimit request headers fieldsz
:    	) 	z!limit request headers fields sizez	 rG   r   r   T_	dangerousdrop)r   splitforwarded_allow_ips
isinstancer   tuplesecure_scheme_headerslenr'   r   popfindr   strip_header_spacesrstripTOKEN_RE	fullmatchr   upperlstrip
startswithr)   appendstripjoinr%   r   
header_map)r/   datafrom_trailerr   r!   linesscheme_headerrP   currheader_lengthnamevaluesecurer%   s                 r2   parse_headerszMessage.parse_headersF   sV   h ED

70C0CDDD  " 	> S,,,T^U33 -"c&===$'$=!  ?	*7||t888)*HIII 99Q<<DIIF3Myy~~""#D)))**S!,,KD%x+ *{{5))%%d++ .'--- ::<<D\\%(()E  0E!H//<< 0yy||TS[[!88 4#@DDDD1DDDDD- /< = = =TZZ..///  0E!H//<< 0 HHUOOEt<@@@@q@@@@@)*MNNN,,,"7"==$*6  ),,2444 - %)M"(DK d{{8&+55X(F22  ,D111NND%=)))  ?	*B r4   c                    d}d }| j         D ]\  }}|dk    r|t          d|           |}!|dk    r|                                dk    r|rt          d|           d}U|                                dk    r|rt          d|           |                                dk    r0|                                  | j        j        st          |          |                                  t          |          |r| j        d	k     r1|                                  | j        j        st          d|           |1|                                  | j        j        st          d|           t          t          | | j
                            | _        d S |	 t          |                                          rt          |          }nt          d|           n# t          $ r t          d|           w xY w|d
k     rt          d|           t          t!          | j
        |                    | _        d S t          t#          | j
                            | _        d S )NFzCONTENT-LENGTH)reqzTRANSFER-ENCODINGchunkedTidentity )rE   rE   r   )r!   r   lowerr7   r   tolerate_dangerous_framingr   r    r   r   r   r#   str	isnumericint
ValueErrorr   r   )r/   rk   content_lengthre   rf   s        r2   r.   zMessage.set_body_reader   s   !\ 	; 	;MT5'''!-'(8dCCCC!&,,,;;==I-- K+,?TJJJJ"GG[[]]j00  K+,?TJJJJK[[]]b(( $$&&&8> ?7>>>? $$&&& 4E:::3 -6  	7 |f$$  """x: G'(;FFFF)   """x: D'(8dCCCC]4??@@DIII'@~&&0022 D%(%8%8NN'(8dCCCC #  @ @ @#$4$????@ !!#$4$????\$-HHIIDIIIYt}5566DIIIs   AG G5c                     | j         rdS | j        D ]F\  }}|dk    r;|                                                    d          }|dk    r dS |dk    r dS  nG| j        dk    S )NT
CONNECTIONrF   closez
keep-aliveFrE   r   )r&   r!   rn   r\   r    )r/   hvs      r2   should_closezMessage.should_close   s    ? 	4l 	 	FQL  GGIIOOE**<<44,&& 55 ! |v%%r4   NF)	__name__
__module____qualname__r3   r7   r,   rh   r.   r{   r=   r4   r2   r   r   !   s|          <  $ $ $V V V VpC7 C7 C7J& & & & &r4   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 )RequestrE   c                    d | _         d | _        d | _        d | _        d | _        |j        | _        | j        dk     s| j        t          k    rt          | _        || _        d | _        t                      
                    |||           d S Nr   )methoduripathqueryfragmentlimit_request_lineMAX_REQUEST_LINE
req_numberproxy_protocol_infosuperr3   )r/   r   r   r   r   	__class__s        r2   r3   zRequest.__init__   s    	
 #&"8#a''*.>>>&6D#$#' h	22222r4   Fc                     |                                 }|s1|rt                      t          |                                          |                    |           d S r9   )readStopIterationr	   getvaluewrite)r/   r   bufstopr_   s        r2   get_datazRequest.get_data  sR    }} 	- &#oo%S\\^^,,,		$r4   c                    t          j                    }|                     ||d           |                     ||| j                  \  }}|                     t          |                    rGt          j                    }|                    |           |                     ||| j                  \  }}|                     |           t          j                    }|                    |           |	                                }|
                    d          }|d d         dk    }	 |
                    d          }|d d         dk    }|dk     rT|sR|                     ||           |	                                }t          |          | j        k    rt          d          nn|r$| j                            |dd                     dS |                     |d |         d	
          | _        ||dz   d          }d }|S )NT)r   s   

r   rB   r   zmax buffer headersr4   F)r`   r   )ioBytesIOr   	read_liner   proxy_protocolr   r   parse_request_liner   rS   rQ   r+   r   r   r-   rh   r!   )	r/   r   r   r@   rbufr_   idxdonerets	            r2   r,   zRequest.parse  s   jllh$/// ^^Hc43JKK
d |D1122 	P*,,CIIdOOO#t7NOOJD$%%%jll		$ ||~~ii$$BQBx7"
	))K((C8w&DQwwtwh,,,||~~t99t666-.BCCC 7 
	  	M  abb***3))$tt*5)II3788n
r4   r   c                    |                                 }	 |                    d          }|dk    r!||cxk    rdk    rn nt          ||          nht          |          dz
  |cxk    rdk    r n nt          t          |          |          |                     ||           |                                 }|d |         ||dz   d          fS )NTrB   r   r   )r   rS   r   rQ   r   )r/   r   r   limitr_   r   s         r2   r   zRequest.read_line8  s    ||~~
	"))G$$Caxx?????????*36664yy1}u((((q(((((&s4yy%888MM(C(((<<>>D
	" TcT
S1WXX  	 r4   c                     | j         j        sdS | j        dk    rdS |                    d          sdS |                                  |                     |           dS )z        Detect, check and parse proxy protocol.

        :raises: ForbiddenProxyRequest, InvalidProxyLine.
        :return: True for proxy protocol line else False
        FrE   PROXYT)r   r   r   rZ   proxy_protocol_access_checkparse_proxy_protocol)r/   r@   s     r2   r   zRequest.proxy_protocolJ  sl     x& 	5?a5w'' 	5((***!!$'''tr4   c                     d| j         j        vrMt          | j        t                    r5| j        d         | j         j        vrt          | j        d                   d S d S d S )NrC   r   )r   proxy_allow_ipsrN   r   rO   r   r6   s    r2   r   z#Request.proxy_protocol_access_check_  sf    tx///t~u-- 0q!)AAA'q(9::: 0///AAr4   c                    |                     d          }t          |          dk    rt          |          |d         }|d         }|d         }|dvrt          d|z            |dk    rb	 t          j        t          j        |           t          j        t          j        |           n# t          j        $ r t          |          w xY w|d	k    rb	 t          j        t          j        |           t          j        t          j        |           n"# t          j        $ r t          |          w xY w	 t          |d
                   }t          |d                   }n # t          $ r t          d|z            w xY wd|cxk    rdk    rn nd|cxk    rdk    sn t          d|z            |||||d| _
        d S )NrG      rE   r      )TCP4TCP6zprotocol '%s' not supportedr   r   r      zinvalid port %sr   i  )r   client_addrclient_port
proxy_addr
proxy_port)rL   rQ   r   socket	inet_ptonAF_INETerrorAF_INET6rr   rs   r   )r/   r@   bitsprotos_addrd_addrs_portd_ports           r2   r   zRequest.parse_proxy_protocolf  s	   zz#t99>>"4((( Qaa ((("#@5#HIIIF??- 888 8888< - - -&t,,,-f__- &999 &9999< - - -&t,,,-	=a\\Fa\\FF 	= 	= 	="#4t#;<<<	= f%%%%%%%%%A,@,@,@,@5,@,@,@,@"#4t#;<<< $!!  $
 $
   s$   ->B, ,C>D D37*E" "E?c                    d |                     dd          D             }t          |          dk    rt          t          |                    |d         | _        | j        j        sit                              | j                  rt          | j                  dt          |d                   cxk    rdk    sn t          | j                  t                              | j                  st          | j                  | j        j        r| j                                        | _        |d         | _        	 t          | j                  }n*# t           $ r t          t          |                    w xY w|j        pd| _        |j        pd| _        |j        pd| _        t(                              |d                   }|t+          |d                   t-          |                    d                    t-          |                    d                    f| _        d	| j        cxk    rd
k     s"n | j        j        st+          | j                  d S d S )Nc                 ,    g | ]}t          |          S r=   r>   )r?   bits     r2   rA   z.Request.parse_request_line.<locals>.<listcomp>  s     GGGcS!!GGGr4       r   r   r      rE   rm   rx   )r   r   )rL   rQ   r
   r   r   r   !permit_unconventional_http_methodMETHOD_BADCHAR_REsearchr   rV   rW   casefold_http_methodrX   r   r   rs   r   r   r   
VERSION_REr   rr   groupr    "permit_unconventional_http_version)r/   
line_bytesr   partsmatchs        r2   r   zRequest.parse_request_line  sA   GGZ-=-=dA-F-FGGGt99>>$\*%=%=>>> 1g x9 	8 ''44 8*4;777DG*********4;777!!$+.. 	4&t{333 8( 	.+++--DK 7	?%dh//EE 	? 	? 	?$\*%=%=>>>	?J$"	[&B
," $$T!W--=$T!W---EKKNN++SQ-@-@A........8> 7(666 /.7 7s   =E 'E9c                     t                                                       t          | j        j        t
                    r)t          t          | j        d                    | _        d S d S r   )	r   r.   rN   r#   readerr   r   r   r   )r/   r   s    r2   r.   zRequest.set_body_reader  sY    !!!di&	22 	=\$-;;<<DIII	= 	=r4   )rE   r|   )r   )r}   r~   r   r3   r   r,   r   r   r   r   r   r.   __classcell__)r   s   @r2   r   r      s        3 3 3 3 3 3"   + + +Z       $  *; ; ;+
 +
 +
Z*7 *7 *7X= = = = = = = = =r4   r   )$r   rer   gunicorn.http.bodyr   r   r   r   gunicorn.http.errorsr   r   r	   r
   r   r   r   r   r   r   r   r   gunicorn.utilr   r   r   r(   r*   RFC9110_5_6_2_TOKEN_SPECIALScompileescaperV   r   r   objectr   r   r=   r4   r2   <module>r      s   
			 				  K K K K K K K K K K K K                      I H H H H H H H 5 5 5 5 5 5 9 9 9 9 9 9 9 9 #   2 2:'9295Q+R+RSTTBJx(( RZ*++
M& M& M& M& M&f M& M& M&`Q= Q= Q= Q= Q=g Q= Q= Q= Q= Q=r4   