3
rY]S              !   @   sD  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m	Z	 d dl
mZmZ d dlmZ G dd dZe e_G dd	 d	Zd
d Zdedfdedfdedfdedfdedfdi fdi fdi fdddgifdedfdedfdedfdddgifdddgifdddgifd dd!gifd"edfd#ed$fd%d&gd'gd(fd)dd&d*gifd+d,gd-gd.gd/fd0d,gd-gd.gd/fd1d,gd-gd.gd/fd2d3gd4gd5gd6gd7gd8gd9gd:gd;fd<d=gd>gd?gd,gd@gdAgdBfgZdCdD ZdEdF ZdGdH ZdIdJ ZG dKdL dLejZdMZdNZdOZdPZdQZedRkr@ej   dS )S    )check_warningsN)
namedtuple)StringIOBytesIO)supportc               @   s   e Zd Zg ZejZdS )HackedSysModuleN)__name__
__module____qualname__argvsysstdin r   r   lib/python3.6/test/test_cgi.pyr      s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ComparableExceptionc             C   s
   || _ d S )N)err)selfr   r   r   r   __init__   s    zComparableException.__init__c             C   s
   t | jS )N)strr   )r   r   r   r   __str__   s    zComparableException.__str__c             C   s*   t |tstS | jj|jko(| jj|jkS )N)
isinstance	ExceptionNotImplementedr   	__class__args)r   ZanExcr   r   r   __eq__   s    
zComparableException.__eq__c             C   s   t | j|S )N)getattrr   )r   attrr   r   r   __getattr__!   s    zComparableException.__getattr__N)r   r	   r
   r   r   r   r   r   r   r   r   r      s   r   c             C   s   i }|dkr"d }d|d< | |d< nD|dkrZt | jd}d|d< d|d< tt| |d< ntd	| ytj||d
dS  tk
r } zt|S d }~X nX d S )NGETREQUEST_METHODQUERY_STRINGPOSTzlatin-1z!application/x-www-form-urlencodedCONTENT_TYPECONTENT_LENGTHzunknown method: %s   )Zstrict_parsing)	r   encoder   len
ValueErrorcgiparser   r   )Zbufmethodenvfpr   r   r   r   do_test$   s    
r.    zbad query field: ''&z&&;z;&;=z=&=z=;=z=aaz&=az=a&z=&azbad query field: 'a'zb=abzb+=azb za=b=aza=+b=az b=az&b=azb&=azbad query field: 'b'za=a+b&b=b+cza bzb c)r3   r4   za=a+b&a=b+azb azx=1&y=2.0&z=2-3.%2b01z2.0z2-3.+0)xyzzx=1;y=2.0&z=2-3.%2b0zx=1;y=2.0;z=2-3.%2b0zHbc5161168c542333633315dee1182227:key_store_seqid=400006&cuyer=r&view=bustomer&order_id=0bb2e248638833d48cb7fed300000f1b&expire=964546263&lobale=en-US&kid=130003.300038&ss=envZ400006rZ	964546263z130003.300038zen-USZ 0bb2e248638833d48cb7fed300000f1br,   Zbustomer)z1Hbc5161168c542333633315dee1182227:key_store_seqidZcuyerZexpireZkidZlobaleZorder_idZssZviewzQgroup_id=5470&set=custom&_assigned_to=31392&_status=1&_category=100&SUBMIT=BrowseZBrowseZ31392Z100Z5470Zcustom)ZSUBMITZ_assigned_toZ	_categoryZ_statusZgroup_idsetc             C   s   t | tdS )N)key)sortedrepr)seqr   r   r   norme   s    r?   c             C   s   dd | D S )Nc             S   s   g | ]}|d  qS )r   r   ).0pr   r   r   
<listcomp>i   s    zfirst_elts.<locals>.<listcomp>r   )listr   r   r   
first_eltsh   s    rD   c             C   s   dd | D S )Nc             S   s    g | ]}|d  |d d  fqS )r   r%   r   )r@   rA   r   r   r   rB   l   s    z%first_second_elts.<locals>.<listcomp>r   )rC   r   r   r   first_second_eltsk   s    rE   c             C   sl   d}t | j|}|jd tj|||d}i }x6t|j D ]&\}}t|trZ|j	|p^|j
||< q>W |S )Nzlatin-1r   )r-   environencoding)r   r&   seekr)   FieldStoragedictitemsr   rC   Zgetlistvalue)datarF   rG   Z
fake_stdinZformresultkvr   r   r   
gen_resultn   s    
"rQ   c               @   s   e Z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 Z
dd Zdd Zdd Zdd Zdd Zdd Zdddgd d!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3S )4CgiTestsc             C   sP   t tjd}tjddd}tj||}dgdgdgdgd}| j|| d S )	Nlatin1558)boundaryzCONTENT-LENGTHs    Add s   1234s   Testing 123.
    )submitidfiletitle)r   POSTDATAr&   BOUNDARYr)   Zparse_multipartassertEqual)r   r-   r,   rN   Zexpectedr   r   r   test_parse_multipart|   s    zCgiTests.test_parse_multipartc             C   s^   t j }| j| | jdt| | jt|t|j  |jjt	ddd | j
| d S )NrI   ZMockFieldStoragenameZ
fieldvalue)r)   rI   assertFalseassertInr=   r]   rC   keysappendr   
assertTrue)r   fsr   r   r   test_fieldstorage_properties   s    
z%CgiTests.test_fieldstorage_propertiesc             C   sL   | j ttjdddid | j ttjdd tjddid	}| j tt| d S )
Nznot-a-file-objr    PUT)rF   ZfooZbarzcontent-typez
text/plain)Zheaders)assertRaises	TypeErrorr)   rI   bool)r   re   r   r   r   test_fieldstorage_invalid   s
    z"CgiTests.test_fieldstorage_invalidc             C   s^   t j L t jddt | jdtjd | jdtjd | jdtjdd	 W d Q R X d S )
Nignorezcgi\.escapeztest &amp; stringztest & stringz&lt;test string&gt;z<test string>z&quot;test string&quot;z"test string"T)warningscatch_warningsfilterwarningsDeprecationWarningr]   r)   escape)r   r   r   r   test_escape   s    
zCgiTests.test_escapec             C   s  xt D  ]\}}t|d}| j||dt|  t|d}| j||dt|  d|i}tj|d}t|tr| jt|t| | j	|j
 |j
  | j|jddd xZ|j
 D ]N}|| }| j|| t|d	kr| j|j|| q| j|j||d
  qW qW d S )Nr   zError parsing %s method GETr"   zError parsing %s method POSTr!   )rF   znonexistent fielddefaultr%   r   )parse_strict_test_casesr.   r]   r=   r)   rI   r   rJ   r'   ZassertCountEqualrb   getvaluera   )r   Zorigexpectdr,   re   r;   Z
expect_valr   r   r   test_strict   s"    


zCgiTests.test_strictc             C   s~   t jd t t _t jdd t jdd | jt jj d tjj	tj
rzd t _tj
t _t jdd | jt j t jd d S )NZTestingz%szTesting initlog 1zTesting log 2z Testing initlog 1
Testing log 2
zTesting log 3zTesting log 4)r)   logr   logfpinitlogr]   ru   ospathexistsdevnulllogfile
addCleanupcloselog)r   r   r   r   test_log   s    
zCgiTests.test_logc             C   s   G dd d}|t jd}| j|j |jdd d  |jd dd	i}tj||d
}| j|jj | j	|j
d |j  d S )Nc               @   s&   e Zd Zdd ZdddZdd ZdS )	z=CgiTests.test_fieldstorage_readline.<locals>.TestReadlineFilec             S   s   || _ d| _d S )Nr   )rY   numcalls)r   rY   r   r   r   r      s    zFCgiTests.test_fieldstorage_readline.<locals>.TestReadlineFile.__init__Nc             S   s,   |  j d7  _ |r| jj|S | jj S d S )Nr%   )r   rY   readline)r   sizer   r   r   r      s    zFCgiTests.test_fieldstorage_readline.<locals>.TestReadlineFile.readlinec             S   s.   | j d }t||}t|ts*t| || |S )NrY   )__dict__r   r   intsetattr)r   r_   rY   r3   r   r   r   r      s
    


zICgiTests.test_fieldstorage_readline.<locals>.TestReadlineFile.__getattr__)N)r   r	   r
   r   r   r   r   r   r   r   TestReadlineFile   s   
r   zwb+   x   i   r   r    rg   )r-   rF      )tempfileZTemporaryFiler   closewriterH   r)   rI   rY   ZassertGreaterr   )r   r   fr,   re   r   r   r   test_fieldstorage_readline   s    
z#CgiTests.test_fieldstorage_readlinec       	      C   s   ddj tdd}ttjd}tj||dd}| jt|j	d dd d	d
dd dd
dddd
dd dd
g}xLt
t|j	D ]:}x4|| j D ]$\}}t|j	| |}| j|| qW q~W d S )Nr"   z multipart/form-data; boundary={}rT   )r    r#   r$   zlatin-1)rF   rG      rX   1234)r_   filenamerL   rZ   r/   rY   ztest.txts   Testing 123.
rW   z Add )formatr\   r   r[   r&   r)   rI   r]   r'   rC   rangerK   r   )	r   r,   r-   re   rv   r6   rO   expgotr   r   r   test_fieldstorage_multipart   s    


z$CgiTests.test_fieldstorage_multipartc       	      C   s   ddj tdd}tdtjd }tj||dd}| jt|j	d d	d d
ddd dddddddd ddg}xLt
t|j	D ]:}x4|| j D ]$\}}t|j	| |}| j|| qW qW d S )Nr"   z multipart/form-data; boundary={}Z560)r    r#   r$   s   
zlatin-1)rF   rG   r   rX   r   )r_   r   rL   rZ   r/   rY   ztest.txts   Testing 123.
rW   z Add )r   r\   r   r[   r&   r)   rI   r]   r'   rC   r   rK   r   )	r   r,   r-   re   rv   r6   rO   r   r   r   r   r   .test_fieldstorage_multipart_leading_whitespace   s    


z7CgiTests.test_fieldstorage_multipart_leading_whitespacec       
      C   s   ddj tdd}xdD ]}ttj|}tj|||d}| jt|j	d d	d d
dg}xLt
t|j	D ]:}x4|| j D ]$\}}t|j	| |}	| j|	| q|W qjW qW d S )Nr"   z multipart/form-data; boundary={}rT   )r    r#   r$   
iso-8859-1utf-8)rF   rG   r%   rX   u   çñ)r_   r   rL   )r   r   )r   r\   r   POSTDATA_NON_ASCIIr&   r)   rI   r]   r'   rC   r   rK   r   )
r   r,   rG   r-   re   rv   r6   rO   r   r   r   r   r   %test_fieldstorage_multipart_non_ascii  s    
z.CgiTests.test_fieldstorage_multipart_non_asciic                s^   d}d  _  fdd}|d|d   |d|d  d  |d|d  d d|d    d S )	Nr%      c                sD   dj dd|  }tt|ddd} jt||d| jdi d S )	Nzp---123
Content-Disposition: form-data; name="upload"; filename="fake.txt"
Content-Type: text/plain

%s
---123--

z
z"multipart/form-data; boundary=-123r"   )r$   r#   r    uploadrS   )replacer   r'   r]   rQ   r&   )contentrM   rF   )r   r   r   check"  s    
z;CgiTests.test_fieldstorage_multipart_maxline.<locals>.checkr6   r7   i   )ZmaxDiff)r   Zmaxliner   r   )r   r   #test_fieldstorage_multipart_maxline  s    z,CgiTests.test_fieldstorage_multipart_maxlinec       
      C   s  ddj ttttd}ttjd}tj||dd}| j	t|j
d | j	|j
d jd | j	|j
d jd	 | j	|j
d
 jd |j
d
 j}| j	t|d d dddd dddg}xHtt|D ]8}x2|| j D ]"\}}t|| |}	| j	|	| qW qW d S )Nr"   z multipart/form-data; boundary={})r    r#   r$   zlatin-1)rF   rG   r   r   zsubmit-nameLarryr%   filesz	file1.txts   ... contents of file1.txt ...)r_   r   rL   z	file2.gifs   ...contents of file2.gif...)r   BOUNDARY_W3r   r'   POSTDATA_W3r   r&   r)   rI   r]   rC   r_   rL   r   rK   r   )
r   r,   r-   re   r   rv   r6   rO   r   r   r   r   r   test_fieldstorage_multipart_w3c5  s"    
z(CgiTests.test_fieldstorage_multipart_w3cc             C   s~   d}d}ddj |tt|d}t|jd}tj||dd}| jt|jd | j|jd	 j	d
 | j|jd	 j
d d S )NZJfISa01z_--JfISa01
Content-Disposition: form-data; name="submit-name"
Content-Length: 5

Larry
--JfISa01r"   z multipart/form-data; boundary={})r    r#   r$   zlatin-1)rF   rG   r%   r   zsubmit-namer   )r   r   r'   r   r&   r)   rI   r]   rC   r_   rL   )r   r\   r[   r,   r-   re   r   r   r   %test_fieldstorage_part_content_lengthJ  s    z.CgiTests.test_fieldstorage_part_content_lengthc             C   s   t d}ddi}tj||d}|jj }| j|jj W d Q R X | j|jj | j|d	 | j	t
d |jj  W d Q R X d S )
Nr   
   r    rg   )r-   rF   r6   zI/O operation on closed files
   xxxxxxxxxxZ
xxxxxxxxxx)r   r)   rI   rY   readr`   closedrd   r]   ZassertRaisesRegexr(   )r   r-   r,   re   r   r   r   r   $test_fieldstorage_as_context_manager\  s    
z-CgiTests.test_fieldstorage_as_context_managerZvalue1Zvalue2xZvalue2yZvalue3Zvalue4)Zkey1Zkey2Zkey3Zkey4c             C   s6   d}t t|dddd}t||}| j| j| d S )Nz$key2=value2x&key3=value3&key4=value4z!application/x-www-form-urlencodedzkey1=value1&key2=value2yr"   )r$   r#   r!   r    )r   r'   rQ   r]   
_qs_result)r   rM   rF   rP   r   r   r   testQSAndUrlEncodem  s    

zCgiTests.testQSAndUrlEncodec             C   s   dj dgd }tt|ddd}| jt tjt|j |dd W d Q R X d	}tt|d
ddd}| jt tjt|j |dd W d Q R X tjt|j |dd d S )Nr0   za=a   z!application/x-www-form-urlencodedr"   )r$   r#   r    r   )r-   rF   Zmax_num_fieldsz---123
Content-Disposition: form-data; name="a"

3
---123
Content-Type: application/x-www-form-urlencoded

a=4
---123
Content-Type: application/x-www-form-urlencoded

a=5
---123--
z"multipart/form-data; boundary=-123za=1&a=2)r$   r#   r!   r    r      )	joinr   r'   rh   r(   r)   rI   r   r&   )r   rM   rF   r   r   r   test_max_num_fieldsx  s.    




zCgiTests.test_max_num_fieldsc             C   s6   d}t t|dddd}t||}| j| j| d S )Nz---123
Content-Disposition: form-data; name="key2"

value2y
---123
Content-Disposition: form-data; name="key3"

value3
---123
Content-Disposition: form-data; name="key4"

value4
---123--
z"multipart/form-data; boundary=-123zkey1=value1&key2=value2xr"   )r$   r#   r!   r    )r   r'   rQ   r]   r   )r   rM   rF   rP   r   r   r   testQSAndFormData  s    

zCgiTests.testQSAndFormDatac             C   sL   d}t t|dddd}| jj }|jddi t||}| j|| d S )NaE  ---123
Content-Disposition: form-data; name="key2"

value2y
---123
Content-Disposition: form-data; name="key3"

value3
---123
Content-Disposition: form-data; name="key4"

value4
---123
Content-Disposition: form-data; name="upload"; filename="fake.txt"
Content-Type: text/plain

this is the content of the fake file

---123--
z"multipart/form-data; boundary=-123zkey1=value1&key2=value2xr"   )r$   r#   r!   r    r   s%   this is the content of the fake file
)r   r'   r   copyupdaterQ   r]   )r   rM   rF   rN   rP   r   r   r   testQSAndFormDataFile  s    



zCgiTests.testQSAndFormDataFilec             C   s<   t dtf& | jdgdgdgdtjd W d Q R X d S )Nz=cgi.parse_qs is deprecated, use urllib.parse.parse_qs insteadA1B3B2)r3   Br4   za=A1&b=B2&B=B3)r   rp   r]   r)   Zparse_qs)r   r   r   r   test_deprecated_parse_qs  s    
z!CgiTests.test_deprecated_parse_qsc             C   s4   t dtf | jd	d
dgtjd W d Q R X d S )Nz?cgi.parse_qsl is deprecated, use urllib.parse.parse_qsl insteadr3   r   r4   r   r   r   za=A1&b=B2&B=B3)r3   r   )r4   r   )r   r   )r   rp   r]   r)   Z	parse_qsl)r   r   r   r   test_deprecated_parse_qsl  s    
z"CgiTests.test_deprecated_parse_qslc             C   s   | j tjddi f | j tjddi f | j tjddddif | j tjddddif | j tjdddd	d
f | j tjddddif | j tjddddif | j tjdddddf | j tjdddddf d S )Nz
text/plainztext/vnd.just.made.this.up ; ztext/vnd.just.made.this.upztext/plain;charset=us-asciicharsetzus-asciiztext/plain ; charset="us-ascii"z,text/plain ; charset="us-ascii"; another=optZopt)r   Zanotherz attachment; filename="silly.txt"Z
attachmentr   z	silly.txtz#attachment; filename="strange;name"zstrange;namez-attachment; filename="strange;name";size=123;Z123)r   r   z-form-data; name="files"; filename="fo\"o;bar"z	form-datar   zfo"o;bar)r_   r   )r]   r)   Zparse_header)r   r   r   r   test_parse_header  s6    

zCgiTests.test_parse_headerc          	   C   s*   ddddddddd	h	}t j| t|d
 d S )Nr   rz   r{   ZdologZnologr   ry   maxlenZvalid_boundary)	blacklist)r   Zcheck__all__r)   )r   r   r   r   r   test_all  s    
zCgiTests.test_allN)r   r	   r
   r^   rf   rk   rr   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rR   z   s4   		%6"rR   z6---------------------------721837373350705526688164684a  -----------------------------721837373350705526688164684
Content-Disposition: form-data; name="id"

1234
-----------------------------721837373350705526688164684
Content-Disposition: form-data; name="title"


-----------------------------721837373350705526688164684
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain

Testing 123.

-----------------------------721837373350705526688164684
Content-Disposition: form-data; name="submit"

 Add 
-----------------------------721837373350705526688164684--
u   -----------------------------721837373350705526688164684
Content-Disposition: form-data; name="id"

çñ
-----------------------------721837373350705526688164684
ZAaB03xa  --AaB03x
Content-Disposition: form-data; name="submit-name"

Larry
--AaB03x
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=BbC04y

--BbC04y
Content-Disposition: file; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--BbC04y
Content-Disposition: file; filename="file2.gif"
Content-Type: image/gif
Content-Transfer-Encoding: binary

...contents of file2.gif...
--BbC04y--
--AaB03x--
__main__)!Ztest.supportr   r)   r|   r   r   Zunittestrm   collectionsr   ior   r   Ztestr   r   r   r.   r(   rt   r?   rD   rE   rQ   ZTestCaserR   r\   r[   r   r   r   r   mainr   r   r   r   <module>   s   










   "
