o
    GXhY                     @   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 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d0gd1gd2gd3gd4gd5gd6fd7d8gd9gd:gd)gd;gd<gd=fgZd>d? Zd@dA ZdBdC ZdDdE ZG dFdG dGejZdHZdIZdJZdKZdLZedMkre  dS dS )N    N)
namedtuple)StringIOBytesIO)support)warnings_helperc                   @   s   e Zd Zg ZejZdS )HackedSysModuleN)__name__
__module____qualname__argvsysstdin r   r   7/opt/python-3.10.19/usr/lib/python3.10/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__      
zComparableException.__init__c                 C   s
   t | jS r   )strr   r   r   r   r   __str__   r   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__       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< n"|dkr-t | d}d|d< d|d< tt| |d< ntd	| z	tj||d
dW S  tyR } z
t|W  Y d }~S d }~ww )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"   
r6    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r;   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 0bb2e248638833d48cb7fed300000f1br4   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_   r"   rR   c                 C      dd | D S )Nc                 S   s   g | ]}|d  qS )r   r   .0pr   r   r   
<listcomp>c   s    zfirst_elts.<locals>.<listcomp>r   listr   r   r   
first_eltsb      rZ   c                 C   rS   )Nc                 S   s    g | ]}|d  |d d  fqS )r   r+   r   rT   r   r   r   rW   f   s     z%first_second_elts.<locals>.<listcomp>r   rX   r   r   r   first_second_eltse   r[   r\   c                 C   sh   d}t | |}|d tj|||d}i }t| D ]\}}t|tr,|	|p.|j
||< q|S )Nr'   r   )r5   environencoding)r   r-   seekr0   FieldStoragedictitemsr   rY   Zgetlistvalue)datar]   r^   Z
fake_stdinZformresultkvr   r   r   
gen_resulth   s   
 rh   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	e
jed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d0d1 Zd2d3 Zd4d5 Zd6S )7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.
r7   )submitidfiletitle)r   POSTDATAr-   BOUNDARYr0   parse_multipartassertEqual)r   r5   r4   re   expectedr   r   r   test_parse_multipartv   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--
rj   rm   JfISa01submit-namezjust a string
)r   r-   r0   rw   rx   )r   ru   r5   r4   re   ry   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 )Nr{   u]   --JfISa01
Content-Disposition: form-data; name="submit-name"
Content-Length: 3

☃
--JfISa01utf8rj   rl   asciisurrogateescape)r^   errorsr|   u	   u   ☃r   )r   r-   r   r.   r0   rw   rx   )r   rv   ru   r5   r4   re   ry   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)r0   r`   assertFalseassertInrP   rx   rY   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r]   ZfooZbarzcontent-type
text/plain)Zheaders)assertRaises	TypeErrorr0   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 ]'}|| }| || t|d	krs| ||| qW| |||d
  qWqd S )Nr#   zError parsing %s method GETr&   zError parsing %s method POSTr%   r   znonexistent fielddefaultr+   r   )parse_strict_test_casesr6   rx   rP   r0   r`   r   ra   r.   ZassertCountEqualr   getvaluer   )r   origexpectdr4   r   rN   
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 ]'}|| }| || t|dkrr| |	|| qV| |	||d  qVq>d S )Nz	x=1;y=2.0rC   rD   )rG   rH   zx=1;y=2.0;z=2-3.%2b0rE   rF   ;r8   z;;z=;ar<   z;b=azb;=ar>   za=a+b;b=b+cr?   r@   rA   za=a+b;a=b+ar;   rB   r%   )	separatorr]   r+   r   )
r/   r0   r`   r   ra   r   r   r.   rx   r   )r   Zparse_semicolonr   r   r4   r   rN   r   r   r   r   test_separator   s,   





zCgiTests.test_separator)categoryc                 C   s   t d t t _t dd t dd | t j d tj	tj
r?d t _tj
t _t dd | t j t d d S d S )NZTestingz%szTesting initlog 1zTesting log 2z Testing initlog 1
Testing log 2
zTesting log 3zTesting log 4)r0   logr   logfpinitlogrx   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   )rs   numcalls)r   rs   r   r   r   r      s   
zFCgiTests.test_fieldstorage_readline.<locals>.TestReadlineFile.__init__Nc                 S   s(   |  j d7  _ |r| j|S | j S )Nr+   )r   rs   readline)r   sizer   r   r   r      s   
zFCgiTests.test_fieldstorage_readline.<locals>.TestReadlineFile.readlinec                 S   s.   | j d }t||}t|tst| || |S )Nrs   )__dict__r   r   intsetattr)r   r   rs   r;   r   r   r   r!      s
   


zICgiTests.test_fieldstorage_readline.<locals>.TestReadlineFile.__getattr__r   )r   r	   r
   r   r   r!   r   r   r   r   TestReadlineFile   s    
r   zwb+s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi   r   r$   r   r5   r]      )tempfileTemporaryFiler   closewriter_   r0   r`   rs   ZassertGreaterr   )r   r   fr4   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 ]}||  D ]\}}t|j	| |}| || qFq>d S )Nr&    multipart/form-data; boundary={}rk   r$   r)   r*   r'   r]   r^      rr   ro   r   filenamerc   rt   r7   rs   test.txtrp   rq   rn   formatrv   r   ru   r-   r0   r`   rx   r.   rY   rangerb   r   	r   r4   r5   r   r   rG   rf   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 ]}||  D ]\}}t|j	| |}| || qHq@d S )Nr&   r   Z560r   s   
r'   r   r   rr   ro   r   rt   r7   rs   r   rp   rq   rn   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 ]D}tt|}tj|||d}| t|j	d dd d	d
g}t
t|j	D ]}||  D ]\}}t|j	| |}	| |	| q;q3qd S )Nr&   r   rk   r   )z
iso-8859-1zutf-8r   r+   rr   u   çñr   )r   rv   r   POSTDATA_NON_ASCIIr-   r0   r`   rx   r.   rY   r   rb   r   )
r   r4   r^   r5   r   r   rG   rf   r   r   r   r   r   %test_fieldstorage_multipart_non_ascii9  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$   uploadrj   )replacer   r.   rx   rh   r-   )contentrd   r]   r   r   r   checkL  s   

z;CgiTests.test_fieldstorage_multipart_maxline.<locals>.checkrG   r+   rH   )ZmaxDiff)r   Zmaxliner   r   r   r   #test_fieldstorage_multipart_maxlineH  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 ]}||  D ]\}}t|| |}	| 	|	| qkqcd S )Nr&   r   r   r'   r   r   r   r|   Larryr+   filesz	file1.txts   ... contents of file1.txt ...r   z	file2.gifs   ...contents of file2.gif...)r   BOUNDARY_W3r   r.   POSTDATA_W3r   r-   r0   r`   rx   rY   r   rc   r   rb   r   )
r   r4   r5   r   r   r   rG   rf   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 )Nr{   z_--JfISa01
Content-Disposition: form-data; name="submit-name"
Content-Length: 5

Larry
--JfISa01r&   r   r   r'   r   r+   r   r|   r   )r   r   r.   r   r-   r0   r`   rx   rY   r   rc   )r   rv   ru   r4   r5   r   r   r   r   %test_fieldstorage_part_content_lengtht  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   r0   r`   rx   r.   rs   read)r   r5   r4   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 s&w   Y  | |jj | |d | 	t
d |j  W d    d S 1 sOw   Y  d S )Ns
   xxxxxxxxxxr$   r   r   Z
xxxxxxxxxxzI/O operation on closed file)r   r0   r`   rs   r   r   closedr   rx   ZassertRaisesRegexr/   )r   r5   r4   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   6   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.   rh   rx   
_qs_resultr   rd   r]   rg   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.w   Y  d	}tt|d
ddd}| t tjt| |dd W d    n1 s\w   Y  tjt| |dd d S )Nr9   za=a   r(   r&   r   
   )r5   r]   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/   r0   r`   r   r-   )r   rd   r]   r   r   r   test_max_num_fields  s<   





zCgiTests.test_max_num_fieldsc                 C   r   )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updaterh   rx   )r   rd   r]   re   rg   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   )rx   r0   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>	   r   r   maxlenZvalid_boundaryr   Znologr   r   Zdolog)not_exported)r   Zcheck__all__r0   )r   r   r   r   r   test_all@  s   zCgiTests.test_allN)r   r	   r
   rz   r}   r   r   r   r   r   r   Zignore_warningsDeprecationWarningr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ri   t   s<    	

%6"ri   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__) r0   r   r   r   Zunittestcollectionsr   ior   r   testr   Ztest.supportr   r   r   r6   r/   r   rR   rZ   r\   rh   ZTestCaseri   rv   ru   r   r   r   r   mainr   r   r   r   <module>   s    







*   V