o
    IXhx                     @   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 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	Z0G d$d% d%e	Z1G d&d' d'eZ2G d(d) d)e2Z3G d*d+ d+e	Z4e5d,kre 6  dS dS )-    )mock)support)socket_helper)warnings_helper)NoLogRequestHandler)TestCase)setup_testing_defaults)Headers)BaseHandlerBaseCGIHandlerSimpleHandler)util)	validator)
WSGIServerWSGIRequestHandler)make_server)HTTPConnection)StringIOBytesIOBufferedReader)
BaseServer)python_implementationNc                   @      e Zd Z	 dd Zdd ZdS )
MockServerc                 C   s   t | || |   d S N)r   __init__server_bind)selfserver_addressZRequestHandlerClass r   ;/opt/python-3.10.19/usr/lib/python3.10/test/test_wsgiref.pyr      s   zMockServer.__init__c                 C   s"   | j \}}|| _|| _|   d S r   )r   Zserver_nameZserver_portsetup_environ)r   hostportr   r   r    r   "   s   
zMockServer.server_bindN)__name__
__module____qualname__r   r   r   r   r   r    r      s    r   c                   @   r   )MockHandlerc                 C   s   | j | _| j\| _| _d S r   )request
connectionZrfileZwfiler   r   r   r    setup+   s   zMockHandler.setupc                 C      d S r   r   r*   r   r   r    finish/      zMockHandler.finishN)r$   r%   r&   r+   r-   r   r   r   r    r'   )   s    r'   c                 C      |dddg dgS )N200 OKContent-Typez
text/plainDatezMon, 05 Jun 2006 18:49:54 GMT   Hello, world!r   environZstart_responser   r   r    	hello_app3   
   r8   c                 C   s2   |dddg d | d | d | d gdgS )	Nr0   r1   r3   ;ZHTTP_X_TEST_HEADERQUERY_STRING	PATH_INFO
iso-8859-1)joinencoder6   r   r   r    
header_app;   s   r@   s   GET / HTTP/1.0

c                 C   sh   t dd| tt}tt|}t }tj}t  }t_z|||fd W |t_n|t_w |	 |	 fS )N P   )	127.0.0.1i"  )
r   r   r'   r   r   sysstderrr   Zfinish_requestgetvalue)appdataserverinpoutZolderrerrr   r   r    	run_amockF   s   rM   c                 C   s   	 |  }d}|D ]}|| |kst |d7 }qz||  W n	 ty&   Y nw t d|zttf W n
 ty<   Y d S w |  }t||urHt |D ]
}t||ksTt qJzt| W n
 tye   Y d S w t d|)Nr      zToo many items from __getitem__zToo many items from .__next__())AssertionError
IndexErroriterStopIteration	NameErrornext)make_itmatchitnitemr   r   r    compare_generic_iterT   s6   


rZ   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 |rdpd 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
rA   z
Hello, world!r=   )r   rD   versionsplitassertEqualr?   )r   rK   
has_lengthpyverr   r   r    check_hello{   s   
zIntegrationTests.check_helloc                 C   s   t  \}}| | d S r   )rM   rb   r   rK   rL   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/)rM   r@   r_   
splitlines)r   r(   rK   rL   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

rH   r   s!   HTTP/1.0 414 Request-URI Too Long)rM   r_   rf   rc   r   r   r    test_request_length   s   z$IntegrationTests.test_request_lengthc                 C   s"   t tt\}}| j|dd d S )NF)r`   )rM   r   r8   rb   rc   r   r   r    test_validated_hello   s   z%IntegrationTests.test_validated_helloc                 C   @   dd }t t|\}}| |d | | d d d S )Nc                 S   s   |dd dgS )Nr0   r1   zHello, world!r   r6   r   r   r    bad_app   s   
z>IntegrationTests.test_simple_validation_error.<locals>.bad_app;   A server error occurred.  Please contact the administrator.z^AssertionError: Headers (('Content-Type', 'text/plain')) must be of type list: <class 'tuple'>rM   r   
assertTrueendswithr_   rf   r   rm   rK   rL   r   r   r    test_simple_validation_error   s   
z-IntegrationTests.test_simple_validation_errorc              	   C   s   dd }g d}|D ]4\}}| j |d" t||\}}| |d | | d | W d    n1 s9w   Y  q
d S )Nc                    s    fdd}|S )Nc                    s   | dg dgS )Nr2   ztext/plain; charset=utf-8r5   r   r6   statusr   r    rm      s   zWIntegrationTests.test_status_validation_errors.<locals>.create_bad_app.<locals>.bad_appr   )rw   rm   r   rv   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 coderv   rn   ro   )subTestrM   rq   rr   r_   rf   )r   rx   Ztestsrw   Zexc_messagerK   rL   r   r   r    test_status_validation_errors   s   z.IntegrationTests.test_status_validation_errorsc                 C   rl   )Nc                 S   s   | d    |ddg dgS )N
wsgi.inputr0   ru      data)readesr   r   r    rm      s   z1IntegrationTests.test_wsgi_input.<locals>.bad_apprn   ro   rO   rp   rs   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   r/   )Nr0   ru   r4   zWed, 24 Dec 2008 13:29:32 GMTr|   r   r~   r   r   r    rG      r9   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)
rM   r   rq   rr   rD   r]   r^   r?   r   r_   )r   rG   rK   rL   verpyra   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 )Nr0   r1   r   r<   latin1r?   r~   r   r   r    rG      s
   z-IntegrationTests.test_cp1252_url.<locals>.apps   GET /%80 HTTP/1.0ri   s   HTTP/1.0 200 OKs   Content-Type: text/plains#   Date: Wed, 24 Dec 2008 13:29:32 GMT    s   /)rM   r   r_   r   ANYrf   )r   rG   rK   rL   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 )Nr0       )r   SOCK_MAX_SIZEr6   r   r   r    rG        
z4IntegrationTests.test_interrupted_write.<locals>.appc                   @      e Zd ZdS )z<IntegrationTests.test_interrupted_write.<locals>.WsgiHandlerNr$   r%   r&   r   r   r   r    WsgiHandler	      r   r   )Zhandler_classc                    s       d S r   )set)signumframe)interruptedr   r    signal_handler     z?IntegrationTests.test_interrupted_write.<locals>.signal_handlerc                     s   t j } | dd |  $}|d 	 tj  jtddr%nqt	| W d    n1 s6w   Y  | 
  d S )NGETr\   d   TrN   )timeout)r   r   r(   Zgetresponser}   signalSIGUSR1waitfloatlenclose)httpresponser   main_threadr   ZreceivedrI   r   r    
run_client  s   


z;IntegrationTests.test_interrupted_write.<locals>.run_client)targetr   )r   Zget_attributer   r   r   r   r   ZHOSTZ
addCleanupZserver_close	threadingEventr   	get_identThreadstartZhandle_requestr>   r_   r   )r   rG   r   r   Zoriginalr   Z
backgroundr   r   r    test_interrupted_write   s"   z'IntegrationTests.test_interrupted_writeN)T)r$   r%   r&   rb   rd   rg   rj   rk   rt   rz   r   r   r   r   r   r   r   r    r[   y   s    
r[   c                   @   s   e Zd Zdd Zd$ddZdd Zdd	 Zd%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# ZdS )&UtilityTestsc                 C   sJ   ||d}t | | t || | |d | | |d | |S )NSCRIPT_NAMEr<   r<   r   )r   r   r_   Zshift_path_info)r   Zsn_inZpi_inpartZsn_outZpi_outenvr   r   r    
checkShift3  s   

zUtilityTests.checkShiftNc                 C   s|   i }t | t|tr| || t nt|tr#| || t n| || | ||i}t | | || | d S r   )r   r   
isinstancer   ZassertIsInstancer   r_   ZassertIs)r   keyvaluealtr   r   r   r    checkDefault;  s   



zUtilityTests.checkDefaultc                 K   s   t | | || | d S r   )r   r   r_   )r   r   r   kwr   r   r    checkCrossDefaultK  s   
zUtilityTests.checkCrossDefaultc                 K   s    t | | t || d S r   )r   r   r_   Zapplication_uri)r   urir   r   r   r    checkAppURIO  s   
zUtilityTests.checkAppURIrN   c                 K   s"   t | | t ||| d S r   )r   r   r_   Zrequest_uri)r   r   queryr   r   r   r    checkReqURIS  s   
zUtilityTests.checkReqURI)categoryc                 C   s^   ||fdd}t || | }| |jj |D ]}q| |jj |  | |jj d S )Nc                 S   s   t t| |S r   )r   FileWrapperr   )textsizer   r   r    rU   Z  s   z%UtilityTests.checkFW.<locals>.make_it)rZ   assertFalseZfilelikeclosedr   rq   )r   r   r   rV   rU   rW   rY   r   r   r    checkFWW  s   
zUtilityTests.checkFWc                 C   sR   t tdd}| td | |d d W d    d S 1 s"w   Y  d S )NZfoobar   zUse iterator protocol insteadrN   foo)r   r   r   assertWarnsRegexDeprecationWarningr_   )r   wrapperr   r   r    $test_filewrapper_getitem_deprecationj  s   "z1UtilityTests.test_filewrapper_getitem_deprecationc                 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 )
NrA   r\   z/xx/az/x/yz/a/x/yz/x/r   r*   r   r   r    testSimpleShiftsq  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..r   r   rA   z//yyz/a/b/yz//y/r\   z/./yz/./y/z///./..//y/.//z/y/z///z/a/b/z/.//z/x//r   z/a/b/xz/.r   r*   r   r   r    testNormalizedShiftsx  s   z!UtilityTests.testNormalizedShiftsc                 C   sF   ddddddddd	d
ddt  fdt fdfD ]
\}}| || qd S )N)SERVER_NAMErC   )SERVER_PORT80)SERVER_PROTOCOLHTTP/1.0)	HTTP_HOSTrC   )ZREQUEST_METHODr   )r   rA   )r<   r\   )wsgi.versionrN   r   )wsgi.run_oncer   )wsgi.multithreadr   )wsgi.multiprocessr   r{   wsgi.errors)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   r   httpsonHTTPS1yesr   r   r   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   )r_   r   Zguess_schemer*   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 )Nhttp://127.0.0.1/http://127.0.0.1/spam/spamr   http://127.0.0.1/sp%E4m   /spämzhttp://spam.example.com:2071/zspam.example.com:2071Z2071)r   r   zhttp://spam.example.com/zspam.example.comr   rC   )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 )Nr   r   r   r   r   r   zhttp://127.0.0.1/spammity/spamz	/spammityr   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  s0   

zUtilityTests.testReqURIsc                 C   s   |  ddddg d S )NZxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzx   ZxxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzZxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz)r   r*   r   r   r    testFileWrapper  s   zUtilityTests.testFileWrapperc                 C   s|   d  D ]}|| | | fD ]
}| t| qqd  D ]}|| | | fD ]
}| t| q0q"d S )NzbConnection Keep-Alive Proxy-Authenticate Proxy-Authorization TE Trailers Transfer-Encoding Upgradez4Accept Cache-Control Date Pragma Trailer Via Warning)r^   titleupperlowerrq   r   Zis_hop_by_hopr   )r   Zhopr   r   r   r    testHopByHop  s   zUtilityTests.testHopByHopr   )rN   )r$   r%   r&   r   r   r   r   r   r   Zignore_warningsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   1  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< |j|j|j	|j
fD ]}| |d | |d | |d	 | |d qn|  |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   rN   r   r   r   barFooZFOObazZwheeZzoo)r_   r   r	   keysvaluesitemsZassertIsNot__contains__getget_all__getitem__rq   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	   r_   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	 eej Zdd ZdS )ErrorHandlerc              	   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&   dictosr7   r   
os_environr   r   r   r   r    r    s    r  c                   @   s   e Zd Z	 dd ZdS )TestHandlerc                  C   s    r   r   r*   r   r   r    handle_error$  s   zTestHandler.handle_errorN)r$   r%   r&   r  r   r   r   r    r  !  s    r  c                   @   sx   e Zd 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 )HandlerTestsi  c                 C   s   dddddd}t td| tdd	d
}|  W d    n1 s$w   Y  dD ]}| t|d| |jd|   q+i }t| | D ]\}}||vrT|||< qH|	dd	dd|
 | dddddtjd | |j| d S )Nz/my/homez/my/pathzfr_FR.UTF-8Ztest_script_nameZtest_server_name)HOMEPATHLANGr   r   r  Yz/override/home)Xr  )r]   r  r  Zrun_onceZfile_wrapperZwsgi_zwsgi.rA   rC   r   Fr   T)r  r  r   r   r{   r   r   r   r   r   r   zwsgi.file_wrapper)r   Z	swap_attrr  r!   r_   getattrr7   r   r   update	get_stdin
get_stderrr   r   ZassertDictEqual)r   r  handlerattrZexpectedr   r   r   r   r    testEnviron,  sF   
zHandlerTests.testEnvironc                 C   s2   t d d d i }|  dD ]	}| ||j qd S )N)r   r{   r   )r   r!   assertInr7   )r   r  r   r   r   r    testCGIEnvironb  s
   zHandlerTests.testCGIEnvironc                 C   sH   t dd}|  | |jd d t  }|  | |jd d d S )Nr   r   r   r   r   )r  r!   r_   r7   r  r   r   r    
testSchemeh  s   zHandlerTests.testSchemec                 C   s6   t  }dD ]}| tt|| q| t|jd d S )N)Z_flushr   r!  Zadd_cgi_varsr  )r
   r
  NotImplementedErrorr  _write)r   r  namer   r   r    testAbstractMethodsn  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 Nr0   r   r=   r   r~   r   r   r    trivial_app1y  s   
z4HandlerTests.testContentLength.<locals>.trivial_app1c                 S   s   |dg | d  d g S r,  r   r~   r   r   r    trivial_app2}  s   z4HandlerTests.testContentLength.<locals>.trivial_app2c                 S   s   |dg  d dgS )Nr0   u   тестzutf-8r   r~   r   r   r    trivial_app3  r   z4HandlerTests.testContentLength.<locals>.trivial_app3c                 S   s   |ddg g S )Nr0   )zContent-LengthZ12345r   r~   r   r   r    trivial_app4  s   z4HandlerTests.testContentLength.<locals>.trivial_app4z)Status: 200 OK
Content-Length: 4

httpr=   zStatus: 200 OK

https-   Status: 200 OK
Content-Length: 8

тестs)   Status: 200 OK
Content-Length: 12345

)r  runr_   stdoutrF   r?   )r   r-  r.  r/  r0  r  r   r   r    testContentLengthv  s4   



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      |dg  g S Nr0   r   r~   r   r   r    non_error_app     
z8HandlerTests.testBasicErrorOutput.<locals>.non_error_appc                 S   s   t d)N This should be caught by handlerrO   r~   r   r   r    	error_app  s   z4HandlerTests.testBasicErrorOutput.<locals>.error_app%Status: 200 OK
Content-Length: 0

r=   rA   z<Status: %s
Content-Type: text/plain
Content-Length: %d

rO   )r  r1  r_   r2  rF   r?   rE   Zerror_statusr   Z
error_bodyr%  )r   r6  r:  r  r   r   r    testBasicErrorOutput  s(   

z!HandlerTests.testBasicErrorOutputc                    sR   d  fdd}t  }|| | |j dd   | d|j  d S )N   Some output has been sentc                    s   |dg   t d)Nr0   r8  r9  r~   MSGr   r    r:    s   z4HandlerTests.testErrorAfterOutput.<locals>.error_appzStatus: 200 OK

r=   rO   )r  r1  r_   r2  rF   r?   r%  rE   r   r:  r  r   r>  r    testErrorAfterOutput  s   
z!HandlerTests.testErrorAfterOutputc           	   
   C   s  dd }d}d d}dD ]q}|rd| pd}d	D ]d}d
D ]_}t|d}d|_||_||_|| | ||j  t|d}d|_||_||_|| |dkr\| |j d q| 	t
|||f  d|j |||f  d|j f qqqd S )Nc                 S   r4  r5  r   r~   r   r   r    r6    r7  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\nr;  r=   )z
FooBar/1.0NzServer: %s
rA   )z1.0z1.1)HTTP/0.9r   zHTTP/1.1)r   FTrB  r   )r?   r  Zorigin_serverZhttp_versionZserver_softwarer1  r_   r2  rF   rq   rerV   )	r   r6  ZstdpatZshortpatZsswswr]   protor  r   r   r    testHeaderFormats  sD   



zHandlerTests.testHeaderFormatsc                 C   s.   dd }t  }|| | d|j  d S )Nc                 S   s   |ddg dgS )Nr0   ru   r|   r   r~   r   r   r    rG     s   z'HandlerTests.testBytesData.<locals>.appsR   Status: 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 4

data)r  r1  r_   r2  rF   )r   rG   r  r   r   r    testBytesData  s   
zHandlerTests.testBytesDatac                    s>   ddid  fdd}t  }|| | d d d S )Nclose_calledFr=  c                    s(   |dg   G fdddt }| S )Nr0   c                       s    e Zd Zdd Z fddZdS )zHHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterablec                 s   s    	 dV  t d)NTs   blahr8  r9  r*   r   r   r    __iter__  s   zQHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterable.__iter__c                    s   d d< d S )NTrH  r   r*   side_effectsr   r    r     r   zNHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterable.closeN)r$   r%   r&   rI  r   r   rJ  r   r    CrashyIterable  s    rL  )object)r   r   rL  r?  rK  r   r    r:    s   z0HandlerTests.testCloseOnError.<locals>.error_appT)r  r1  r_   r@  r   rN  r    testCloseOnError  s   
zHandlerTests.testCloseOnErrorc                    s~   t   G  fddd}ddi}tt | tj|}d}| t| |t W d    n1 s2w   Y  | 	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Zwrittenr   r    write"  s   
z:HandlerTests.testPartialWrite.<locals>.PartialWriter.writec                 S   r,   r   r   r*   r   r   r    flush'  r.   z:HandlerTests.testPartialWrite.<locals>.PartialWriter.flushN)r$   r%   r&   rU  rV  r   rT  r   r    PartialWriter!  s    rW  r   r   z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   rD   rE   r   r   r1  r8   r_   )r   rW  r7   r  msgr   rT  r    testPartialWrite  s   	zHandlerTests.testPartialWritec              	      s   ddi}t ttfD ]9 | j d) G  fddd}t }tt | ||}|t | 	|
  W d    n1 s=w   Y  q	d S )Nr   r   	exceptionc                          e Zd Z fddZdS )zEHandlerTests.testClientConnectionTerminations.<locals>.AbortingWriterc                        r   r   r   rR  r[  r   r    rU  @  r.   zKHandlerTests.testClientConnectionTerminations.<locals>.AbortingWriter.writeNr$   r%   r&   rU  r   r[  r   r    AbortingWriter?      ra  )ConnectionAbortedErrorBrokenPipeErrorConnectionResetErrorry   r   r   r   r1  r8   r   rF   )r   r7   ra  rE   r  r   r[  r     testClientConnectionTerminations7  s   
z-HandlerTests.testClientConnectionTerminationsc                    s   G dd dt  G  fddd}t }ddi}tt | ||}|t | d|  | |j	 | |j
 | |j | |j d S )Nc                   @   r   )zKHandlerTests.testDontResetInternalStateOnException.<locals>.CustomExceptionNr   r   r   r   r    CustomExceptionJ  r   rg  c                       r]  )zJHandlerTests.testDontResetInternalStateOnException.<locals>.AbortingWriterc                    r^  r   r   r_  rg  r   r    rU  R  r.   zPHandlerTests.testDontResetInternalStateOnException.<locals>.AbortingWriter.writeNr`  r   rh  r   r    ra  Q  rb  ra  r   r   )
ValueErrorr   r   r   r1  r8   r%  rF   ZassertIsNotNoneresultZheadersrw   r7   )r   ra  rE   r7   r  r   rh  r    %testDontResetInternalStateOnExceptionI  s   
z2HandlerTests.testDontResetInternalStateOnExceptionN)r$   r%   r&   ZmaxDiffr$  r&  r'  r+  r3  r<  rA  rF  rG  rO  rZ  rf  rk  r   r   r   r    r  (  s    62+r  __main__)7Zunittestr   r  r   Ztest.supportr   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   Zhttp.clientr   ior   r   r   socketserverr   platformr   r  rC  r   rD   r   r   r'   r8   r@   rM   rZ   r[   r   r   r  r  r  r$   mainr   r   r   r    <module>   sT    
% 9 +7  =