B
    u9a                 @   s  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mZ ddlZddlZddlZdd	d
ddddddddddddg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fd d
Zd6d!dZd7d"dZ d8d%dZ!d&d' Z"d(d Z#G d)d dZ$G d*d	 d	Z%ejfd+dZ&d9d,dZ'ejfd-dZ(d.d Z)d/d Z*d0d Z+d1d Z,d:d2dZ-d3d4 Z.e/d5kre&  dS );z2.6    )StringIOBytesIOTextIOWrapper)MappingN)
FeedParser)Message)warnMiniFieldStorageFieldStorageparseparse_qs	parse_qslparse_multipartparse_headertestprint_exceptionprint_environ
print_formprint_directoryprint_argumentsprint_environ_usageescape c              G   sF   t r,ts,ytt daW n tk
r*   Y nX ts6tantat|   d S )Na)logfilelogfpopenOSErrornologlogdolog)allargs r"   /usr/lib/python3.7/cgi.pyinitlog:   s    r$   c             G   s   t | | d  d S )N
)r   write)Zfmtargsr"   r"   r#   r    ]   s    r    c              G   s   d S )Nr"   )r!   r"   r"   r#   r   a   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#   closeloge   s
    r)   c       	      C   sV  | d krt j} t| dr | j}nd}t| tr4| j} d|krDd|d< |d dkrt|d \}}|dkrtt| |S |dkrt	|d	 }t
r|t
krtd
| ||}nd}d|kr|r|d }||d  }n(t jdd  r|r|d }|t jd  }||d< n<d|kr|d }n(t jdd  r6t jd }nd}||d< tjj||||dS )Nencodingzlatin-1REQUEST_METHODGETPOSTCONTENT_TYPEzmultipart/form-dataz!application/x-www-form-urlencodedCONTENT_LENGTHzMaximum content length exceededr   QUERY_STRING&   )r*   )sysstdinhasattrr*   
isinstancer   bufferr   r   intmaxlen
ValueErrorreaddecodeargvurllibr   r   )	fpenvironkeep_blank_valuesstrict_parsingr*   ctypepdictZclengthqsr"   r"   r#   r   x   sH    


  


c             C   s   t dtd tj| ||S )Nz=cgi.parse_qs is deprecated, use urllib.parse.parse_qs instead   )r   DeprecationWarningr>   r   r   )rE   rA   rB   r"   r"   r#   r      s    c             C   s   t dtd tj| ||S )Nz?cgi.parse_qsl is deprecated, use urllib.parse.parse_qsl insteadrF   )r   rG   r>   r   r   )rE   rA   rB   r"   r"   r#   r      s    utf-8replacec                s\   |d  d}d|}t }|| |d |d< t| |||ddid  fd	d
 D S )Nboundaryasciiz multipart/form-data; boundary={}zCONTENT-LENGTHzContent-Lengthr+   r-   )headersr*   errorsr@   c                s   i | ]}  ||qS r"   )getlist).0k)fsr"   r#   
<dictcomp>   s    z#parse_multipart.<locals>.<dictcomp>)r<   formatr   Zset_typer
   )r?   rD   r*   rM   rJ   rC   rL   r"   )rQ   r#   r      s    


c             c   s   x| d d dkr| dd  } |  d}x<|dkrd| dd|| dd| d rd|  d|d }q*W |dk rvt| }| d | }| V  | |d  } qW d S )Nr2   ;r   "z\"rF   )findcountlenstrip)sendfr"   r"   r#   _parseparam   s    
*
r]   c             C   s   t d|  }| }i }x|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W ||fS )NrT   =r   r2   rF   rU   z\\\z\")r]   __next__rV   rY   lowerrX   rI   )linepartskeyrD   pinamevaluer"   r"   r#   r      s    

,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 )N)rh   ri   )selfrh   ri   r"   r"   r#   __init__  s    zMiniFieldStorage.__init__c             C   s   d| j | jf S )NzMiniFieldStorage(%r, %r))rh   ri   )rj   r"   r"   r#   __repr__  s    zMiniFieldStorage.__repr__)__name__
__module____qualname__filenamelisttypefiletype_optionsdispositiondisposition_optionsrL   rk   rl   r"   r"   r"   r#   r	     s   c            
   @   s   e Zd Zdddej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d9d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d/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 ZdS );r
   N    r   zutf-8rI   c             C   sP  d}|| _ || _|
| _d|kr*|d  }d | _|dks@|dkrd|krR|d }ntjdd  rltjd }nd}|t	 d}t
|}|d krdd	i}|d kri }|d
krd	|d< d|kr|d |d< d|kr|d | _d|kr|d |d< nt|ttfstd|| _|d kr$tjj| _n<t|tr:|j| _n&t|drRt|dsZtd|| _|| _|	| _t|tstdt|j || _d| _|| _di  }}d| jkrt| jd \}}|| _|| _d | _ d|kr|d | _ d | _!d|kr|d | _!| j!d k	| _"d| jkr0t| jd \}}n(| jsB|d
krNdi  }}n
d	i  }}|| _|| _#d|kr|d | j| j| _$nd| _$d}d| jkryt%| jd }W n t&k
r   Y nX t'r|t'krt&d|| _(| jd kr|r|| _d  | _)| _*d| _+|d	kr"| ,  n*|d d dkrD| -||| n| .  d S )Nr,   r+   ZHEADr0   r2   r   surrogateescapezcontent-typez!application/x-www-form-urlencodedr-   r.   r/   z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-dispositionrh   rp   z
text/plainrJ   rw   r_   zMaximum content length exceeded
   z
multipart/)/rA   rB   max_num_fieldsupper
qs_on_postr3   r=   encodelocalegetpreferredencodingr   r6   r   r   	TypeErrorrL   r4   r7   r?   r   r5   r*   rM   bytesrr   rm   outerboundary
bytes_readlimitr   ru   rv   rh   rp   _binary_filert   innerboundaryr8   r:   r9   lengthrq   rs   doneread_urlencoded
read_multiread_single)rj   r?   rL   r   r@   rA   rB   r   r*   rM   r{   methodrE   ZcdisprD   rC   Zclenr"   r"   r#   rk   I  s    /












zFieldStorage.__init__c             C   s(   y| j   W n tk
r"   Y nX d S )N)rs   r(   AttributeError)rj   r"   r"   r#   __del__  s    zFieldStorage.__del__c             C   s   | S )Nr"   )rj   r"   r"   r#   	__enter__  s    zFieldStorage.__enter__c             G   s   | j   d S )N)rs   r(   )rj   r'   r"   r"   r#   __exit__  s    zFieldStorage.__exit__c             C   s   d| j | j| jf S )NzFieldStorage(%r, %r, %r))rh   rp   ri   )rj   r"   r"   r#   rl     s    zFieldStorage.__repr__c             C   s   t |  S )N)iterkeys)rj   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 k	rL| j}nd }|S )Nri   r   )r   rs   seekr;   rq   )rj   rh   ri   r"   r"   r#   __getattr__  s    

zFieldStorage.__getattr__c             C   sb   | j d krtdg }x"| j D ]}|j|kr|| qW |sFt|t|dkrZ|d S |S d S )Nznot indexabler2   r   )rq   r   rh   appendKeyErrorrX   )rj   re   founditemr"   r"   r#   __getitem__  s    

 zFieldStorage.__getitem__c             C   s8   || kr0| | }t |tr(dd |D S |jS n|S d S )Nc             S   s   g | ]
}|j qS r"   )ri   )rO   xr"   r"   r#   
<listcomp>!  s    z)FieldStorage.getvalue.<locals>.<listcomp>)r6   rq   ri   )rj   re   defaultri   r"   r"   r#   getvalue  s    
zFieldStorage.getvaluec             C   s4   || kr,| | }t |tr$|d jS |jS n|S d S )Nr   )r6   rq   ri   )rj   re   r   ri   r"   r"   r#   getfirst'  s    

zFieldStorage.getfirstc             C   s:   || kr2| | }t |tr(dd |D S |jgS ng S d S )Nc             S   s   g | ]
}|j qS r"   )ri   )rO   r   r"   r"   r#   r   7  s    z(FieldStorage.getlist.<locals>.<listcomp>)r6   rq   ri   )rj   re   ri   r"   r"   r#   rN   2  s    

zFieldStorage.getlistc             C   s*   | j d krtdt tdd | j D S )Nznot indexablec             s   s   | ]}|j V  qd S )N)rh   )rO   r   r"   r"   r#   	<genexpr>A  s    z$FieldStorage.keys.<locals>.<genexpr>)rq   r   set)rj   r"   r"   r#   r   =  s    
zFieldStorage.keysc                s*   | j d krtdt fdd| j D S )Nznot indexablec             3   s   | ]}|j  kV  qd S )N)rh   )rO   r   )re   r"   r#   r   G  s    z,FieldStorage.__contains__.<locals>.<genexpr>)rq   r   any)rj   re   r"   )re   r#   __contains__C  s    
zFieldStorage.__contains__c             C   s   t |  S )N)rX   r   )rj   r"   r"   r#   __len__I  s    zFieldStorage.__len__c             C   s   | j d krtdt| j S )NzCannot be converted to bool.)rq   r   bool)rj   r"   r"   r#   __bool__M  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d}dd |D | _|   d S )Nz%s should return bytes, got %sr1   )r*   rM   r{   c             S   s   g | ]\}}t ||qS r"   )r	   )rO   re   ri   r"   r"   r#   r   _  s    z0FieldStorage.read_urlencoded.<locals>.<listcomp>)r?   r;   r   r6   r   r:   rr   rm   r<   r*   rM   r}   r>   r   r   rA   rB   r{   rq   
skip_lines)rj   rE   queryr"   r"   r#   r   R  s    


zFieldStorage.read_urlencodedc             C   s8  | j }t|std|f g | _| jrbtjj| j| j| j	| j
| j| jd}| jdd |D  | jpl| j}| j }t|tstd| jt|jf |  jt|7  _x6| d| j  kr|r| j }|  jt|7  _qW | j}|d k	r|t| j8 }x&t }	d}
x$| j }|
|7 }
| sP qW |
s>P |  jt|
7  _|	|
| j
| j |	 }d|kr~|d= || j|||||| j| j | j
| j|
}|d k	r|d	8 }|jr|t|j8 }|d
k rtd|  j|j7  _| j| |js$| j| j   kr d
krn nP qW | !  d S )Nz&Invalid boundary in multipart form: %r)r*   rM   r{   c             s   s   | ]\}}t ||V  qd S )N)r	   )rO   re   ri   r"   r"   r#   r   o  s    z*FieldStorage.read_multi.<locals>.<genexpr>z%s should return bytes, got %ss   --rw   zcontent-lengthr2   r   zMax number of fields exceeded)"r   valid_boundaryr:   rq   r}   r>   r   r   rA   rB   r*   rM   r{   extendFieldStorageClass	__class__r?   ry   r6   r   rr   rm   r   rX   rY   r   Zfeedr<   r(   r   r   r   r   r   )rj   r@   rA   rB   Zibr   klassZ
first_liner{   parserZhdr_textdatarL   partr"   r"   r#   r   d  sh    









(zFieldStorage.read_multic             C   s4   | j dkr|   |   n|   | jd d S )Nr   )r   read_binaryr   
read_linesrs   r   )rj   r"   r"   r#   r     s
    

zFieldStorage.read_singlei    c             C   s   |   | _| j}|dkrxx|dkr| jt|| j}t|tsXt	d| jt
|jf |  jt|7  _|svd| _P | j| |t| }qW d S )Nr   z%s should return bytes, got %sr_   )	make_filers   r   r?   r;   minbufsizer6   r   r:   rr   rm   r   rX   r   r&   )rj   Ztodor   r"   r"   r#   r     s    


zFieldStorage.read_binaryc             C   s@   | j rt  | _| _nt  | _| _| jr4|   n|   d S )N)r   r   rs   _FieldStorage__filer   r   read_lines_to_outerboundaryread_lines_to_eof)rj   r"   r"   r#   r     s    
zFieldStorage.read_linesc             C   sv   | j d k	rF| j  t| dkrF|  | _| j  }| j| d | _ | jrZ| j| n| j|| j	| j
 d S )Ni  )r   tellrX   r   rs   r   r&   r   r<   r*   rM   )rj   rc   r   r"   r"   r#   Z__write  s    


zFieldStorage.__writec             C   s>   x8| j d}|  jt|7  _|s,d| _P | | qW d S )Ni   r_   )r?   ry   r   rX   r   _FieldStorage__write)rj   rc   r"   r"   r#   r     s    zFieldStorage.read_lines_to_eofc       	      C   s,  d| j  }|d }d}d}d}x|| jkr.P | jd}|  jt|7  _|t|7 }|sdd| _P |dkrx|| }d}|dr|r| }||krP ||krd| _P |}|	d	rd	}|d d
 }d}nJ|	drd}|d d }d}n*|	drd}|d d }d}nd}d}| 
||  q"W d S )Ns   --rw   Tr   i   r_      r2   s   
   
F)r   r   r?   ry   r   rX   r   
startswithrstripendswithr   )	rj   next_boundarylast_boundaryZdelimlast_line_lfendZ_readrc   strippedlineZodelimr"   r"   r#   r     sP    



z(FieldStorage.read_lines_to_outerboundaryc             C   s   | j r| jrd S d| j  }|d }d}xh| jd}|  jt|7  _|sRd| _P |dr|r| }||krrP ||krd| _P |d}q(W d S )Ns   --Ti   r_   r2   r   )r   r   r?   ry   r   rX   r   rY   )rj   r   r   r   rc   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   tempfileZTemporaryFiler*   )rj   r"   r"   r#   r   .  s    
zFieldStorage.make_file)N)N) rm   rn   ro   osr@   rk   r   r   r   rl   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>   + "

C	
1c             C   s   t d t   tjt_yNt }t  t  t| t|  t	  dd }|fdd}t d |  W n   t
  Y nX t d day&t }t  t  t| t|  W n   t
  Y nX d S )	NzContent-type: text/htmlc               S   s   t d d S )Nz,testing print_exception() -- <I>italics?</I>)execr"   r"   r"   r#   r\   a  s    ztest.<locals>.fc             S   s
   |   d S )Nr"   )r\   r"   r"   r#   gc  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   )printr3   stdoutstderrr
   r   r   r   r   r   r   r9   )r@   formr\   r   r"   r"   r#   r   P  s4    
c          	   C   sx   | d k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   r_   )	r3   exc_info	tracebackr   	format_tbformat_exception_onlyhtmlr   join)rr   ri   tbr   r   rq   r"   r"   r#   r   w  s    
c          	   C   s`   t |  }t  td td x*|D ]"}tdt|dt| |  q(W td t  d S )Nz<H3>Shell Environment:</H3>z<DL>z<DT>z<DD>z</DL>)sortedr   r   r   r   )r@   r   re   r"   r"   r#   r     s    
"c             C   s   t |  }t  td |s&td td xb|D ]Z}tdt| d dd | | }tdttt| d	  td
tt|  q4W td t  d S )Nz<H3>Form Contents:</H3>z<P>No form fields.z<DL>z<DT>: )r[   z<i>z</i>z<DD>z</DL>)r   r   r   r   r   reprrr   )r   r   re   ri   r"   r"   r#   r     s    
c           
   C   sj   t   t d yt } W n6 tk
rP } zt dtt| W d d }~X Y nX 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    &c               C   s(   t   t d t   t tj t   d S )Nz <H3>Command Line Arguments:</H3>)r   r3   r=   r"   r"   r"   r#   r     s
    
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    'c             C   sF   t dtdd | dd} | dd} | dd	} |rB| d
d} | S )Nz1cgi.escape is deprecated, use html.escape insteadrF   )
stacklevelr1   z&amp;<z&lt;>z&gt;rU   z&quot;)r   rG   rI   )rZ   Zquoter"   r"   r#   r     s    
c             C   s(   dd l }t| trd}nd}||| S )Nr   s   ^[ -~]{0,200}[!-~]$z^[ -~]{0,200}[!-~]$)rer6   r   match)rZ   r   Z_vb_patternr"   r"   r#   r     s
    
r   __main__)r   r   )r   r   )rH   rI   )NNNN)N)0__version__ior   r   r   Zcollections.abcr   r3   r   Zurllib.parser>   Zemail.parserr   Zemail.messager   warningsr   r   r   r   __all__r   r   r$   r    r   r)   r   r9   r@   r   r   r   r   r]   r   r	   r
   r   r   r   r   r   r   r   r   r   rm   r"   r"   r"   r#   <module>   s^   #	E


    6'
/

