a
    zeX                     @   s  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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d,d-gd.gd/gd0gd1gd2gd3gd4gd5fd6d7gd8gd9gd(gd:gd;gd<fgZd=d> Zd?d@ ZdAdB ZdCdD ZG dEdF dFejZdGZdHZdIZdJZdKZedLkre  dS )M    N)
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   #/usr/lib/python3.9/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 r   )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 r   )
isinstance	ExceptionNotImplementedr   	__class__args)r   ZanExcr   r   r   __eq__   s
    
zComparableException.__eq__c                 C   s   t | j|S r   )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 | d}d|d< d|d< tt| |d< ntd	| ztj||d
dW S  ty } zt|W  Y d }~S d }~0 0 d S )NGETREQUEST_METHODQUERY_STRINGPOSTlatin-1!application/x-www-form-urlencodedCONTENT_TYPECONTENT_LENGTHzunknown method: %s   )strict_parsing)	r   encoder   len
ValueErrorcgiparser   r   )bufmethodenvfpr   r   r   r   do_test"   s    
r3    bad query field: ''&z&&=z=&=z=aaz&=az=a&z=&abad query field: 'a'zb=abzb+=azb za=b=aza=+b=az b=az&b=azb&=abad query field: 'b'za=a+b&b=b+ca bb cr8   r:   za=a+b&a=b+ab azx=1&y=2.0&z=2-3.%2b012.02-3.+0xyzzHbc5161168c542333633315dee1182227: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 0bb2e248638833d48cb7fed300000f1br1   Zbustomer)z1Hbc5161168c542333633315dee1182227:key_store_seqidZcuyerZexpireZkidZlobaleZorder_idss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   norm^   s    rO   c                 C   s   dd | D S )Nc                 S   s   g | ]}|d  qS )r   r   .0pr   r   r   
<listcomp>b       zfirst_elts.<locals>.<listcomp>r   listr   r   r   
first_eltsa   s    rW   c                 C   s   dd | D S )Nc                 S   s    g | ]}|d  |d d  fqS )r   r(   r   rP   r   r   r   rS   e   rT   z%first_second_elts.<locals>.<listcomp>r   rU   r   r   r   first_second_eltsd   s    rX   c                 C   sh   d}t | |}|d tj|||d}i }t| D ]&\}}t|trX|	|p\|j
||< q<|S )Nr$   r   )r2   environencoding)r   r*   seekr-   FieldStoragedictitemsr   rV   Zgetlistvalue)datarY   rZ   Z
fake_stdinZformresultkvr   r   r   
gen_resultg   s    
 rd   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 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/d0 Zd1d2 Zd3d4 Zd5S )6CgiTestsc                 C   sP   t td}tddd}t||}dgdgdgdgd}| || d S )	Nlatin1558boundaryzCONTENT-LENGTH Add 1234   Testing 123.
r4   )submitidfiletitle)r   POSTDATAr*   BOUNDARYr-   parse_multipartassertEqual)r   r2   r1   ra   expectedr   r   r   test_parse_multipartu   s    zCgiTests.test_parse_multipartc                 C   sF   d}t |d}dddi}t||}ddgi}| || d S )NzY--JfISa01
Content-Disposition: form-data; name="submit-name"

just a string

--JfISa01--
rf   ri   JfISa01submit-namezjust a string
)r   r*   r-   rs   rt   )r   rq   r2   r1   ra   ru   r   r   r   +test_parse_multipart_without_content_length~   s    
z4CgiTests.test_parse_multipart_without_content_lengthc                 C   s   d}d}t |d}|dtt|dd}tj||ddd}d	d
gi}| || | dd|d	 d dd d S )Nrw   u]   --JfISa01
Content-Disposition: form-data; name="submit-name"
Content-Length: 3

☃
--JfISa01utf8rf   rh   asciisurrogateescape)rZ   errorsrx   u	   u   ☃r   )r   r*   r   r+   r-   rs   rt   )r   rr   rq   r2   r1   ra   ru   r   r   r   %test_parse_multipart_invalid_encoding   s    

z.CgiTests.test_parse_multipart_invalid_encodingc                 C   s^   t  }| | | dt| | t|t|  |jt	ddd | 
| d S )Nr\   ZMockFieldStoragenameZ
fieldvalue)r-   r\   assertFalseassertInrM   rt   rV   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 |  ttjdd tjddid	}|  tt| d S )
Nznot-a-file-objr!   PUTrY   ZfooZbarzcontent-type
text/plain)Zheaders)assertRaises	TypeErrorr-   r\   boolr   r   r   r   test_fieldstorage_invalid   s    z"CgiTests.test_fieldstorage_invalidc                 C   s  t D ]\}}t|d}| ||dt|  t|d}| ||dt|  d|i}tj|d}t|tr| t|t| | 	|
 |
  | |ddd |
 D ]N}|| }| || t|d	kr| ||| q| |||d
  qqd S )Nr    zError parsing %s method GETr#   zError parsing %s method POSTr"   r   znonexistent fielddefaultr(   r   )parse_strict_test_casesr3   rt   rM   r-   r\   r   r]   r+   ZassertCountEqualr   getvaluer   )r   origexpectdr1   r   rK   
expect_valr   r   r   test_strict   s"    


zCgiTests.test_strictc                 C   s  ddgdgdfddgdgdgdfdt d	fd
t d	fdt dfdt d	fdt dfddgdgdfddddgifg	}|D ]\}}d|i}tjd|d}t|tr|| D ]N}|| }| || t|dkr| |	|| q| |	||d  qq|d S )Nz	x=1;y=2.0r@   rA   )rD   rE   zx=1;y=2.0;z=2-3.%2b0rB   rC   ;r5   z;;z=;ar9   z;b=azb;=ar;   za=a+b;b=b+cr<   r=   r>   za=a+b;a=b+ar8   r?   r"   )	separatorrY   r(   r   )
r,   r-   r\   r   r]   r   r   r+   rt   r   )r   Zparse_semicolonr   r   r1   r   rK   r   r   r   r   test_separator   s(    





zCgiTests.test_separatorc                 C   s~   t d t t _t dd t dd | t j d tj	tj
rzd t _tj
t _t dd | t j t 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initlogrt   r   ospathexistsdevnulllogfile
addCleanupcloselogr   r   r   r   test_log   s    
zCgiTests.test_logc                 C   s~   G dd d}|t d}| |j |dd  |d ddi}tj||d	}| |jj | 	|j
d
 |  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   )ro   numcalls)r   ro   r   r   r   r      s    zFCgiTests.test_fieldstorage_readline.<locals>.TestReadlineFile.__init__Nc                 S   s,   |  j d7  _ |r| j|S | j S d S )Nr(   )r   ro   readline)r   sizer   r   r   r      s    zFCgiTests.test_fieldstorage_readline.<locals>.TestReadlineFile.readlinec                 S   s.   | j d }t||}t|ts*t| || |S )Nro   )__dict__r   r   intsetattr)r   r   ro   r8   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+s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi   r   r!   r   r2   rY      )tempfileTemporaryFiler   closewriter[   r-   r\   ro   ZassertGreaterr   )r   r   fr1   r   r   r   r   test_fieldstorage_readline   s    
z#CgiTests.test_fieldstorage_readlinec           	      C   s   dd tdd}ttd}tj||dd}| t|j	d dd d	d
dd dd
dddd
dd dd
g}t
t|j	D ]6}||  D ]$\}}t|j	| |}| || qq|d S )Nr#    multipart/form-data; boundary={}rg   r!   r&   r'   r$   rY   rZ      rn   rk   r   filenamer_   rp   r4   ro   test.txtrl   rm   rj   formatrr   r   rq   r*   r-   r\   rt   r+   rV   ranger^   r   	r   r1   r2   r   r   rD   rb   expgotr   r   r   test_fieldstorage_multipart  s     



z$CgiTests.test_fieldstorage_multipartc           	      C   s   dd tdd}tdtd }tj||dd}| t|j	d d	d d
ddd dddddddd ddg}t
t|j	D ]6}||  D ]$\}}t|j	| |}| || qqd S )Nr#   r   Z560r   s   
r$   r   r   rn   rk   r   rp   r4   ro   r   rl   rm   rj   r   r   r   r   r   .test_fieldstorage_multipart_leading_whitespace$  s     



z7CgiTests.test_fieldstorage_multipart_leading_whitespacec           
      C   s   dd tdd}dD ]}tt|}tj|||d}| t|j	d dd d	d
g}t
t|j	D ]6}||  D ]$\}}t|j	| |}	| |	| qvqfqd S )Nr#   r   rg   r   )z
iso-8859-1zutf-8r   r(   rn   u   çñr   )r   rr   r   POSTDATA_NON_ASCIIr*   r-   r\   rt   r+   rV   r   r^   r   )
r   r1   rZ   r2   r   r   rD   rb   r   r   r   r   r   %test_fieldstorage_multipart_non_ascii7  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 )Ni   c                    sD   d dd|  }tt|ddd} t||d| di d S )	Nzp---123
Content-Disposition: form-data; name="upload"; filename="fake.txt"
Content-Type: text/plain

%s
---123--

z
"multipart/form-data; boundary=-123r#   r'   r&   r!   uploadrf   )replacer   r+   rt   rd   r*   )contentr`   rY   r   r   r   checkJ  s    
z;CgiTests.test_fieldstorage_multipart_maxline.<locals>.checkrD   r(   rE   )ZmaxDiff)r   Zmaxliner   r   r   r   #test_fieldstorage_multipart_maxlineF  s    z,CgiTests.test_fieldstorage_multipart_maxlinec           
      C   s   dd ttttd}ttd}tj||dd}| 	t|j
d | 	|j
d jd | 	|j
d jd	 | 	|j
d
 jd |j
d
 j}| 	t|d d dddd dddg}tt|D ]4}||  D ]"\}}t|| |}	| 	|	| qqd S )Nr#   r   r   r$   r   r   r   rx   Larryr(   filesz	file1.txts   ... contents of file1.txt ...r   z	file2.gifs   ...contents of file2.gif...)r   BOUNDARY_W3r   r+   POSTDATA_W3r   r*   r-   r\   rt   rV   r   r_   r   r^   r   )
r   r1   r2   r   r   r   rD   rb   r   r   r   r   r   test_fieldstorage_multipart_w3c]  s&    


z(CgiTests.test_fieldstorage_multipart_w3cc                 C   s~   d}d}dd |tt|d}t|d}tj||dd}| t|jd | |jd	 j	d
 | |jd	 j
d d S )Nrw   z_--JfISa01
Content-Disposition: form-data; name="submit-name"
Content-Length: 5

Larry
--JfISa01r#   r   r   r$   r   r(   r   rx   r   )r   r   r+   r   r*   r-   r\   rt   rV   r   r_   )r   rr   rq   r1   r2   r   r   r   r   %test_fieldstorage_part_content_lengthr  s    
z.CgiTests.test_fieldstorage_part_content_lengthc                 C   s@   t d}dd|d}tj||d}| t|d j d d S )Nsa   --MyBoundary
Content-Disposition: form-data; name="my-arg"; filename="foo"

Test

--MyBoundary--
r#   z(multipart/form-data; boundary=MyBoundary)r!   r&   z
wsgi.inputr   zmy-arg   )r   r-   r\   rt   r+   ro   read)r   r2   r1   fieldsr   r   r   .test_field_storage_multipart_no_content_length  s    z7CgiTests.test_field_storage_multipart_no_content_lengthc                 C   s   t d}ddi}tj||d(}|j }| |jj W d    n1 sL0    Y  | |jj | |d | 	t
d |j  W d    n1 s0    Y  d S )Ns
   xxxxxxxxxxr!   r   r   Z
xxxxxxxxxxzI/O operation on closed file)r   r-   r\   ro   r   r   closedr   rt   ZassertRaisesRegexr,   )r   r2   r1   r   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| d S )Nz$key2=value2x&key3=value3&key4=value4r%   zkey1=value1&key2=value2yr#   r'   r&   r"   r!   r   r+   rd   rt   
_qs_resultr   r`   rY   rc   r   r   r   testQSAndUrlEncode  s    

zCgiTests.testQSAndUrlEncodec                 C   s   d dgd }tt|ddd}| t( tjt| |dd W d    n1 s\0    Y  d	}tt|d
ddd}| t( tjt| |dd W d    n1 s0    Y  tjt| |dd d S )Nr6   za=a   r%   r#   r   
   )r2   rY   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--
r   za=1&a=2r   r   r   )	joinr   r+   r   r,   r-   r\   r   r*   )r   r`   rY   r   r   r   test_max_num_fields  s8    

$

$
zCgiTests.test_max_num_fieldsc                 C   s6   d}t t|dddd}t||}| | 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--
r   key1=value1&key2=value2xr#   r   r   r   r   r   r   testQSAndFormData  s    

zCgiTests.testQSAndFormDatac                 C   sL   d}t t|dddd}| j }|ddi t||}| || 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--
r   r   r#   r   r   s%   this is the content of the fake file
)r   r+   r   copyupdaterd   rt   )r   r`   rY   ra   rc   r   r   r   testQSAndFormDataFile  s    


zCgiTests.testQSAndFormDataFilec                 C   s   |  tddi f |  tddi f |  tddddif |  tddddif |  tdddd	d
f |  tddddif |  tddddif |  tdddddf |  tdddddf d S )Nr   z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=opt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   )rt   r-   Zparse_headerr   r   r   r   test_parse_header!  sH    



zCgiTests.test_parse_headerc                 C   s   h d}t j| t|d d S )N>	   Zvalid_boundaryZdologr   r   r   Znologr   maxlenr   )	blacklist)r   Zcheck__all__r-   )r   r   r   r   r   test_all>  s    zCgiTests.test_allN)r   r   r	   rv   ry   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   re   s   s8   	%6"re   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__)r-   r   r   r   Zunittestcollectionsr   ior   r   testr   r   r   r3   r,   r   rO   rW   rX   rd   ZTestCasere   rr   rq   r   r   r   r   mainr   r   r   r   <module>   s   







*   T
