
    nfD                     z   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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! ej        d          Z" G d d          Z# G d de#          Z$dS )    N)ChunkedReaderLengthReader	EOFReaderBody)
InvalidHeaderInvalidHeaderName
NoMoreDataInvalidRequestLineInvalidRequestMethodInvalidHTTPVersionLimitRequestLineLimitRequestHeadersUnsupportedTransferCodingObsoleteFolding)InvalidProxyLineForbiddenProxyRequest)InvalidSchemeHeaders)bytes_to_strsplit_request_urii  i   z!#$%&'*+-.^_`|~z[%s0-9a-zA-Z]+z[a-z#]zHTTP/(\d)\.(\d)z[\0\r\n]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         T/var/www/surfInsights/venv3-11/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'   r0   s    r3   force_closezMessage.force_close@   s    r5   c                     t                      N)NotImplementedError)r0   r   s     r3   r-   zMessage.parseC   s    !###r5   Fc                    | j         }g }d |                    d          D             }d}i }g }|rnEd|j        v s.t          | j        t
                    r| j        d         |j        v r|j        }|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| j         j        st/          |          |                    d          }	|
t          |	          t          d          z   z  }
|
| j        cxk    rdk    rn nt          d          |                    |	                    d                     |r|d                             d          d                    |          }t6                              |          rt          |          |
| j        cxk    rdk    rn nt          d          ||v r7|||         k    }|rdnd}|r|| j        k    rt=                      n	d}|| _        d|v r;||v sd|v rn2| j         j        dk    rn!| j         j        dk    rt%          |          |                    ||f           ||S )Nc                 ,    g | ]}t          |          S  r   ).0lines     r3   
<listcomp>z)Message.parse_headers.<locals>.<listcomp>K   s     DDDd##DDDr5      
F*r   zlimit request headers fieldsz
:    	) 	z!limit request headers fields sizez	 rH   r   r   T_	dangerousdrop) r   splitforwarded_allow_ips
isinstancer   tuplesecure_scheme_headersforwarder_headerslenr(   r   popfindr   strip_header_spacesrstripTOKEN_RE	fullmatchr   upperstrip
startswithpermit_obsolete_foldingr   r*   appendjoin!RFC9110_5_5_INVALID_AND_DANGEROUSsearchr&   r   
header_map)r0   datafrom_trailerr   r"   linesscheme_headerrQ   rR   currheader_lengthnamevaluesecurer&   s                  r3   parse_headerszMessage.parse_headersF   s   h ED

70C0CDDD  " 	6 S,,,T^U33 -"c&===$'$=! # 5  H	*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x7 0)$///yy||TS[[!88 4#@DDDD1DDDDD- /< = = =TZZ..///  	0E!H//<< 	0 HHUOOE077>> *#D)))t<@@@@q@@@@@)*MNNN,,,"7"==$*6  ),,2444 - %)M"(DK d{{,,,7H0H0HX(K77X(F22  ,D111NND%=)))Q  H	*T r5   c                 J   d}d }| j         D ]\  }}|dk    r|t          d|           |}!|dk    rd |                    d          D             }|D ]}|                                dk    r|rt          d|           d}0|                                d	k    r|rt          d|           \|                                d
v r(|rt          d|           |                                  t          |          |rX| j        dk     rt          d|           |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-ENCODINGc                 6    g | ]}|                                 S r>   )r[   )r@   vs     r3   rB   z+Message.set_body_reader.<locals>.<listcomp>   s     <<<a		<<<r5   ,chunkedTidentity)compressdeflategzip)rF   rF   r   )r"   r   rM   lowerr8   r   r!   r   r   r   r$   str	isnumericint
ValueErrorr   r   )r0   rr   content_lengthri   rj   valsvals          r3   r/   zMessage.set_body_reader   s   !\ 	? 	?MT5'''!-'(8dCCCC!&,,, =<5;;s+;+;<<< ? ?Cyy{{i//" O"/0C"N"N"NN"&
22 # O"/0C"N"N"NNO(GGG" O"/0C"N"N"NN((****7>>> 	7 |f$$#$7TBBBB) $$4$????]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F F: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
CONNECTIONrG   closez
keep-aliveFrF   r   )r'   r"   rw   r[   r!   )r0   hrp   s      r3   should_closezMessage.should_close   s    ? 	4l 	 	FQL  GGIIOOE**<<44,&& 55 ! |v%%r5   NF)	__name__
__module____qualname__r4   r8   r-   rl   r/   r   r>   r5   r3   r   r   !   sy          <  $ $ $a a a aF:7 :7 :7x& & & & &r5   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 )RequestrF   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superr4   )r0   r   r   r   r   	__class__s        r3   r4   zRequest.__init__   s    	
 #&"8#a''*.>>>&6D#$#' h	22222r5   Fc                     |                                 }|s1|rt                      t          |                                          |                    |           d S r:   )readStopIterationr	   getvaluewrite)r0   r   bufstoprc   s        r3   get_datazRequest.get_data  sR    }} 	- &#oo%S\\^^,,,		$r5   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   rC   r   zmax buffer headersr5   F)rd   r   )ioBytesIOr   	read_liner   proxy_protocolr   r   parse_request_liner   rU   rS   r,   r   r   r.   rl   r"   )	r0   r   r   rA   rbufrc   idxdonerets	            r3   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
r5   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 )NTrC   r   r   )r   rU   r   rS   r   )r0   r   r   limitrc   r   s         r3   r   zRequest.read_line:  s    ||~~
	"))G$$Caxx?????????*36664yy1}u((((q(((((&s4yy%888MM(C(((<<>>D
	" TcT
S1WXX  	 r5   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
        FrF   PROXYT)r   r   r   r\   proxy_protocol_access_checkparse_proxy_protocol)r0   rA   s     r3   r   zRequest.proxy_protocolL  sl     x& 	5?a5w'' 	5((***!!$'''tr5   c                     d| j         j        vrMt          | j        t                    r5| j        d         | j         j        vrt          | j        d                   d S d S d S )NrD   r   )r   proxy_allow_ipsrO   r   rP   r   r7   s    r3   r   z#Request.proxy_protocol_access_checka  sf    tx///t~u-- 0q!)AAA'q(9::: 0///AAr5   c                 p   |                     d          }t          |          dk    rt          |          |d         }|d         }|d         }|dvrt          d|z            |dk    r]	 t          j        t          j        |           t          j        t          j        |           n# t          $ r t          |          w xY w|d	k    r]	 t          j        t          j        |           t          j        t          j        |           n# t          $ 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 )NrH      rF   r      )TCP4TCP6zprotocol '%s' not supportedr   r   r      zinvalid port %sr   i  )r   client_addrclient_port
proxy_addr
proxy_port)rM   rS   r   socket	inet_ptonAF_INETOSErrorAF_INET6rz   r{   r   )r0   rA   bitsprotos_addrd_addrs_portd_ports           r3   r   zRequest.parse_proxy_protocolh  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 D)-*E E5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                  dk    rt          t          |                    	 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     r3   rB   z.Request.parse_request_line.<locals>.<listcomp>  s     GGGcS!!GGGr5       r   r   r      rF    r   )r   r   )rM   rS   r
   r   r   r   !permit_unconventional_http_methodMETHOD_BADCHAR_REra   r   rX   rY   casefold_http_methodrZ   r   r   r{   r   r   r   
VERSION_REr   rz   groupr!   "permit_unconventional_http_version)r0   
line_bytesr   partsmatchs        r3   r   zRequest.parse_request_line  sl   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 tx==A$\*%=%=>>>	?%dh//EE 	? 	? 	?$\*%=%=>>>	?J$"	[&B
," $$T!W--=$T!W---EKKNN++SQ-@-@A........8> 7(666 /.7 7s   1F 'F-c                     t                                                       t          | j        j        t
                    r)t          t          | j        d                    | _        d S d S r   )	r   r/   rO   r$   readerr   r   r   r   )r0   r   s    r3   r/   zRequest.set_body_reader  sY    !!!di&	22 	=\$-;;<<DIII	= 	=r5   )rF   r   )r   )r   r   r   r4   r   r-   r   r   r   r   r   r/   __classcell__)r   s   @r3   r   r      s        3 3 3 3 3 3"   + + +Z       $  *; ; ;+
 +
 +
Z57 57 57n= = = = = = = = =r5   r   )%r   rer   gunicorn.http.bodyr   r   r   r   gunicorn.http.errorsr   r   r	   r
   r   r   r   r   r   r   r   r   r   gunicorn.utilr   r   r   r)   r+   RFC9110_5_6_2_TOKEN_SPECIALScompileescaperX   r   r   r`   r   r   r>   r5   r3   <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*++
$.BJ{$;$; !O& O& O& O& O& O& O& O&d\= \= \= \= \=g \= \= \= \= \=r5   