
    ޕgD                        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$y)    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                   2    e Zd Zd Zd Zd ZddZd Zd Zy)	Messagec                 f   || _         || _        || _        || _        d | _        g | _        g | _        d | _        |j                  rdnd| _	        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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/html/AdoubleTech/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                     d| _         y )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   c                 d   | j                   }g }|j                  d      D cg c]  }t        |       }}d}i }g }	|rn[d|j                  v s5t	        | j
                  t              r| j
                  d   |j                  v r|j                  }|j                  }	|rt        |      | j                  k\  rt        d      |j                  d      }
t        |
      t        d      z   }|
j                  d      dk  rt        |
      |
j                  dd      \  }}| j                   j                  r|j!                  d	      }t"        j%                  |      st'        |      |j)                         }|j+                  d	      g}|r|d   j-                  d
      r| j                   j.                  st1        |      |j                  d      }
|t        |
      t        d      z   z  }|| j2                  cxkD  rdkD  rt        d       |j5                  |
j+                  d             |r|d   j-                  d
      rdj7                  |      }t8        j;                  |      rt        |      || j2                  cxkD  rdkD  rt        d       ||v r2|||   k(  }|rdnd}|r|| j<                  k7  rt?               d}|| _        d|v rI||	v sd|	v rn@| j                   j@                  dk(  rn&| j                   j@                  dk(  rot'        |      |j5                  ||f       |r|S c c}w )N   
F*r   zlimit request headers fieldsz
:    	) 	z!limit request headers fields sizez	 rB   r   r   T_	dangerousdrop)!r   splitr   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"   linelinesscheme_headerrK   rL   currheader_lengthnamevaluesecurer&   s                   r3   parse_headerszMessage.parse_headersF   s   hh 15

70CDd#DD  " S,,,T^^U3"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 4#@#@D1D- /< = = E TZZ./ E!H//< HHUOE077>#D))t<<@q@)*MNN A ,,"7"==$* ,244$(M"(DK d{,,7H0HXX((K7XX((F2  ,D11NND%=)Q T y Es   L-c                    d}d }| j                   D ]  \  }}|dk(  r|t        d|       |}|dk(  s#|j                  d      D cg c]  }|j                          }}|D ]  }|j	                         dk(  r|rt        d|       d}(|j	                         dk(  r|s>t        d|       |j	                         d	v r |rt        d|       | j                          }t        |        |rP| j                  d
k  rt        d|       |t        d|       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 c c}w # t        $ r t        d|       w xY w)NFzCONTENT-LENGTH)reqzTRANSFER-ENCODING,chunkedTidentity)compressdeflategzip)r@   r@   r   )r"   r   rG   rU   lowerr8   r   r!   r   r   r   r$   str	isnumericint
ValueErrorr   r   )r0   rk   content_lengthrd   re   vvalsvals           r3   r/   zMessage.set_body_reader   s   !\\ 	?MT5''!-'(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%(%8N'(8dCC # !#$4$??\$--HIDIYt}}56DI] =L  @#$4$??@s   G2G G,c                     | j                   ry| j                  D ]9  \  }}|dk(  s|j                         j                  d      }|dk(  r y|dk(  r y n | j                  dk  S )NT
CONNECTIONrA   closez
keep-aliveFr@   r   )r'   r"   rp   rU   r!   )r0   hrv   s      r3   should_closezMessage.should_close   sh    ??ll 	FQL GGIOOE*<,& 	 ||v%%r5   NF)	__name__
__module____qualname__r4   r8   r-   rg   r/   r~    r5   r3   r   r   !   s#    <$aF: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 )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superr4   )r0   r   r   r   r   	__class__s        r3   r4   zRequest.__init__   s{    	
 #&"8"8##a'**.>>&6D#$#' h	2r5   c                     |j                         }|s%|r
t               t        |j                               |j	                  |       y r:   )readStopIterationr	   getvaluewrite)r0   r   bufstopr]   s        r3   get_datazRequest.get_data  s7    }}#o%S\\^,,		$r5   c                 n   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	
      | _        ||dz   d  }d }|S )NT)r   s   

r   r=   r   zmax buffer headersr5   F)r^   r   )ioBytesIOr   	read_liner   proxy_protocolr   r   parse_request_liner   rO   rM   r,   r   r   r.   rg   r"   )	r0   r   r   r_   rbufr]   idxdonerets	            r3   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)I378n
r5   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 )Nr=   r   r   )r   rO   r   rM   r   )r0   r   r   limitr]   r   s         r3   r   zRequest.read_line:  s    ||~))G$Cax??*3664y1}u(q(&s4y%88MM(C(<<>D  Tc
S1WX  	 r5   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   r   rV   proxy_protocol_access_checkparse_proxy_protocol)r0   r_   s     r3   r   zRequest.proxy_protocolL  sO     xx&&??aw'((*!!$'r5   c                     d| j                   j                  vrYt        | j                  t              r>| j                  d   | j                   j                  vrt        | j                  d         y y y )Nr>   r   )r   proxy_allow_ipsrI   r   rJ   r   r7   s    r3   r   z#Request.proxy_protocol_access_checka  sa    txx///t~~u-q!)A)AA'q(9:: B . 0r5   c                    |j                  d      }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        $ r t        |      w xY w# t        $ r t        |      w xY w# t        $ r t        d|z        w xY w)NrB      r@   r      )TCP4TCP6zprotocol '%s' not supportedr   r   r      zinvalid port %sr   i  )r   client_addrclient_port
proxy_addr
proxy_port)rG   rM   r   socket	inet_ptonAF_INETOSErrorAF_INET6rs   rt   r   )r0   r_   bitsprotos_addrd_addrs_portd_ports           r3   r   zRequest.parse_proxy_protocolh  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 *E- =EE*-Fc                    |j                  dd      D cg c]  }t        |       }}t        |      dk7  rt        t        |            |d   | _        | j
                  j                  sbt        j                  | j                        rt        | j                        dt        |d         cxk  rdk  sn t        | j                        t        j                  | j                        st        | j                        | j
                  j                  r| j                  j                         | _        |d   | _        t        | j                        dk(  rt        t        |            	 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| _        d| j0                  cxk  rd	k  s.n | j
                  j2                  st+        | j0                        y y c c}w # t         $ r t        t        |            w xY w)
N    r   r   r      r@    r|   )r   r   )rG   r   rM   r
   r   r   !permit_unconventional_http_methodMETHOD_BADCHAR_REr[   r   rR   rS   casefold_http_methodrT   r   r   rt   r   r   r   
VERSION_REr   rs   groupr!   "permit_unconventional_http_version)r0   
line_bytesbitr   partsmatchs         r3   r   zRequest.parse_request_line  s   -7-=-=dA-FGcS!GGt9>$\*%=>> 1g xx99 ''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   I&-I+ +J	c                     t         |           t        | j                  j                  t
              r%t        t        | j                  d            | _        y y r   )	r   r/   rI   r$   readerr   r   r   r   )r0   r   s    r3   r/   zRequest.set_body_reader  s>    !dii&&	2\$--;<DI 3r5   )r@   r   )r   )r   r   r   r4   r   r-   r   r   r   r   r   r/   __classcell__)r   s   @r3   r   r      s8    3"+Z $*;+
Z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escaperR   r   r   rZ   r   r   r   r5   r3   <module>r      s   
 
 	  K K   I 5 9 #   2 2::'92995Q+RSTBJJx( RZZ*+
$.BJJ{$; !O& O&d\=g \=r5   