
    7i<                         d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZmZ ddlmZmZ dd	lmZmZmZmZmZ d
 Z G d de      Z G d de      Z G d d      Zd Zd Z ej:                  d      Zd Zy)zwHTTP Request Parser

This server uses asyncore to accept connections and do initial
processing but threads to do work.
    )BytesION)parse)unquote_to_bytes)OverflowableBuffer)ChunkedReceiverFixedStreamReceiver)HEADER_FIELD_REONLY_DIGIT_RE)
BadRequestRequestEntityTooLargeRequestHeaderFieldsTooLargeServerNotImplementedfind_double_newlinec                 6    t        |       j                  d      S )Nlatin-1)r   decode)
bytestrings    B/var/www/html/venv/lib/python3.12/site-packages/waitress/parser.pyunquote_bytes_to_wsgir   $   s    J'..y99    c                       e Zd Zy)ParsingErrorN__name__
__module____qualname__ r   r   r   r   (       r   r   c                       e Zd Zy)TransferEncodingNotImplementedNr   r   r   r   r    r    ,   r   r   r    c                   b    e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZd Zd Zd	 Zd
 Zd Zy)HTTPRequestParserzA structure that collects the HTTP request.

    Once the stream is completed, the instance is passed to
    a server task constructor.
    Fr   r   N1.0c                      i | _         || _        y)z/
        adj is an Adjustments object.
        N)headersadj)selfr&   s     r   __init__zHTTPRequestParser.__init__H   s     r   c                    | j                   ryt        |      }| j                  }|T| j                  j                  }| j
                  |z   }t        |      }d}|dk\  r|| _        |t        |      |z
  z
  }n| xj                  |z  c_        |}| j                  |k\  r-| j                  d       t        d|z        | _
        d| _         |S |dk\  r|d| }|j                         }|sd| _        d| _         nt	 | j                  |       | j                  d| _         | j                  dkD  r@| j                  j                  }	| j                  |	k\  rt        d|	z        | _
        d| _         	 d| _        |S || _        |S |j-                  |      }| xj.                  |z  c_        | j                  j                  }	| j.                  |	k\  rt        d|	z        | _
        d| _         |S |j                  r|j                  | _
        d| _         |S |j                   r9d| _         | j0                  r&t3        |j5                               | j6                  d<   |S # t         $ r/}
t#        |
j$                  d         | _
        d| _         Y d}
~
d}
~
wt&        $ r/}
t)        |
j$                  d         | _
        d| _         Y d}
~
Od}
~
ww xY w)z
        Receives the HTTP stream for one request.  Returns the number of
        bytes consumed.  Sets the completed flag once both the header and the
        body have been received.
        r   Ns   GET / HTTP/1.0
zexceeds max_header of %sTzexceeds max_body of %sCONTENT_LENGTH)	completedlenbody_rcvr&   max_request_header_sizeheader_plusr   header_bytes_receivedparse_headerr   errorlstripemptycontent_lengthmax_request_body_sizer   r   r   argsr    r   headers_finishedreceivedbody_bytes_receivedchunkedstr__len__r%   )r'   datadatalenbr
max_headersindexconsumedr/   max_bodyes              r   r9   zHTTPRequestParser.receivedQ   s    >>d)]]:99J  4'A'*EHz .3*"c!fun5**g5*" ))Z7!!"788.;
 "&zi *002"!%DJ%)DN6))+6  ==0 .2DN..2'+xx'E'EH  $22h>-B$<x$G."
 26(,%  !DN {{4(H$$0$xx55H''8323Kh3VW
!%$ O# XX
!% O !%<< 695FDLL!12Os ( .%/q	%:
)-9 .%9!&&)%D
)-.s$   7I 	J>$JJ>$J99J>c                 n   |j                  d      }|dk\  r|d| j                         }||dz   d }nt        d      d|v sd|v rt        d      || _        t	        |      }| j
                  }|D ]  }t        j                  |      }|st        d	      |j                  d
d      \  }}	d|v r?|	j                  d      }	|j                         j                  dd      j                  d      }
	 ||
xx   d|	z   j                  d      z  cc<    t        |      \  }}}||cxk(  r|cxk(  rdk(  rt        d       |j                  d      | _        |j                  d      }|j                  d      }|| _        || _        t%        |      \  | _        | _        | _        | _        | _        | j0                  j2                  | _        |j5                  dd      }|dk(  r|j7                         dk7  rd| _        |dk(  r|j;                  dd      }|j=                  d      D cg c]$  }|s|j                  d      j7                         & }}|D ]  }|dvst?        d       |r?|d   dk(  r7d| _         tC        | j0                  jD                        }tG        |      | _$        n|rt?        d      |j5                  d d      j7                         }|d!k(  | _%        |j7                         d"k(  rd| _        | j@                  s|j5                  d#d$      }tM        j                  |jO                  d            st        d%      tQ        |      }|| _)        |dkD  r1tC        | j0                  jD                        }tU        ||      | _$        yyy# t        $ r |	j                  d      ||
<   Y =w xY wc c}w )&zp
        Parses the header_plus block of text (the headers plus the
        first line of the request).
           
r   N   zHTTP message header invalid      
z#Bare CR or LF found in HTTP messagezInvalid headernamevalue   _s    	   -r   s   , r   zStart line is invalid
CONNECTION r#   z
keep-aliveTz1.1TRANSFER_ENCODING,z 	>   r;   z-Transfer-Encoding requested is not supported.r;   EXPECTz100-continuecloser*   0zContent-Length is invalid)+findrstripr   
first_lineget_header_linesr%   r	   matchgroupstripupperreplacer   KeyErrorcrack_first_linerequest_uricommandversion	split_uriproxy_schemeproxy_netlocpathqueryfragmentr&   
url_schemegetlowerconnection_closepopsplitr    r;   r   inbuf_overflowr   r-   expect_continuer
   encodeintr5   r   )r'   r/   rC   rZ   headerlinesr%   linekeyrM   key1rd   urire   
connectionteencoding	encodingsbufexpectcls                        r   r1   zHTTPRequestParser.parse_header   s   
   )A:$Ve,335J -F<==J%:"5DEE$ (,, 	8D$**40F"#344fg6JCs{  KK'E99;&&tT299)DD
8%%-!7!7	!BB-	86 !1 <gc+W++677 ,
 ::i0..+..+ cN	
IJM((--[[r2
e!\1(,%e
 0"5B ?Ahhsm2:xu%++-I  &  ;.8G  Yr]i7#()@)@A / 44C  [[2.446F#)^#;D !W,(,%||-s3B &&ryy';<"#>??RB"$DAv()@)@A 3B <  Y  8 %Y 78Vs   1N$N2,!N2N/.N/c                 R    | j                   }||j                         S t               S N)r-   getfiler   r'   r-   s     r   get_body_streamz!HTTPRequestParser.get_body_streamN  s(    ==##%%9r   c                 ^    | j                   }||j                         j                          y y r   )r-   getbufrV   r   s     r   rV   zHTTPRequestParser.closeV  s)    ==OO##%  r   )r   r   r   __doc__r+   r4   rs   r8   r/   r;   r5   r0   r:   r-   re   r2   ro   r(   r9   r1   r   rV   r   r   r   r"   r"   0   sk     IEOKGNHGE
unD=L&r   r"   c                    dx}x}x}x}}| d d dk(  r5| }d|v r|j                  dd      \  }}d|v r2|j                  dd      \  }}n	 t        j                  |       \  }}}}}|j                  d      |j                  d      t        |      |j                  d      |j                  d      fS # t        $ r t	        d      w xY w)	Nr   rI   s   //   #      ?zBad URIr   )rq   r   urlsplitUnicodeErrorr   r   r   )r{   schemenetlocri   rj   rk   s         r   rf   rf   ]  s     143F3V3d3UX 2Aw%4<!ZZa0ND(4<**T1-KD%	*49NN34G1FFD%
 	i i d#Y	"   	*y))	*s   	B0 0Cc                    g }| j                  d      }|D ]o  }|sd|v sd|v rt        dt        |d      z        |j                  d      r(|st        dt        |d      z        |dxx   |z  cc<   _|j	                  |       q |S )	zL
    Splits the header into lines, putting multi-line headers together.
    rH   rJ   rK   z'Bare CR or LF found in header line "%s"r   )       	zMalformed header line "%s"rT   )rq   r   r<   
startswithappend)rv   rrw   rx   s       r   r[   r[     s     	ALL!E D=ETM9Ci<PP  ??=)"#?#dIBV#VWWbETMEHHTN" Hr   s   (?P<method>[!#$%&'*+\-.^_`|~0-9A-Za-z]+) (?P<uri>(?:[^ :?#]+://[^ ?#/]*(?:[0-9]{1,5})?)?[^ ]+)(?: HTTP/(?P<version>[0-9]\.[0-9]))?c                     t         j                  |       }|y|d   xs d}|d   }|d   }||j                         k7  rt        dt	        |d      z        |||fS )N)r   r   r   re   r   methodr{   zMalformed HTTP method "%s"r   )first_line_re	fullmatchr_   r   r<   )rx   mre   r   r{   s        r   rb   rb     so    %Ay	l!cGx[F
E(C 7#fi:PPQQ3r   ) r   ior   reurllibr   urllib.parser   waitress.buffersr   waitress.receiverr   r   waitress.rfc7230r	   r
   waitress.utilitiesr   r   r   r   r   r   	Exceptionr   r    r"   rf   r[   compiler   rb   r   r   r   <module>r      s|   
  	  ) / B ; :	9 		Y 	j& j&Z	!H6 

- r   