a
    ze                     @   sR  d Z ddlmZmZmZ ddlm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ZddlZddlZg dZdadad	d
 Zdd Zdd Zdd ZeadadejdddfddZd1ddZdd Zdd ZG dd dZ G dd dZ!ejfd d!Z"d2d"d#Z#ejfd$d%Z$d&d' Z%d(d) Z&d*d+ Z'd,d- Z(d.d/ Z)e*d0krNe"  dS )3z2.6    )StringIOBytesIOTextIOWrapper)MappingN)
FeedParser)Message)MiniFieldStorageFieldStorageparseparse_multipartparse_headertestprint_exceptionprint_environ
print_formprint_directoryprint_argumentsprint_environ_usage c                  G   sD   t r*ts*ztt daW n ty(   Y n0 ts4tantat|   d S )Na)logfilelogfpopenOSErrornologlogdologZallargs r   /usr/lib/python3.9/cgi.pyinitlog8   s    r    c                 G   s   t | | d  d S )N
)r   write)fmtargsr   r   r   r   [   s    r   c                  G   s   d S Nr   r   r   r   r   r   _   s    r   c                   C   s   da trt  d atad S )Nr   )r   r   closer    r   r   r   r   r   closelogc   s
    r'   &c           
      C   s^  | d u rt j} t| dr | j}nd}t| tr4| j} d|vrDd|d< |d dkrt|d \}}|dkrxt| ||dS |d	krt	|d
 }t
r|t
krtd| ||}	nd}	d|v r|	r|	d }	|	|d  }	n*t jdd  r|	r|	d }	|	t jd  }	|	|d< n<d|v r |d }	n(t jdd  r<t jd }	nd}	|	|d< tjj|	||||dS )Nencodingzlatin-1REQUEST_METHODGETPOSTCONTENT_TYPEzmultipart/form-data)	separator!application/x-www-form-urlencodedCONTENT_LENGTHMaximum content length exceededr   QUERY_STRINGr(      )r)   r.   )sysstdinhasattrr)   
isinstancer   bufferr   r   intmaxlen
ValueErrorreaddecodeargvurllibr
   parse_qs)
fpenvironkeep_blank_valuesstrict_parsingr.   r)   ctypepdictZclengthqsr   r   r   r
   v   sF    




r
   utf-8replacec                    sv   |d  d}d|}t }|| z|d |d< W n tyJ   Y n0 t| |||ddi|d  fd	d
 D S )Nboundaryasciiz multipart/form-data; boundary={}zCONTENT-LENGTHzContent-Lengthr*   r,   )headersr)   errorsrB   r.   c                    s   i | ]}|  |qS r   )getlist).0kfsr   r   
<dictcomp>       z#parse_multipart.<locals>.<dictcomp>)r=   formatr   Zset_typeKeyErrorr	   )rA   rF   r)   rM   r.   rJ   rE   rL   r   rQ   r   r      s    


r   c                 c   s   | d d dkr| dd  } |  d}|dkr`| dd|| dd| d r`|  d|d }q&|dk rpt| }| d | }| V  | |d  } q d S )Nr3   ;r   "\"   )findcountlenstrip)sendfr   r   r   _parseparam   s    
(
rb   c                 C   s   t d|  }| }i }|D ]}|d}|dkr|d |   }||d d   }t|dkr|d |d   krdkrn n |dd }|dd	d
d}|||< q||fS )NrW   =r   r3   rZ   rX   z\\\rY   )rb   __next__r[   r^   lowerr]   rI   )linepartskeyrF   pinamevaluer   r   r   r      s    
,
r   c                   @   s<   e Zd ZdZdZdZdZi ZdZi Z	i Z
dd Zdd ZdS )r   Nc                 C   s   || _ || _d S r%   rm   rn   selfrm   rn   r   r   r   __init__	  s    zMiniFieldStorage.__init__c                 C   s   d| j | jf S )NzMiniFieldStorage(%r, %r)ro   rq   r   r   r   __repr__  s    zMiniFieldStorage.__repr__)__name__
__module____qualname__filenamelisttypefiletype_optionsdispositiondisposition_optionsrL   rr   rt   r   r   r   r   r      s   r   c                   @   s   e Zd ZdddejdddddddfddZd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd Zd:ddZd;ddZdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& ZdZd'd( Zd)d* Zd+Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 ZdS )<r	   NrT   r   rH   rI   r(   c                 C   sX  d}|| _ || _|
| _|| _d|v r0|d  }d | _|dksF|dkrd|v rX|d }ntjdd  rrtjd }nd}|t	
 d}t|}|d u rdd	i}|d u ri }|d
krd	|d< d|v r|d |d< d|v r|d | _d|v r|d |d< nt|ttfstd|| _|d u r*tjj| _n<t|tr@|j| _n&t|drXt|ds`td|| _|| _|	| _t|tstdt|j || _d| _|| _di  }}d| jv rt| jd \}}|| _|| _ d | _!d|v r|d | _!d | _"d|v r
|d | _"| j"d u| _#d| jv r6t| jd \}}n(| jsH|d
krTdi  }}n
d	i  }}|| _|| _$d|v r|d | j| j| _%nd| _%d}d| jv rzt&| jd }W n t'y   Y n0 t(r|t(krt'd|| _)| jd u r|dkr|| _d  | _*| _+d| _,|d	kr*| -  n*|d d dkrL| .||| n| /  d S )Nr+   r*   ZHEADr2   r3   r   surrogateescapezcontent-typer/   r,   r-   r0   content-lengthz?headers must be mapping or an instance of email.message.Messager<   readlinezfp must be file pointerz#outerboundary must be bytes, not %sr   zcontent-dispositionrm   rx   z
text/plainrJ   rT   rd   r1   
   z
multipart/)0rC   rD   max_num_fieldsr.   upper
qs_on_postr4   r>   encodelocalegetpreferredencodingr   r7   r   r   	TypeErrorrL   r5   r8   rA   r   r6   r)   rM   bytesrz   ru   outerboundary
bytes_readlimitr   r}   r~   rm   rx   _binary_filer|   innerboundaryr9   r;   r:   lengthry   r{   doneread_urlencoded
read_multiread_single)rq   rA   rL   r   rB   rC   rD   r   r)   rM   r   r.   methodrG   ZcdisprF   rE   Zclenr   r   r   rr   ?  s    /












zFieldStorage.__init__c                 C   s&   z| j   W n ty    Y n0 d S r%   )r{   r&   AttributeErrorrs   r   r   r   __del__  s    zFieldStorage.__del__c                 C   s   | S r%   r   rs   r   r   r   	__enter__  s    zFieldStorage.__enter__c                 G   s   | j   d S r%   )r{   r&   )rq   r$   r   r   r   __exit__  s    zFieldStorage.__exit__c                 C   s   d| j | j| jf S )NzFieldStorage(%r, %r, %r))rm   rx   rn   rs   r   r   r   rt     s    zFieldStorage.__repr__c                 C   s   t |  S r%   )iterkeysrs   r   r   r   __iter__  s    zFieldStorage.__iter__c                 C   sT   |dkrt || jr:| jd | j }| jd n| jd urL| j}nd }|S )Nrn   r   )r   r{   seekr<   ry   rp   r   r   r   __getattr__  s    

zFieldStorage.__getattr__c                 C   s^   | j d u rtdg }| j D ]}|j|kr|| q|sBt|t|dkrV|d S |S d S )Nnot indexabler3   r   )ry   r   rm   appendrV   r]   )rq   rj   founditemr   r   r   __getitem__  s    

zFieldStorage.__getitem__c                 C   s8   || v r0| | }t |tr(dd |D S |jS n|S d S )Nc                 S   s   g | ]
}|j qS r   rn   rO   xr   r   r   
<listcomp>  rT   z)FieldStorage.getvalue.<locals>.<listcomp>r7   ry   rn   rq   rj   defaultrn   r   r   r   getvalue  s    
zFieldStorage.getvaluec                 C   s4   || v r,| | }t |tr$|d jS |jS n|S d S Nr   r   r   r   r   r   getfirst  s    

zFieldStorage.getfirstc                 C   s:   || v r2| | }t |tr(dd |D S |jgS ng S d S )Nc                 S   s   g | ]
}|j qS r   r   r   r   r   r   r   .  rT   z(FieldStorage.getlist.<locals>.<listcomp>r   )rq   rj   rn   r   r   r   rN   )  s    

zFieldStorage.getlistc                 C   s*   | j d u rtdt tdd | j D S )Nr   c                 s   s   | ]}|j V  qd S r%   rm   rO   r   r   r   r   	<genexpr>8  rT   z$FieldStorage.keys.<locals>.<genexpr>)ry   r   setrs   r   r   r   r   4  s    
zFieldStorage.keysc                    s*   | j d u rtdt fdd| j D S )Nr   c                 3   s   | ]}|j  kV  qd S r%   r   r   rj   r   r   r   >  rT   z,FieldStorage.__contains__.<locals>.<genexpr>)ry   r   any)rq   rj   r   r   r   __contains__:  s    
zFieldStorage.__contains__c                 C   s   t |  S r%   )r]   r   rs   r   r   r   __len__@  s    zFieldStorage.__len__c                 C   s   | j d u rtdt| j S )NzCannot be converted to bool.)ry   r   boolrs   r   r   r   __bool__D  s    
zFieldStorage.__bool__c              	   C   s   | j | j}t|ts0td| j t|jf || j	| j
}| jrT|d| j 7 }tjj|| j| j| j	| j
| j| jd}dd |D | _|   d S )N%s should return bytes, got %sr(   r)   rM   r   r.   c                 S   s   g | ]\}}t ||qS r   r   rO   rj   rn   r   r   r   r   V  rT   z0FieldStorage.read_urlencoded.<locals>.<listcomp>)rA   r<   r   r7   r   r;   rz   ru   r=   r)   rM   r   r?   r
   	parse_qslrC   rD   r   r.   ry   
skip_lines)rq   rG   queryr   r   r   r   I  s    

zFieldStorage.read_urlencodedc                 C   sL  | j }t|std|f g | _| jrftjj| j| j| j	| j
| j| j| jd}| jdd |D  | jpp| j}| j }t|tstd| jt|jf |  jt|7  _| d| j  kr|r| j }|  jt|7  _q| j}|d ur|t| j8 }t }	d}
| j }|
|7 }
| sq0q|
s:q@|  jt|
7  _|	|
| j
| j |	 }d|v rz|d= | jd u rd n
| j| j }|| j||||||| j
| j|| j}|d ur|d	8 }|jr|t|j8 }|d
k rtd|  j|j7  _| j| |j s@| j| j!  kr4d
krn nq@q| "  d S )Nz&Invalid boundary in multipart form: %rr   c                 s   s   | ]\}}t ||V  qd S r%   r   r   r   r   r   r   f  rT   z*FieldStorage.read_multi.<locals>.<genexpr>r      --rT   r   r3   r   zMax number of fields exceeded)#r   valid_boundaryr;   ry   r   r?   r
   r   rC   rD   r)   rM   r   r.   extendFieldStorageClass	__class__rA   r   r7   r   rz   ru   r   r]   r^   r   Zfeedr=   r&   r   r   r   r   r   )rq   rB   rC   rD   Zibr   klassZ
first_liner   parserZhdr_textdatarL   r   partr   r   r   r   [  sr    









(zFieldStorage.read_multic                 C   s4   | j dkr|   |   n|   | jd d S r   )r   read_binaryr   
read_linesr{   r   rs   r   r   r   r     s
    

zFieldStorage.read_singlei    c                 C   s   |   | _| j}|dkr|dkr| jt|| j}t|tsVt	d| jt
|jf |  jt|7  _|std| _q| j| |t| }qd S )Nr   r   rd   )	make_filer{   r   rA   r<   minbufsizer7   r   r;   rz   ru   r   r]   r   r"   )rq   Ztodor   r   r   r   r     s    

zFieldStorage.read_binaryc                 C   s@   | j rt  | _| _nt  | _| _| jr4|   n|   d S r%   )r   r   r{   _FieldStorage__filer   r   read_lines_to_outerboundaryread_lines_to_eofrs   r   r   r   r     s    
zFieldStorage.read_linesc                 C   sv   | j d urF| j  t| dkrF|  | _| j  }| j| d | _ | jrZ| j| n| j|| j	| j
 d S )Ni  )r   tellr]   r   r{   r   r"   r   r=   r)   rM   )rq   rh   r   r   r   r   Z__write  s    


zFieldStorage.__writec                 C   s:   | j d}|  jt|7  _|s*d| _q6| | q d S )N   rd   )rA   r   r   r]   r   _FieldStorage__write)rq   rh   r   r   r   r     s    zFieldStorage.read_lines_to_eofc           	      C   sJ  d| j  }|d }d}d}d}| jd urFd| j  kr>|krFn nqF| jd}|  jt|7  _|t|7 }|s~d| _qF|dkr|| }d}|dr|r| }||krqF||krd| _qF|}|	d	rd	}|d d
 }d}nL|	drd}|d d }d}n*|	dr.d}|d d }d}nd}d}| 
||  qd S )Nr   rT   Tr   r   rd      r3   s   
   
F)r   r   rA   r   r   r]   r   
startswithrstripendswithr   )	rq   next_boundarylast_boundarydelimlast_line_lfend_readrh   strippedlineZodelimr   r   r   r     sN    
$
z(FieldStorage.read_lines_to_outerboundaryc                 C   s   | j r| jrd S d| j  }|d }d}| jd}|  jt|7  _|sPd| _q|dr|r| }||krpq||krd| _q|d}q&d S )Nr   Tr   rd   r3   r   )r   r   rA   r   r   r]   r   r^   )rq   r   r   r   rh   r   r   r   r   r     s$    
zFieldStorage.skip_linesc                 C   s&   | j rtdS tjd| jddS d S )Nzwb+zw+r!   )r)   newline)r   tempfileTemporaryFiler)   rs   r   r   r   r   (  s
    
zFieldStorage.make_file)N)N) ru   rv   rw   osrB   rr   r   r   r   rt   r   r   r   r   r   rN   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	     s@   +
 &

E	
2r	   c                 C   s   t d t   tjt_zNt }t  t  t| t|  t	  dd }|fdd}t d |  W n   t
  Y n0 t d daz&t }t  t  t| t|  W n   t
  Y n0 d S )	NzContent-type: text/htmlc                   S   s   t d d S )Nz,testing print_exception() -- <I>italics?</I>)execr   r   r   r   ra   [  s    ztest.<locals>.fc                 S   s
   |   d S r%   r   )ra   r   r   r   g]  s    ztest.<locals>.gz9<H3>What follows is a test, not an actual exception:</H3>z*<H1>Second try with a small maxlen...</H1>2   )printr4   stdoutstderrr	   r   r   r   r   r   r   r:   )rB   formra   r   r   r   r   r   J  s4    
r   c              	   C   sx   | d u rt  \} }}dd l}t  td ||||| | }tdtd|d d t|d f  ~d S )Nr   z+<H3>Traceback (most recent call last):</H3>z<PRE>%s<B>%s</B></PRE>r   rd   )	r4   exc_info	tracebackr   	format_tbformat_exception_onlyhtmlescapejoin)rz   rn   tbr   r   ry   r   r   r   r   q  s    

r   c              	   C   s\   t |  }t  td td |D ]"}tdt|dt| |  q&td t  d S )Nz<H3>Shell Environment:</H3><DL><DT><DD></DL>)sortedr   r   r   r   )rB   r   rj   r   r   r   r     s     r   c                 C   s   t |  }t  td |s&td td |D ]Z}tdt| d dd | | }tdttt| d	  td
tt|  q2td t  d S )Nz<H3>Form Contents:</H3>z<P>No form fields.r   r   : )r`   z<i>z</i>r   r   )r   r   r   r   r   reprrz   )r   r   rj   rn   r   r   r   r     s    r   c               
   C   sl   t   t d zt } W n8 tyR } z t dtt| W Y d }~nd }~0 0 t t|  t   d S )Nz#<H3>Current Working Directory:</H3>zOSError:)r   r   getcwdr   r   r   str)pwdmsgr   r   r   r     s    *r   c                   C   s(   t   t d t   t tj t   d S )Nz <H3>Command Line Arguments:</H3>)r   r4   r>   r   r   r   r   r     s
    
r   c                   C   s   t d d S )Na  
<H3>These environment variables could have been set:</H3>
<UL>
<LI>AUTH_TYPE
<LI>CONTENT_LENGTH
<LI>CONTENT_TYPE
<LI>DATE_GMT
<LI>DATE_LOCAL
<LI>DOCUMENT_NAME
<LI>DOCUMENT_ROOT
<LI>DOCUMENT_URI
<LI>GATEWAY_INTERFACE
<LI>LAST_MODIFIED
<LI>PATH
<LI>PATH_INFO
<LI>PATH_TRANSLATED
<LI>QUERY_STRING
<LI>REMOTE_ADDR
<LI>REMOTE_HOST
<LI>REMOTE_IDENT
<LI>REMOTE_USER
<LI>REQUEST_METHOD
<LI>SCRIPT_NAME
<LI>SERVER_NAME
<LI>SERVER_PORT
<LI>SERVER_PROTOCOL
<LI>SERVER_ROOT
<LI>SERVER_SOFTWARE
</UL>
In addition, HTTP headers sent by the server may be passed in the
environment as well.  Here are some common variable names:
<UL>
<LI>HTTP_ACCEPT
<LI>HTTP_CONNECTION
<LI>HTTP_HOST
<LI>HTTP_PRAGMA
<LI>HTTP_REFERER
<LI>HTTP_USER_AGENT
</UL>
)r   r   r   r   r   r     s    r   c                 C   s(   dd l }t| trd}nd}||| S )Nr   s   ^[ -~]{0,200}[!-~]$z^[ -~]{0,200}[!-~]$)rer7   r   match)r_   r   Z_vb_patternr   r   r   r     s
    
r   __main__)rH   rI   r(   )NNNN)+__version__ior   r   r   collections.abcr   r4   r   urllib.parser?   Zemail.parserr   Zemail.messager   r   r   r   __all__r   r   r    r   r   r'   r   r:   rB   r
   r   rb   r   r   r	   r   r   r   r   r   r   r   r   ru   r   r   r   r   <module>   sR   #	
F
    :'
/
