grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026B úÓ‰ïnšNã@sšdZdZddlmZmZmZddlmZddlZddl Z ddl Z ddl m Z ddlmZddlmZddlZddlZddlZd d d d d ddddddddddgZdadadd„Zdd„Zdd„Zdd „Zeadade jddd!fd"d „Zd8d#d „Z d9d$d „Z!d:d'd„Z"d(d)„Z#d*d„Z$Gd+d „d ƒZ%Gd,d „d ƒZ&e jfd-d„Z'd;d.d„Z(e jfd/d„Z)d0d„Z*d1d„Z+d2d„Z,d3d„Z-dæsz#parse_multipart..)r=ÚformatrZset_typeÚKeyErrorr )r@rEr+rNr0rKrDrMr")rRr#rÍs   ccs xš|dd…dkrš|dd…}| d¡}x<|dkrd| dd|¡| dd|¡drd| d|d¡}q*W|dkrvt|ƒ}|d|…}| ¡V||d…}qWdS)Nr3ú;rú"z\"rG)ÚfindÚcountÚlenÚstrip)ÚsÚendÚfr"r"r#Ú _parseparamès  *  r_cCs¼td|ƒ}| ¡}i}xš|D]’}| d¡}|dkr|d|… ¡ ¡}||dd… ¡}t|ƒdkr¨|d|dkr„dkr¨nn |dd…}| d d ¡ d d¡}|||<qW||fS) zfParse a Content-type like header. Return the main content-type and a dictionary of options. rVú=rNr3rGéÿÿÿÿrWz\\ú\z\")r_Ú__next__rXr[ÚlowerrZrJ)ÚlineÚpartsÚkeyrEÚpÚiÚnameÚvaluer"r"r#rôs   ,  c@s@eZdZdZdZdZdZdZiZdZ iZ iZ dd„Z dd„Z dS)r z=Like FieldStorage, for use when no file uploads are possible.NcCs||_||_dS)z&Constructor from field name and value.N)rjrk)Úselfrjrkr"r"r#Ú__init__szMiniFieldStorage.__init__cCsd|j|jfS)z Return printable representation.zMiniFieldStorage(%r, %r))rjrk)rlr"r"r#Ú__repr__ szMiniFieldStorage.__repr__)Ú__name__Ú __module__Ú __qualname__Ú__doc__ÚfilenameÚlistÚtypeÚfileÚ type_optionsÚ dispositionÚdisposition_optionsrMrmrnr"r"r"r#r sc @sþeZdZdZdddejdddddddf dd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z d;dd„ZdÚencodeÚlocaleZgetpreferredencodingrr7rrÚ TypeErrorrMr5r8r@rr6r+rNÚbytesruroÚ outerboundaryÚ bytes_readÚlimitrrxryrjrsÚ _binary_filerwÚ innerboundaryr9r;r:ÚlengthrtrvÚdoneÚread_urlencodedÚ read_multiÚ read_single)rlr@rMr…rArBrCr‡r+rNr~r0ÚmethodrFZcdisprErDZclenr"r"r#rmPs°/                           zFieldStorage.__init__cCs(y|j ¡Wntk r"YnXdS)N)rvr(ÚAttributeError)rlr"r"r#Ú__del__õszFieldStorage.__del__cCs|S)Nr")rlr"r"r#Ú __enter__ûszFieldStorage.__enter__cGs|j ¡dS)N)rvr()rlr'r"r"r#Ú__exit__þszFieldStorage.__exit__cCsd|j|j|jfS)z"Return a printable representation.zFieldStorage(%r, %r, %r))rjrsrk)rlr"r"r#rnszFieldStorage.__repr__cCs t| ¡ƒS)N)ÚiterÚkeys)rlr"r"r#Ú__iter__szFieldStorage.__iter__cCsT|dkrt|ƒ‚|jr:|j d¡|j ¡}|j d¡n|jdk rL|j}nd}|S)Nrkr)r�rvÚseekr<rt)rlrjrkr"r"r#Ú __getattr__ s   zFieldStorage.__getattr__cCsb|jdkrtdƒ‚g}x"|jD]}|j|kr| |¡qW|sFt|ƒ‚t|ƒdkrZ|dS|SdS)zDictionary style indexing.Nz not indexabler3r)rtrƒrjÚappendrUrZ)rlrgÚfoundÚitemr"r"r#Ú __getitem__s    zFieldStorage.__getitem__cCs8||kr0||}t|tƒr(dd„|DƒS|jSn|SdS)z8Dictionary style get() method, including 'value' lookup.cSsg|] }|j‘qSr")rk)rPÚxr"r"r#ú )sz)FieldStorage.getvalue..N)r7rtrk)rlrgÚdefaultrkr"r"r#Úgetvalue$s  zFieldStorage.getvaluecCs4||kr,||}t|tƒr$|djS|jSn|SdS)z! Return the first value received.rN)r7rtrk)rlrgrŸrkr"r"r#Úgetfirst/s   zFieldStorage.getfirstcCs:||kr2||}t|tƒr(dd„|DƒS|jgSngSdS)z Return list of received values.cSsg|] }|j‘qSr")rk)rPr�r"r"r#rž?sz(FieldStorage.getlist..N)r7rtrk)rlrgrkr"r"r#rO:s   zFieldStorage.getlistcCs*|jdkrtdƒ‚ttdd„|jDƒƒƒS)zDictionary style keys() method.Nz not indexablecss|] }|jVqdS)N)rj)rPr›r"r"r#ú Isz$FieldStorage.keys..)rtrƒÚset)rlr"r"r#r•Es zFieldStorage.keyscs*|jdkrtdƒ‚t‡fdd„|jDƒƒS)z%Dictionary style __contains__ method.Nz not indexablec3s|]}|jˆkVqdS)N)rj)rPr›)rgr"r#r¢Osz,FieldStorage.__contains__..)rtrƒÚany)rlrgr")rgr#Ú __contains__Ks zFieldStorage.__contains__cCs t| ¡ƒS)z Dictionary style len(x) support.)rZr•)rlr"r"r#Ú__len__QszFieldStorage.__len__cCs|jdkrtdƒ‚t|jƒS)NzCannot be converted to bool.)rtrƒÚbool)rlr"r"r#Ú__bool__Us zFieldStorage.__bool__c Cs–|j |j¡}t|tƒs0td|jt|ƒjfƒ‚| |j |j ¡}|j rT|d|j 7}t j j||j|j|j |j |j|jd�}dd„|Dƒ|_| ¡dS)z+Internal: read data in query string format.z%s should return bytes, got %sr*)r+rNr~r0cSsg|]\}}t||ƒ‘qSr")r )rPrgrkr"r"r#ržgsz0FieldStorage.read_urlencoded..N)r@r<rŠr7r„r;ruror=r+rNr€r?r r rBrCr~r0rtÚ skip_lines)rlrFÚqueryr"r"r#rŒZs  zFieldStorage.read_urlencodedc CsT|j}t|ƒstd|fƒ‚g|_|jrftjj|j|j|j |j |j |j |j d�}|j dd„|Dƒ¡|jpp|j}|j ¡}t|tƒsžtd|jt|ƒjfƒ‚|jt|ƒ7_x6| ¡d|jkræ|ræ|j ¡}|jt|ƒ7_q²W|j }|dk �r|t|jƒ8}�x>tƒ} d} x$|j ¡} | | 7} |  ¡�sP�qW| �sBP|jt| ƒ7_|  |  |j |j ¡¡|  ¡} d | k�r‚| d =|jdk�r’dn |j|j} ||j| ||||| |j |j ||j ƒ }|dk �rü|d 8}|j�rê|t|jƒ8}|d k�rütd ƒ‚|j|j7_|j |¡|j �s@|j|j!k�r.z%s should return bytes, got %ss--Nrzzcontent-lengthr3rzMax number of fields exceeded)#r‰Úvalid_boundaryr;rtr€r?r r rBrCr+rNr~r0ÚextendÚFieldStorageClassÚ __class__r@r|r7r„ruror†rZr[rZfeedr=r(r‡r™r‹rŠr©)rlrArBrCZibrªÚklassZ first_liner~ÚparserZhdr_textÚdatarMr‡Úpartr"r"r#r�lsl             (zFieldStorage.read_multicCs4|jdkr| ¡| ¡n| ¡|j d¡dS)zInternal: read an atomic part.rN)rŠÚ read_binaryr©Ú read_linesrvr—)rlr"r"r#rޱs   zFieldStorage.read_singlei cCs–| ¡|_|j}|dkr’xx|dkr�|j t||jƒ¡}t|tƒsXt d|jt |ƒj fƒ‚|j t |ƒ7_ |svd|_P|j |¡|t |ƒ}qWdS)zInternal: read binary data.rz%s should return bytes, got %sraN)Ú make_filervrŠr@r<ÚminÚbufsizer7r„r;ruror†rZr‹r&)rlZtodor±r"r"r#r³¼s    zFieldStorage.read_binarycCs@|jrtƒ|_|_ntƒ|_|_|jr4| ¡n| ¡dS)z0Internal: read lines until EOF or outerboundary.N)rˆrrvÚ_FieldStorage__filerr…Úread_lines_to_outerboundaryÚread_lines_to_eof)rlr"r"r#r´Ís  zFieldStorage.read_linescCsv|jdk rF|j ¡t|ƒdkrF| ¡|_|j ¡}|j |¡d|_|jrZ|j |¡n|j | |j |j ¡¡dS)z line is always bytes, not stringNiè) r¸ÚtellrZrµrvr r&rˆr=r+rN)rlrer±r"r"r#Z__writeØs    zFieldStorage.__writecCs>x8|j d¡}|jt|ƒ7_|s,d|_P| |¡qWdS)zInternal: read lines until EOF.iraN)r@r|r†rZr‹Ú_FieldStorage__write)rlrer"r"r#rºçs zFieldStorage.read_lines_to_eofc CsHd|j}|d}d}d}d}�x"|jdk rHd|jkrB|krHnnP|j d¡}|jt|ƒ7_|t|ƒ7}|s~d|_P|dkr’||}d}| d¡rÂ|rÂ| ¡}||kr²P||krÂd |_P|}|  d ¡ræd }|dd …}d}nL|  d ¡�rd }|dd…}d}n*|  d¡�r*d}|dd…}d }nd}d }|  ||¡q"WdS)zžInternal: read lines until outerboundary. Data is read as bytes: boundaries and line ends must be converted to bytes for comparisons. s--rzTrNiraó r3s éþÿÿÿó F) r…r‡r@r|r†rZr‹Ú startswithÚrstripÚendswithr¼) rlÚ next_boundaryÚ last_boundaryZdelimÚlast_line_lfendZ_readreÚ strippedlineZodelimr"r"r#r¹ñsP $        z(FieldStorage.read_lines_to_outerboundarycCs”|jr |jrdSd|j}|d}d}xh|j d¡}|jt|ƒ7_|sRd|_P| d¡r‚|r‚| ¡}||krrP||kr‚d|_P| d¡}q(WdS)z5Internal: skip lines until outer boundary if defined.Ns--Tirar3r¿)r…r‹r@r|r†rZrÂr[)rlrÃrÄrÅrerÆr"r"r#r©#s&   zFieldStorage.skip_linescCs&|jrt d¡Stjd|jdd�SdS)a¯Overridable: return a readable & writable file. The file will be used as follows: - data is written to it - seek(0) - data is read from it The file is opened in binary mode for files, in text mode for other fields This version opens a temporary file for reading and writing, and immediately deletes (unlinks) it. The trick (on Unix!) is that the file can still be used, but it can't be opened by another process, and it will automatically be deleted when it is closed or when the current process terminates. If you want a more permanent file, you derive a class which overrides this method. If you want a visible temporary file that is nevertheless automatically deleted when the script terminates, try defining a __del__ method in a derived class which unlinks the temporary files you have created. zwb+zw+r%)r+ÚnewlineN)rˆÚtempfileZ TemporaryFiler+)rlr"r"r#rµ9s zFieldStorage.make_file)N)N)!rorprqrrÚosrArmr‘r’r“rnr–r˜rœr r¡rOr•r¥r¦r¨rŒr­r�rŽr·r³r´r¼rºr¹r©rµr"r"r"r#r %s@*#   E   2cCsÂtdƒtƒtjt_yNtƒ}tƒtƒt|ƒt|ƒt ƒdd„}|fdd„}tdƒ|ƒWnt ƒYnXtdƒda y&tƒ}tƒtƒt|ƒt|ƒWnt ƒYnXd S) z—Robust test CGI script, usable as main program. Write minimal HTTP headers and dump all information provided to the script in HTML form. zContent-type: text/htmlcSs tdƒdS)Nz,testing print_exception() -- italics?)Úexecr"r"r"r#r^lsztest..fcSs |ƒdS)Nr")r^r"r"r#Úgnsztest..gz9

What follows is a test, not an actual exception:

z*

Second try with a small maxlen...

é2N) Úprintr4ÚstdoutÚstderrr rrrrrrr:)rAÚformr^rËr"r"r#r[s4    c Csx|dkrt ¡\}}}ddl}tƒtdƒ| ||¡| ||¡}tdt d |dd…¡¡t |d¡fƒ~dS)Nrz+

Traceback (most recent call last):

z
%s%s
rra) r4Úexc_infoÚ tracebackrÍÚ format_tbÚformat_exception_onlyÚhtmlrÚjoin)rurkÚtbr‡rÒrtr"r"r#r‚s c Cs`t| ¡ƒ}tƒtdƒtdƒx*|D]"}tdt |¡dt ||¡ƒq(WtdƒtƒdS)z#Dump the shell environment as HTML.z

Shell Environment:

z
z
z
z
N)Úsortedr•rÍrÕr)rAr•rgr"r"r#r�s  "cCs¤t| ¡ƒ}tƒtdƒ|s&tdƒtdƒxb|D]Z}tdt |¡ddd�||}tdt tt|ƒƒ¡d ƒtd t t|ƒ¡ƒq4Wtd ƒtƒd S) z$Dump the contents of a form as HTML.z

Form Contents:

z

No form fields.z

z
ú:ú )r]zzz
z
N)rØr•rÍrÕrÚreprru)rÐr•rgrkr"r"r#r›s  c Csjtƒtdƒy t ¡}Wn6tk rP}ztdt t|ƒ¡ƒWdd}~XYnXtt |¡ƒtƒdS)z#Dump the current directory as HTML.z#

Current Working Directory:

zOSError:N)rÍrÉÚgetcwdrrÕrÚstr)ÚpwdÚmsgr"r"r#r«s &cCs(tƒtdƒtƒttjƒtƒdS)Nz

Command Line Arguments:

)rÍr4r>r"r"r"r#r·s  cCs tdƒdS)z9Dump a list of environment variables used by CGI as HTML.aØ

These environment variables could have been set:

  • AUTH_TYPE
  • CONTENT_LENGTH
  • CONTENT_TYPE
  • DATE_GMT
  • DATE_LOCAL
  • DOCUMENT_NAME
  • DOCUMENT_ROOT
  • DOCUMENT_URI
  • GATEWAY_INTERFACE
  • LAST_MODIFIED
  • PATH
  • PATH_INFO
  • PATH_TRANSLATED
  • QUERY_STRING
  • REMOTE_ADDR
  • REMOTE_HOST
  • REMOTE_IDENT
  • REMOTE_USER
  • REQUEST_METHOD
  • SCRIPT_NAME
  • SERVER_NAME
  • SERVER_PORT
  • SERVER_PROTOCOL
  • SERVER_ROOT
  • SERVER_SOFTWARE
In addition, HTTP headers sent by the server may be passed in the environment as well. Here are some common variable names:
  • HTTP_ACCEPT
  • HTTP_CONNECTION
  • HTTP_HOST
  • HTTP_PRAGMA
  • HTTP_REFERER
  • HTTP_USER_AGENT
N)rÍr"r"r"r#r¾s'cCsFtdtdd�| dd¡}| dd¡}| dd ¡}|rB| d d ¡}|S) zDeprecated API.z1cgi.escape is deprecated, use html.escape insteadrG)Ú stacklevelr*z&úz>rWz")rrHrJ)r\Zquoter"r"r#rís     cCs(ddl}t|tƒrd}nd}| ||¡S)Nrs^[ -~]{0,200}[!-~]$z^[ -~]{0,200}[!-~]$)Úrer7r„Úmatch)r\rãZ _vb_patternr"r"r#r«ùs  r«Ú__main__)rr)rr)rIrJr*)NNNN)N)1rrÚ __version__ÚiorrrZcollections.abcrr4rÉZ urllib.parser?Z email.parserrZ email.messagerÚwarningsrrÕr‚rÈÚ__all__rrr$r rr)rr:rAr r r rr_rr r rrrrrrrrr«ror"r"r"r#Úsb     # H    :'   /