
    3                       U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZ d dlmZ d dlZd dlmZmZmZ d dlmZ d dlmZ  ee      Z ej6                         Zd	ed
<   ej                  j<                  aded<    ee      Z g dZ!ejE                  d      e jE                  d      e jE                  d      dSd                     Z#ejE                  d      dSd       Z$ejE                  d      dSd       Z%ejE                  dg d      e jE                  dg d      dSd              Z&ejE                  ddg      dSd       Z'ejE                  d      dSd       Z(ejE                  d      dSd       Z)ejE                  d       dSd!       Z*ejE                  d"g d      dSd#       Z+ejE                  d$dg      e jE                  d$dd%g      dSd&              Z,ejE                  d'      ejE                  d(d)d*i+      dTd,              Z-ejE                  d-      dSd.       Z.ejE                  d/d0dg      dSd1       Z/ejE                  d2      dSd3       Z0ejE                  d4d0dg      dSd5       Z1ejE                  d6      dSd7       Z2ejE                  d8      dSd9       Z3ejE                  d:g d      dSd;       Z4ejE                  d<      dSd=       Z5ejE                  d>      dSd?       Z6ejE                  d@      e jE                  d@      dSdA              Z7ejE                  dB      dSdC       Z8ejE                  dDd0dEg      dSdF       Z9e jt                  dUdG       Z;e jE                  dH      dSdI       Z<e jE                  dJ      dSdK       Z=e jE                  dL      dSdM       Z>e jE                  ddd%g      dSdN       Z?e jE                  dO      dVdP       Z@e jE                  dQ      dSdR       ZAy)W    )annotationsN)BytesIO)Path)Iterator)Responsemake_responserequest)ResponseReturnValue)	QuartTriozcollections.Counter[str]RETRY_TEST_NAMESzdatetime.datetimeLAST_RETRY_AFTER_REQ))zAccess-Control-Allow-Origin*)zCross-Origin-Opener-Policyzsame-origin)zCross-Origin-Embedder-Policyzrequire-corp)zFeature-Policyzsync-xhr *;)zAccess-Control-Allow-Headersr   /z/indexc                 4   K   t        d       d {   S 7 w)NzDummy server!r        6platform/gsutil/third_party/urllib3/dummyserver/app.pyindexr   %   s      ////s   z/alpn_protocolc                 f   K   t         j                  d   d   d   } t        |        d{   S 7 w)#Return the requester's certificate.
extensionstlsalpn_protocolN)r	   scoper   )r   s    r   r   r   ,   s1      MM,/6GM}----   (1/1z/certificatec                    K   t        dt        j                         t        j                  d   d   d   } t        d | j	                  d      D              }t        |       d{   S 7 w)r   r   r   r   client_cert_namec              3  >   K   | ]  }|j                  d         yw)=N)split).0parts     r   	<genexpr>zcertificate.<locals>.<genexpr>8   s     K7Jt4::c?7Js   z, N)printr	   r   dictr!   r   )subjectsubject_as_dicts     r   certificater)   3   sY      
'7==!mmL)%01CDGKw}}T7JKKO////s   A#A,%A*&A,z/specific_method)GETPOSTPUT)methodsc                 <  K   t         j                   d{   j                  dd      } t         j                  j	                         | j	                         k(  rt        dd       d{   S t        d|  dt         j                   d       d{   S 7 7 .7 w)z8Confirm that the request matches the desired method typeNmethod    zWrong method:  !=   )r	   valuesgetr/   upperr   )method_params    r   specific_methodr8   <   s      "..(--h;L~~!3!3!55"2s+++"\N$w~~.>?
 
 	
 ) ,
s4   BBAB)B*'BBBBBz/uploadr+   c                 *  K   t         j                   d{   } | j                  d      }| j                  d      }t        | j                  dd            }t         j                   d{   j                  |      }|J t        |      dk7  r#t        d| dt        |       d	       d{   S |d
   }t        j                  |j                        5 }|j                         }ddd       t        |      t              k7  r,t        dt        |       dt        |       d	       d{   S ||j                  k7  r$t        d| d|j                   d	       d{   S t                d{   S 7 c7 7 # 1 sw Y   xY w7 ]7 ,7 w)z8Confirm that the uploaded file conforms to specificationNupload_paramupload_filenameupload_size0   zExpected 1 file for 'z', not r3   r   zWrong size: r2   zWrong filename: )r	   formr5   intfilesgetlistlenr   
contextlibclosingstreamreadfilename)paramsparamfilename_paramsizefiles_file_rF   datas           r   uploadrP   J   ss     <<FJJ~&EZZ 12Nvzz--.DMM!**51F
6{a"#E7'#f+?
 
 	
 1IE			ELL	)V{{} 
* 4yCI"\#d)DT#LcRRR'"~.d5>>2BCS
 
 	
   3   "
 
*	) S
 !s~   FE9AF+E<,AF/E?0(FF)AF/F02F"F#F4F5F<F?FF
FFFz/chunkedc                 F   K   dd} t         |               d {   S 7 w)Nc               3  4   K   t        d      D ]  } d  y w)N   123)range)_s    r   generatezchunked.<locals>.generatek   s     qAK s   )returnzIterator[str]r   rW   s    r   chunkedrZ   i   s       xz****s   !!z/chunked_gzipc                 L   K   dd} t         |        ddg       d {   S 7 w)Nc               3     K   t        j                  dt         j                  dt         j                  z         } dgdz  D ]  }| j	                  |        | j                          y w)N      s   123rS   )zlibcompressobjDEFLATED	MAX_WBITScompressflush)
compressoruncompresseds     r   rW   zchunked_gzip.<locals>.generatet   sW     %%aT^^8KL
#HqLL%%l33 )  s   A(A*r1   Content-Encodinggzip)rX   zIterator[bytes]r   rY   s    r   chunked_gziprj   r   s(     ! xz31M0NOOOOs   $"$z
/keepalivec                    K   t         j                  j                  dd      dk(  rdg} t        dd|        d {   S dg} t        dd|        d {   S 7 7 w)	Nclose   0   1)
Connectionrl   Closingr1   )ro   z
keep-alivezKeeping alive)r	   argsr5   r   )headerss    r   	keepalivers   ~   s^     ||&$.*+"9c7;;;+,GW=== < >s!   7AAAAAAz/echoc                    K   t         j                  dk(  r!t        t         j                         d{   S t        t        j                          d{          d{   S 7 17 7 w)zEcho back the paramsr*   N)r	   r/   r   query_stringget_datar   r   r   echorw      sO      ~~"7#7#7888W%5%5%77888 978s3   0A*A$ A*A&A*A( A*&A*(A*z
/echo_jsonOPTIONSc                    K   t         j                  dk(  rt        dd       d{   S t        j                          d{   } t        | dt         j                         d{   S 7 C7 )7 w)zEcho back the JSONrx   r0   r1   N)r	   r/   r   rv   rr   )rO   s    r   	echo_jsonrz      sX      ~~""2s+++!!##DtS'//::: ,#:s3   #A/A)A/A+"A/$A-%A/+A/-A/z/echo_uri/<path:rest>z	/echo_urirestr0   )defaultsc                t   K   t         j                  J t        t         j                         d{   S 7 w)zEcho back the requested URIN)r	   	full_pathr   )r{   s    r   echo_urir      s1      (((w001111s   /868z/echo_paramsc                    K   t        j                          d{    t        d t         j                  j	                         D              } t        t        |              d{   S 7 N7 w)zEcho back the query parametersNc              3  *   K   | ]  \  }}||f  y wNr   )r"   kvs      r   r$   zecho_params.<locals>.<genexpr>   s     ;&:daAq6&:s   )r	   rv   sortedrq   itemsr   repr)echods    r   echo_paramsr      sR      


;gll&8&8&:;;EtE{+++ +s"   A-A)A	A-$A+%A-+A-z/headersr*   c                 ~   K   t        t        t        j                  j	                                      d {   S 7 wr   )r   r&   r	   rr   r   r   r   r   rr   rr      s)     tGOO$9$9$;<====s   4=;=z/headers_and_paramsc                    K   t        t        t        j                        t        j                  d       d {   S 7 w)N)rr   rI   )r   r&   r	   rr   rq   r   r   r   headers_and_paramsr      s5     GOO,ll	
   s   7A >A z/multi_headersc                 f   K   t        dt        t        j                        i       d {   S 7 w)Nrr   )r   listr	   rr   r   r   r   multi_headersr      s%     	4+@ABBBBr   z/multi_redirectc                   K   t         j                  } | j                  dd      }d|v r|j                  dd      n|df\  }}|J |}|st	        d|       d{   S dd| fg}t	        d	||       d{   S 7 !7 w)
z5Performs a redirect chain based on ``redirect_codes``redirect_codes200,r>   NzDone redirectingLocationz/multi_redirect?redirect_codes=r0   )r	   rq   r5   r!   r   )rI   codesheadtailstatusrr   s         r   multi_redirectr      s      \\FJJ'/E(+uS!$5$-JD$F"#5v>>>=dVDEFGr67333 ? 4s$   AA?A;A?6A=7A?=A?z/encodingrequestc                   K   d} t         j                  j                  dd      }g }|dk(  rcdg}t               }t	        j
                  t        j                  dd|            5 }|j                  |        ddd       |j                         } n3|d	k(  rd
g}t        j                  |       } n|dk(  rdg}d} n
|dk(  rd
g}d} t        | d|       d{   S # 1 sw Y   bxY w7 w)z,Check for UA accepting gzip/deflate encodings   hello, world!zAccept-Encodingr0   ri   rg   w)modefileobjNdeflate)rh   r   zgarbage-gzips   garbagezgarbage-deflater1   )r	   rr   r5   r   rD   rE   ri   GzipFilewritegetvaluer_   rc   r   )rO   encodingrr   rN   zipfiles        r   encodingrequestr      s      D""#4b9HG6/0	bsE JKwMM$ L~~	Y	23}}T"	^	#/0	&	&23tS'222 LK 3s+   A"C%$C6AC%C#C%C C%z	/redirectc                    K   t         j                   d{   } | j                  dd      }| j                  dd      }|j                  d      d   }d|fg}t	        d	||       d{   S 7 V7 w)
 Perform a redirect to ``target``Ntargetr   r   z303 See Other r   r   r0   r	   r4   r5   r!   r   )r4   r   r   status_coderr   s        r   redirectr      sq      >>!FZZ#&FZZ/2F,,s#A&KF#$Gr;888 " 9s"   A1A-AA1(A/)A1/A1z/redirect_afterc                   K   t         j                  } | j                  d      }|rot        j                  j	                  t        |      t        j                  j                        }t        j                  j                  |d      }t        |      }nd}| j                  dd      }d|fd	|fg}t        d
d|       d{   S 7 w)r   date)tzT)usegmt1r   r   r   Retry-Afterr0   i/  N)r	   rq   r5   datetimefromtimestampfloattimezoneutcemailutilsformat_datetimestrr   )rI   r   dthttp_dtretry_afterr   rr   s          r   redirect_afterr      s      \\F::fD,,U4[X=N=N=R=R,S++--b->'lZZ#&FF#m[%ABGr30000s   B?CCCz/retry_afterc                   K   t         j                  } t        j                  j                         t        z
  t        j
                  d      k  r<| j                  dd      }|j                  d      d   }t        d|dg       d {   S t        j                  j                         at        dd	       d {   S 7 67 w)
Nr>   )secondsr   z429 Too Many Requestsr   r   r0   )r   r   r1   )	r	   rq   r   nowr   	timedeltar5   r!   r   )rI   r   r   s      r   r   r     s      \\F!558J8JST8UUH&=>ll3'*"2{5I4JKKK#,,002r3''' L (s$   BCB=1C8B?9C?Cz/statusc                    K   t         j                   d {   } | j                  dd      }|j                  d      d   }t	        d|       d {   S 7 >7 w)Nr   z200 OKr   r   r0   r   )r4   r   r   s      r   r   r     sR      >>!FZZ(+F,,s#A&Kr;/// " 0s!   AA9AAAAz/source_addressc                 P   K   t        t        j                         d{   S 7 w)z"Return the requester's IP address.N)r   r	   remote_addrr   r   r   source_addressr     s      w223333s   &$&z/successful_retryr,   c                   K   t         j                  j                  dd      } | st        dd       d{   S t        | xx   dz  cc<   t        |    dk\  rt        dd       d{   S t        d	d
       d{   S 7 I7 7 w)zyFirst return an error and then success

    It's not currently very flexible as the number of retries is hard-coded.
    z	test-nameNztest-name header not setr3   r>      zRetry successful!r1   zneed to keep retrying!i  )r	   rr   r5   r   r   )	test_names    r   successful_retryr     s      ##K6I"#=sCCCY1$	"a'"#6<<<"#;SAAA D
 =As3   2BA>0B%B &B9B:B BBc                @    t         D ]  \  }}|| j                  |<    | S r   )DEFAULT_HEADERSrr   )responseheadervalues      r   apply_cachingr   1  s%    (#(  )Or   z/slowc                 t   K   t        j                  d       d {    t        dd       d {   S 7 7 w)N
   zTEN SECONDS LATERr1   )triosleepr   r   r   r   slowr   8  s1     
**R.2C888 8s   848688z/bigfilec                 @   K   ddz  } t        | d       d {   S 7 w)Ni      WOOO YAY BOOYAKAHr1   r   bigdatas    r   bigfiler   >  s&      ,,Gw,,,,   z/mediumfilec                 @   K   ddz  } t        | d       d {   S 7 w)Ni   r   r1   r   r   s    r   
mediumfiler   F  s&      ))Gw,,,,r   c                 t  K   t         j                  dk(  rt        dd       d {   S t        j                  d       d {   } t	        |       dk7  rt        dd       d {   S t         j
                   d {   }t         j                   d {   }|d	   d
k7  s|d   dk7  rt        dd       d {   S t	        |      dk7  s|j                  d
      t        dd       d {   S |d
   }|j                  dk7  r!t        d|j                   d       d {   S t        j                  |      5  |j                         j                  d      }d d d        dk7  rt        d| d       d {   S t        dd       d {   S 7 n7 S7 47 7 
7 7 7 # 1 sw Y   NxY w7 97 'w)Nrx   r0   r1   T)parse_form_datar   zBad upload data  r:   	filefieldr;   z
lolcat.txtzBad upload form valuesr>   zMissing file in formzFile name incorrect zutf-8z2I'm in ur multipart form-data, hazing a cheezburgrzFile data incorrect zUploaded file correct)r	   r/   r   rv   rC   rA   r?   r5   rH   namerD   rE   rG   decode)
spare_datarA   r?   filerO   s        r   pyodide_uploadr   M  s    ~~""2s+++''==J
:!"#4c:::--EDN{*d3D.E.U"#;SAAA
5zQ%))K08"#93???D}}$"%9$))#EsKKK			D	!yy{!!'* 
"CC"%9$#@#FFF6<<<# ,=:A? L	!	! G<s   #F8FF8F!F8%F&F8=F>F8F#F89F":2F8,F$-4F8!F&"F8; F(F8:F4;F8F6F8F8F8F8F8"F8$F8&F8(F1-F86F8z/pyodide/<py_file>c                  K   t        t        j                  d   |       }|j                         rBt	        j
                  |      \  }}|sd}t        |j                         dd|fg       d {   S t        dd       d {   S 7 7 w)Npyodide_dist_dirz
text/plainr1   zContent-Typer0   r   )r   pyodide_testing_appconfigexists	mimetypes
guess_typer   
read_bytes)py_file	file_path	mime_typer   s       r   pyodider   d  s     (//0BCWMI'229=	8$I"  "C>9*E)F
 
 	
 #2s+++	
 ,s$   A+B
-B.B
BB
B
z/wheel/dist.whlc                 V  K   t        t              j                  j                  dz  } t        | j	                  d            }t        |      dkD  r=|d   }dd|j                   dfg}t        |j                         d|       d {   }|S t        d|  d	       d {   S 7 7 w)
Ndistz*.whlr   zContent-Dispositionzinline; filename=''r1   zNO WHEEL IN r   )	r   __file__parentr   globrC   r   r   r   )wheel_folderwheelswheelrr   resps        r   r   r   r  s      >((//&8L,##G,-F
6{Qq	)-?

|1+MNO"5#3#3#5sGDD"\,#@#FFF E Gs$   BB)B%B) B'!B)'B))rX   r
   )r{   r   rX   r
   )r   r   rX   r
   )r   r   rX   r
   )B
__future__r   collectionsrD   r   email.utilsr   ri   r   r_   ior   pathlibr   typingr   r   quartr   r   r	   quart.typingr
   
quart_trior   __name__hypercorn_appCounterr   __annotations__minr   r   r   router   r   r)   r8   rP   rZ   rj   rs   rw   rz   r   r   rr   r   r   r   r   r   r   r   r   r   r   after_requestr   r   r   r   r   r   r   r   r   r   <module>r     s   "            2 2 ,  (# .A[-@-@-B * B*2*;*;*?*? ' ?  )  S38$0 %   0 %&. '. ^$0 %0 '1GH-7MN	
 O I	
 Y1! 2!< Z + !+ _%P &P \"> #> W&<=9 >9 \F84<&)1DE; F 5; ,-[FB<82 9 .2 ^$, %, Z%9> :> *+ , %v?C @C &'4 (4 '(3 )3. [*@A9 B9 &'1 (1 ^$
( %
( Y9%0 &  0 &'4 (4
 (5%.AB BB" "" # 7#9 $9
 :&- '- =)- *- 9vy.AB= C=, /0
, 1
, ,-
G .
Gr   