
    D_	h<                         S r SSKJr  SSKrSSKJr  SSKJr  SSKJ	r	  SSK
JrJr  SSKJrJr  SS	KJrJrJrJrJr  S
 r " S S\5      r " S S\5      r " S S5      rS rS r\R:                  " S5      rS rg)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    [        U 5      R                  S5      $ )Nlatin-1)r   decode)
bytestrings    M/var/www/html/fileupload/venv/lib/python3.13/site-packages/waitress/parser.pyunquote_bytes_to_wsgir   $   s    J'..y99    c                       \ rS rSrSrg)ParsingError(    N__name__
__module____qualname____firstlineno____static_attributes__r   r   r   r   r   (       r   r   c                       \ rS rSrSrg)TransferEncodingNotImplemented,   r   Nr   r   r   r   r#   r#   ,   r!   r   r#   c                   j    \ rS rSrSrSrSrSrSrSr	Sr
SrSrSrSrSrSrSrS rS	 rS
 rS rS rSrg)HTTPRequestParser0   zA 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                     0 U l         Xl        g)z
adj is an Adjustments object.
N)headersadj)selfr+   s     r   __init__HTTPRequestParser.__init__H   s     r   c                    U R                   (       a  g[        U5      nU R                  nUGc\  U R                  R                  nU R
                  U-   n[        U5      nSnUS:  a  X`l        U[        U5      U-
  -
  nOU =R                  U-  sl        UnU R                  U:  a-  U R                  S5        [        SU-  5      U l
        SU l         U$ US:  a  USU nUR                  5       nU(       d  SU l        SU l         Ov U R                  U5        U R                  c  SU l         U R                  S:  a@  U R                  R                  n	U R                  U	:  a  [        SU	-  5      U l
        SU l         SU l        U$ XPl        U$ UR-                  U5      nU =R.                  U-  sl        U R                  R                  n	U R.                  U	:  a  [        SU	-  5      U l
        SU l         U$ UR                  (       a  UR                  U l
        SU l         U$ UR                   (       a>  SU l         U R0                  (       a&  [3        UR5                  5       5      U R6                  S'   U$ ! [          a/  n
[#        U
R$                  S   5      U l
        SU l          Sn
A
GN)Sn
A
f[&         a/  n
[)        U
R$                  S   5      U l
        SU l          Sn
A
GN`Sn
A
ff = f)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consumedr5   max_bodyes              r   r?   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(,%  !N {{4(H$$0$xx55H''8323Kh3VW
!%$ O# XX
!% O !%<< 695FDLL!12Os ( .%/q	%:
)-9 .%9!&&)%D
)-.s$   I. .
K8$J""K/$KKc                    UR                  S5      nUS:  a  USU R                  5       nXS-   S nO[        S5      eSU;   d  SU;   a  [        S5      eX0l        [	        U5      nU R
                  nU H  n[        R                  " U5      nU(       d  [        S	5      eUR                  S
S5      u  pSU;   a  MG  U	R                  S5      n	UR                  5       R                  SS5      R                  S5      n
 Xj==   SU	-   R                  S5      -  ss'   M     [        U5      u  pnXs=:X  a  Us=:X  a  S:X  a  O  O[        S5      eUR                  S5      U l        UR                  S5      nUR                  S5      nXl        Xl        [%        U5      u  U l        U l        U l        U l        U l        U R0                  R2                  U l        UR5                  SS5      nUS:X  a  UR7                  5       S:w  a  SU l        US:X  Ga  UR;                  SS5      nUR=                  S5       Vs/ s H+  nU(       d  M  UR                  S5      R7                  5       PM-     nnU H  nUS;  d  M  [?        S5      e   U(       a@  US   S:X  a7  SU l         [C        U R0                  RD                  5      n[G        U5      U l$        OU(       a  [?        S5      eUR5                  S S5      R7                  5       nUS!:H  U l%        UR7                  5       S":X  a  SU l        U R@                  (       d  UR5                  S#S$5      n[L        R                  " URO                  S5      5      (       d  [        S%5      e[Q        U5      nUU l)        US:  a1  [C        U R0                  RD                  5      n[U        UU5      U l$        ggg! [         a    U	R                  S5      Xj'    GMq  f = fs  snf )&zX
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 	>   rA   z-Transfer-Encoding requested is not supported.rA   EXPECTz100-continuecloser0   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#   rA   r   inbuf_overflowr   r3   expect_continuer
   encodeintr;   r   )r,   r5   rI   ra   headerlinesr*   linekeyrT   key1rk   urirl   
connectionteencoding	encodingsbufexpectcls                        r   r7   HTTPRequestParser.parse_header   s   
   )A:$Ve,335J -F<==J%:"5DEE$ (,,D$**40F"#344fg6JCs{  KK'E99;&&tT299)DD
8%%-!7!7	!BB- 6 !1 <g+W++677 ::i0..+..+ cN	
IJM((--[[r2
e!\1(,%e
 0"5B ?Ahhsm>K(x-u%++-m   & ;.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   <O5O)#O)O&%O&c                 T    U R                   nUb  UR                  5       $ [        5       $ N)r3   getfiler   r,   r3   s     r   get_body_stream!HTTPRequestParser.get_body_streamN  s(    ==##%%9r   c                 `    U R                   nUb  UR                  5       R                  5         g g r   )r3   getbufr]   r   s     r   r]   HTTPRequestParser.closeV  s)    ==OO##%  r   )r+   r3   rA   rk   r1   rv   r;   r:   r8   rz   ra   rr   r6   r5   r*   r>   rp   ro   rn   rq   rj   rs   rl   )r   r   r   r   __doc__r1   r:   rz   r>   r5   rA   r;   r6   r@   r3   rl   r8   rv   r-   r?   r7   r   r]   r    r   r   r   r&   r&   0   sk     IEOKGNHGE
unD=L&r   r&   c                    S=n=n=n=pEU S S S:X  a7  U nSU;   a  UR                  SS5      u  p5SU;   a  UR                  SS5      u  p4O [        R                  " U 5      u  pp4nUR                  S5      UR                  S5      [        U5      UR                  S5      UR                  S5      4$ ! [         a    [	        S5      ef = f)	Nr   rP   s   //   #      ?zBad URIr   )rx   r   urlsplitUnicodeErrorr   r   r   )r   schemenetlocrp   rq   rr   s         r   rm   rm   ]  s     143F3V3d3U 2Aw%4<!ZZa0ND4<**T1-KD	*49NN34G1FD
 	i i d#Y	"   	*y))	*s   B1 1Cc                 B   / nU R                  S5      nU H  nU(       d  M  SU;   d  SU;   a  [        S[        US5      -  5      eUR                  S5      (       a.  U(       d  [        S[        US5      -  5      eUS==   U-  ss'   Mt  UR	                  U5        M     U$ )	zD
Splits the header into lines, putting multi-line headers together.
rO   rQ   rR   z'Bare CR or LF found in header line "%s"r   )       	zMalformed header line "%s"r[   )rx   r   rB   
startswithappend)r}   rr~   r   s       r   rb   rb     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                     [         R                  U 5      nUc  gUS   =(       d    SnUS   nUS   nX3R                  5       :w  a  [        S[	        US5      -  5      eX4U4$ )N)r   r   r   rl   r   methodr   zMalformed HTTP method "%s"r   )first_line_re	fullmatchrf   r   rB   )r   mrl   r   r   s        r   ri   ri     sk    %Ay	l!cGx[F
E(C 7#fi:PPQQ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&   rm   rb   compiler   ri   r   r   r   <module>r      sz   
  	  ) / B ; :	9 		Y 	j& j&Z	!H6 

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