Current File : //usr/local/apps/python3/lib/python3.11/test/__pycache__/test_wsgiref.cpython-311.opt-1.pyc
�

�KeKu��6�ddlmZddlmZddlmZddlmZddlmZddl	m
Z
ddlmZddl
mZmZmZdd	lmZdd
lmZddlmZmZddlmZdd
lmZddlmZmZmZddlm Z ddl!m"Z"ddl#Z#ddl$Z$ddl%Z%ddl&Z&ddl'Z'ddlZGd�de��Z(Gd�de��Z)d�Z*d�Z+e*dfd�Z,d�Z-Gd�de��Z.Gd�de��Z/Gd�d e��Z0Gd!�d"e��Z1Gd#�d$e1��Z2Gd%�d&e��Z3e4d'krej5��dSdS)(�)�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��eZdZdZd�Zd�ZdS)�
MockServerzNon-socket HTTP serverc�Z�tj|||��|���dS�N)r�__init__�server_bind)�self�server_address�RequestHandlerClasss   �;/usr/local/apps/python3/lib/python3.11/test/test_wsgiref.pyrzMockServer.__init__s0����D�.�2E�F�F�F���������c�^�|j\}}||_||_|���dSr)r�server_name�server_port�
setup_environ)r�host�ports   r!rzMockServer.server_bind!s6���(�
��d��������������r"N)�__name__�
__module__�__qualname__�__doc__rr�r"r!rrs8������ � ��������r"rc��eZdZdZd�Zd�ZdS)�MockHandlerzNon-socket HTTP handlerc�F�|j|_|j\|_|_dSr)�request�
connection�rfile�wfile�rs r!�setupzMockHandler.setup*s���,���!%����
�D�J�J�Jr"c��dSrr-r5s r!�finishzMockHandler.finish.s���r"N)r)r*r+r,r6r8r-r"r!r/r/(s8������!�!�1�1�1�
�
�
�
�
r"r/c�$�|dddg��dgS)N�200 OK��Content-Typez
text/plain��DatezMon, 05 Jun 2006 18:49:54 GMT�
Hello, world!r-��environ�start_responses  r!�	hello_apprC2s.���N�8�%�0�����
��r"c��|dddg��d�|d|d|dg���d��gS)	Nr:r;r=�;�HTTP_X_TEST_HEADER�QUERY_STRING�	PATH_INFO�
iso-8859-1)�join�encoder@s  r!�
header_apprL:sl���N�8�&�1�����
�H�H��$�%�w�~�'>�����
�
��v�l����r"sGET / HTTP/1.0

c��tdd|tt��}tt	|����}t	��}t
j}t��x}t
_	|�||fd��|t
_n#|t
_wxYw|�	��|�	��fS)N��P)�	127.0.0.1i�")
rrr/rr�sys�stderrr�finish_request�getvalue)�app�data�server�inp�out�olderr�errs       r!�	run_amockr\Es���
��R��j�+�
>�
>�F�
�����
'�
'�C�
�)�)�C�
�Z�F��z�z�!�C�#�*�����s�C�j�*<�=�=�=���
�
��V��
������<�<�>�>�3�<�<�>�>�)�)s�/B�B"c���|��}t|��|urt�|D]}t|��|kst��	t|��td|���#t$rYdSwxYw)z�Utility 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).zToo many items from .__next__()N)�iter�AssertionError�next�
StopIteration)�make_it�match�it�items    r!�compare_generic_iterrfTs���
����B���8�8�r�>�>����!�!���B�x�x�4��� � � �D��R�����>��C�C�C���
�
�
����
���s�A"�"
A0�/A0c�R�eZdZdd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�Zd�Zd�Z
d
S)�IntegrationTestsTc���t��dztj���dz}|�|d|zdz|rdpdzdz�d����dS)	N�/rz(HTTP/1.0 200 OK
Server: WSGIServer/0.2 zA
Content-Type: text/plain
Date: Mon, 05 Jun 2006 18:49:54 GMT
zContent-Length: 13
rNz
Hello, world!rI)rrQ�version�split�assertEqualrK)rrY�
has_length�pyvers    r!�check_hellozIntegrationTests.check_helloks���&�(�(�3�.���!�!�#�#�A�&�'������&�(-�.�06�6��
5�5�
;��	=�

��$�V�L�1�1�	
�	
�	
�	
�	
r"c�R�t��\}}|�|��dSr)r\rp�rrYr[s   r!�test_plain_helloz!IntegrationTests.test_plain_helloxs)���;�;���S���������r"c��d}tt|��\}}|�|���dd��dS)NsmGET /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\rLrm�
splitlines)rr1rYr[s    r!�test_environzIntegrationTests.test_environ|sX��
%�	��Z��1�1���S�����N�N���R� �:�	
�	
�	
�	
�	
r"c��tdddzzdz���\}}|�|���dd��dS)NsGET �xis HTTP/1.0

�rVrs!HTTP/1.0 414 Request-URI Too Long)r\rmrvrrs   r!�test_request_lengthz$IntegrationTests.test_request_length�s[���'�T�E�\�":�=M�"M�N�N�N���S�������)�)�!�,�=�	?�	?�	?�	?�	?r"c�|�ttt����\}}|�|d���dS)NF)rn)r\rrCrprrs   r!�test_validated_helloz%IntegrationTests.test_validated_hello�s:���Y�y�1�1�2�2���S�������/�/�/�/�/r"c��d�}tt|����\}}|�|�d����|�|���dd��dS)Nc� �|dd��dgS)Nr:r;z
Hello, world!r-r@s  r!�bad_appz>IntegrationTests.test_simple_validation_error.<locals>.bad_app�s���N�8�%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�endswithrmrv�rr�rYr[s    r!�test_simple_validation_errorz-IntegrationTests.test_simple_validation_error�s���	%�	%�	%��Y�w�/�/�0�0���S�������J�
�
�	�	�	�	
����N�N���R� �
0�	
�	
�	
�	
�	
r"c�b�d�}gd�}|D]�\}}|�|���5t||����\}}|�|�d����|�|���d|��ddd��n#1swxYwY��dS)Nc����fd�}|S)Nc�$��|�dg��dgS)N�r<ztext/plain; charset=utf-8r?r-)rArB�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)z20X 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�rmrv)rr��testsr��exc_messagerYr[s       r!�test_status_validation_errorsz.IntegrationTests.test_status_validation_errors�s,��	�	�	�
�
�
��$)�	D�	D��F�K����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�	Ds�A2B#�#B'	�*B'	c��d�}tt|����\}}|�|�d����|�|���dd��dS)Nc�V�|d���|ddg��dgS)N�
wsgi.inputr:r��data)�read��e�ss  r!r�z1IntegrationTests.test_wsgi_input.<locals>.bad_app�s6��
�l�O� � �"�"�"�
�A�h�F�G�H�H�H��9�r"r�r�r_r�r�s    r!�test_wsgi_inputz IntegrationTests.test_wsgi_input�s���	�	�	��Y�w�/�/�0�0���S�������J�
�
�	�	�	�	
����N�N���R� �"2�	
�	
�	
�	
�	
r"c��d�}tt|����\}}|�|�d����tj���d�d��}t���d��}|dz|z}|�	d|zdz|��dS)Nc�$�|dddg��dgS)Nr:r��r>zWed, 24 Dec 2008 13:29:32 GMTr�r-r�s  r!rUz3IntegrationTests.test_bytes_validation.<locals>.app�s-��
�A�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)
r\rr�r�rQrkrlrKrrm)rrUrYr[�ver�pyros       r!�test_bytes_validationz&IntegrationTests.test_bytes_validation�s���	�	�	��Y�s�^�^�,�,���S�������%?�@�@�A�A�A��k���!�!�!�$�+�+�G�4�4��#�%�%�,�,�W�5�5���T�	�C������+�,1�2�5���	�	�	�	�	r"c��d�}tt|��d���\}}|�dtjddddg|�����dS)	Nc�V�|dddg��|d�d��gS)Nr:r;r�rH�latin1�rKr�s  r!rUz-IntegrationTests.test_cp1252_url.<locals>.app�s@��
�A�h�.�9��
�
�
��k�N�)�)�(�3�3�4�4r"sGET /�%80 HTTP/1.0rzsHTTP/1.0 200 OKsContent-Type: text/plains#Date: Wed, 24 Dec 2008 13:29:32 GMTr"s/��)r\rrmr�ANYrv)rrUrYr[s    r!�test_cp1252_urlz IntegrationTests.test_cp1252_url�s���	5�	5�	5���c�N�N�!9�;�;�;���S����"���+�6���

�
�N�N���		�		�		�		�		r"c�����	�
��tjtd���	d�}Gd�dtt��}ttjd||����|��j	��tj����fd�}tjtj|��}|�tjtj|��d�
tj
������	�
�fd�}tj|�	��}|�������|���|��
tjd
z
��dS)N�pthread_killc�:�|dg��dtjzgS)Nr:�)r�
SOCK_MAX_SIZEr@s  r!rUz4IntegrationTests.test_interrupted_write.<locals>.app�s%���N�8�R�(�(�(��G�1�1�2�2r"c��eZdZdS)�<IntegrationTests.test_interrupted_write.<locals>.WsgiHandlerN�r)r*r+r-r"r!�WsgiHandlerr����������Dr"r�r)�
handler_classc�0������dSr)�set)�signum�frame�interrupteds  �r!�signal_handlerz?IntegrationTests.test_interrupted_write.<locals>.signal_handlers����O�O�����r"c���t�j�}|�dd��|���5}|�d��	��t
j����td�����rn�;t|������ddd��n#1swxYwY|�
��dS)N�GETrj�dT�)�timeout)rrr1�getresponser��signal�SIGUSR1�wait�float�len�close)�http�responser��main_threadr��receivedrWs  �����r!�
run_clientz;IntegrationTests.test_interrupted_write.<locals>.run_clients���!�6�#8�9�D��L�L���$�$�$��!�!�#�#�
0�x��
�
�c�"�"�"�� �L��f�n�=�=�=�"�'�'��a���'�9�9����
�x�}�}���/�/��
0�
0�
0�
0�
0�
0�
0�
0�
0�
0�
0����
0�
0�
0�
0�
�J�J�L�L�L�L�Ls�A3B9�9B=�B=)�targetr�)r�
get_attributer�rrrr�HOST�
addCleanup�server_close�	threading�Eventr��	get_ident�Thread�start�handle_requestrJrmr�)rrUr�r��originalr��
backgroundr�r�r�r�rWs       @@@@@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�#8�3�#>�?�?�?�?�?r"N)T)r)r*r+rprsrwr{r}r�r�r�r�r�r�r-r"r!rhrhis�������
�
�
�
����
�
�
�?�?�?�
0�0�0�

�
�
�D�D�D�*
�
�
����*���./@�/@�/@�/@�/@r"rhc�l�eZdZd�Zdd�Zd�Zd�Zdd�Zd�Zd	�Z	d
�Z
d�Zd�Zd
�Z
d�Zd�Zd�Zd�ZdS)�UtilityTestsc��||d�}tj|��|�tj|��|��|�|d|��|�|d|��|S)N��SCRIPT_NAMErHrHr�)r
rrm�shift_path_info)r�sn_in�pi_in�part�sn_out�pi_out�envs       r!�
checkShiftzUtilityTests.checkShift#s|��"�u�5�5���#�C�(�(�(�����-�c�2�2�4�8�8�8�����[�)�&�1�1�1�����]�+�F�3�3�3��
r"Nc��i}tj|��t|t��r"|�||t��nSt|t
��r"|�||t
��n|�|||��||i}tj|��|�|||��dSr)r
r�
isinstancer�assertIsInstancerrm�assertIs)r�key�value�altr�s     r!�checkDefaultzUtilityTests.checkDefault+s������#�C�(�(�(��e�X�&�&�	.��!�!�#�c�(�H�5�5�5�5�
��g�
&�
&�	.��!�!�#�c�(�7�3�3�3�3����S��X�u�-�-�-��3�i���#�C�(�(�(��
�
�c�#�h��$�$�$�$�$r"c�f�tj|��|�|||��dSr)r
rrm)rr�r��kws    r!�checkCrossDefaultzUtilityTests.checkCrossDefault;s3���#�B�'�'�'�����C���'�'�'�'�'r"c�~�tj|��|�tj|��|��dSr)r
rrm�application_uri)r�urir�s   r!�checkAppURIzUtilityTests.checkAppURI?s:���#�B�'�'�'�����-�b�1�1�#�6�6�6�6�6r"r�c��tj|��|�tj||��|��dSr)r
rrm�request_uri)rr��queryr�s    r!�checkReqURIzUtilityTests.checkReqURICs<���#�B�'�'�'�����)�"�U�3�3�C�8�8�8�8�8r"c�2�||fd�}t||��|��}|�|jj��|D]}�|�|jj��|���|�|jj��dS)Nc�F�tjt|��|��Sr)r
�FileWrapperr)�text�sizes  r!rbz%UtilityTests.checkFW.<locals>.make_itIs���#�H�T�N�N�4�8�8�8r")rf�assertFalse�filelike�closedr�r�)rr�r�rcrbrdres       r!�checkFWzUtilityTests.checkFWGs����4�	9�	9�	9�	9�	�W�U�+�+�+�
�W�Y�Y�������+�,�,�,��	�	�D�������+�,�,�,�
���
�
�
������*�+�+�+�+�+r"c��|�ddddd��|�ddddd��|�ddddd��|�ddddd��|�dd	ddd��dS)
NrNrjz/x�x�/az/x/yz/a/x�/yz/x/�r�r5s r!�testSimpleShiftszUtilityTests.testSimpleShiftsYs�������3��C��,�,�,�����4��d�B�/�/�/�����B��c�2�.�.�.�����V�S�&�$�7�7�7�����U�S�&�#�6�6�6�6�6r"c�,�|�ddddd��|�ddddd��|�dddd	d��|�dd
dd	d��|�dddd	d��|�dd
dd	d��|�ddddd��|�ddddd��|�ddddd��|�ddddd��|�ddddd��dS)Nz/a/bz/../yz..rrrNz//y�yz/a/b/yz//y/rjz/./yz/./y/z///./..//y/.//z/y/z///z/a/b/z/.//z/x//rz/a/b/xz/.rr5s r!�testNormalizedShiftsz!UtilityTests.testNormalizedShifts`s'��������t�T�:�:�:�����G�T�2�t�4�4�4������s�H�b�9�9�9�������X�s�;�;�;�������X�r�:�:�:�������h��<�<�<����� 0�$��e�D�D�D������r�7�B�7�7�7�������G�R�8�8�8�������X�s�;�;�;������d�F�B�7�7�7�7�7r"c��ddddddddd	d
ddt��fd
t��fdfD]\}}|�||���dS)N)�SERVER_NAMErP)�SERVER_PORT�80)�SERVER_PROTOCOL�HTTP/1.0)�	HTTP_HOSTrP)�REQUEST_METHODr�)r�rN)rHrj)�wsgi.version�r�r)�
wsgi.run_oncer)�wsgi.multithreadr)�wsgi.multiprocessrr��wsgi.errors)�wsgi.url_schemer�)rrr�)rr�r�s   r!�testDefaultszUtilityTests.testDefaultsmsx��'�!�*�%�$���#� �#�$�
�7�9�9�%�
�H�J�J�'�&�
�	)�	)�J�C�� 
���c�%�(�(�(�(�!	)�	)r"c�V�|�ddd���|�ddd���|�ddd���|�ddd	���|�dd
d���|�dd
d���|�ddd���dS)Nrzfoo.bar�rr�https�on��HTTPS�1�yesr��foorr�443)r�r5s r!�testCrossDefaultszUtilityTests.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��|�tji��d��|�tjddi��d��|�tjddi��d��|�tjddi��d��|�tjddi��d��dS)Nr�r"r%r rr$r#)rmr
�guess_schemer5s r!�testGuessSchemezUtilityTests.testGuessScheme�s�������*�2�.�.��7�7�7�����*�G�E�?�;�;�V�D�D�D�����*�G�D�>�:�:�G�D�D�D�����*�G�E�?�;�;�W�E�E�E�����*�G�C�=�9�9�7�C�C�C�C�Cr"c�x�|�d��|�dd���|�dd���|�ddd	�
��|�dd�
��|�ddd���|�dd���|�ddd���dS)N�http://127.0.0.1/�http://127.0.0.1/spam�/spam�r��http://127.0.0.1/sp%E4m�/spämzhttp://spam.example.com:2071/zspam.example.com:2071�2071)rrzhttp://spam.example.com/zspam.example.comrrP)rrzhttps://127.0.0.1/r r!zhttp://127.0.0.1:8000/�8000)rr)r�r5s r!�testAppURIszUtilityTests.testAppURIs�s�����,�-�-�-����0�g��F�F�F����2�
��K�K�K����8�-�6�	�	C�	C�	C����3�*�	�	,�	,�	,����,�!�/A�	�	C�	C�	C����-�T��:�:�:����1�v��	�	�	�	�	�	r"c���|�d��|�dd���|�dd���|�ddd�	��|�d
dd�	��|�ddd�	��|�d
dd�	��|�dddd���|�dddd���|�ddddd���dS)Nr,r-r.r/r0r1zhttp://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=nizsay=ni)r�rHrGz'http://127.0.0.1/spammity/spam?s%E4y=nizs%E4y=nir)r�r5s r!�testReqURIszUtilityTests.testReqURIs�so�����,�-�-�-����0�g��F�F�F����2�
��K�K�K����9�#�w�	�	8�	8�	8����;�#�z�	�	;�	;�	;����=�#�{�	�	<�	<�	<����J�#�/G�	�	I�	I�	I����@�#�w�H�	�	N�	N�	N����B�#�w�J�	�	P�	P�	P����9�1�#�w�H�	�	N�	N�	N�	N�	Nr"c�8�|�ddddg��dS)Nږxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz�x�xxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz�xyzxyzxyzxyzxyzxyzxyzxyzxyzxyz)rr5s r!�testFileWrapperzUtilityTests.testFileWrapper�s#�����X�s�X�h�$7�8�8�8�8�8r"c��d���D]h}||���|���|���fD])}|�tj|�����*�id���D]h}||���|���|���fD])}|�tj|�����*�idS)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!�testHopByHopzUtilityTests.testHopByHop�s���
4�
�%�'�'�	9�	9�C��C�I�I�K�K������c�i�i�k�k�A�
9�
9������ 2�3� 7� 7�8�8�8�8�
9�

C�
�%�'�'�	:�	:�C��C�I�I�K�K������c�i�i�k�k�A�
:�
:��� � ��!3�C�!8�!8�9�9�9�9�
:�	:�	:r"r)r�)r)r*r+r�r�r�r�r�rr	rrr'r*r4r6r<rCr-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� �eZdZd�Zd�Zd�ZdS)�HeaderTestsc	��dg}|�tt����d��|�ttg����d��|�tt|dd�����d��|�t|dd������dg��|�t|dd������dg��|�t|dd������|��|�t|�����|��t��}|d=d|d<|j|j|j	|j
fD]z}|�|d����|�|d����|�|d	����|�|d�����{|�|dd��d
|d<|�|d	d
��|�|�	d��d
g��|�|�dd��d
��|�|�dd��d��|�|�
dd��d
��|�|�
dd��d��|�|dd
��|�|dd��dS)
N)rrrr�rrr%�bar�Foo�FOO�baz�whee�zoo)rmr�r	�keys�values�items�assertIsNot�__contains__�get�get_all�__getitem__r�r�
setdefault)r�test�h�ms    r!�testMappingInterfacez HeaderTests.testMappingInterface�s���{������W�Y�Y����+�+�+�����W�R�[�[�)�)�!�,�,�,�����W�T�!�!�!�W�-�-�.�.�q�1�1�1������a�a�a��)�)�.�.�0�0�3�%�8�8�8������a�a�a��)�)�0�0�2�2�S�E�:�:�:������a�a�a��)�)�/�/�1�1�4�8�8�8��������,�,�.�.��5�5�5��I�I��
�e�H���%�������	�1�=�@�	'�	'�A��O�O�A�A�e�H�H�%�%�%��O�O�A�A�e�H�H�%�%�%��O�O�A�A�e�H�H�%�%�%����Q�Q�u�X�X�&�&�&�&�����5��%�(�(�(���%������5��%�(�(�(�������5�)�)�5�'�2�2�2�������u�V�,�,�e�4�4�4�������u�V�,�,�f�5�5�5�������e�F�3�3�U�;�;�;�������e�F�3�3�V�<�<�<�����5��%�(�(�(�����5��&�)�)�)�)�)r"c�H�|�ttd��dS)Nr%)�assertRaises�	TypeErrorr	r5s r!�testRequireListzHeaderTests.testRequireList�s �����)�W�e�4�4�4�4�4r"c���t��}|�t|��d��|�ddd���|�|dd��|�t|��d��|�ddd�	��|�|�d��dd
g��|�t|��d��dS)Nz
r%rG�spam)rJzbar; baz="spam"zfoo: bar; baz="spam"

rH)�cheesezbar; cheesez*foo: bar; baz="spam"
Foo: bar; cheese

)r	rm�str�
add_headerrS�rrWs  r!�
testExtraszHeaderTests.testExtras�s����I�I������Q����'�'�'�	���U�5�V��,�,�,�����5��#4�5�5�5�����Q��� >�?�?�?�	���U�5���-�-�-�������5�)�)�
�
�.�	0�	0�	0�	
����Q���
�	
�	
�	
�	
�	
r"N)r)r*r+rYr]rdr-r"r!rErE�sB������*�*�*�@5�5�5�
�
�
�
�
r"rEc�\�eZdZdZeej�����Zd�Z	dS)�ErrorHandlerz/Simple handler subclass for testing BaseHandlerc	��t|��tj|t��t��t	��|dd���dS)NT)�multithread�multiprocess)rrrrr)rr�s  r!rzErrorHandler.__init__sP���r�"�"�"����'�)�)�W�Y�Y��
�
�B��4�	
�	
�	
�	
�	
�	
r"N)
r)r*r+r,�dict�osrArO�
os_environrr-r"r!rfrf�sH������9�9�
��b�j�&�&�(�(�)�)�J�
�
�
�
�
r"rfc��eZdZdZd�ZdS)�TestHandlerzASimple handler subclass for testing BaseHandler, w/error passthruc���rr-r5s r!�handle_errorzTestHandler.handle_errors��
r"N)r)r*r+r,rpr-r"r!rnrn	s)������K�K�����r"rnc�`�eZdZdZd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zd�ZdS)�HandlerTestsi�c�x�dddddd�}tjtd|��5tdd	�
��}|���ddd��n#1swxYwYdD]7}|�t|d|z��|jd
|z���8i}t|��|���D]\}}||vr|||<�|�	dd	dd|�
��|���dddddtj
d���|�|j|��dS)Nz/my/homez/my/pathzfr_FR.UTF-8�test_script_name�test_server_name)�HOME�PATH�LANGr�rrl�Yz/override/home)�Xrv)rkrhri�run_once�file_wrapper�wsgi_zwsgi.rNrPrFr�T)rzrvr�rr�rrrrrrzwsgi.file_wrapper)r�	swap_attrrnr&rm�getattrrArrO�update�	get_stdin�
get_stderrr
r��assertDictEqual)rrl�handler�attr�expectedr�r�s       r!�testEnvironzHandlerTests.testEnvirons�����!�.�-�	
�	
�
��
�{�L�*�
E�
E�	$�	$�!�C�.>�?�?�?�G��!�!�#�#�#�	$�	$�	$�	$�	$�	$�	$�	$�	$�	$�	$����	$�	$�	$�	$�%�	>�	>�D����W�W�g��n�=�=�$�_�W�t�^�<�
>�
>�
>�
>����x�(�(�(�%�*�*�,�,�	&�	&�J�C���(�"�"� %���
������$��&�"�+�+�-�-�"�-�-�/�/�"�"�%� $�!%�!%�!1�%
�
�	�	�	�(	
���W�_�h�7�7�7�7�7s�&A�A�Ac��tdddi��}|���dD]}|�||j���dS)N)rr�r)rr&�assertInrA)rrWr�s   r!�testCGIEnvironzHandlerTests.testCGIEnvironJsW���4��T�"�-�-��	������A�	*�	*�C��M�M�#�q�y�)�)�)�)�	*�	*r"c��td���}|���|�|jdd��t��}|���|�|jdd��dS)Nr r!rrr�)rnr&rmrArcs  r!�
testSchemezHandlerTests.testSchemePs{��
�D�
!�
!�
!��1�?�?�#4�#4�#4������#4�5�g�>�>�>�
�-�-�����*�*�*������#4�5�f�=�=�=�=�=r"c��t��}dD]+}|�tt||�����,|�t|jd��dS)N)�_flushr�r��add_cgi_varsrV)r
r[�NotImplementedErrorr�_write)rrW�names   r!�testAbstractMethodsz HandlerTests.testAbstractMethodsVsc���M�M��
�	D�	D�D�
���1�7�1�T�?�?�C�C�C�C����-�q�x��@�@�@�@�@r"c���d�}d�}d�}d�}t��}|�|��|�|j���d�d����t��}|�|��|�|j���d�d����t��}|�|��|�|j���d��t��}|�|��|�|j���d	��dS)
Nc�R�|dg��|d�d��gS�Nr:rrIr�r�s  r!�trivial_app1z4HandlerTests.testContentLength.<locals>.trivial_app1as.��
�A�h�r�N�N�N��'�(�/�/��=�=�>�>r"c�b�|dg��|d�d����gSr�r�r�s  r!�trivial_app2z4HandlerTests.testContentLength.<locals>.trivial_app2es5���A�A�h�r�N�N�1�.�/�6�6�|�D�D�E�E�E��Ir"c�F�|dg��d�d��gS)Nr:uтестzutf-8r�r�s  r!�trivial_app3z4HandlerTests.testContentLength.<locals>.trivial_app3is(��
�A�h�r�N�N�N�.�5�5�g�>�>�?�?r"c� �|ddg��gS)Nr:)zContent-Length�12345r-r�s  r!�trivial_app4z4HandlerTests.testContentLength.<locals>.trivial_app4ms��
�A�h�3�4�5�5�5��Ir"z)Status: 200 OK
Content-Length: 4

httprIzStatus: 200 OK

https-Status: 200 OK
Content-Length: 8

тестs)Status: 200 OK
Content-Length: 12345

)rn�runrm�stdoutrTrK)rr�r�r�r�rWs      r!�testContentLengthzHandlerTests.testContentLength^s���	?�	?�	?�	�	�	�	@�	@�	@�	�	�	�

�M�M��	���l���������*�*�,�,���F�<�(�(�		*�	*�	*�
�M�M��	���l���������*�*�,�,���F�<�(�(�	*�	*�	*�

�M�M��	���l���������*�*�,�,�
0�	1�	1�	1�
�M�M��	���l���������*�*�,�,�
�	�	�	�	�	r"c��d�}d�}t��}|�|��|�|j���d�d����|�|j���d��t��}|�|��|�|j���d|jt|j	��fz�d��|j	z��|�
d|j�����dS)Nc��|dg��gS�Nr:r-r�s  r!�
non_error_appz8HandlerTests.testBasicErrorOutput.<locals>.non_error_app����
�A�h�r�N�N�N��Ir"c� �td���)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

rIrNz<Status: %s
Content-Type: text/plain
Content-Length: %d

r_)rfr�rmr�rTrKrR�error_statusr��
error_bodyr�)rr�r�rWs    r!�testBasicErrorOutputz!HandlerTests.testBasicErrorOutput�sH��	�	�	�	E�	E�	E�
�N�N��	���m���������*�*�,�,���F�<�(�(�	*�	*�	*�	
�����*�*�,�,�R�0�0�0��N�N��	���i���������*�*�,�,���n�S���%6�%6�7�8�:@���9M�9M��l�	
�	�	�	�	
�
�
�&���(9�(9�(;�(;�<�<�<�<�<r"c�<��d��fd�}t��}|�|��|�|j���d�d���z��|�d|j�����dS)N�Some output has been sentc�L��|dg�����td���)Nr:r�r�)r�r��MSGs  �r!r�z4HandlerTests.testErrorAfterOutput.<locals>.error_app�s,����A�A�h�r�N�N�3���� �!C�D�D�Dr"zStatus: 200 OK

rIr_)rfr�rmr�rTrKr�rR)rr�rWr�s   @r!�testErrorAfterOutputz!HandlerTests.testErrorAfterOutput�s����*��	E�	E�	E�	E�	E�
�N�N��	���i���������*�*�,�,���6�,�'�'��,�	.�	.�	.�	
�
�
�&���(9�(9�(;�(;�<�<�<�<�<r"c
�2�d�}d}d�d��}dD�]x}|rd|zpd}dD�]h}d	D�]a}t|�
��}d|_||_||_|�|��|�||j�����t|�
��}d|_||_||_|�|��|d
kr.|�|j���d����|�	tj|||fz�d��|j�����|||fz�d��|j���f����c��j��zdS)Nc��|dg��gSr�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)z1.0z1.1)�HTTP/0.9rzHTTP/1.1)rFTr�r")rKrn�
origin_server�http_version�server_softwarer�rmr�rTr��rerc)	rr��stdpat�shortpat�ssw�swrk�protorWs	         r!�testHeaderFormatszHandlerTests.testHeaderFormats�s���	�	�	�

3�	�
@�
�&��
�
�	�&�	�	�C��/�)�C�/�5�2�B�'�
�
��?���E�#�E�:�:�:�A�&+�A�O�%,�A�N�(+�A�%��E�E�-�(�(�(��$�$�X�a�h�.?�.?�.A�.A�B�B�B�#�E�:�:�:�A�&*�A�O�%,�A�N�(+�A�%��E�E�-�(�(�(��j�(�(��(�(���):�):�)<�)<�S�A�A�A�A�����H�f�g�b�\�&9�%A�%A�,�%O�%O� !�� 1� 1� 3� 3�5�5�$�g�b�\�1�9�9�,�G�G� !�� 1� 1� 3� 3�5�����#�
�	�	r"c��d�}t��}|�|��|�d|j�����dS)Nc�"�|ddg��dgS)Nr:r�r�r-r�s  r!rUz'HandlerTests.testBytesData.<locals>.app�s*��
�A�h�=��
�
�
��9�r"sRStatus: 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 4

data)rnr�rmr�rT)rrUrWs   r!�
testBytesDatazHandlerTests.testBytesData�se��	�	�	�
�M�M��	���c�
�
�
�����

�H�����	!�	!�	!�	!�	!r"c����ddi�d���fd�}t��}|�|��|��dd��dS)N�close_calledFr�c�l��|dg�����G�fd�dt��}|��S)Nr:c� ��eZdZd�Z�fd�ZdS)�HHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterablec3�.K�	dV�td���)NTsblahr�r�r5s r!�__iter__zQHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterable.__iter__�s$����Q�%�
�
�
�,�-O�P�P�Pr"c���d�d<dS)NTr�r-)r�side_effectss �r!r�zNHandlerTests.testCloseOnError.<locals>.error_app.<locals>.CrashyIterable.close�s���37�L��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����A�A�h�r�N�N�3����
8�
8�
8�
8�
8�
8�
8��
8�
8�
8�"�>�#�#�#r"T)rfr�rm)rr�rWr�r�s   @@r!�testCloseOnErrorzHandlerTests.testCloseOnError�so����&��.��*��		$�		$�		$�		$�		$�		$�
�N�N��	���i��������n�5�t�<�<�<�<�<r"c�t��t���G�fd�d��}ddi}tt��|��tj|��}d}|�t|��5|�t��ddd��n#1swxYwY|�	d���dS)Nc� ��eZdZ�fd�Zd�ZdS)�4HandlerTests.testPartialWrite.<locals>.PartialWriterc�`��|dd�}��|��t|��S)N�)�extendr�)r�b�partial�writtens   �r!�writez:HandlerTests.testPartialWrite.<locals>.PartialWriter.write
s.����B�Q�B�%�����w�'�'�'��7�|�|�#r"c��dSrr-r5s r!�flushz:HandlerTests.testPartialWrite.<locals>.PartialWriter.flushs���r"N)r)r*r+r�r�)r�s�r!�
PartialWriterr�	s=�������
$�
$�
$�
$�
$�

�
�
�
�
r"r�rrzshould not do partial writesssHTTP/1.0 200 OK
Content-Type: text/plain
Date: Mon, 05 Jun 2006 18:49:54 GMT
Content-Length: 13

Hello, world!)
�	bytearrayrrrQrR�assertWarnsRegex�DeprecationWarningr�rCrm)rr�rArW�msgr�s     @r!�testPartialWritezHandlerTests.testPartialWrites����+�+��	�	�	�	�	�	�	�	�	�	�%�j�1���'�)�)�]�]�_�_�c�j�'�J�J��,��
�
"�
"�#5�s�
;�
;�	�	�
�E�E�)����	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�����
�
	�	�	�	�	s�0B�B�Bc���ddi}tttfD]��|�����5G�fd�d��}t	��}tt
��|��||��}|�t��|�	|�
����ddd��n#1swxYwY��dS)Nrr��	exceptionc���eZdZ�fd�ZdS)�EHandlerTests.testClientConnectionTerminations.<locals>.AbortingWriterc�����rr-)rr�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�rrrr�rCrrT)rrAr�rRrWr�s     @r!� testClientConnectionTerminationsz-HandlerTests.testClientConnectionTerminationss)���$�j�1��"�� �
�	4�	4�I�
���	��2�2�	
4�	
4�(�(�(�(�(�(�(�(�(�(�"����!�'�)�)�^�^�-=�-=�v�w�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�BC�C	�
C	c���Gd�dt���G�fd�d��}t��}ddi}tt��|��||��}|�t
��|�d|�����|�|j	��|�|j
��|�|j��|�|j��dS)Nc��eZdZdS)�KHandlerTests.testDontResetInternalStateOnException.<locals>.CustomExceptionNr�r-r"r!�CustomExceptionr�2r�r"r�c���eZdZ�fd�ZdS)�JHandlerTests.testDontResetInternalStateOnException.<locals>.AbortingWriterc�����rr-)rr�r�s  �r!r�zPHandlerTests.testDontResetInternalStateOnException.<locals>.AbortingWriter.write:s	���%�%r"Nr�)r�s�r!r�r�9s.�������
&�
&�
&�
&�
&�
&�
&r"r�rr)
�
ValueErrorrrrr�rCr�rT�assertIsNotNone�result�headersr�rA)rr�rRrArWr�s     @r!�%testDontResetInternalStateOnExceptionz2HandlerTests.testDontResetInternalStateOnException1s$���	�	�	�	�	�j�	�	�	�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&�����$�j�1���'�)�)�^�^�%5�%5�v�w�G�G��	���i�����
�
�'����):�):�;�;�;�	
���Q�X�&�&�&����Q�Y�'�'�'����Q�X�&�&�&����Q�Y�'�'�'�'�'r"N)r)r*r+�maxDiffr�r�r�r�r�r�r�r�r�r�r�r�r�r-r"r!rrrrs��������G�48�48�48�l*�*�*�>�>�>�A�A�A�0�0�0�d=�=�=�8=�=�=�)�)�)�V!�!�!� =�=�=�$���24�4�4�$(�(�(�(�(r"rr�__main__)6�unittestrrVr�test.supportr�test.test_httpserversrr�wsgiref.utilr�wsgiref.headersr	�wsgiref.handlersr
rr�wsgirefr
�wsgiref.validater�wsgiref.simple_serverrrr�http.clientr�iorrr�socketserverr�platformrrkr�r�rQr�rr/rCrLr\rfrhr�rErfrnrrr)�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�`:�`:�`:�D5
�5
�5
�5
�5
�(�5
�5
�5
�n

�

�

�

�

�>�

�

�

������,����x(�x(�x(�x(�x(�8�x(�x(�x(�v	�z����H�M�O�O�O�O�O��r"