B
    18™\1l  ã               @   s´  d dl mZ d dlmZ d dlmZ d dl mZ d dlmZ d dl	m
Z
 d dlmZmZmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZ d dlmZ d dlmZmZ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l$Z$d dl%Z%d dl Z G dd„ deƒZ&G dd„ deƒZ'dd„ Z(dd„ Z)e(dfdd„Z*dd„ Z+G dd„ deƒZ,G d d!„ d!eƒZ-G d"d#„ d#eƒZ.G d$d%„ d%eƒZ/G d&d'„ d'e/ƒZ0G d(d)„ d)eƒZ1e2d*kr°e  3¡  dS )+é    )Úmock)Úsupport)ÚNoLogRequestHandler)ÚTestCase)Úsetup_testing_defaults)ÚHeaders)ÚBaseHandlerÚBaseCGIHandlerÚSimpleHandler)Úutil)Ú	validator)Ú
WSGIServerÚWSGIRequestHandler)Úmake_server)ÚHTTPConnection)ÚStringIOÚBytesIOÚBufferedReader)Ú
BaseServer)Úpython_implementationNc               @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú
MockServerzNon-socket HTTP serverc             C   s   t  | ||¡ |  ¡  d S )N)r   Ú__init__Úserver_bind)ÚselfÚserver_addressZRequestHandlerClass© r   úU/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_wsgiref.pyr      s    zMockServer.__init__c             C   s"   | j \}}|| _|| _|  ¡  d S )N)r   Zserver_nameZserver_portÚsetup_environ)r   ÚhostÚportr   r   r   r       s    
zMockServer.server_bindN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r      s   r   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚMockHandlerzNon-socket HTTP handlerc             C   s   | j | _| j\| _| _d S )N)ÚrequestÚ
connectionZrfileZwfile)r   r   r   r   Úsetup)   s    zMockHandler.setupc             C   s   d S )Nr   )r   r   r   r   Úfinish-   s    zMockHandler.finishN)r    r!   r"   r#   r'   r(   r   r   r   r   r$   '   s   r$   c             C   s   |dddgƒ dgS )Nz200 OK)zContent-Typez
text/plain)ÚDatezMon, 05 Jun 2006 18:49:54 GMTs   Hello, world!r   )ÚenvironÚstart_responser   r   r   Ú	hello_app1   s    r,   c             C   s2   |dddgƒ d  | d | d | d g¡ d¡gS )	Nz200 OK)zContent-Typez
text/plain)r)   zMon, 05 Jun 2006 18:49:54 GMTú;ZHTTP_X_TEST_HEADERÚQUERY_STRINGÚ	PATH_INFOz
iso-8859-1)ÚjoinÚencode)r*   r+   r   r   r   Ú
header_app9   s    r2   s   GET / HTTP/1.0

c             C   sb   t dd| ttƒ}tt|ƒƒ}tƒ }tj}tƒ  }t_z| ||fd¡ W d |t_X | 	¡ | 	¡ fS )NÚ éP   )z	127.0.0.1i¸"  )
r   r   r$   r   r   ÚsysÚstderrr   Zfinish_requestÚgetvalue)ÚappÚdataÚserverZinpÚoutZolderrÚerrr   r   r   Ú	run_amockD   s    r=   c             C   sâ   | ƒ }d}x$|D ]}|| |ks$t ‚|d7 }qW y||  W n tk
rP   Y nX t d|ƒ‚yttf W n tk
r|   Y nbX | ƒ }t|ƒ|k	r”t ‚x|D ]}t|ƒ|ksšt ‚qšW yt|ƒ W n tk
rÒ   Y nX t d|ƒ‚dS )a  Utility to compare a generic 2.1/2.2+ iterator with an iterable

    If running under Python 2.2+, this tests the iterator using iter()/next(),
    as well as __getitem__.  'make_it' must be a function returning a fresh
    iterator to be tested (since this may test the iterator twice).r   é   zToo many items from __getitem__zToo many items from .__next__()N)ÚAssertionErrorÚ
IndexErrorÚiterÚStopIterationÚ	NameErrorÚnext)Úmake_itÚmatchÚitÚnÚitemr   r   r   Úcompare_generic_iterR   s4    
 
 
 rJ   c               @   sf   e Z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d„ Z
dd„ Zdd„ Zdd„ ZdS )ÚIntegrationTestsTc             C   sF   t ƒ d tj ¡ d  }|  |d| d |r0dp2d d  d¡¡ d S )	Nú/r   z(HTTP/1.0 200 OK
Server: WSGIServer/0.2 zA
Content-Type: text/plain
Date: Mon, 05 Jun 2006 18:49:54 GMT
zContent-Length: 13
r3   z
Hello, world!z
iso-8859-1)r   r5   ÚversionÚsplitÚassertEqualr1   )r   r;   Ú
has_lengthÚpyverr   r   r   Úcheck_helloy   s    zIntegrationTests.check_helloc             C   s   t ƒ \}}|  |¡ d S )N)r=   rR   )r   r;   r<   r   r   r   Útest_plain_hello†   s    
z!IntegrationTests.test_plain_helloc             C   s*   d}t t|ƒ\}}|  | ¡ d d¡ d S )Nsm   GET /p%61th/?query=test HTTP/1.0
X-Test-Header: Python test 
X-Test-Header: Python test 2
Content-Length: 0

éÿÿÿÿs+   Python test,Python test 2;query=test;/path/)r=   r2   rO   Ú
splitlines)r   r%   r;   r<   r   r   r   Útest_environŠ   s
    
zIntegrationTests.test_environc             C   s2   t ddd  d d\}}|  | ¡ d d¡ d S )Ns   GET ó   xi  s    HTTP/1.0

)r9   r   s!   HTTP/1.0 414 Request-URI Too Long)r=   rO   rU   )r   r;   r<   r   r   r   Útest_request_length—   s    z$IntegrationTests.test_request_lengthc             C   s"   t ttƒƒ\}}| j|dd d S )NF)rP   )r=   r   r,   rR   )r   r;   r<   r   r   r   Útest_validated_helloœ   s    z%IntegrationTests.test_validated_helloc             C   s@   dd„ }t t|ƒƒ\}}|  | d¡¡ |  | ¡ d d¡ d S )Nc             S   s   |ddƒ dgS )Nz200 OK)zContent-Typez
text/plainzHello, world!r   )r*   r+   r   r   r   Úbad_app¢   s    
z>IntegrationTests.test_simple_validation_error.<locals>.bad_apps;   A server error occurred.  Please contact the administrator.éþÿÿÿz^AssertionError: Headers (('Content-Type', 'text/plain')) must be of type list: <class 'tuple'>)r=   r   Ú
assertTrueÚendswithrO   rU   )r   rZ   r;   r<   r   r   r   Útest_simple_validation_error¡   s    
z-IntegrationTests.test_simple_validation_errorc          
   C   st   dd„ }dddg}x\|D ]T\}}| j |d: t||ƒƒ\}}|  | d¡¡ |  | ¡ d |¡ W d Q R X qW d S )	Nc                s   ‡ fdd„}|S )Nc                s   |ˆ dgƒ dgS )N)zContent-Typeztext/plain; charset=utf-8s   Hello, world!r   )r*   r+   )Ústatusr   r   rZ   ±   s    zWIntegrationTests.test_status_validation_errors.<locals>.create_bad_app.<locals>.bad_appr   )r_   rZ   r   )r_   r   Úcreate_bad_app°   s    zFIntegrationTests.test_status_validation_errors.<locals>.create_bad_app)Z200z4AssertionError: Status must be at least 4 characters)z20X OKz8AssertionError: Status message must begin w/3-digit code)Z200OKz;AssertionError: Status message must have a space after code)r_   s;   A server error occurred.  Please contact the administrator.r[   )ÚsubTestr=   r\   r]   rO   rU   )r   r`   Útestsr_   Zexc_messager;   r<   r   r   r   Útest_status_validation_errors¯   s    z.IntegrationTests.test_status_validation_errorsc             C   s@   dd„ }t t|ƒƒ\}}|  | d¡¡ |  | ¡ d d¡ d S )Nc             S   s   | d   ¡  |ddgƒ dgS )Nz
wsgi.inputz200 OK)zContent-Typeztext/plain; charset=utf-8s   data)Úread)ÚeÚsr   r   r   rZ   Å   s    z1IntegrationTests.test_wsgi_input.<locals>.bad_apps;   A server error occurred.  Please contact the administrator.r[   r?   )r=   r   r\   r]   rO   rU   )r   rZ   r;   r<   r   r   r   Útest_wsgi_inputÄ   s    z IntegrationTests.test_wsgi_inputc             C   sl   dd„ }t t|ƒƒ\}}|  | d¡¡ tj ¡ d  d¡}tƒ  d¡}|d | }|  	d| d |¡ d S )	Nc             S   s   |dddgƒ dgS )Nz200 OK)zContent-Typeztext/plain; charset=utf-8)r)   zWed, 24 Dec 2008 13:29:32 GMTs   datar   )re   rf   r   r   r   r8   Ò   s    z3IntegrationTests.test_bytes_validation.<locals>.appz"GET / HTTP/1.0" 200 4
r   Úasciió   /s(   HTTP/1.0 200 OK
Server: WSGIServer/0.2 sV   
Content-Type: text/plain; charset=utf-8
Date: Wed, 24 Dec 2008 13:29:32 GMT

data)
r=   r   r\   r]   r5   rM   rN   r1   r   rO   )r   r8   r;   r<   ÚverÚpyrQ   r   r   r   Útest_bytes_validationÑ   s    
z&IntegrationTests.test_bytes_validationc             C   s>   dd„ }t t|ƒdd\}}|  dtjdddd	g| ¡ ¡ d S )
Nc             S   s   |dddgƒ | d   d¡gS )Nz200 OK)zContent-Typez
text/plain)r)   zWed, 24 Dec 2008 13:29:32 GMTr/   Úlatin1)r1   )re   rf   r   r   r   r8   ç   s    z-IntegrationTests.test_cp1252_url.<locals>.apps   GET /€%80 HTTP/1.0)r9   s   HTTP/1.0 200 OKs   Content-Type: text/plains#   Date: Wed, 24 Dec 2008 13:29:32 GMTó    s   /€€)r=   r   rO   r   ÚANYrU   )r   r8   r;   r<   r   r   r   Útest_cp1252_urlæ   s    	z IntegrationTests.test_cp1252_urlc                sÒ   t  td¡‰dd„ }G dd„ dttƒ}tt jd||d‰|  ˆj¡ t	 
¡ ‰ ‡ fdd	„}t tj|¡}|  tjtj|¡ d ‰t	 ¡ ‰‡ ‡‡‡‡fd
d„}t	j|d}| ¡  ˆ ¡  | ¡  |  ˆt jd ¡ d S )NÚpthread_killc             S   s   |dg ƒ dt j gS )Nz200 OKó    )r   ÚSOCK_MAX_SIZE)r*   r+   r   r   r   r8     s    
z4IntegrationTests.test_interrupted_write.<locals>.appc               @   s   e Zd ZdS )z<IntegrationTests.test_interrupted_write.<locals>.WsgiHandlerN)r    r!   r"   r   r   r   r   ÚWsgiHandler  s   rt   r   )Zhandler_classc                s   ˆ   ¡  d S )N)Úset)ÚsignumÚframe)Úinterruptedr   r   Úsignal_handler  s    z?IntegrationTests.test_interrupted_write.<locals>.signal_handlerc           	      sp   t ˆjŽ } |  dd¡ |  ¡ @}| d¡ x"ˆˆtjƒ ˆ jtdƒdr,P q,W t	| ¡ ƒ‰W d Q R X |  
¡  d S )NÚGETrL   éd   r>   )Útimeout)r   r   r%   Úgetresponserd   ÚsignalÚSIGUSR1ÚwaitÚfloatÚlenÚclose)ÚhttpÚresponse)rx   Úmain_threadrq   Úreceivedr:   r   r   Ú
run_client  s    


z;IntegrationTests.test_interrupted_write.<locals>.run_client)Útargetr{   )r   Úget_attributer~   r   r   r   ÚHOSTÚ
addCleanupZserver_closeÚ	threadingÚEventr   Ú	get_identÚThreadÚstartZhandle_requestr0   rO   rs   )r   r8   rt   ry   Úoriginalrˆ   Z
backgroundr   )rx   r†   rq   r‡   r:   r   Útest_interrupted_writeý   s"    z'IntegrationTests.test_interrupted_writeN)T)r    r!   r"   rR   rS   rV   rX   rY   r^   rc   rg   rl   rp   r“   r   r   r   r   rK   w   s   
rK   c               @   sˆ   e Zd Zdd„ Zd!dd„Zdd„ Z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d„ Zdd„ Zdd„ Zdd „ ZdS )#ÚUtilityTestsc             C   sJ   ||dœ}t  |¡ |  t  |¡|¡ |  |d |¡ |  |d |¡ |S )N)ÚSCRIPT_NAMEr/   r/   r•   )r   r   rO   Zshift_path_info)r   Zsn_inZpi_inÚpartZsn_outZpi_outÚenvr   r   r   Ú
checkShift1  s    

zUtilityTests.checkShiftNc             C   s|   i }t  |¡ t|tƒr*|  || t¡ n,t|tƒrF|  || t¡ n|  || |¡ ||i}t  |¡ |  || |¡ d S )N)r   r   Ú
isinstancer   ÚassertIsInstancer   rO   ÚassertIs)r   ÚkeyÚvalueÚaltr—   r   r   r   ÚcheckDefault9  s    



zUtilityTests.checkDefaultc             K   s   t  |¡ |  || |¡ d S )N)r   r   rO   )r   rœ   r   Úkwr   r   r   ÚcheckCrossDefaultI  s    
zUtilityTests.checkCrossDefaultc             K   s    t  |¡ |  t  |¡|¡ d S )N)r   r   rO   Zapplication_uri)r   Úurir    r   r   r   ÚcheckAppURIM  s    
zUtilityTests.checkAppURIr>   c             K   s"   t  |¡ |  t  ||¡|¡ d S )N)r   r   rO   Zrequest_uri)r   r¢   Zqueryr    r   r   r   ÚcheckReqURIQ  s    
zUtilityTests.checkReqURIc             C   sb   ||fdd„}t ||ƒ |ƒ }|  |jj¡ x|D ]}q2W |  |jj¡ | ¡  |  |jj¡ d S )Nc             S   s   t  t| ƒ|¡S )N)r   ZFileWrapperr   )ÚtextÚsizer   r   r   rE   W  s    z%UtilityTests.checkFW.<locals>.make_it)rJ   ÚassertFalseZfilelikeÚclosedrƒ   r\   )r   r¥   r¦   rF   rE   rG   rI   r   r   r   ÚcheckFWU  s    

zUtilityTests.checkFWc             C   s^   |   ddddd¡ |   ddddd¡ |   ddd dd¡ |   ddddd¡ |   dd	ddd¡ d S )
Nr3   rL   z/xÚxz/az/x/yz/a/xz/yz/x/)r˜   )r   r   r   r   ÚtestSimpleShiftsg  s
    zUtilityTests.testSimpleShiftsc             C   sÊ   |   ddddd¡ |   ddddd¡ |   dddd	d¡ |   dd
dd	d¡ |   dddd	d¡ |   dddd	d¡ |   ddddd¡ |   ddddd¡ |   ddddd¡ |   ddddd¡ |   ddd dd¡ d S )Nz/a/bz/../yz..z/az/yr3   z//yÚyz/a/b/yz//y/rL   z/./yz/./y/z///./..//y/.//z/y/z///z/a/b/z/.//z/x//rª   z/a/b/xz/.)r˜   )r   r   r   r   ÚtestNormalizedShiftsn  s    z!UtilityTests.testNormalizedShiftsc             C   sJ   xDddddddddd	d
ddt ƒ fdtƒ fdgD ]\}}|  ||¡ q.W d S )N)ÚSERVER_NAMEz	127.0.0.1)ÚSERVER_PORTÚ80)ÚSERVER_PROTOCOLzHTTP/1.0)Ú	HTTP_HOSTz	127.0.0.1)ZREQUEST_METHODrz   )r•   r3   )r/   rL   )zwsgi.version)r>   r   )zwsgi.run_oncer   )zwsgi.multithreadr   )zwsgi.multiprocessr   z
wsgi.inputzwsgi.errors)zwsgi.url_schemer„   )r   r   rŸ   )r   rœ   r   r   r   r   ÚtestDefaults{  s     zUtilityTests.testDefaultsc             C   st   | j dddd | j dddd | j dddd | j ddd	d | j dd
dd | j dddd | j dddd d S )Nr²   zfoo.bar)r®   zwsgi.url_schemeÚhttpsÚon)ÚHTTPSÚ1Úyesr„   Úfoor¯   r°   Z443)r¡   )r   r   r   r   ÚtestCrossDefaultsŽ  s    zUtilityTests.testCrossDefaultsc             C   sn   |   t i ¡d¡ |   t ddi¡d¡ |   t ddi¡d¡ |   t ddi¡d¡ |   t ddi¡d¡ d S )Nr„   r¶   r¹   rµ   r´   r¸   r·   )rO   r   Zguess_scheme)r   r   r   r   ÚtestGuessScheme—  s
    zUtilityTests.testGuessSchemec             C   sv   |   d¡ | j ddd | j ddd | j ddd	d
 | j ddd | j dddd | j ddd | j ddd d d S )Nzhttp://127.0.0.1/zhttp://127.0.0.1/spamz/spam)r•   zhttp://127.0.0.1/sp%E4mu   /spÃ¤mzhttp://spam.example.com:2071/zspam.example.com:2071Z2071)r²   r¯   zhttp://spam.example.com/zspam.example.com)r®   z	127.0.0.1)r²   r®   zhttps://127.0.0.1/rµ   )r¶   zhttp://127.0.0.1:8000/Z8000)r¯   r²   )r£   )r   r   r   r   ÚtestAppURIsž  s    


zUtilityTests.testAppURIsc             C   s¢   |   d¡ | j ddd | j ddd | j dddd	 | j d
ddd	 | j dddd	 | j dddd	 | j ddddd | j ddddd | j dddddd d S )Nzhttp://127.0.0.1/zhttp://127.0.0.1/spamz/spam)r•   zhttp://127.0.0.1/sp%E4mu   /spÃ¤mzhttp://127.0.0.1/spammity/spamz	/spammity)r•   r/   z http://127.0.0.1/spammity/sp%E4mz"http://127.0.0.1/spammity/spam;hamz	/spam;hamz/http://127.0.0.1/spammity/spam;cookie=1234,5678z/spam;cookie=1234,5678z%http://127.0.0.1/spammity/spam?say=nizsay=ni)r•   r/   r.   z'http://127.0.0.1/spammity/spam?s%E4y=nizs%E4y=nir   )r¤   )r   r   r   r   ÚtestReqURIs¬  s"    




zUtilityTests.testReqURIsc             C   s   |   ddddg¡ d S )NZ–xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzéx   ZxxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzZxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz)r©   )r   r   r   r   ÚtestFileWrapper¿  s    zUtilityTests.testFileWrapperc             C   sŒ   xBd  ¡ D ]6}x0|| ¡ | ¡ | ¡ fD ]}|  t |¡¡ q(W q
W xBd  ¡ D ]6}x0|| ¡ | ¡ | ¡ fD ]}|  t |¡¡ qlW qNW d S )NzbConnection Keep-Alive Proxy-Authenticate Proxy-Authorization TE Trailers Transfer-Encoding Upgradez4Accept Cache-Control Date Pragma Trailer Via Warning)rN   ÚtitleÚupperÚlowerr\   r   Zis_hop_by_hopr§   )r   Zhoprž   r   r   r   ÚtestHopByHopÂ  s    zUtilityTests.testHopByHop)N)r>   )r    r!   r"   r˜   rŸ   r¡   r£   r¤   r©   r«   r­   r³   rº   r»   r¼   r½   r¿   rÃ   r   r   r   r   r”   /  s   

	r”   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚHeaderTestsc             C   sÎ  dg}|   ttƒ ƒd¡ |   ttg ƒƒd¡ |   tt|d d … ƒƒd¡ |   t|d d … ƒ ¡ dg¡ |   t|d d … ƒ ¡ dg¡ |   t|d d … ƒ ¡ |¡ |  t|ƒ ¡ |¡ tƒ }|d= d|d< xT|j|j|j	|j
fD ]<}|  |dƒ¡ |  |dƒ¡ |  |d	ƒ¡ |  |dƒ¡ qÞW |   |d d¡ d
|d< |   |d	 d
¡ |   | 	d¡d
g¡ |   | dd¡d
¡ |   | dd¡d¡ |   | dd¡d
¡ |   | dd¡d¡ |   |d d
¡ |   |d d¡ d S )N)rª   r¬   r   r>   rª   r¬   r¹   ÚbarÚFooZFOOÚbazZwheeZzoo)rO   r‚   r   ÚkeysÚvaluesÚitemsÚassertIsNotÚ__contains__ÚgetÚget_allÚ__getitem__r\   r§   Ú
setdefault)r   ÚtestÚhÚmr   r   r   ÚtestMappingInterfaceÓ  s4    z HeaderTests.testMappingInterfacec             C   s   |   ttd¡ d S )Nr¹   )ÚassertRaisesÚ	TypeErrorr   )r   r   r   r   ÚtestRequireListó  s    zHeaderTests.testRequireListc             C   s€   t ƒ }|  t|ƒd¡ |jdddd |  |d d¡ |  t|ƒd¡ |jddd d	 |  | d¡dd
g¡ |  t|ƒd¡ d S )Nz
r¹   rÅ   Zspam)rÇ   zbar; baz="spam"zfoo: bar; baz="spam"

rÆ   )Zcheesezbar; cheesez*foo: bar; baz="spam"
Foo: bar; cheese

)r   rO   ÚstrZ
add_headerrÎ   )r   rÒ   r   r   r   Ú
testExtrasö  s    

zHeaderTests.testExtrasN)r    r!   r"   rÔ   r×   rÙ   r   r   r   r   rÄ   Ñ  s    rÄ   c               @   s&   e Zd ZdZeej ¡ ƒZdd„ Z	dS )ÚErrorHandlerz/Simple handler subclass for testing BaseHandlerc          	   K   s*   t |ƒ tj| tƒ tƒ tƒ |ddd d S )NT)ÚmultithreadÚmultiprocess)r   r	   r   r   r   )r   r    r   r   r   r     s    zErrorHandler.__init__N)
r    r!   r"   r#   ÚdictÚosr*   rÊ   Z
os_environr   r   r   r   r   rÚ     s   rÚ   c               @   s   e Zd ZdZdd„ ZdS )ÚTestHandlerzASimple handler subclass for testing BaseHandler, w/error passthruc              C   s   ‚ d S )Nr   )r   r   r   r   Úhandle_error  s    zTestHandler.handle_errorN)r    r!   r"   r#   rà   r   r   r   r   rß     s   rß   c               @   st   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S )ÚHandlerTestsc             C   sJ   |j }x>dD ]6}|dkr$|jd kr$q|  t|d| ƒ|d|  ¡ qW d S )N)rM   rÛ   rÜ   Zrun_onceÚfile_wrapperrâ   Zwsgi_zwsgi.)r*   Zwsgi_file_wrapperrO   Úgetattr)r   Úhandlerr—   Úattrr   r   r   ÚcheckEnvironAttrs   s
    
zHandlerTests.checkEnvironAttrsc             C   sr   i }t |ƒ |j}ddlm} x,| ¡ D ] \}}||kr(|  || |¡ q(W x | ¡ D ]\}}|  ||¡ qVW d S )Nr   )r*   )r   r*   rÞ   rÊ   rO   ÚassertIn)r   rä   Úemptyr—   r*   ÚkÚvr   r   r   ÚcheckOSEnviron)  s     zHandlerTests.checkOSEnvironc             C   s<   t dd}| ¡  |  |¡ |  |¡ |  |jd d¡ d S )NÚY)ÚXrí   )rß   r   ræ   rë   rO   r*   )r   rÒ   r   r   r   ÚtestEnviron3  s
    


zHandlerTests.testEnvironc             C   s6   t d d d i ƒ}| ¡  xdD ]}|  ||j¡ qW d S )N)zwsgi.url_schemez
wsgi.inputzwsgi.errors)r	   r   rç   r*   )r   rÒ   rœ   r   r   r   ÚtestCGIEnviron:  s    
zHandlerTests.testCGIEnvironc             C   sH   t dd}| ¡  |  |jd d¡ t ƒ }| ¡  |  |jd d¡ d S )Nrµ   )r¶   zwsgi.url_schemer´   r„   )rß   r   rO   r*   )r   rÒ   r   r   r   Ú
testScheme@  s    
  zHandlerTests.testSchemec             C   s:   t ƒ }xdD ]}|  tt||ƒ¡ qW |  t|jd¡ d S )N)Z_flushZ	get_stdinZ
get_stderrZadd_cgi_varsrÑ   )r   rÕ   ÚNotImplementedErrorrã   Z_write)r   rÒ   Únamer   r   r   ÚtestAbstractMethodsF  s    
z HandlerTests.testAbstractMethodsc             C   s¸   dd„ }dd„ }dd„ }dd„ }t ƒ }| |¡ |  |j ¡ d	 d
¡¡ t ƒ }| |¡ |  |j ¡ d d
¡¡ t ƒ }| |¡ |  |j ¡ d¡ t ƒ }| |¡ |  |j ¡ d¡ d S )Nc             S   s   |dg ƒ | d   d¡gS )Nz200 OKzwsgi.url_schemez
iso-8859-1)r1   )re   rf   r   r   r   Útrivial_app1Q  s    
z4HandlerTests.testContentLength.<locals>.trivial_app1c             S   s   |dg ƒ| d   d¡ƒ g S )Nz200 OKzwsgi.url_schemez
iso-8859-1)r1   )re   rf   r   r   r   Útrivial_app2U  s    z4HandlerTests.testContentLength.<locals>.trivial_app2c             S   s   |dg ƒ d  d¡gS )Nz200 OKu   Ñ‚ÐµÑÑ‚zutf-8)r1   )re   rf   r   r   r   Útrivial_app3Y  s    
z4HandlerTests.testContentLength.<locals>.trivial_app3c             S   s   |ddgƒ g S )Nz200 OK)zContent-LengthZ12345r   )re   rf   r   r   r   Útrivial_app4]  s    z4HandlerTests.testContentLength.<locals>.trivial_app4z)Status: 200 OK
Content-Length: 4

httpz
iso-8859-1zStatus: 200 OK

https-   Status: 200 OK
Content-Length: 8

Ñ‚ÐµÑÑ‚s)   Status: 200 OK
Content-Length: 12345

)rß   ÚrunrO   Ústdoutr7   r1   )r   rô   rõ   rö   r÷   rÒ   r   r   r   ÚtestContentLengthN  s,    



zHandlerTests.testContentLengthc             C   sž   dd„ }dd„ }t ƒ }| |¡ |  |j ¡ d d¡¡ |  |j ¡ d¡ t ƒ }| |¡ |  |j ¡ d|jt|j	ƒf  d¡|j	 ¡ |  
d	|j ¡ ¡ d S )
Nc             S   s   |dg ƒ g S )Nz200 OKr   )re   rf   r   r   r   Únon_error_app‚  s    
z8HandlerTests.testBasicErrorOutput.<locals>.non_error_appc             S   s   t dƒ‚d S )Nz This should be caught by handler)r?   )re   rf   r   r   r   Ú	error_app†  s    z4HandlerTests.testBasicErrorOutput.<locals>.error_appz%Status: 200 OK
Content-Length: 0

z
iso-8859-1r3   z<Status: %s
Content-Type: text/plain
Content-Length: %d

r?   )rÚ   rø   rO   rù   r7   r1   r6   Zerror_statusr‚   Z
error_bodyrç   )r   rû   rü   rÒ   r   r   r   ÚtestBasicErrorOutput€  s    


z!HandlerTests.testBasicErrorOutputc                sR   d‰ ‡ fdd„}t ƒ }| |¡ |  |j ¡ d d¡ˆ  ¡ |  d|j ¡ ¡ d S )Ns   Some output has been sentc                s   |dg ƒˆ ƒ t dƒ‚d S )Nz200 OKz This should be caught by handler)r?   )re   rf   )ÚMSGr   r   rü   ž  s    z4HandlerTests.testErrorAfterOutput.<locals>.error_appzStatus: 200 OK

z
iso-8859-1r?   )rÚ   rø   rO   rù   r7   r1   rç   r6   )r   rü   rÒ   r   )rþ   r   ÚtestErrorAfterOutputœ  s    
z!HandlerTests.testErrorAfterOutputc       	   
   C   s  dd„ }d}d  d¡}xòdD ]ê}|r,d| p.d}xÔd	D ]Ì}xÆd
D ]¾}t|d}d|_||_||_| |¡ |  ||j ¡ ¡ t|d}d|_||_||_| |¡ |dkr¾|  |j ¡ d¡ q@|  	t
 |||f   d¡|j ¡ ¡|||f   d¡|j ¡ f¡ q@W q6W qW d S )Nc             S   s   |dg ƒ g S )Nz200 OKr   )re   rf   r   r   r   rû   «  s    
z5HandlerTests.testHeaderFormats.<locals>.non_error_appzfHTTP/%s 200 OK\r\nDate: \w{3}, [ 0123]\d \w{3} \d{4} \d\d:\d\d:\d\d GMT\r\n%sContent-Length: 0\r\n\r\nz%Status: 200 OK
Content-Length: 0

z
iso-8859-1)z
FooBar/1.0NzServer: %s
r3   )z1.0z1.1)zHTTP/0.9zHTTP/1.0zHTTP/1.1)r±   FTzHTTP/0.9rn   )r1   rß   Zorigin_serverZhttp_versionZserver_softwarerø   rO   rù   r7   r\   ÚrerF   )	r   rû   ZstdpatZshortpatZsswÚswrM   ÚprotorÒ   r   r   r   ÚtestHeaderFormats©  s4    







zHandlerTests.testHeaderFormatsc             C   s.   dd„ }t ƒ }| |¡ |  d|j ¡ ¡ d S )Nc             S   s   |ddgƒ dgS )Nz200 OK)zContent-Typeztext/plain; charset=utf-8s   datar   )re   rf   r   r   r   r8   Õ  s    z'HandlerTests.testBytesData.<locals>.appsR   Status: 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 4

data)rß   rø   rO   rù   r7   )r   r8   rÒ   r   r   r   ÚtestBytesDataÔ  s
    
zHandlerTests.testBytesDatac                s>   ddi‰d‰ ‡ ‡fdd„}t ƒ }| |¡ |  ˆd d¡ d S )NÚclose_calledFs   Some output has been sentc                s(   |dg ƒˆ ƒ G ‡fdd„dt ƒ}|ƒ S )Nz200 OKc                   s    e Zd Zdd„ Z‡ fdd„ZdS )zHHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterablec             s   s   xdV  t dƒ‚qW d S )Ns   blahz This should be caught by handler)r?   )r   r   r   r   Ú__iter__ê  s    zQHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterable.__iter__c                s   dˆ d< d S )NTr  r   )r   )Úside_effectsr   r   rƒ   î  s    zNHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterable.closeN)r    r!   r"   r  rƒ   r   )r  r   r   ÚCrashyIterableé  s   r  )Úobject)re   rf   r  )rþ   r  r   r   rü   ç  s    z0HandlerTests.testCloseOnError.<locals>.error_appT)rÚ   rø   rO   )r   rü   rÒ   r   )rþ   r  r   ÚtestCloseOnErrorä  s    
zHandlerTests.testCloseOnErrorc          	      sj   t ƒ ‰ G ‡ fdd„dƒ}ddi}ttƒ |ƒ tj|ƒ}d}|  t|¡ | t¡ W d Q R X |  	dˆ ¡ d S )Nc                   s    e Zd Z‡ fdd„Zdd„ ZdS )z4HandlerTests.testPartialWrite.<locals>.PartialWriterc                s   |d d… }ˆ   |¡ t|ƒS )Né   )Úextendr‚   )r   ÚbÚpartial)Úwrittenr   r   Úwriteú  s    
z:HandlerTests.testPartialWrite.<locals>.PartialWriter.writec             S   s   d S )Nr   )r   r   r   r   Úflushÿ  s    z:HandlerTests.testPartialWrite.<locals>.PartialWriter.flushN)r    r!   r"   r  r  r   )r  r   r   ÚPartialWriterù  s   r  r±   zHTTP/1.0zshould not do partial writesss   HTTP/1.0 200 OK
Content-Type: text/plain
Date: Mon, 05 Jun 2006 18:49:54 GMT
Content-Length: 13

Hello, world!)
Ú	bytearrayr
   r   r5   r6   ÚassertWarnsRegexÚDeprecationWarningrø   r,   rO   )r   r  r*   rÒ   Úmsgr   )r  r   ÚtestPartialWriteö  s    	zHandlerTests.testPartialWriteN)r    r!   r"   ræ   rë   rî   rï   rð   ró   rú   rý   rÿ   r  r  r
  r  r   r   r   r   rá     s   	
2+rá   Ú__main__)4Úunittestr   rÑ   r   Ztest.test_httpserversr   r   Zwsgiref.utilr   Zwsgiref.headersr   Zwsgiref.handlersr   r	   r
   Zwsgirefr   Zwsgiref.validater   Zwsgiref.simple_serverr   r   r   Úhttp.clientr   Úior   r   r   Úsocketserverr   Úplatformr   rÞ   r   r~   r5   r   r   r$   r,   r2   r=   rJ   rK   r”   rÄ   rÚ   rß   rá   r    Úmainr   r   r   r   Ú<module>   sJ   
% 9 #7 s
