
    <eKu                     6   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e          Z( G d de          Z)d Z*d Z+e*dfdZ,d Z- G d de          Z. G d de          Z/ G d d e          Z0 G d! d"e          Z1 G d# d$e1          Z2 G d% d&e          Z3e4d'k    r e j5                     dS dS )(    )mock)support)socket_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Zd Zd ZdS )
MockServerzNon-socket HTTP serverc                 Z    t          j        | ||           |                                  d S N)r   __init__server_bind)selfserver_addressRequestHandlerClasss      (/usr/lib/python3.11/test/test_wsgiref.pyr   zMockServer.__init__   s0    D.2EFFF    c                 ^    | j         \  }}|| _        || _        |                                  d S r   )r   server_nameserver_portsetup_environ)r   hostports      r!   r   zMockServer.server_bind!   s6    (
dr"   N)__name__
__module____qualname____doc__r   r    r"   r!   r   r      s8                r"   r   c                       e Zd ZdZd Zd ZdS )MockHandlerzNon-socket HTTP handlerc                 F    | j         | _        | j        \  | _        | _        d S r   )request
connectionrfilewfiler   s    r!   setupzMockHandler.setup*   s    ,!%
DJJJr"   c                     d S r   r-   r5   s    r!   finishzMockHandler.finish.   s    r"   N)r)   r*   r+   r,   r6   r8   r-   r"   r!   r/   r/   (   s8        !!1 1 1    r"   r/   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-   environstart_responses     r!   	hello_apprC   2   s.    N8%0    r"   c                      |dddg           d                     | d         | d         | d         g                              d          gS )	Nr:   r;   r=   ;HTTP_X_TEST_HEADERQUERY_STRING	PATH_INFO
iso-8859-1)joinencoder@   s     r!   
header_apprL   :   sl    N8&1    HH$%w~'>   vl r"   s   GET / HTTP/1.0

c                    t          dd| t          t                    }t          t	          |                    }t	                      }t
          j        }t                      x}t
          _        	 |                    ||fd           |t
          _        n# |t
          _        w xY w|	                                |	                                fS )N P   )	127.0.0.1i"  )
r   r   r/   r   r   sysstderrr   finish_requestgetvalue)appdataserverinpoutolderrerrs          r!   	run_amockr\   E   s    Rj+>>F

'
'C
))CZFzz!C#*sCj*<===

V
<<>>3<<>>))s   /B B"c                      |             }t          |          |urt          |D ]}t          |          |k    st          	 t          |           t          d|          # t          $ r Y dS w xY w)zUtility to compare a generic iterator with an iterable

    This tests the iterator using iter()/next().
    'make_it' must be a function returning a fresh
    iterator to be tested (since this may test the iterator twice).zToo many items from .__next__()N)iterAssertionErrornextStopIteration)make_itmatchititems       r!   compare_generic_iterrf   T   s     
B88r>> ! !Bxx4    DR >CCC    s   A" "
A0/A0c                   R    e Zd ZddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd ZdS )IntegrationTestsTc                     t                      dz   t          j                                        d         z   }|                     |d|z   dz   |rdpdz   dz                       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
rN   z
Hello, world!rI   )r   rQ   versionsplitassertEqualrK   )r   rY   
has_lengthpyvers       r!   check_hellozIntegrationTests.check_hellok   s    &((3.!!##A&'&(-.066 55;	=
 $VL11	
 	
 	
 	
 	
r"   c                 R    t                      \  }}|                     |           d S r   )r\   rp   r   rY   r[   s      r!   test_plain_helloz!IntegrationTests.test_plain_hellox   s)    ;;Sr"   c                     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\   rL   rm   
splitlines)r   r1   rY   r[   s       r!   test_environzIntegrationTests.test_environ|   sX    % 	 Z11SNNR :	
 	
 	
 	
 	
r"   c                     t          dddz  z   dz             \  }}|                     |                                d         d           d S )Ns   GET    xi  s    HTTP/1.0

rV   r   s!   HTTP/1.0 414 Request-URI Too Long)r\   rm   rv   rr   s      r!   test_request_lengthz$IntegrationTests.test_request_length   s[    'TE\":=M"MNNNS))!,=	? 	? 	? 	? 	?r"   c                 |    t          t          t                              \  }}|                     |d           d S )NF)rn   )r\   r   rC   rp   rr   s      r!   test_validated_helloz%IntegrationTests.test_validated_hello   s:    Yy1122S/////r"   c                     d }t          t          |                    \  }}|                     |                    d                     |                     |                                d         d           d S )Nc                       |dd           dgS )Nr:   r;   zHello, world!r-   r@   s     r!   bad_appz>IntegrationTests.test_simple_validation_error.<locals>.bad_app   s    N8%BCCC#$$r"   ;   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endswithrm   rv   r   r   rY   r[   s       r!   test_simple_validation_errorz-IntegrationTests.test_simple_validation_error   s    	% 	% 	% Yw//00SJ
 
 	 	 	 	NNR 0	
 	
 	
 	
 	
r"   c                 b   d }g d}|D ]\  }}|                      |          5  t           ||                    \  }}|                     |                    d                     |                     |                                d         |           d d d            n# 1 swxY w Y   d S )Nc                       fd}|S )Nc                 $     |dg           dgS )Nr<   ztext/plain; charset=utf-8r?   r-   )rA   rB   statuss     r!   r   zWIntegrationTests.test_status_validation_errors.<locals>.create_bad_app.<locals>.bad_app   s"    v(U'VWWW())r"   r-   )r   r   s   ` r!   create_bad_appzFIntegrationTests.test_status_validation_errors.<locals>.create_bad_app   s#    * * * * * Nr"   ))200z4AssertionError: Status must be at least 4 characters)z20X OKz8AssertionError: Status message must begin w/3-digit code)200OKz;AssertionError: Status message must have a space after code)r   r   r   )subTestr\   r   r   rm   rv   )r   r   testsr   exc_messagerY   r[   s          r!   test_status_validation_errorsz.IntegrationTests.test_status_validation_errors   s,   	 	 	
 
 
 $) 	D 	DFKV,, D D$^^F%;%;<<SR! !      !1!1"!5{CCCD D D D D D D D D D D D D D D	D 	Ds   A2B##B'	*B'	c                     d }t          t          |                    \  }}|                     |                    d                     |                     |                                d         d           d S )Nc                 V    | d                                            |ddg           dgS )N
wsgi.inputr:   r      data)readess     r!   r   z1IntegrationTests.test_wsgi_input.<locals>.bad_app   s6    lO  """AhFGHHH9r"   r   r   r_   r   r   s       r!   test_wsgi_inputz IntegrationTests.test_wsgi_input   s    	 	 	 Yw//00SJ
 
 	 	 	 	NNR "2	
 	
 	
 	
 	
r"   c                    d }t          t          |                    \  }}|                     |                    d                     t          j                                        d                             d          }t                                          d          }|dz   |z   }| 	                    d|z   dz   |           d S )Nc                 $     |dddg           dgS )Nr:   r   r>   zWed, 24 Dec 2008 13:29:32 GMTr   r-   r   s     r!   rU   z3IntegrationTests.test_bytes_validation.<locals>.app   s-    Ah=9    9r"   z"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   rQ   rk   rl   rK   r   rm   )r   rU   rY   r[   verpyro   s          r!   test_bytes_validationz&IntegrationTests.test_bytes_validation   s    	 	 	 Ys^^,,S%?@@AAAk!!!$++G44#%%,,W55T	C+,125 	 	 	 	 	r"   c                     d }t          t          |          d          \  }}|                     dt          j        ddddg|                                           d S )	Nc                 V     |dddg           | d                              d          gS )Nr:   r;   r   rH   latin1rK   r   s     r!   rU   z-IntegrationTests.test_cp1252_url.<locals>.app   s@    Ah.9    kN))(3344r"   s   GET /%80 HTTP/1.0rz   s   HTTP/1.0 200 OKs   Content-Type: text/plains#   Date: Wed, 24 Dec 2008 13:29:32 GMTr"   s   /)r\   r   rm   r   ANYrv   )r   rU   rY   r[   s       r!   test_cp1252_urlz IntegrationTests.test_cp1252_url   s    	5 	5 	5 cNN!9; ; ;S"+6 NN		 		 		 		 		r"   c                   	
 t          j        t          d          	d } G d dt          t                    }t          t          j        d||          |                     j	                   t          j                    fd}t          j        t          j        |          }|                     t          j        t          j        |           d 
t          j                    	
fd}t          j        |	          }|                                                                  |                                 |                     
t           j        d
z
             d S )Npthread_killc                 :     |dg            dt           j        z  gS )Nr:       )r   SOCK_MAX_SIZEr@   s     r!   rU   z4IntegrationTests.test_interrupted_write.<locals>.app   s%    N8R(((G1122r"   c                       e Zd ZdS )<IntegrationTests.test_interrupted_write.<locals>.WsgiHandlerNr)   r*   r+   r-   r"   r!   WsgiHandlerr              Dr"   r   r   )handler_classc                 0                                      d S r   )set)signumframeinterrupteds     r!   signal_handlerz?IntegrationTests.test_interrupted_write.<locals>.signal_handler   s    OOr"   c                     t          j         } |                     dd           |                                 5 }|                    d           	  t
          j                                       t          d                    rn;t          |                                          d d d            n# 1 swxY w Y   | 
                                 d S )NGETrj   d   T   )timeout)r   r   r1   getresponser   signalSIGUSR1waitfloatlenclose)httpresponser   main_threadr   receivedrW   s     r!   
run_clientz;IntegrationTests.test_interrupted_write.<locals>.run_client  s   !6#89DLL$$$!!## 0xc""" Lfn==="''a'99 
 x}}//0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 JJLLLLLs   A3B99B= B=)targetr   )r   get_attributer   r   r   r   r   HOST
addCleanupserver_close	threadingEventr   	get_identThreadstarthandle_requestrJ   rm   r   )r   rU   r   r   originalr   
backgroundr   r   r   r   rW   s          @@@@@r!   test_interrupted_writez'IntegrationTests.test_interrupted_write   s    ,V^DD	3 	3 	3	 	 	 	 	-/A 	 	 	 ]/C{SSS+,,,o''	 	 	 	 	 =@@v~x@@@)++	 	 	 	 	 	 	 	 	$ %Z888
7#83#>?????r"   N)T)r)   r*   r+   rp   rs   rw   r{   r}   r   r   r   r   r   r   r-   r"   r!   rh   rh   i   s        
 
 
 
  
 
 
? ? ?
0 0 0

 
 
D D D*
 
 
  *  ./@ /@ /@ /@ /@r"   rh   c                   l    e Zd Zd ZddZd Zd ZddZd Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd ZdS )UtilityTestsc                     ||d}t          j        |           |                     t          j        |          |           |                     |d         |           |                     |d         |           |S )NSCRIPT_NAMErH   rH   r   )r   r   rm   shift_path_info)r   sn_inpi_inpartsn_outpi_outenvs          r!   
checkShiftzUtilityTests.checkShift#  s|    "u55#C(((-c224888[)&111]+F333
r"   Nc                    i }t          j        |           t          |t                    r"|                     ||         t                     nSt          |t
                    r"|                     ||         t
                     n|                     ||         |           ||i}t          j        |           |                     ||         |           d S r   )r   r   
isinstancer   assertIsInstancer   rm   assertIs)r   keyvaluealtr   s        r!   checkDefaultzUtilityTests.checkDefault+  s    #C(((eX&& 	.!!#c(H5555g&& 	.!!#c(73333SXu--- 3i#C(((c#h$$$$$r"   c                 f    t          j        |           |                     ||         |           d S r   )r   r   rm   )r   r   r   kws       r!   checkCrossDefaultzUtilityTests.checkCrossDefault;  s3    #B'''C'''''r"   c                 ~    t          j        |           |                     t          j        |          |           d S r   )r   r   rm   application_uri)r   urir   s      r!   checkAppURIzUtilityTests.checkAppURI?  s:    #B'''-b11#66666r"   r   c                     t          j        |           |                     t          j        ||          |           d S r   )r   r   rm   request_uri)r   r   queryr   s       r!   checkReqURIzUtilityTests.checkReqURIC  s<    #B''')"U33C88888r"   c                 2   ||fd}t          ||            |            }|                     |j        j                   |D ]}|                     |j        j                   |                                 |                     |j        j                   d S )Nc                 F    t          j        t          |           |          S r   )r   FileWrapperr   )textsizes     r!   rb   z%UtilityTests.checkFW.<locals>.make_itI  s    #HTNN4888r"   )rf   assertFalsefilelikeclosedr   r   )r   r   r   rc   rb   rd   re   s          r!   checkFWzUtilityTests.checkFWG  s    4 	9 	9 	9 	9 	WU+++WYY+,,, 	 	D+,,,



*+++++r"   c                     |                      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 )
NrN   rj   z/xx/az/x/yz/a/x/yz/x/r   r5   s    r!   testSimpleShiftszUtilityTests.testSimpleShiftsY  s    3C,,,4dB///Bc2...VS&$777US&#66666r"   c                 ,   |                      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  rN   z//yyz/a/b/yz//y/rj   z/./yz/./y/z///./..//y/.//z/y/z///z/a/b/z/.//z/x//r  z/a/b/xz/.r  r5   s    r!   testNormalizedShiftsz!UtilityTests.testNormalizedShifts`  s'   tT:::GT2t444sHb999Xs;;;Xr:::h<<< 0$eDDDr7B777GR888Xs;;;dFB77777r"   c                     ddddddddd	d
ddt                      fdt                      fdfD ]\  }}|                     ||           d S )N)SERVER_NAMErP   )SERVER_PORT80)SERVER_PROTOCOLHTTP/1.0)	HTTP_HOSTrP   )REQUEST_METHODr   )r   rN   )rH   rj   )wsgi.versionr   r   )wsgi.run_oncer   )wsgi.multithreadr   )wsgi.multiprocessr   r   wsgi.errors)wsgi.url_schemer   )r   r   r   )r   r   r   s      r!   testDefaultszUtilityTests.testDefaultsm  sx    '!*%$# #$799%HJJ'&
 	) 	)JC  c%((((!	) 	)r"   c                 V   |                      ddd           |                      ddd           |                      ddd           |                      ddd	           |                      dd
d           |                      ddd           |                      ddd           d S )Nr  zfoo.barr  r  httpsonHTTPS1yesr   foor  r  443)r   r5   s    r!   testCrossDefaultszUtilityTests.testCrossDefaults  s    {9KKK0tDDD0sCCC0uEEE0eDDD}T>>>}U>>>>>r"   c                    |                      t          j        i           d           |                      t          j        ddi          d           |                      t          j        ddi          d           |                      t          j        ddi          d           |                      t          j        ddi          d           d S )Nr   r"  r%  r   r  r$  r#  )rm   r   guess_schemer5   s    r!   testGuessSchemezUtilityTests.testGuessScheme  s    *2..777*GE?;;VDDD*GD>::GDDD*GE?;;WEEE*GC=997CCCCCr"   c                 x   |                      d           |                      dd           |                      dd           |                      ddd	
           |                      dd           |                      ddd           |                      d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:20712071)r  r  zhttp://spam.example.com/zspam.example.comr  rP   )r  r  zhttps://127.0.0.1/r   r!  zhttp://127.0.0.1:8000/8000)r  r  )r   r5   s    r!   testAppURIszUtilityTests.testAppURIs  s   ,---0gFFF2
KKK8-6 	 	C 	C 	C3* 	 	, 	, 	,,!/A 	 	C 	C 	C-T:::1v 	 	 	 	 	 	r"   c                    |                      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 )Nr,  r-  r.  r/  r0  r1  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   rH   rG   z'http://127.0.0.1/spammity/spam?s%E4y=nizs%E4y=nir   )r   r5   s    r!   testReqURIszUtilityTests.testReqURIs  so   ,---0gFFF2
KKK9#w 	 	8 	8 	8;#z 	 	; 	; 	;=#{ 	 	< 	< 	<J#/G 	 	I 	I 	I@#wH 	 	N 	N 	NB#wJ 	 	P 	P 	P91#wH 	 	N 	N 	N 	N 	Nr"   c                 8    |                      ddddg           d S )Nږxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzx   xxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz)r  r5   s    r!   testFileWrapperzUtilityTests.testFileWrapper  s#    XsXh$788888r"   c                    d                                 D ]h}||                                |                                |                                fD ])}|                     t          j        |                     *id                                 D ]h}||                                |                                |                                fD ])}|                     t          j        |                     *id S )NzbConnection Keep-Alive Proxy-Authenticate Proxy-Authorization TE Trailers Transfer-Encoding Upgradez4Accept Cache-Control Date Pragma Trailer Via Warning)rl   titleupperlowerr   r   is_hop_by_hopr   )r   hopr   s      r!   testHopByHopzUtilityTests.testHopByHop  s    4
%''	9 	9C CIIKKciikkA 9 9 23 7 788889
 C
%''	: 	:C CIIKKciikkA : :  !3C!8!89999:	: 	:r"   r   )r   )r)   r*   r+   r   r   r   r   r   r  r	  r  r  r'  r*  r4  r6  r<  rC  r-   r"   r!   r   r   !  s         % % % % ( ( (7 7 79 9 9 9, , ,$7 7 78 8 8) ) )&? ? ?D D D  N N N&9 9 9: : : : :r"   r   c                        e Zd Zd Zd Zd ZdS )HeaderTestsc           	         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 ]z}|                      |d                     |                      |d                     |                      |d	                     |                      |d                     {|                      |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FooFOObazwheezoo)rm   r   r	   keysvaluesitemsassertIsNot__contains__getget_all__getitem__r   r   
setdefault)r   testhms       r!   testMappingInterfacez HeaderTests.testMappingInterface  s   {WYY+++WR[[))!,,,WT!!!W--..q111aaa))..003%888aaa))0022SE:::aaa))//114888,,..555IIeH%	1=@ 	' 	'AOOAAeHH%%%OOAAeHH%%%OOAAeHH%%%QQuXX&&&&5%(((%5%(((5))5'222uV,,e444uV,,f555eF33U;;;eF33V<<<5%(((5&)))))r"   c                 H    |                      t          t          d           d S )Nr%  )assertRaises	TypeErrorr	   r5   s    r!   testRequireListzHeaderTests.testRequireList  s     )We44444r"   c                    t                      }|                     t          |          d           |                    ddd           |                     |d         d           |                     t          |          d           |                    ddd 	           |                     |                    d          dd
g           |                     t          |          d           d S )Nz
r%  rG  spam)rJ  zbar; baz="spam"zfoo: bar; baz="spam"

rH  )cheesezbar; cheesez*foo: bar; baz="spam"
Foo: bar; cheese

)r	   rm   str
add_headerrS  r   rW  s     r!   
testExtraszHeaderTests.testExtras  s    IIQ'''	U5V,,,5#4555Q >???	U5---5)).	0 	0 	0 	Q	
 	
 	
 	
 	
r"   N)r)   r*   r+   rY  r]  rd  r-   r"   r!   rE  rE    sB        * * *@5 5 5
 
 
 
 
r"   rE  c                   \    e Zd ZdZ eej                                                  Zd Z	dS )ErrorHandlerz/Simple handler subclass for testing BaseHandlerc           	          t          |           t          j        | t                      t                      t	                      |dd           d S )NT)multithreadmultiprocess)r   r   r   r   r   )r   r   s     r!   r   zErrorHandler.__init__  sP    r"""'))WYY

B4	
 	
 	
 	
 	
 	
r"   N)
r)   r*   r+   r,   dictosrA   rO  
os_environr   r-   r"   r!   rf  rf    sH        99
 bj&&(())J
 
 
 
 
r"   rf  c                       e Zd ZdZd ZdS )TestHandlerzASimple handler subclass for testing BaseHandler, w/error passthruc                       r   r-   r5   s    r!   handle_errorzTestHandler.handle_error  s    r"   N)r)   r*   r+   r,   rp  r-   r"   r!   rn  rn  	  s)        KK    r"   rn  c                   `    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd ZdS )HandlerTestsi  c                 x   dddddd}t          j        t          d|          5  t          dd	
          }|                                 d d d            n# 1 swxY w Y   dD ]7}|                     t          |d|z             |j        d|z                       8i }t          |           |                                D ]\  }}||vr|||<   |	                    dd	dd|
                                |                                dddddt          j        d           |                     |j        |           d S )Nz/my/homez/my/pathzfr_FR.UTF-8test_script_nametest_server_name)HOMEPATHLANGr   r  rl  Yz/override/home)Xrv  )rk   rh  ri  run_oncefile_wrapperwsgi_zwsgi.rN   rP   r  Fr   T)rz  rv  r   r  r   r  r  r  r  r  r  zwsgi.file_wrapper)r   	swap_attrrn  r&   rm   getattrrA   r   rO  update	get_stdin
get_stderrr   r   assertDictEqual)r   rl  handlerattrexpectedr   r   s          r!   testEnvironzHandlerTests.testEnviron  s    ! .-	
 	

 {L*EE 	$ 	$!C.>???G!!###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$% 	> 	>DWWgn==$_Wt^<> > > > x((( %**,, 	& 	&JC("" %$ & "++--"--//""% $!%!%!1%
 
 	 	 	( 	W_h77777s   &AAAc                     t          d d d i           }|                                 dD ]}|                     ||j                   d S )N)r  r   r  )r   r&   assertInrA   )r   rW  r   s      r!   testCGIEnvironzHandlerTests.testCGIEnvironJ  sW    4T"--	A 	* 	*CMM#qy))))	* 	*r"   c                    t          d          }|                                 |                     |j        d         d           t                      }|                                 |                     |j        d         d           d S )Nr   r!  r  r  r   )rn  r&   rm   rA   rc  s     r!   
testSchemezHandlerTests.testSchemeP  s{    
D
!
!
!1??#4#4#4#45g>>>
--***#45f=====r"   c                     t                      }dD ]+}|                     t          t          ||                     ,|                     t          |j        d           d S )N)_flushr  r  add_cgi_varsrV  )r
   r[  NotImplementedErrorr  _write)r   rW  names      r!   testAbstractMethodsz HandlerTests.testAbstractMethodsV  sc    MM
 	D 	DD 171T??CCCC-qx@@@@@r"   c                    d }d }d }d }t                      }|                    |           |                     |j                                        d                    d                     t                      }|                    |           |                     |j                                        d                    d                     t                      }|                    |           |                     |j                                        d           t                      }|                    |           |                     |j                                        d	           d S )
Nc                 R     |dg            | d                              d          gS Nr:   r  rI   r   r   s     r!   trivial_app1z4HandlerTests.testContentLength.<locals>.trivial_app1a  s.    AhrNNN'(//==>>r"   c                 b      |dg           | d                              d                     g S r  r   r   s     r!   trivial_app2z4HandlerTests.testContentLength.<locals>.trivial_app2e  s5    AAhrNN1./66|DDEEEIr"   c                 F     |dg            d                     d          gS )Nr:   u   тестzutf-8r   r   s     r!   trivial_app3z4HandlerTests.testContentLength.<locals>.trivial_app3i  s(    AhrNNN.55g>>??r"   c                       |ddg           g S )Nr:   )zContent-Length12345r-   r   s     r!   trivial_app4z4HandlerTests.testContentLength.<locals>.trivial_app4m  s    Ah34555Ir"   z)Status: 200 OK
Content-Length: 4

httprI   zStatus: 200 OK

https-   Status: 200 OK
Content-Length: 8

тестs)   Status: 200 OK
Content-Length: 12345

)rn  runrm   stdoutrT   rK   )r   r  r  r  r  rW  s         r!   testContentLengthzHandlerTests.testContentLength^  s   	? 	? 	?	 	 		@ 	@ 	@	 	 	
 MM	l**,, F<((		* 	* 	* MM	l**,,F<((	* 	* 	*
 MM	l**,,0	1 	1 	1 MM	l**,,	 	 	 	 	r"   c                    d }d }t                      }|                    |           |                     |j                                        d                    d                     |                     |j                                        d           t                      }|                    |           |                     |j                                        d|j        t          |j	                  fz                      d          |j	        z              | 
                    d|j                                                   d S )Nc                      |dg            g S Nr:   r-   r   s     r!   non_error_appz8HandlerTests.testBasicErrorOutput.<locals>.non_error_app      AhrNNNIr"   c                      t          d          )N This should be caught by handlerr_   r   s     r!   	error_appz4HandlerTests.testBasicErrorOutput.<locals>.error_app  s     !CDDDr"   %Status: 200 OK
Content-Length: 0

rI   rN   z<Status: %s
Content-Type: text/plain
Content-Length: %d

r_   )rf  r  rm   r  rT   rK   rR   error_statusr   
error_bodyr  )r   r  r  rW  s       r!   testBasicErrorOutputz!HandlerTests.testBasicErrorOutput  sH   	 	 		E 	E 	E NN	m**,,F<((	* 	* 	* 	**,,R000NN	i**,, nS%6%678 :@9M9Ml		 	 	 	&(9(9(;(;<<<<<r"   c                 <   dfd}t                      }|                    |           |                     |j                                        d                    d          z              |                     d|j                                                   d S )N   Some output has been sentc                 L      |dg                      t          d          )Nr:   r  r  )r   r   MSGs     r!   r  z4HandlerTests.testErrorAfterOutput.<locals>.error_app  s,    AAhrNN3 !CDDDr"   zStatus: 200 OK

rI   r_   )rf  r  rm   r  rT   rK   r  rR   )r   r  rW  r  s      @r!   testErrorAfterOutputz!HandlerTests.testErrorAfterOutput  s    *	E 	E 	E 	E 	E NN	i**,,6,'',	. 	. 	. 	&(9(9(;(;<<<<<r"   c           
      2   d }d}d                     d          }dD ]x}|rd|z  pd}dD ]h}d	D ]a}t          |
          }d|_        ||_        ||_        |                    |           |                     ||j                                                   t          |
          }d|_        ||_        ||_        |                    |           |dk    r.|                     |j                                        d           | 	                    t          j        |||fz                       d          |j                                                  |||fz                       d          |j                                        f           cjzd S )Nc                      |dg            g S r  r-   r   s     r!   r  z5HandlerTests.testHeaderFormats.<locals>.non_error_app  r  r"   zfHTTP/%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  rI   )z
FooBar/1.0NzServer: %s
rN   )z1.0z1.1)HTTP/0.9r  zHTTP/1.1)r  FTr  r"   )rK   rn  origin_serverhttp_versionserver_softwarer  rm   r  rT   r   rerc   )	r   r  stdpatshortpatsswswrk   protorW  s	            r!   testHeaderFormatszHandlerTests.testHeaderFormats  s   	 	 	
3 	 @
&

 	 & 	 	C/)C/52B'  ?  E#E:::A&+AO%,AN(+A%EE-((($$Xah.?.?.A.ABBB#E:::A&*AO%,AN(+A%EE-(((j(((():):)<)<SAAAAHfgb\&9%A%A,%O%O ! 1 1 3 35 5$gb\199,GG ! 1 1 3 35   #	 	r"   c                     d }t                      }|                    |           |                     d|j                                                   d S )Nc                 "     |ddg           dgS )Nr:   r   r   r-   r   s     r!   rU   z'HandlerTests.testBytesData.<locals>.app  s*    Ah=    9r"   sR   Status: 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 4

data)rn  r  rm   r  rT   )r   rU   rW  s      r!   testBytesDatazHandlerTests.testBytesData  se    	 	 	 MM	c


 
 H	! 	! 	! 	! 	!r"   c                     ddidfd}t                      }|                    |           |                     d         d           d S )Nclose_calledFr  c                 l      |dg                       G fddt                     } |            S )Nr:   c                        e Zd Zd Z fdZdS )HHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterablec              3   .   K   	 dV  t          d          )NTs   blahr  r  r5   s    r!   __iter__zQHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterable.__iter__  s$      Q%,-OPPPr"   c                     dd<   d S )NTr  r-   )r   side_effectss    r!   r   zNHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterable.close  s    37L000r"   N)r)   r*   r+   r  r   )r  s   r!   CrashyIterabler    s@        Q Q Q8 8 8 8 8 8 8r"   r  )object)r   r   r  r  r  s      r!   r  z0HandlerTests.testCloseOnError.<locals>.error_app  sa    AAhrNN38 8 8 8 8 8 8 8 8 8 ">###r"   T)rf  r  rm   )r   r  rW  r  r  s      @@r!   testCloseOnErrorzHandlerTests.testCloseOnError  so    &.*		$ 		$ 		$ 		$ 		$ 		$ NN	in5t<<<<<r"   c                 t   t                       G fdd          }ddi}t          t                       |            t          j        |          }d}|                     t          |          5  |                    t                     d d d            n# 1 swxY w Y   | 	                    d           d S )Nc                        e Zd Z fdZd ZdS )4HandlerTests.testPartialWrite.<locals>.PartialWriterc                 `    |d d         }                     |           t          |          S )N   )extendr   )r   bpartialwrittens      r!   writez:HandlerTests.testPartialWrite.<locals>.PartialWriter.write
  s.    BQB%w'''7||#r"   c                     d S r   r-   r5   s    r!   flushz:HandlerTests.testPartialWrite.<locals>.PartialWriter.flush  s    r"   N)r)   r*   r+   r  r  )r  s   r!   PartialWriterr  	  s=        $ $ $ $ $
    r"   r  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   rQ   rR   assertWarnsRegexDeprecationWarningr  rC   rm   )r   r  rA   rW  msgr  s        @r!   testPartialWritezHandlerTests.testPartialWrite  s   ++	 	 	 	 	 	 	 	 	 	 %j1'))]]__cj'JJ,""#5s;; 	 	EE)	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  	 	 	 	 	s   0BBBc                    ddi}t           t          t          fD ]|                               5   G fdd          }t	                      }t          t                       |            ||          }|                    t                     | 	                    |
                                           d d d            n# 1 swxY w Y   d S )Nr  r  	exceptionc                       e Zd Z fdZdS )EHandlerTests.testClientConnectionTerminations.<locals>.AbortingWriterc                     r   r-   )r   r  r  s     r!   r  zKHandlerTests.testClientConnectionTerminations.<locals>.AbortingWriter.write(  s    'r"   Nr)   r*   r+   r  r  s   r!   AbortingWriterr  '  s.        ( ( ( ( ( ( (r"   r  )ConnectionAbortedErrorBrokenPipeErrorConnectionResetErrorr   r   r   r   r  rC   r   rT   )r   rA   r  rR   rW  r  s        @r!    testClientConnectionTerminationsz-HandlerTests.testClientConnectionTerminations  s)   $j1" 
 	4 	4I
 	22 	4 	4( ( ( ( ( ( ( ( ( ( "!'))^^-=-=vwOOi     !2!2333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4	4 	4s   BCC	
C	c                     G d dt                      G fdd          }t                      }ddi}t          t                       |            ||          }|                    t
                     |                     d|                                           |                     |j	                   |                     |j
                   |                     |j                   |                     |j                   d S )Nc                       e Zd ZdS )KHandlerTests.testDontResetInternalStateOnException.<locals>.CustomExceptionNr   r-   r"   r!   CustomExceptionr  2  r   r"   r  c                       e Zd Z fdZdS )JHandlerTests.testDontResetInternalStateOnException.<locals>.AbortingWriterc                     r   r-   )r   r  r  s     r!   r  zPHandlerTests.testDontResetInternalStateOnException.<locals>.AbortingWriter.write:  s	    %%r"   Nr  )r  s   r!   r  r  9  s.        & & & & & & &r"   r  r  r  )
ValueErrorr   r   r   r  rC   r  rT   assertIsNotNoneresultheadersr   rA   )r   r  rR   rA   rW  r  s        @r!   %testDontResetInternalStateOnExceptionz2HandlerTests.testDontResetInternalStateOnException1  s$   	 	 	 	 	j 	 	 		& 	& 	& 	& 	& 	& 	& 	& 	& 	& $j1'))^^%5%5vwGG	i'):):;;; 	QX&&&QY'''QX&&&QY'''''r"   N)r)   r*   r+   maxDiffr  r  r  r  r  r  r  r  r  r  r  r  r  r-   r"   r!   rr  rr    s        G48 48 48l* * *> > >A A A0 0 0d= = =8= = =) ) )V! ! ! = = =$  24 4 4$( ( ( ( (r"   rr  __main__)6unittestr   rV  r   test.supportr   test.test_httpserversr   r   wsgiref.utilr   wsgiref.headersr	   wsgiref.handlersr
   r   r   wsgirefr   wsgiref.validater   wsgiref.simple_serverr   r   r   http.clientr   ior   r   r   socketserverr   platformr   rk  r  r   rQ   r   r   r/   rC   rL   r\   rf   rh   r   rE  rf  rn  rr  r)   mainr-   r"   r!   <module>r
     sc               & & & & & & 5 5 5 5 5 5       / / / / / / # # # # # # G G G G G G G G G G       & & & & & & @ @ @ @ @ @ @ @ - - - - - - & & & & & & 0 0 0 0 0 0 0 0 0 0 # # # # # # * * * * * * 				 				  



                $        "7 * * * *D D D*u@ u@ u@ u@ u@x u@ u@ u@p`: `: `: `: `:8 `: `: `:D5
 5
 5
 5
 5
( 5
 5
 5
n
 
 
 
 
> 
 
 
    ,   x( x( x( x( x(8 x( x( x(v	 zHMOOOOO r"   