
    0hhCu                        S SK Jr  S SKJr  S SKJr  S SKJr  S SK Jr  S SK	J
r
  S SKJr  S SKJrJrJr  S S	KJr  S S
KJr  S SKJrJr  S SKJr  S SKJr  S SKJrJrJr  S SKJ r   S SK!J"r"  S SK#r#S SK$r$S SK%r%S SK&r&S SK'r'S SK r  " S S\5      r( " S S\5      r)S r*S r+\*S4S jr,S r- " S S\5      r. " S S\5      r/ " S S \5      r0 " S! S"\5      r1 " S# S$\15      r2 " S% S&\5      r3\4S':X  a  \ Rj                  " 5         gg)(    )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                   $    \ rS rSrSrS rS rSrg)
MockServer   zNon-socket HTTP serverc                 R    [         R                  " XU5        U R                  5         g N)r   __init__server_bind)selfserver_addressRequestHandlerClasss      :/opt/python-3.13.8/usr/lib/python3.13/test/test_wsgiref.pyr   MockServer.__init__   s    D2EF    c                 X    U R                   u  pXl        X l        U R                  5         g r   )r    server_nameserver_portsetup_environ)r   hostports      r"   r   MockServer.server_bind!   s'    ((
r$   )r&   r'   N)__name__
__module____qualname____firstlineno____doc__r   r   __static_attributes__ r$   r"   r   r      s     r$   r   c                   $    \ rS rSrSrS rS rSrg)MockHandler(   zNon-socket HTTP handlerc                 X    U R                   U l        U R                  u  U l        U l        g r   )request
connectionrfilewfiler   s    r"   setupMockHandler.setup*   s    ,,!%
DJr$   c                     g r   r2   r;   s    r"   finishMockHandler.finish.   s    r$   )r8   r9   r:   N)r,   r-   r.   r/   r0   r<   r?   r1   r2   r$   r"   r4   r4   (   s    !1r$   r4   c                     U" SSS/5        S/$ )N200 OKContent-Typez
text/plainDatezMon, 05 Jun 2006 18:49:54 GMT   Hello, world!r2   environstart_responses     r"   	hello_apprK   2   s"    8%0  r$   c                 r    U" SSS/5        SR                  U S   U S   U S   /5      R                  S5      /$ )	NrB   rC   rE   ;HTTP_X_TEST_HEADERQUERY_STRING	PATH_INFO
iso-8859-1)joinencoderH   s     r"   
header_apprT   :   sX    8&1  HH$%w~'>  vl r$   s   GET / HTTP/1.0

c                 T   [        SSU [        [        5      n[        [	        U5      5      n[	        5       n[
        R                  n[        5       =n[
        l         UR                  X44S5        U[
        l        UR                  5       UR                  5       4$ ! U[
        l        f = f)N P   )	127.0.0.1i"  )
r   r   r4   r   r   sysstderrr   finish_requestgetvalue)appdataserverinpoutolderrerrs          r"   	run_amockrd   E   s    Rj+>F

'C
)CZZFz!C#*sj*<=
<<>3<<>)) 
s   B B'c                     U " 5       n[        U5      ULa  [        eU H  n[        U5      U:X  a  M  [        e    [        U5        [        SU5      e! [         a     gf = f)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_iterrn   T   si     
B8r>Bx4   DR >CC  s   A 
AAc                   Z    \ rS rSrSS jrS rS rS rS rS r	S r
S	 rS
 rS rS rSrg)IntegrationTestsi   c                     [        5       S-   [        R                  R                  5       S   -   nU R	                  USU-   S-   U=(       a    S=(       d    S-   S-   R                  S5      5        g )	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
rV   z
Hello, world!rQ   )r   rY   versionsplitassertEqualrS   )r   ra   
has_lengthpyvers       r"   check_helloIntegrationTests.check_hellok   s{    &(3.!!#A&'&(-.066 55;	=
 $VL1	
r$   c                 >    [        5       u  pU R                  U5        g r   )rd   ry   r   ra   rc   s      r"   test_plain_hello!IntegrationTests.test_plain_hellox   s    ;r$   c                 r    Sn[        [        U5      u  p#U R                  UR                  5       S   S5        g )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/)rd   rT   rv   
splitlines)r   r7   ra   rc   s       r"   test_environIntegrationTests.test_environ|   s<    % 	 Z1NNR :	
r$   c                 r    [        SSS-  -   S-   S9u  pU R                  UR                  5       S   S5        g )Ns   GET    xi  s    HTTP/1.0

r^   r   s   HTTP/1.0 414 URI Too Long)rd   rv   r   r|   s      r"   test_request_length$IntegrationTests.test_request_length   s<    'TE\":=M"MN)!,5	7r$   c                 X    [        [        [        5      5      u  pU R                  USS9  g )NF)rw   )rd   r   rK   ry   r|   s      r"   test_validated_hello%IntegrationTests.test_validated_hello   s&    Yy12/r$   c                     S n[        [        U5      5      u  p#U R                  UR                  S5      5        U R	                  UR                  5       S   S5        g )Nc                     U" SS5        S/$ )NrB   rC   zHello, world!r2   rH   s     r"   bad_app>IntegrationTests.test_simple_validation_error.<locals>.bad_app   s    8%BC#$$r$   ;   A server error occurred.  Please contact the administrator.z^AssertionError: Headers (('Content-Type', 'text/plain')) must be of type list: <class 'tuple'>rd   r   
assertTrueendswithrv   r   r   r   ra   rc   s       r"   test_simple_validation_error-IntegrationTests.test_simple_validation_error   sX    	% Yw/0J
 	 	NNR 0	
r$   c                 (   S n/ SQnU Hs  u  p4U R                  US9   [        U" U5      5      u  pVU R                  UR                  S5      5        U R	                  UR                  5       S   U5        S S S 5        Mu     g ! , (       d  f       M  = f)Nc                    ^  U 4S jnU$ )Nc                    > U" TS/5        S/$ )NrD   ztext/plain; charset=utf-8rG   r2   )rI   rJ   statuss     r"   r   WIntegrationTests.test_status_validation_errors.<locals>.create_bad_app.<locals>.bad_app   s    v(U'VW())r$   r2   )r   r   s   ` r"   create_bad_appFIntegrationTests.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   )subTestrd   r   r   rv   r   )r   r   testsr   exc_messagera   rc   s          r"   test_status_validation_errors.IntegrationTests.test_status_validation_errors   s    	
 $)FV,$^F%;<R!    !1"!5{C -, $),,s   AB
B	c                     S n[        [        U5      5      u  p#U R                  UR                  S5      5        U R	                  UR                  5       S   S5        g )Nc                 B    U S   R                  5         U" SS/5        S/$ )N
wsgi.inputrB   r      data)readess     r"   r   1IntegrationTests.test_wsgi_input.<locals>.bad_app   s(    lO  "hFGH9r$   r   r   rg   r   r   s       r"   test_wsgi_input IntegrationTests.test_wsgi_input   sV    	 Yw/0J
 	 	NNR "2	
r$   c                 H   S n[        [        U5      5      u  p#U R                  UR                  S5      5        [        R
                  R                  5       S   R                  S5      n[        5       R                  S5      nUS-   U-   nU R                  SU-   S-   U5        g )Nc                     U" SSS/5        S/$ )NrB   r   rF   zWed, 24 Dec 2008 13:29:32 GMTr   r2   r   s     r"   r]   3IntegrationTests.test_bytes_validation.<locals>.app   s!    h=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)
rd   r   r   r   rY   rt   ru   rS   r   rv   )r   r]   ra   rc   verpyrx   s          r"   test_bytes_validation&IntegrationTests.test_bytes_validation   s    	 Ys^,%?@Akk!!$++G4#%,,W5T	C+,125 	r$   c                     S n[        [        U5      SS9u  p#U R                  S[        R                  SSSS/UR                  5       5        g )	Nc                 B    U" SSS/5        U S   R                  S5      /$ )NrB   rC   r   rP   latin1rS   r   s     r"   r]   -IntegrationTests.test_cp1252_url.<locals>.app   s1    h.9  kN))(344r$   s   GET /%80 HTTP/1.0r   s   HTTP/1.0 200 OKs   Content-Type: text/plains#   Date: Wed, 24 Dec 2008 13:29:32 GMTr$   s   /)rd   r   rv   r   ANYr   )r   r]   ra   rc   s       r"   test_cp1252_url IntegrationTests.test_cp1252_url   sT    	5 cN!9;"+6 NN		r$   c                   ^^^	^
^ [         R                  " [        S5      m	S n " S S[        [        5      n[        [        R                  SXS9mU R                  TR                  5        [        R                  " 5       mU4S jn[        R                  " [        R                  U5      nU R                  [        R                  [        R                  U5        S m
[        R                  " 5       mUUU	U
U4S jn[        R                  " US	9nUR                  5         TR!                  5         UR#                  5         U R%                  T
[         R&                  S
-
  5        g )Npthread_killc                 <    U" S/ 5        S[         R                  -  /$ )NrB       )r   SOCK_MAX_SIZErH   s     r"   r]   4IntegrationTests.test_interrupted_write.<locals>.app   s     8R(G11122r$   c                       \ rS rSrSrg)<IntegrationTests.test_interrupted_write.<locals>.WsgiHandler   r2   Nr,   r-   r.   r/   r1   r2   r$   r"   WsgiHandlerr          r$   r   r   )handler_classc                 &   > TR                  5         g r   )set)signumframeinterrupteds     r"   signal_handler?IntegrationTests.test_interrupted_write.<locals>.signal_handler   s    OOr$   c                    > [        TR                  6 n U R                  SS5        U R                  5        nUR	                  S5         T" T[
        R                  5        TR                  [        S5      S9(       a  OM7  [        UR	                  5       5      mS S S 5        U R                  5         g ! , (       d  f       N= f)NGETrs   d      )timeout)r   r    r7   getresponser   signalSIGUSR1waitfloatlenclose)httpresponser   main_threadr   receivedr_   s     r"   
run_client;IntegrationTests.test_interrupted_write.<locals>.run_client  s    !6#8#89DLL$!!#xc"  fnn="''a'9 
 x}}/ $ JJL $#s   A#B22
C )targetr   )r   get_attributer   r   r   r   r   HOST
addCleanupserver_close	threadingEventr   	get_identThreadstarthandle_requestrR   rv   r   )r   r]   r   r   originalr   
backgroundr   r   r   r   r_   s          @@@@@r"   test_interrupted_write'IntegrationTests.test_interrupted_write   s     ,,V^D	3	-/A 	 ]//CS++,oo'	 ==@v~~x@))+	 	$ %%Z8
7#8#83#>?r$   r2   N)T)r,   r-   r.   r/   ry   r}   r   r   r   r   r   r   r   r   r   r1   r2   r$   r"   rp   rp   i   s;    

7
0

D*
*./@r$   rp   c                   v    \ rS rSrS rSS jrS rS rSS jrS r	S	 r
S
 rS rS rS rS rS rS rS rSrg)UtilityTestsi!  c                     XS.n[         R                  " U5        U R                  [         R                  " U5      U5        U R                  US   U5        U R                  US   U5        U$ )NSCRIPT_NAMErP   rP   r   )r   r   rv   shift_path_info)r   sn_inpi_inpartsn_outpi_outenvs          r"   
checkShiftUtilityTests.checkShift#  sb    "5##C(--c248[)&1]+F3
r$   Nc                 n   0 n[         R                  " U5        [        U[        5      (       a  U R	                  XA   [        5        OB[        U[
        5      (       a  U R	                  XA   [
        5        OU R                  XA   U5        X0n[         R                  " U5        U R                  XA   U5        g r   )r   r   
isinstancer   assertIsInstancer   rv   assertIs)r   keyvaluealtr  s        r"   checkDefaultUtilityTests.checkDefault+  s    ##C(eX&&!!#(H5g&&!!#(73SXu- i##C(ch$r$   c                 X    [         R                  " U5        U R                  X1   U5        g r   )r   r   rv   )r   r  r  kws       r"   checkCrossDefaultUtilityTests.checkCrossDefault;  s"    ##B''r$   c                 |    [         R                  " U5        U R                  [         R                  " U5      U5        g r   )r   r   rv   application_uri)r   urir  s      r"   checkAppURIUtilityTests.checkAppURI?  s+    ##B'--b1#6r$   c                 |    [         R                  " U5        U R                  [         R                  " X25      U5        g r   )r   r   rv   request_uri)r   r  queryr  s       r"   checkReqURIUtilityTests.checkReqURIC  s+    ##B'))"3C8r$   c                 D   X4S jn[        XC5        U" 5       nU R                  UR                  R                  5        U H  nM     U R                  UR                  R                  5        UR	                  5         U R                  UR                  R                  5        g )Nc                 B    [         R                  " [        U 5      U5      $ r   )r   FileWrapperr   )textsizes     r"   rj   %UtilityTests.checkFW.<locals>.make_itI  s    ##HTN488r$   )rn   assertFalsefilelikeclosedr   r   )r   r!  r"  rk   rj   rl   rm   s          r"   checkFWUtilityTests.checkFWG  sy     	9 	W+Y++,D  	++,

**+r$   c                     U R                  SSSSS5        U R                  SSSSS5        U R                  SSS SS5        U R                  SSSSS5        U R                  SS	SSS5        g )
NrV   rs   z/xx/az/x/yz/a/x/yz/x/r  r;   s    r"   testSimpleShiftsUtilityTests.testSimpleShiftsY  sf    3C,4dB/Bc2.VS&$7US&#6r$   c                    U R                  SSSSS5        U R                  SSSSS5        U R                  SSSS	S5        U R                  SS
SS	S5        U R                  SSSS	S5        U R                  SSSS	S5        U R                  SSSSS5        U R                  SSSSS5        U R                  SSSSS5        U R                  SSSSS5        U R                  SSS SS5        g )Nz/a/bz/../yz..r+  r,  rV   z//yyz/a/b/yz//y/rs   z/./yz/./y/z///./..//y/.//z/y/z///z/a/b/z/.//z/x//r*  z/a/b/xz/.r-  r;   s    r"   testNormalizedShifts!UtilityTests.testNormalizedShifts`  s    tT:GT2t4sHb9Xs;Xr:h< 0$eDr7B7GR8Xs;dFB7r$   c                     SSSSSSSSS	S
SS[        5       4S[        5       4S4 H  u  pU R                  X5        M     g )N)SERVER_NAMErX   )SERVER_PORT80)SERVER_PROTOCOLHTTP/1.0)	HTTP_HOSTrX   )REQUEST_METHODr   )r   rV   )rP   rs   )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"   testDefaultsUtilityTests.testDefaultsm  sX    '!*%$# #$79%HJ'&
JC  c(!
r$   c                     U R                  SSSS9  U R                  SSSS9  U R                  SSSS9  U R                  SSS	S9  U R                  SS
SS9  U R                  SSSS9  U R                  SSSS9  g )Nr:  zfoo.barr5  rB  httpsonHTTPS1yesr   foor6  r7  443)r  r;   s    r"   testCrossDefaultsUtilityTests.testCrossDefaults  s    {9K0tD0sC0uE0eD}T>}U>r$   c                    U R                  [        R                  " 0 5      S5        U R                  [        R                  " SS05      S5        U R                  [        R                  " SS05      S5        U R                  [        R                  " SS05      S5        U R                  [        R                  " SS05      S5        g )Nr   rJ  rM  rH  rG  rL  rK  )rv   r   guess_schemer;   s    r"   testGuessSchemeUtilityTests.testGuessScheme  s    **2.7**GE?;VD**GD>:GD**GE?;WE**GC=97Cr$   c                    U R                  S5        U R                  SSS9  U R                  SSS9  U R                  SSS	S
9  U R                  SSS9  U R                  SSSS9  U R                  SSS9  U R                  SSS S9  g )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:  r6  zhttp://spam.example.com/zspam.example.comrF  rX   )r:  r5  zhttps://127.0.0.1/rH  rI  zhttp://127.0.0.1:8000/8000)r6  r:  )r  r;   s    r"   testAppURIsUtilityTests.testAppURIs  s    ,-0gF2
K8-6 	 	C3* 	 	,,!/A 	 	C-T:1v 	 	r$   c                 \   U R                  S5        U R                  SSS9  U R                  SSS9  U R                  SSSS	9  U R                  S
SSS	9  U R                  SSSS	9  U R                  SSSS	9  U R                  SSSSS9  U R                  SSSSS9  U R                  SSSSSS9  g )NrV  rW  rX  rY  rZ  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   rP   rO   z'http://127.0.0.1/spammity/spam?s%E4y=nizs%E4y=nir   )r  r;   s    r"   testReqURIsUtilityTests.testReqURIs  s   ,-0gF2
K9#w 	 	8;#z 	 	;=#{ 	 	<J#/G 	 	I@#wH 	 	NB#wJ 	 	P91#wH 	 	Nr$   c                 .    U R                  SSSS/5        g )Nږxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzx   xxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz)r'  r;   s    r"   testFileWrapperUtilityTests.testFileWrapper  s    XsXh$78r$   c                    SR                  5        H^  nXR                  5       UR                  5       UR                  5       4 H(  nU R	                  [
        R                  " U5      5        M*     M`     SR                  5        H^  nXR                  5       UR                  5       UR                  5       4 H(  nU R                  [
        R                  " U5      5        M*     M`     g )NzbConnection Keep-Alive Proxy-Authenticate Proxy-Authorization TE Trailers Transfer-Encoding Upgradez4Accept Cache-Control Date Pragma Trailer Via Warning)ru   titleupperlowerr   r   is_hop_by_hopr$  )r   hopr  s      r"   testHopByHopUtilityTests.testHopByHop  s    4
%'C IIKciikA 2 23 78 B	 C
%'C IIKciikA  !3!3C!89 Br$   r2   r   )r   )r,   r-   r.   r/   r  r  r  r  r  r'  r.  r2  rC  rO  rS  r^  ra  rh  rp  r1   r2   r$   r"   r   r   !  sO    % (79,$78)&?DN&9:r$   r   c                   &    \ rS rSrS rS rS rSrg)HeaderTestsi  c           	         S/nU R                  [        [        5       5      S5        U R                  [        [        / 5      5      S5        U R                  [        [        US S  5      5      S5        U R                  [        US S  5      R                  5       S/5        U R                  [        US S  5      R	                  5       S/5        U R                  [        US S  5      R                  5       U5        U R                  [        U5      R                  5       U5        [        5       nUS	 SUS'   UR                  UR                  UR                  UR                  4 H_  nU R                  U" S5      5        U R                  U" S5      5        U R                  U" S	5      5        U R                  U" S5      5        Ma     U R                  US   S5        S
US'   U R                  US	   S
5        U R                  UR                  S5      S
/5        U R                  UR                  SS5      S
5        U R                  UR                  SS5      S5        U R                  UR                  SS5      S
5        U R                  UR                  SS5      S5        U R                  US   S
5        U R                  US   S5        g )N)r*  r1  r   r   r*  r1  rM  barFooFOObazwheezoo)rv   r   r	   keysvaluesitemsassertIsNot__contains__getget_all__getitem__r   r$  
setdefault)r   testhms       r"   testMappingInterface HeaderTests.testMappingInterface  s<   {WY+WR[)!,WT!W-.q1a)..03%8a)002SE:a)//148,,.5IeH%		1==@AOOAeH%OOAeH%OOAeH%QuX&	 A 	5%(%5%(5)5'2uV,e4uV,f5eF3U;eF3V<5%(5&)r$   c                 :    U R                  [        [        S5        g )NrM  )assertRaises	TypeErrorr	   r;   s    r"   testRequireListHeaderTests.testRequireList  s    )We4r$   c                 n   [        5       nU R                  [        U5      S5        UR                  SSSS9  U R                  US   S5        U R                  [        U5      S5        UR                  SSS S	9  U R                  UR	                  S5      SS
/5        U R                  [        U5      S5        g )Nz
rM  ru  spam)rx  zbar; baz="spam"zfoo: bar; baz="spam"

rv  )cheesezbar; cheesez*foo: bar; baz="spam"
Foo: bar; cheese

)r	   rv   str
add_headerr  r   r  s     r"   
testExtrasHeaderTests.testExtras  s    IQ'	U5V,5#45Q >?	U5-5).	0 	Q	
r$   r2   N)r,   r-   r.   r/   r  r  r  r1   r2   r$   r"   rs  rs    s    *@5
r$   rs  c                   ^    \ rS rSrSr\" \R                  R                  5       5      r	S r
Srg)ErrorHandleri  z/Simple handler subclass for testing BaseHandlerc           
      ~    [        U5        [        R                  " U [        5       [        5       [	        5       USSS9  g )NT)multithreadmultiprocess)r   r   r   r   r   )r   r  s     r"   r   ErrorHandler.__init__  s.    r"')WY
B4	
r$   r2   N)r,   r-   r.   r/   r0   dictosrI   r}  
os_environr   r1   r2   r$   r"   r  r    s#    9
 bjj&&()J
r$   r  c                       \ rS rSrSrS rSrg)TestHandleri	  zASimple handler subclass for testing BaseHandler, w/error passthruc                     e r   r2   r;   s    r"   handle_errorTestHandler.handle_error  s    r$   r2   N)r,   r-   r.   r/   r0   r  r1   r2   r$   r"   r  r  	  s
    Kr$   r  c                   f    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rSrg)HandlerTestsi  i  c                 N   SSSSSS.n[         R                  " [        SU5         [        SS	S
9nUR                  5         S S S 5        S H2  nU R	                  [        WSU-   5      UR                  SU-      5        M4     0 n[        U5        UR                  5        H  u  pVXT;  d  M  XdU'   M     UR                  SS	SSWR                  5       UR                  5       SSSSS[        R                  S.5        U R                  UR                  U5        g ! , (       d  f       N= f)Nz/my/homez/my/pathzfr_FR.UTF-8test_script_nametest_server_name)HOMEPATHLANGr   r5  r  Yz/override/home)Xr  )rt   r  r  run_oncefile_wrapperwsgi_zwsgi.rV   rX   r=  Fr   T)r  r  r   r5  r   rA  r<  r>  rB  r?  r@  zwsgi.file_wrapper)r   	swap_attrr  r(   rv   getattrrI   r   r}  update	get_stdin
get_stderrr   r   assertDictEqual)r   r  handlerattrexpectedr  r  s          r"   testEnvironHandlerTests.testEnviron  s-    ! .-	

 {L*E!C.>?G!!# F%DWWgn=$__Wt^<>% x( %**,JC" % - 	$ & "++-"--/""% $!%!%!1!1%
 	( 	W__h7Q FEs   D
D$c                     [        S S S 0 5      nUR                  5         S H  nU R                  X!R                  5        M      g )N)rB  r   rA  )r   r(   assertInrI   )r   r  r  s      r"   testCGIEnvironHandlerTests.testCGIEnvironJ  s7    4T"-	ACMM#yy) Br$   c                     [        SS9oR                  5         U R                  UR                  S   S5        [        5       oR                  5         U R                  UR                  S   S5        g )NrH  rI  rB  rG  r   )r  r(   rv   rI   r  s     r"   
testSchemeHandlerTests.testSchemeP  sU    
D
!??#4#45g>
-*#45f=r$   c                     [        5       nS H"  nU R                  [        [        X5      5        M$     U R                  [        UR                  S5        g )N)_flushr  r  add_cgi_varsr  )r
   r  NotImplementedErrorr  _write)r   r  names      r"   testAbstractMethods HandlerTests.testAbstractMethodsV  sE    M
D 171?C
 	-qxx@r$   c                    S nS nS nS n[        5       nUR                  U5        U R                  UR                  R	                  5       SR                  S5      5        [        5       nUR                  U5        U R                  UR                  R	                  5       SR                  S5      5        [        5       nUR                  U5        U R                  UR                  R	                  5       S5        [        5       nUR                  U5        U R                  UR                  R	                  5       S	5        g )
Nc                 >    U" S/ 5        U S   R                  S5      /$ NrB   rB  rQ   r   r   s     r"   trivial_app14HandlerTests.testContentLength.<locals>.trivial_app1a  s%    hrN'(//=>>r$   c                 H    U" S/ 5      " U S   R                  S5      5        / $ r  r   r   s     r"   trivial_app24HandlerTests.testContentLength.<locals>.trivial_app2e  s&    hrN1./66|DEIr$   c                 8    U" S/ 5        SR                  S5      /$ )NrB   u   тестzutf-8r   r   s     r"   trivial_app34HandlerTests.testContentLength.<locals>.trivial_app3i  s    hrN.55g>??r$   c                     U" SS/5        / $ )NrB   )zContent-Length12345r2   r   s     r"   trivial_app44HandlerTests.testContentLength.<locals>.trivial_app4m  s    h345Ir$   z)Status: 200 OK
Content-Length: 4

httprQ   zStatus: 200 OK

https-   Status: 200 OK
Content-Length: 8

тестs)   Status: 200 OK
Content-Length: 12345

)r  runrv   stdoutr\   rS   )r   r  r  r  r  r  s         r"   testContentLengthHandlerTests.testContentLength^  s	   	?		@	
 M	l**, F<(		* M	l**,F<(	*
 M	l**,0	1 M	l**,	r$   c                 f   S nS n[        5       nUR                  U5        U R                  UR                  R	                  5       SR                  S5      5        U R                  UR                  R	                  5       S5        [        5       nUR                  U5        U R                  UR                  R	                  5       SUR                  [        UR                  5      4-  R                  S5      UR                  -   5        U R                  SUR                  R	                  5       5        g )Nc                     U" S/ 5        / $ NrB   r2   r   s     r"   non_error_app8HandlerTests.testBasicErrorOutput.<locals>.non_error_app      hrNIr$   c                     [        S5      e)N This should be caught by handlerrg   r   s     r"   	error_app4HandlerTests.testBasicErrorOutput.<locals>.error_app  s     !CDDr$   %Status: 200 OK
Content-Length: 0

rQ   rV   z<Status: %s
Content-Type: text/plain
Content-Length: %d

rg   )r  r  rv   r  r\   rS   rZ   error_statusr   
error_bodyr  )r   r  r  r  s       r"   testBasicErrorOutput!HandlerTests.testBasicErrorOutput  s    		E N	m**,F<(	* 	**,R0N	i**, nnS%678 :@9Mll		 	&(9(9(;<r$   c                   ^ SmU4S jn[        5       nUR                  U5        U R                  UR                  R	                  5       SR                  S5      T-   5        U R                  SUR                  R	                  5       5        g )N   Some output has been sentc                 8   > U" S/ 5      " T5        [        S5      e)NrB   r  r  )r   r   MSGs     r"   r  4HandlerTests.testErrorAfterOutput.<locals>.error_app  s    hrN3 !CDDr$   zStatus: 200 OK

rQ   rg   )r  r  rv   r  r\   rS   r  rZ   )r   r  r  r  s      @r"   testErrorAfterOutput!HandlerTests.testErrorAfterOutput  st    *	E N	i**,6,',	. 	&(9(9(;<r$   c           
         S nSnSR                  S5      nS GHe  nU=(       a    SU-  =(       d    SnS GHC  nS	 GH8  n[        US
9nSUl        Xhl        XHl        UR                  U5        U R                  X8R                  R                  5       5        [        US
9nSUl        Xhl        XHl        UR                  U5        US:X  a,  U R                  UR                  R                  5       S5        M  U R                  [        R                  " X&U4-  R                  S5      UR                  R                  5       5      X&U4-  R                  S5      UR                  R                  5       45        GM;     GMF     GMh     g )Nc                     U" S/ 5        / $ r  r2   r   s     r"   r  5HandlerTests.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  rQ   )z
FooBar/1.0NzServer: %s
rV   )z1.0z1.1)HTTP/0.9r9  zHTTP/1.1)r8  FTr  r$   )rS   r  origin_serverhttp_versionserver_softwarer  rv   r  r\   r   rerk   )	r   r  stdpatshortpatsswswrt   protor  s	            r"   testHeaderFormatsHandlerTests.testHeaderFormats  sR   	
3 	 @
&
 	 &C/)C/52B'?E#E:A&+AO%,N(+%EE-($$Xhh.?.?.AB#E:A&*AO%,N(+%EE-(j((():):)<SAHHfb\&9%A%A,%O ! 1 1 35$b\199,G ! 1 1 35# @ ( &r$   c                     S n[        5       nUR                  U5        U R                  SUR                  R	                  5       5        g )Nc                     U" SS/5        S/$ )NrB   r   r   r2   r   s     r"   r]   'HandlerTests.testBytesData.<locals>.app  s    h=  9r$   sR   Status: 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 4

data)r  r  rv   r  r\   )r   r]   r  s      r"   testBytesDataHandlerTests.testBytesData  s@    	 M	c
 
 HH	!r$   c                    ^^ SS0mSmUU4S jn[        5       nUR                  U5        U R                  TS   S5        g )Nclose_calledFr  c                 T   > U" S/ 5      " T5         " U4S jS[         5      nU" 5       $ )NrB   c                   (   > \ rS rSrS rU 4S jrSrg)HHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterablei  c              3   *   #     Sv   [        S5      e7f)Ns   blahr  r  r;   s    r"   __iter__QHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterable.__iter__  s     %,-OPPs   c                    > STS'   g )NTr
  r2   )r   side_effectss    r"   r   NHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterable.close  s    37L0r$   r2   N)r,   r-   r.   r/   r  r   r1   )r  s   r"   CrashyIterabler    s    Q8 8r$   r  )object)r   r   r  r  r  s      r"   r  0HandlerTests.testCloseOnError.<locals>.error_app  s(    hrN38 8 "##r$   T)r  r  rv   )r   r  r  r  r  s      @@r"   testCloseOnErrorHandlerTests.testCloseOnError  sA    &.*		$ N	in5t<r$   c                 @  ^ [        5       m " U4S jS5      nSS0n[        [        5       U" 5       [        R                  U5      nSnU R                  [        U5         UR                  [        5        S S S 5        U R                  ST5        g ! , (       d  f       N!= f)Nc                   (   > \ rS rSrU 4S jrS rSrg)4HandlerTests.testPartialWrite.<locals>.PartialWriteri	  c                 F   > US S nTR                  U5        [        U5      $ )N   )extendr   )r   bpartialwrittens      r"   write:HandlerTests.testPartialWrite.<locals>.PartialWriter.write
  s$    BQ%w'7|#r$   c                     g r   r2   r;   s    r"   flush:HandlerTests.testPartialWrite.<locals>.PartialWriter.flush  s    r$   r2   N)r,   r-   r.   r/   r"  r%  r1   )r!  s   r"   PartialWriterr  	  s    $
r$   r'  r8  r9  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   rY   rZ   assertWarnsRegexDeprecationWarningr  rK   rv   )r   r'  rI   r  msgr!  s        @r"   testPartialWriteHandlerTests.testPartialWrite  s    +	 	 %j1')]_cjj'J,""#5s;EE) <  	 <;s   B
Bc                 \  ^ SS0n[         [        [        4 H  mU R                  TS9    " U4S jS5      n[	        5       n[        [        5       U" 5       X15      nUR                  [        5        U R                  UR                  5       5        S S S 5        M     g ! , (       d  f       M  = f)Nr8  r9  	exceptionc                   "   > \ rS rSrU 4S jrSrg)EHandlerTests.testClientConnectionTerminations.<locals>.AbortingWriteri'  c                    > Ter   r2   )r   r  r0  s     r"   r"  KHandlerTests.testClientConnectionTerminations.<locals>.AbortingWriter.write(  s    'r$   r2   Nr,   r-   r.   r/   r"  r1   r/  s   r"   AbortingWriterr2  '  s    ( (r$   r6  )ConnectionAbortedErrorBrokenPipeErrorConnectionResetErrorr   r   r   r   r  rK   r$  r\   )r   rI   r6  rZ   r  r0  s        @r"    testClientConnectionTerminations-HandlerTests.testClientConnectionTerminations  s    $j1" 
I
 	2( ( "!')^-=vOi   !23 32

 32s   A&B
B+	c                   ^  " S S[         5      m " U4S jS5      n[        5       nSS0n[        [        5       U" 5       X#5      nUR	                  [
        5        U R                  SUR                  5       5        U R                  UR                  5        U R                  UR                  5        U R                  UR                  5        U R                  UR                  5        g )Nc                       \ rS rSrSrg)KHandlerTests.testDontResetInternalStateOnException.<locals>.CustomExceptioni2  r2   Nr   r2   r$   r"   CustomExceptionr>  2  r   r$   r?  c                   "   > \ rS rSrU 4S jrSrg)JHandlerTests.testDontResetInternalStateOnException.<locals>.AbortingWriteri9  c                    > Ter   r2   )r   r  r?  s     r"   r"  PHandlerTests.testDontResetInternalStateOnException.<locals>.AbortingWriter.write:  s	    %%r$   r2   Nr5  )r?  s   r"   r6  rA  9  s    & &r$   r6  r8  r9  )
ValueErrorr   r   r   r  rK   r  r\   assertIsNotNoneresultheadersr   rI   )r   r6  rZ   rI   r  r?  s        @r"   %testDontResetInternalStateOnException2HandlerTests.testDontResetInternalStateOnException1  s    	j 		& 	& $j1')^%5vG	i'):; 	QXX&QYY'QXX&QYY'r$   r2   N)r,   r-   r.   r/   maxDiffr  r  r  r  r  r  r  r  r  r  r,  r:  rH  r1   r2   r$   r"   r  r    sL    G48l*>A0d=8=)V! =$24$(r$   r  __main__)6unittestr   r  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   r  r  r   rY   r   r   r4   rK   rT   rd   rn   rp   r   rs  r  r  r  r,   mainr2   r$   r"   <module>rZ     s      & 5  / # G G  & @ - & 0 0 # * 	 	  
   $  "7 *D*u@x u@p`:8 `:D5
( 5
n
> 
, x(8 x(v	 zMMO r$   