
    i]#                       d dl mZ  ej                     d dlmZ d dlmZ d dlZd dlZd dl	m
Z d dlZd dlZd dlmZ d dlmZ d dl Z d dlmZmZ d dlmZ d d	l mZ d d
l mZ d dlmZ  G d dee          ZdZej        ZdddZ G d de           Z!d Z"d Z# G d de$          Z%e%j&        Z' G d dej(                  Z( G d de$          Z) G d de)e(          Z* G d de*          Z+ G d  d!e*          Z, G d" d#e,          Z- G d$ d%e*          Z. G d& d'e)e(          Z/ G d( d)e)e(          Z0 G d* d+e(          Z1 G d, d-e(          Z2 G d. d/e(          Z3 G d0 d1e(          Z4 G d2 d3e4          Z5 G d4 d5e(          Z6 G d6 d7e(          Z7 G d8 d9e(          Z8 G d: d;e(          Z9 G d< d=e(          Z:d dl;Z  e<e j=        d>          Z>e>r G d? d@e:          Z? G dA dBe:          Z@e>r G dC dDe?e@          ZA G dE dFe(          ZB G dG dHe(          ZC G dI dJeC          ZD G dK dLe(          ZE G dM dNeE          ZF G dO dPeE          ZG G dQ dRe(          ZH G dS dTe(          ZI G dU dVeI          ZJ G dW dXe(          ZK G dY dZe(          ZL G d[ d\e(          ZM G d] d^e(          ZN G d_ d`e(          ZO G da dbe(          ZP G dc ddeK          ZQ G de dfe(          ZR G dg dhe(          ZS G di dje(          ZT G dk dle(          ZU G dm dne(          ZV G do dpe(          ZW G dq dre(          ZX G ds dte(          ZY G du dve(          ZZ G dw dxe(          Z[ddyZ\ G dz d{ej]                  Z^ G d| d}e(          Z_ G d~ de(          Z` G d de(          Zaebdk    r ejc                     dS dS )    )monkey)contextmanager)parse_qsN)BytesIO)	validator)PY3PYPY)ExpectedException)socket)pywsgi)Inputc                       e Zd ZdZdS )ExpectedAssertionErrorzAn expected assertion errorN)__name__
__module____qualname____doc__     D/usr/local/lib/python3.11/dist-packages/gevent/tests/test__pywsgi.pyr   r   ,   s        %%%%r   r   Content-LengthOKInternal Server Error)     c                       e Zd ZdS )ConnectionClosedNr   r   r   r   r   r   r   r   8   s        Dr   r   c                    |                                  }|st          |                    d          }i }	 |                                                                  }|sn|                    d          }	 |                    dd          \  }}n#  t          d|            xY w|                                d |D             vsJ d|d|d	|            |||<   ||fS )
Nlatin-1T:    zFailed to split: c                 6    h | ]}|                                 S r   )lower).0xs     r   	<setcomp>zread_headers.<locals>.<setcomp>L   s     ">">">17799">">">r   zHeader :z sent more than once: )readliner   decodestripsplitprintr$   )fdresponse_lineheaderslinekeyvalues         r   read_headersr4   <   s   KKMMM !((33MG{{}}""$$ 	{{9%%	D!,,JC	E442333yy{{">">g">">">>>>>jmjmjmotototv}v}@~>>> '!!s   5B B$c              #     K   	 |                                  }|                                }t          |d          }|dk    r4|                     d          }|dk    sJ t	          |                      d S |                     |          }|V  |                     d          }|dk    sJ t	          |                      )NT   r         
)r)   r+   intreadrepr)r.   r1   
chunk_sizecrlfdatas        r   iread_chunksr?   Q   s      +{{}}ZZ\\
R((
??771::D7???DJJ???Ewwz""


wwqzzwT

+r   c                   Z    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
e	 	 dd            ZdS )Responsec                    || _         || _        d | _        d| _        	 |d d                             dd          \  }}| _        t          |          | _        |                    d          \  }| _        |dk    sJ t          |                      | j        dv sJ t          | j                              d S # t          $ r t          d|z              w xY w)	NF r7   /HTTP)1.01.1z	Error: %r)status_liner0   bodychunksr,   reasonr9   codeversionr;   	Exceptionr-   )selfrI   r0   rN   rM   rF   s         r   __init__zResponse.__init__b   s    &		)4SbS)9)?)?Q)G)G&GT4;D		DI!(s!3!3D$,6>>>4::>>><>11143E3E11111 	 	 	++,,,	s   BB: :Cc              #   @   K   | j         V  | j        V  | j        V  d S N)rI   r0   rJ   rP   s    r   __iter__zResponse.__iter__q   s2      lir   c                 V    | j         j        | j        | j        | j        | j        f}d|z  S )Nz0<%s status_line=%r headers=%r body=%r chunks=%r>)	__class__r   rI   r0   rJ   rK   )rP   argss     r   __str__zResponse.__str__v   s-    ')94<TXT_`ADHHr   c                     t          |d          r#| j        |v sJ d| j        d|d|             d S | j        |k    sJ d| j        d|d|             d S )N__contains__zUnexpected code:  (expected )
)hasattrrM   )rP   rM   s     r   
assertCodezResponse.assertCodez   s    4(( 	h9$$$$QUQZQZQZ\`\`\`bfbf&g$$$$$9$$$$QUQZQZQZ\`\`\`bfbf&g$$$$$r   c                 L    | j         |k    sJ d| j         d|d|             d S )NzUnexpected reason: r\   r]   )rL   )rP   rL   s     r   assertReasonzResponse.assertReason   sB    {f$$$$SWS^S^S^`f`f`fhlhl&m$$$$$r   c                 L    | j         |k    sJ d| j         d|d|             d S )NzUnexpected version: r\   r]   )rN   )rP   rN   s     r   assertVersionzResponse.assertVersion   sB    |w&&&&VZVbVbVbdkdkdkmqmq(r&&&&&r   c           	      t    | j                             |d          }||k    sJ d|d|d|d|             d S )NFzUnexpected header r!   r\   r]   )r0   get)rP   headerr3   
real_values       r   assertHeaderzResponse.assertHeader   sZ    \%%fe44
U""""<BFFJJJPUPUPUW[W[\ #""""r   c                     t          |t                    rt          r|                    d          }| j        |k    sJ d| j        d|d|             d S )NasciizUnexpected body: r\   r]   )
isinstancestrr   encoderJ   )rP   rJ   s     r   
assertBodyzResponse.assertBody   sh    dC   	(S 	(;;w''DyD    TYYYX\X\X\^b^b"c     r   r   defaultrH   Nc                    t          |          \  }}	 | ||	          }
||
                    |           |dk    rt                              |          }||
                    |           ||
                    |           |
j        dk    r|
S |:t          |t                    rt          |          }|

                    d|           d|	                    dd          v rYt          |	v rt          d           t          t          |                    |
_        d	                    |
j                  |
_        nWt          |	v r5t          |	t                             }|                    |          |
_        n|                                |
_        ||
                    |           |||
j        k    sJ ||
j        f            |
S )
zo
        Read an HTTP response, optionally perform assertions,
        and return the Response object.
        Nro   d   r   chunkedTransfer-Encoding zhWARNING: server used chunked transfer-encoding despite having Content-Length header (libevent 1.x's bug)r   )r4   r_   REASONSre   ra   rc   rM   rk   r9   rl   rh   CONTENT_LENGTHr-   listr?   rK   joinrJ   r:   rn   )clsr.   rM   rL   rN   rJ   rK   content_length_status_liner0   rP   nums               r   r:   zResponse.read   s    !-R 0 0gs<))OOD!!!Y[[&&Ff%%%w'''9K%.#.. 5!$^!4!4.???$7<<<<((  A  B  B  B|B//00DK--DIIw&&gn-..CDII		DIOOD!!!T[(((64;*?(((r   )r   ro   rH   NNN)r   r   r   rQ   rU   rY   r_   ra   rc   rh   rn   classmethodr:   r   r   r   rA   rA   `   s            
I I Ih h hn n ns s s] ] ]
d d d
 :?48' ' ' [' ' 'r   rA   c                        e Zd ZdZ ee          ZdZej        Z	ej
        Z G d dej                  Zd Zd Zd Zej        rej        rd Z fdZd	 Zed
             Zed             Zd ZdZi ZddZ xZS )TestCaseNc                       e Zd ZeZdS )TestCase.handler_classN)r   r   r   r   ApplicationErrorr   r   r   handler_classr      s        1r   r   c                 l    dd l }|                    d          }|                    |j                   |S )Nr   zgevent.tests.pywsgi)logging	getLoggersetLevelCRITICAL)rP   r   loggers      r   init_loggerzTestCase.init_logger   s9    ""#899()))r   c                     |                                  x}| _        t          j        | j        df|||| j                  | _        d S )Nr   )log	error_logr   )r   r   r   
WSGIServerlisten_addrr   server)rP   applicationr   s      r   init_serverzTestCase.init_server   sP    #//111'q!&,	
 
 
r   c                 h   | j         }| j        |                     |          }|                     |           | j                                         | j        j        st          d           | j        j        | j        j        | _        | j        sJ t          j	        
                    |            d S )NzWaiting on server port)r   r   r   r   startserver_portr-   port	greentestr   setUprP   r   s     r   r   zTestCase.setUp   s    &>%..55K%%%+) 	,*+++ +) 	,K+	y  &&&&&r   c                 ^    | j                             t          j        |                     |S rS   )close_on_teardownappendweakrefref)rP   resources     r   _close_on_teardownzTestCase._close_on_teardown   s(    "))'+h*?*?@@@Or   c                     d | j         D             | _         t          t          |                                            d S )Nc                 6    g | ]} |             |            S rS   r   )r%   rs     r   
<listcomp>z5TestCase._tearDownCloseOnTearDown.<locals>.<listcomp>   s%    %]%]%]aQQSS_aacc___r   )r   superr   _tearDownCloseOnTearDownrP   rW   s    r   r   z!TestCase._tearDownCloseOnTearDown   s>    %]%]43I%]%]%]D"(D!!::<<<<<r   c                 t   t           j                            |            | j        Pt          j                            d          5  | j                                         d d d            n# 1 swxY w Y   d | _        t           j        r.dd l	}|
                                 |
                                 d S d S )N      ?r   )r   r   tearDownr   geventTimeout	start_newstopr	   gccollect)rP   r   s     r   r   zTestCase.tearDown   s    ##D)));"))#.. # #  """# # # # # # # # # # # # # # #> 	IIIJJLLLJJLLLLL	 	s   A,,A03A0c              #   "   K   t          j         j         j        f          }t          r-j         fd G fddt                    } |            }	 |V  |                                 d S # |                                 w xY w)Nc                      d|v r|                     d          |d<   d|v r | i |S d|d<    | i |}|j        fd}||_                            |           |S )Nbufsize	bufferingmoderwbc                 n    t          | t                    r|                     d          }  |           S Nrj   )rk   rl   rm   )r>   _rconn_writes    r   writez1TestCase.connect.<locals>.makefile.<locals>.write  s6    !$,, 4#{{733'<---r   )popr   r   )rX   kwargsrconnr   r   conn_makefilerP   s       @r   makefilez"TestCase.connect.<locals>.makefile  s    &&*0**Y*?*?F;'V##(=$9&999 "'v%t6v66${. . . . . $''...r   c                       e Zd Z fdZdS )TestCase.connect.<locals>.proxyc                 4    |dk    rS t          |          S )Nr   )getattr)rP   nameconnr   s     r   __getattribute__z0TestCase.connect.<locals>.proxy.__getattribute__!  s#    z))'"4...r   N)r   r   r   r   )r   r   s   r   proxyr      s3        / / / / / / / /r   r   )r   create_connectionconnect_addrr   r   r   objectclose)rP   resultr   r   r   r   s   `  @@@r   connectzTestCase.connect  s      '):DI(FGG 	 MM     */ / / / / / / / / / /
 UWWF	LLLLLNNNNNFLLNNNNs   A8 8Bc              #      K   |                                  5 }	 |                    d          }|V  |                                 n# |                                 w xY w	 d d d            d S # 1 swxY w Y   d S )Nr"   r   )r   r   r   )rP   sockr   s      r   r   zTestCase.makefile+  s      \\^^ 	tq11	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s'   A/AA/AA//A36A3c                     |                                  5 }|                    d          5 }|                    d           t          |g|R i |cd d d            cd d d            S # 1 swxY w Y   	 d d d            d S # 1 swxY w Y   d S )Nr"   r   #GET / HTTP/1.1
Host: localhost

)r   r   r   	read_http)rP   rX   r   r   r.   s        r   urlopenzTestCase.urlopen4  s2   \\^^ 	6tq)) 6RDEEE 5d555f556 6 6 6 6 6 6	6 	6 	6 	6 	6 	6 	6 	66 6 6 6 6 6 6 6 6	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6s4   B%A*B*A.	.B1A.	2BB
BrH   GETrE   c                    | j                                         }|                    |           |}d                    d |                                D                       }|r|dz   n|}d}|t          ||| j        |          z  }|S )N
c              3       K   | ]	}d |z  V  
dS )z%s: %sNr   )r%   items     r   	<genexpr>z*TestCase.format_request.<locals>.<genexpr>B  s&      JJ$hoJJJJJJr   zE%(method)s %(path)s HTTP/%(http_ver)s
Host: localhost
%(headers)s
)methodpathhttp_verr0   )DEFAULT_EXTRA_CLIENT_HEADERScopyupdaterx   itemsdictHTTP_CLIENT_VERSION)rP   r   r   r0   def_headersr   s         r   format_requestzTestCase.format_request=  s    7<<>>7###++JJ'--//JJJJJ&-:'F""7 	 $-	
 
 
 
 r   )r   rE   )r   r   r   r   staticmethodr   r   r   DEFAULT_BIND_ADDRr   DEFAULT_LOCAL_HOST_ADDRr   r   WSGIHandlerr   r   r   r   CPYTHONPY2r   r   r   r   r   r   r   r   r   r   __classcell__rW   s   @r   r   r      s[       FY''IK -K 4L2 2 2 2 2* 2 2 2  
 
 

' 
' 
'  =Y] =	 	 		= 	= 	= 	= 	=	 	 	 $ $ ^$L   ^6 6 6  #%        r   r   c                   ^    e Zd ZdZdZdZd Zd Zd Z e	j
        d          d             ZdS )	CommonTestMixinr   Fc                    |                                  5 }|                    |                                            t          |d          }|j                            d          dk    r+|                     | j        d           |d fcd d d            S |                     | j                   | j	        r|
                    dd           |                    |                     d                     t          |d	d
d          }|                    |                                            t          |d          }||fcd d d            S # 1 swxY w Y   d S )Nhello worldrJ   
Connectionr   ,Server closed connection, not expecting that
keep-alive	/notexistr     	Not Found	not foundrM   rL   rJ   )r   r   r   r   r0   re   
assertTrueEXPECT_CLOSEassertFalseEXPECT_KEEPALIVErh   )rP   r.   responsedne_responses       r   
test_basiczCommonTestMixin.test_basicX  s   ]]__ 	*HHT((**+++ -888H##L11W<< 13abbb~	* 	* 	* 	* 	* 	* 	* 	* T.///$ B%%lLAAAHHT((k(::;;;$Rc+KXXXLHHT((**+++ -888H\)	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   A5EB.EEEc                 4   t          d          }|                                 5 }|                    |                                 |                     d          z              t	          |d           	 t
          j                            d|          }	 t	          |dd	d
           |                                 n# |                                 w xY wn'# | j	        $ r Y nt           $ r}||ur Y d }~nd }~ww xY wd d d            d S # 1 swxY w Y   d S )Nz@HTTP pipelining not supported; the second request is thrown awayr   r   r   r   r   )	exceptionr   r   r   r   )
AssertionErrorr   r   r   r   r   r   r   r   PIPELINE_NOT_SUPPORTED_EXS)rP   r  r.   timeoutexs        r   test_pipelinezCommonTestMixin.test_pipelinek  s|   "#eff	]]__ 	HHT((**T-@-@k-@-R-RRSSSb}----
 .223)2LL$bs;[QQQQMMOOOOGMMOOOOO2   !   Y&& '&&&&	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s`   AD5!CB?*C?CCD
C=#D%	C=.C83D8C==DDDc                 F   |                                  5 }|                    |                                            t          |          }|j                            d          dk    r)|                     | j        d           	 d d d            d S |                     | j                   | j	        r|
                    dd           |                    |                     d                     t          |           |                    |                                            	 |                                }|                     |d|           n1# t          j        $ r}|j        d         t          vr Y d }~nd }~ww xY wd d d            d S # 1 swxY w Y   d S )Nr   r   r   r   )r   zAThe remote side is expected to close the connection, but it sent r   )r   r   r   r   r0   re   r   r   r   r   rh   r)   r   errorrX   CONN_ABORTED_ERRORS)rP   r.   r   r   r  s        r   test_connection_closez%CommonTestMixin.test_connection_close}  s	   ]]__ 	!HHT((**+++ }}H##L11W<< 13abbb	! 	! 	! 	! 	! 	! 	! 	! T.///$ B%%lLAAAHHT((G(<<===bMMMHHT((**+++	!
   Fv ! ! ! !	 <   71:%888 98888#	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!sC   A1FBF*E>FF'F<FFFFFzNot surec                    g }t          d          D ]}|                    d           d                    |          }|                                 5 }d|z  }|                    |           |                                }|                    d          d         }|                     |d           d d d            d S # 1 swxY w Y   d S )Ni  r   rE   z%GET /%s HTTP/1.0
Host: localhost

rD   r"   414)ranger   rx   r   r   r)   r,   assertEqual)rP   
path_parts_r   r.   requestr   statuss           r   test_006_reject_long_urlsz)CommonTestMixin.test_006_reject_long_urls  s   
t 	& 	&Af%%%%xx
##]]__ 	,CdJGHHW[[]]F\\#&&q)FVU+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   A C  CCN)r   r   r   r  r   r   r  r	  r  unittestskipr  r   r   r   r   r   S  sz        !#L* * *&  $! ! !6 X]:, , , , ,r   r   c                   :     e Zd ZdZdZddZd Z fdZd Z xZ	S )TestNoChunksNTc                     |r/|                      | j                            d                     d S |                     | j        d                    d S )Nwsgi.input_terminated)r   last_environre   r   )rP   input_terminateds     r   _check_environzTestNoChunks._check_environ  sX     	IOOD-112IJJKKKKKT./FGHHHHHr   c                     || _         |d         }|dk    r |ddg           ddgS |dk    r |ddd	g          } |d
           ddgS  |ddg           ddgS )N	PATH_INFOrE   200 OKzContent-Typez
text/plain   hello    world
/websocketz101 Switching Protocols)r   r   r   s   upgrading tos	   websocket404 Not Found   not    found)r  )rP   envstart_responser   r   s        r   r   zTestNoChunks.application  s    ;3;;N8&D%EFFFx((<"N#<$B %<	$=> >E E#JJJ#\22)G(HIII""r   c                 L   t          t          |                                           \  }}|                                  |                     |j                   |                    dd           |2|                     |j                   |                    dd           d S d S )Nr   119)r   r  r  r  r   rK   rh   )rP   r   r  rW   s      r   r  zTestNoChunks.test_basic  s    !&|T!:!:!E!E!G!G,))).555#\0111%%&6<<<<< $#r   c                 ^   |                                  5 }|                    |                     d                     t          |ddd          }d d d            n# 1 swxY w Y   |                     |j                   |                                  |                    dd           d S )	Nr   r   r   r   r   r   r   r.  )r   r   r   r   r   rK   r  rh   rP   r.   r   s      r   test_dnezTestNoChunks.test_dne  s    ]]__ 	UHHT((k(::;;; #kTTTH	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	))).44444   =AA"%A")T)
r   r   r   r   r  r  r   r  r1  r   r   s   @r   r  r    sz         ILI I I I# # #$= = = = =5 5 5 5 5 5 5r   r  c                       e Zd Zd Zd ZdS )TestConnectionUpgradesc                 4   |                                  5 }|                    |                     dd                     t          |d          }d d d            n# 1 swxY w Y   |                     d           |                     |j                   d S )Nr&  upgrade)r   r   e   rM   Fr  r   r   r   r   r  r   rK   r0  s      r   test_connection_upgradez.TestConnectionUpgrades.test_connection_upgrade  s    ]]__ 	/HHT((ly(QQRRR #...H	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	U333)))))   <AA!$A!c                 4   |                                  5 }|                    |                     dd                     t          |d          }d d d            n# 1 swxY w Y   |                     d           |                     |j                   d S )Nr&  	websocket)r   Upgrader7  r8  Fr9  r:  r0  s      r   test_upgrade_websocketz-TestConnectionUpgrades.test_upgrade_websocket  s    ]]__ 	/HHT((lK(PPQQQ #...H	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	U333)))))r<  N)r   r   r   r;  r@  r   r   r   r4  r4    s2        * * ** * * * *r   r4  c                       e Zd ZdZefZdZdS )TestNoChunks10rG   TN)r   r   r   r   r   r  r   r   r   r   rB  rB    s"        "2!4LLLr   rB  c                       e Zd ZddiZdZdZdS )TestNoChunks10KeepAliver   r   FTN)r   r   r   r   r   r   r   r   r   rD  rD    s*        l$  Lr   rD  c                       e Zd Zd ZdS )TestExplicitContentLengthc                     || _         |                     |                    d                     |d         }|dk    r |dddg           ddgS  |d	dd
g           ddgS )Nr  r!  rE   r"  r#  )r   r-  r$  r%  r'  )r   r.  r(  r)  )r  r   re   )rP   r*  r+  r   s       r   r   z%TestExplicitContentLength.application  s     788999;3;;N8&DF^%_```x(()GI`(abbb""r   Nr   r   r   r   r   r   r   rF  rF    s#        	# 	# 	# 	# 	#r   rF  c                   $    e Zd Zed             ZdS )	TestYieldc              #   n   K   | d         }|dk    r |ddg           dV  d S  |ddg           dV  d S )Nr!  rE   r"  r#  s   hello worldr'  	   not foundr   r*  r+  r   s      r   r   zTestYield.application  si      ;3;;N8&D%EFFF      N?-K,LMMMr   Nr   r   r   r   r   r   r   r   rJ  rJ    s-          \  r   rJ  c                   (    e Zd ZdZed             ZdS )TestBytearrayNc                     | d         }|dk    r+ |ddg           t          d          t          d          gS  |ddg           t          d          gS )	Nr!  rE   r"  r#  r$  r%  r'  rL  	bytearrayrM  s      r   r   zTestBytearray.application  sm    ;3;;N8&D%EFFFi(()H*=*=>>)G(HIII,''((r   )r   r   r   r   r   r   r   r   r   rP  rP    s2        I) ) \) ) )r   rP  c                   *    e Zd Zed             Zd ZdS )TestMultiLineHeaderc                 :    d| d         v sJ  |ddg           dgS )Nztest.submitCONTENT_TYPEr"  r#  s   okr   r*  r+  s     r   r   zTestMultiLineHeader.application"  s5    N 33333x"@!ABBBwr   c                     d                     d          }|                                 5 }|                    |           t          |           ddd           dS # 1 swxY w Y   dS )z
issue #116r   )POST / HTTP/1.0Host: localhostz9Content-Type: multipart/related; boundary="====XXXX====";z$ type="text/xml";start="test.submit"zContent-Length: 0rt   rt   Nrx   r   r   r   rP   r  r.   s      r   test_multiline_116z&TestMultiLineHeader.test_multiline_116(  s    ++    ]]__ 	HHWbMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   %AA #A N)r   r   r   r   r   r^  r   r   r   rU  rU  !  s<          \
    r   rU  c                   *    e Zd Zed             Zd ZdS )
TestGetArgc                    | d                              d          }t          r|                    d          }t          |                              ddg          d         } |ddg           d	|d
|                    d          gS )N
wsgi.input   rj   ar"   r   r"  r#  za is z
, body is )r:   r   r*   r   re   rm   )r*  r+  rJ   rd  s       r   r   zTestGetArg.application8  s    < %%a(( 	(;;w''DTNNsQC((+x"@!ABBBB*+!!TT2::7CCDDr   c                     d                     d          }|                                 5 }|                    |           |                    d           t          |d           d d d            d S # 1 swxY w Y   d S )Nr   )rZ  r[  zContent-Length: 3rt   za=a01234567890123456789za is a, body is a=ar   r\  r]  s      r   test_007_get_argzTestGetArg.test_007_get_argA  s     ++    ]]__ 	6HHW HH+,,,b45555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6s   <A33A7:A7N)r   r   r   r   r   rg  r   r   r   r`  r`  6  s?        E E \E6 6 6 6 6r   r`  c                   .    e Zd ZdZd Zd ZdZd Zd ZdS )TestCloseIterNc                       |ddg           | S Nr"  r#  r   rP   r*  r+  s      r   r   zTestCloseIter.applicationW  s    x"@!ABBBr   c              #   4   K   t          d          V  dV  d S )N   Hello World   !rR  rT   s    r   rU   zTestCloseIter.__iter__[  s'      '''''




r   Fc                 &    | xj         dz  c_         d S )Nr"   )closedrT   s    r   r   zTestCloseIter.closea  s    qr   c                     d| _         |                                 5 }|                    d           t          |dddg           d d d            n# 1 swxY w Y   |                     | j         d           d S )NFr   s   Hello World!rn  ro  rJ   rK   r"   )rq  r   r   r   r  rP   r.   s     r   test_close_is_calledz"TestCloseIter.test_close_is_calledd  s    ]]__ 	OHH@AAAb7MNNNN	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	a(((((s   *AAA)	r   r   r   r   r   rU   rq  r   ru  r   r   r   ri  ri  R  s^         I     F  ) ) ) ) )r   ri  c                   .    e Zd Zg dZd Zd Zd Zd ZdS )TestChunkedApp)s   thiss   iss   chunkedc                 6    d                     | j                  S )Nr   )rx   rK   rT   s    r   rJ   zTestChunkedApp.bodyp  s    xx$$$r   c              #      K   |                      |                    d                      |ddg           | j        E d {V  d S )Nr  r"  r#  )r   re   rK   rl  s      r   r   zTestChunkedApp.applications  s[       788999x"@!ABBB;r   c                 <   |                                  5 }|                    d           t          ||                                 d           }d d d            n# 1 swxY w Y   |                    dd           |                     |j        | j                   d S )N6GET / HTTP/1.1
Host: localhost
Connection: close

rs  rs   rr   )r   r   r   rJ   rh   r  rK   r0  s      r   test_chunked_responsez$TestChunkedApp.test_chunked_responsex  s    ]]__ 	DHHUVVV $))++dCCCH	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	19===$+66666s   :AA"Ac           	         |                                  5 }|                    d           t          |          }d d d            n# 1 swxY w Y   |                     |j        |                                            |                     |j                            d          d            |j                            d          }|D|                     |t          t          |                                                                d S d S )Nz6GET / HTTP/1.0
Host: localhost
Connection: close

rs   r   )	r   r   r   r  rJ   r0   re   rl   len)rP   r.   r   rz   s       r   test_no_chunked_http_1_0z'TestChunkedApp.test_no_chunked_http_1_0  s#   ]]__ 	%HHUVVV }}H	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 			444)--.ABBDIII!)--.>??%^STYY[[1A1A-B-BCCCCC &%s   %AA
A
N)r   r   r   rK   rJ   r   r|  r  r   r   r   rw  rw  l  s`        )))F% % %  
7 7 7D D D D Dr   rw  c                        e Zd Zddz  gdz  ZdS )TestBigChunks   ai    rc  N)r   r   r   rK   r   r   r   r  r    s        Tk]QFFFr   r  c                        e Zd Zd Zd Zd ZdS )TestNegativeReadc                     |                      |                    d                      |ddg           |d         dk    r|d                             d          }|gS d S )Nr  r"  r#  r!  z/readrb  )r   re   r:   )rP   r*  r+  r>   s       r   r   zTestNegativeRead.application  sn     788999x"@!ABBB{w&&|$))"--D6M '&r   c                     d}|                                  5 }|                    |           t          |d           d d d            d S # 1 swxY w Y   d S )Nsl   POST /read HTTP/1.1
Host: localhost
Connection: close
Transfer-Encoding: chunked

2
oh
4
 hai
0

oh hair   r   r   r   rP   r>   r.   s      r   test_negative_chunked_readz+TestNegativeRead.test_negative_chunked_read      5 ]]__ 	)HHTNNNbx((((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)   'AAAc                     d}|                                  5 }|                    |           t          |d           d d d            d S # 1 swxY w Y   d S )NsT   POST /read HTTP/1.1
Host: localhost
Connection: close
Content-Length: 6

oh hair  r   r  r  s      r   test_negative_nonchunked_readz.TestNegativeRead.test_negative_nonchunked_read       ]]__ 	)HHTNNNbx((((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)r  N)r   r   r   r   r  r  r   r   r   r  r    sA          ) ) )) ) ) ) )r   r  c                   4    e Zd ZdZed             Zd Zd ZdS )TestNegativeReadlineNc                 t     |ddg           | d         dk    r| d                              d          }|gS d S )Nr"  r#  r!  z	/readlinerb  r  )r)   )r*  r+  r>   s      r   r   z TestNegativeReadline.application  sO    x"@!ABBB{{**|$--b11D6M +*r   c                     d}|                                  5 }|                    |           t          |d           d d d            d S # 1 swxY w Y   d S )Nsp   POST /readline HTTP/1.1
Host: localhost
Connection: close
Transfer-Encoding: chunked

2
oh
4
 hai
0

r  r   r  r  s      r   test_negative_chunked_readlinez3TestNegativeReadline.test_negative_chunked_readline  r  r  c                     d}|                                  5 }|                    |           t          |d           d d d            d S # 1 swxY w Y   d S )NsX   POST /readline HTTP/1.1
Host: localhost
Connection: close
Content-Length: 6

oh hair  r   r  r  s      r   !test_negative_nonchunked_readlinez6TestNegativeReadline.test_negative_nonchunked_readline  r  r  )r   r   r   r   r   r   r  r  r   r   r   r  r    sP        I  \) ) )) ) ) ) )r   r  c                   x    e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Z ej        d
          d             Z ej        d
          d             Z ej        d
          d             Z ej        d
          d             Z ej        d
          d             Z ej        d
          d             Z xZS )TestChunkedPostr   c                 V    t                                                       d| _        d S )Nr   )r   r   callsr   s    r   r   zTestChunkedPost.setUp  s    


r   c                    | xj         dz  c_         |                                         d                      |ddg           d         dk    rd                             d          }|gS d         d	k    r"t	          t          fd
d                    }|S d         dk    r t	          t          fdd                    S dd                             d          gS )Nr"   r  r"  r#  r!  z/arb     z/bc                  :     d                              d          S )Nrb  r  r:   r*  s   r   <lambda>z-TestChunkedPost.application.<locals>.<lambda>  s    c,&7&<&<Q&?&? r   r   z/cc                  :     d                              d          S )Nrb  r"   r  r  s   r   r  z-TestChunkedPost.application.<locals>.<lambda>  s    S%6%;%;A%>%> r   s   We should not get hererj   )r  r   re   r:   rw   iterrm   )rP   r*  r+  r>   liness    `   r   r   zTestChunkedPost.application  s    

a

 788999x"@!ABBB{t##|$))!,,D6M{t##????EEFFEL{t##>>>>DDEEE)3{+;+B+B7+K+KLLr   c                 H   d}|                                  5 }|                    |           t          |d           d d d            n# 1 swxY w Y   |                                  5 }|                    |                    dd                     t          |d           d d d            n# 1 swxY w Y   |                                  5 }|                    |                    dd                     t          |d           d d d            d S # 1 swxY w Y   d S )Nsi   POST /a HTTP/1.1
Host: localhost
Connection: close
Transfer-Encoding: chunked

2
oh
4
 hai
0

r  r   s   /as   /bs   /c)r   r   r   replacer  s      r   test_014_chunked_postz%TestChunkedPost.test_014_chunked_post  s   5 ]]__ 	)HHTNNNbx((((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)
 ]]__ 	)HHT\\%//000bx((((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) ]]__ 	)HHT\\%//000bx((((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s5   'A

AA);B00B47B4;DDDc                     d}|                                  5 }|                    |           t          |d           d d d            d S # 1 swxY w Y   d S )Nst   POST /a HTTP/1.1
Host: localhost
Connection: close
Content-Length: 12
Transfer-Encoding: chunked

{"hi": "ho"}  r8  r  r  s      r   #test_229_incorrect_chunk_no_newlinez3TestChunkedPost.test_229_incorrect_chunk_no_newline  s    
  ]]__ 	$HHTNNNbs####	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$r  c                     d}|                                  5 }|                    |           t          |d           d d d            d S # 1 swxY w Y   d S )Nsv   POST /a HTTP/1.1
Host: localhost
Connection: close
Content-Length: 12
Transfer-Encoding: chunked

{"hi": "ho"}
r  r8  r  r  s      r    test_229_incorrect_chunk_non_hexz0TestChunkedPost.test_229_incorrect_chunk_non_hex  s    $ ]]__ 	$HHTNNNbs####	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$r  c                     d}|                                  5 }|                    |           t          |d           d d d            d S # 1 swxY w Y   d S )Nsw   POST /a HTTP/1.1
Host: localhost
Connection: close
Transfer-Encoding: chunked

2;token="oh hi"
oh
4
 hai
0

r  r   r  r  s      r   !test_229_correct_chunk_quoted_extz1TestChunkedPost.test_229_correct_chunk_quoted_ext  s    C ]]__ 	)HHTNNNbx((((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)r  c                     d}|                                  5 }|                    |           t          |d           d d d            d S # 1 swxY w Y   d S )Nu   POST /a HTTP/1.1
Host: localhost
Connection: close
Transfer-Encoding: chunked

2;token=oh_hi
oh
4
 hai
0

r  r   r  r  s      r    test_229_correct_chunk_token_extz0TestChunkedPost.test_229_correct_chunk_token_ext  s    A ]]__ 	)HHTNNNbx((((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)r  c                     d}|                     dddz            }|                                 5 }|                    |           t          |d           d d d            d S # 1 swxY w Y   d S )Nr  s   oh_his   _oh_hii  r  r8  )r  r   r   r   r  s      r   +test_229_incorrect_chunk_token_ext_too_longz;TestChunkedPost.test_229_incorrect_chunk_token_ext_too_long  s    A ||Hi$&677]]__ 	$HHTNNNbs####	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   'A$$A(+A(zMaybe hangsc                 4   d}d}|                                  5 }|                    |           t          |d           |                    |           t          |d           d d d            n# 1 swxY w Y   |                     | j        d           d S )Ns   POST /a HTTP/1.1
Host: localhost
Connection: keep-alive
Transfer-Encoding: chunked

2
oh
4
 hai
0
trailer1: value1
trailer2: value2

sg   POST /a HTTP/1.1
Host: localhost
Connection: close
Transfer-Encoding: chunked

2
oh
4
 bye
0
r  r   oh byer7   r   r   r   r  r  )rP   data1data2r.   s       r   test_trailers_keepalive_ignoredz/TestChunkedPost.test_trailers_keepalive_ignored#  s     	  	 ]]__ 	)HHUOOObx((((HHUOOObx((((		) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	Q'''''s   AA22A69A6c                 2   d}|                                  5 }|                    |           t          |d           |                     t                    5  t          |           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Ns   POST /a HTTP/1.1
Host: localhost
Connection: close
Transfer-Encoding: chunked

2
oh
4
 hai
0
GETpath2a:123 HTTP/1.1
Host: a.com
Connection: close

r  r   )r   r   r   assertRaisesr   r  s      r   test_trailers_close_ignoredz+TestChunkedPost.test_trailers_close_ignoredG  s    	" ]]__ 	HHTNNNbx((((""#344  "              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s6   ABA4(B4A8	8B;A8	<BBBc                 Z   d}|dt           j        z  z  }|                                 5 }|                    |           t	          |d           |                     t                    5  t	          |d           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Ns|   POST /a HTTP/1.1
Host: localhost
Connection: keep-alive
Transfer-Encoding: chunked

2
oh
4
 hai
0
trailer2: value2   tr  r   r  )r   MAX_REQUEST_LINEr   r   r   r  r   r  s      r   test_trailers_too_longz&TestChunkedPost.test_trailers_too_long`  s0   
  	 	v... ]]__ 	-HHTNNNbx((((""#344 - -"8,,,,- - - - - - - - - - - - - - -	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s6   AB *B<B B	B B	B  B$'B$c                 f   d}|                                  5 }|                    |           t          |d           |                     t                    5  t          |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     | j        d           d S )Ns   POST /a HTTP/1.1
Host: localhost
Connection: keep-alive
Transfer-Encoding: chunked

2
oh
4
 hai
0GET /path2?a=:123 HTTP/1.1
Host: a.com
Connection: close

r  r   r"   r   r   r   r  r   r  r  r  s      r   =test_trailers_request_smuggling_missing_last_chunk_keep_alivezMTestChunkedPost.test_trailers_request_smuggling_missing_last_chunk_keep_alivey  s%    	" ]]__ 	HHTNNNbx((((""#344  "              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	Q'''''s6   ABA4(B4A8	8B;A8	<BBBc                 j   d}|                                  5 }|                    |           t          |d           |                     t                    5  t          |d           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     | j        d           d S )Ns   POST /a HTTP/1.1
Host: localhost
Connection: keep-alive
Transfer-Encoding: chunked

2
oh
4
 hai
0
Header: value
GET /path2?a=:123 HTTP/1.1
Host: a.com
Connection: close

r  r   r  r8  r"   r  r  s      r   ,test_trailers_request_smuggling_header_firstz<TestChunkedPost.test_trailers_request_smuggling_header_first  s-    	 ]]__ 	(HHTNNNbx((((""#344 ( ("3''''( ( ( ( ( ( ( ( ( ( ( ( ( ( (	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	Q'''''s6   ABA6*B6A:	:B=A:	>BBBc                    d}|                                  5 }|                    |           t          |d           t          |d           d d d            n# 1 swxY w Y   |                     | j        d           d S )Ns   POST /a HTTP/1.1
Host: localhost
Connection: keep-alive
Transfer-Encoding: chunked

2
oh
4
 hai
0

Header: valueGET /path2?a=:123 HTTP/1.1
Host: a.com
Connection: close

r  r   r  r8  r"   r  r  s      r   >test_trailers_request_smuggling_request_terminates_then_headerzNTestChunkedPost.test_trailers_request_smuggling_request_terminates_then_header  s     	  ]]__ 	$HHTNNNbx((((bs####	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$
 	Q'''''s   8AA"A)r   r   r   r  r   r   r  r  r  r  r  r  r   skipOnWindowsr  r  r  r  r  r  r   r   s   @r   r  r    s       E    M M M") ) )"$ $ $
$ 
$ 
$) ) )) ) )$ $ $ Y]++!( !( ,+!(F Y]++  ,+0 Y]++- - ,+-0 Y]++( ( ,+(@ Y]++( ( ,+(2 Y]++( ( ,+( ( ( ( (r   r  c                   \    e Zd ZdZdZ e eeez                       Zd Zd Z	d Z
d ZdS )TestUseWrites   abcdes   endc                 \   |d         dk    r& |ddd| j         fg          } || j                   ns|d         dk    r |ddg          } || j                   nI|d         dk    r. |ddg          } || j                    || j                   nt          d          | j        gS )	Nr!  z/explicit-content-lengthr"  r#  r   z/no-content-lengthz/no-content-length-twicezInvalid url)rz   rJ   rO   end)rP   r*  r+  r   s       r   r   zTestUseWrite.application  s    {999"N8.L/?AT.U.W X XEE$)!555"N8.L-MNNEE$)!;;;"N8.L-MNNEE$)E$) M***zr   c                 &   |                                  5 }|                    d           t          || j        | j        z             }d d d            n# 1 swxY w Y   |                    d| j                   |                    dd           d S )NzMGET /explicit-content-length HTTP/1.1
Host: localhost
Connection: close

r   r   rs   F)r   r   r   rJ   r  rh   rz   r0  s      r   test_explicit_content_lengthz)TestUseWrite.test_explicit_content_length  s    ]]__ 	@HHlmmm $)dh*>???H	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	.0CDDD1599999   4AAAc                    |                                  5 }|                    d           t          || j        | j        z             }d d d            n# 1 swxY w Y   |                    dd           |                    dd           d S )NzGGET /no-content-length HTTP/1.1
Host: localhost
Connection: close

r   r   Frs   rr   )r   r   r   rJ   r  rh   r0  s      r   test_no_content_lengthz#TestUseWrite.test_no_content_length  s    ]]__ 	@HHfggg $)dh*>???H	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	.66619=====r  c                    |                                  5 }|                    d           t          || j        | j        z   | j        z             }d d d            n# 1 swxY w Y   |                    dd           |                    dd           |                     |j        | j        | j        | j        g           d S )NzMGET /no-content-length-twice HTTP/1.1
Host: localhost
Connection: close

r   r   Frs   rr   )r   r   r   rJ   r  rh   r  rK   r0  s      r   test_no_content_length_twicez)TestUseWrite.test_no_content_length_twice  s   ]]__ 	LHHlmmm $)di*?$(*JKKKH	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	.66619===49di*JKKKKKr<  N)r   r   r   rJ   r  rl   r~  rz   r   r  r  r  r   r   r   r  r    sz        D
CSTCZ))N  ": : :> > >L L L L Lr   r  c                       e Zd Zej                            ej                            e          d          Zej                            ej                            e          d          Z	d Z
ddZd ZdS )	HttpsTestCaseztest_server.crtztest_server.keyc                 b    t          j        | j        df|| j        | j                  | _        d S )Nr   certfilekeyfile)r   r   r   r  r  r   r   s     r   r   zHttpsTestCase.init_server  s7    ')91(={15V V Vr   r   Nc           	         dd l }|                                 5 }|                    |          5 }|                    d          5 }|                    d|z             |U|                    dt          |          z             |                    |           |                    d          ||d<   n|                    d           |                                 t          |fi |cd d d            cd d d            cd d d            S # 1 swxY w Y   	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   r"   r   z %s / HTTP/1.1
Host: localhost
zContent-Length: %s

rJ   r   )	sslr   wrap_socketr   r   r~  re   flushr   )rP   r   	post_bodyr   r  raw_sockr   r.   s           r   r   zHttpsTestCase.urlopen  s0   


\\^^ 	3x** 3d]]1]-- 3HHCfLMMM ,!=I!NOOO+++!::f--5-6F6N(((HHJJJ$R226223 3 3 3 3 3 33 3 3 3 3 3 3	3 	3 	3 	3 	3 	3 	3 	33 3 3 3 3 3 3 3 33 3 3 3 3 3 3 3 3 3 3 3 3 3 3	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s_   E D(B%D+D(7E DD(DD(E (D,	,E /D,	0E  EEc                     |d         dk    sJ |d                      |ddg           |d                              d          gS )Nzwsgi.url_schemehttpsr"  r#  rb  
   r  rP   environr+  s      r   r   zHttpsTestCase.application  sY    ()W444g>O6P444x"@!ABBB%**2..//r   )r   N)r   r   r   osr   rx   dirname__file__r  r  r   r   r   r   r   r   r  r    s        w||BGOOH557HIIHgll27??8446GHHGV V V3 3 3 3"0 0 0 0 0r   r  create_default_contextc                       e Zd Zd ZdS )HttpsSslContextTestCasec                     ddl m}  |            }|                    | j        | j                   t          j        | j        df||          | _        d S )Nr   )_create_unverified_contextr  )ssl_context)	
gevent.sslr  load_cert_chainr  r  r   r   r   r   )rP   r   r  contexts       r   r   z#HttpsSslContextTestCase.init_server#  sp     >=====0022G##T]DL#QQQ +T-=q,A,7WN N NDKKKr   N)r   r   r   r   r   r   r   r  r  "  s(        	N 	N 	N 	N 	Nr   r  c                   6    e Zd Z eed          rd Zd ZdS dS )	TestHttpsr  c                 j    |                      dd          }|                     |j        d           d S )NPOSTabc)r   r  r   r  rJ   rP   r   s     r   test_012_ssl_serverzTestHttps.test_012_ssl_server5  s5    \\5\AAFV[%00000r   c                 d    |                                  }|                     |j        d           d S )Nrt   r  r  s     r   test_013_empty_returnzTestHttps.test_013_empty_return9  s-    \\^^FV["-----r   N)r   r   r   r^   r   r  r  r   r   r   r  r  1  sP        wvu .	1 	1 	1	. 	. 	. 	. 	.. .r   r  c                       e Zd ZdS )TestHttpsWithContextNr   r   r   r   r  r  >  s        r   r  c                       e Zd ZdZd Zd ZdS )TestInternationalNc                     d}t           r|                    d          }|                     |d         |           |                     |d         d            |ddg           g S )Ns   /приветr    r!  QUERY_STRINGzC%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81=%D0%BE%D1%82%D0%B2%D0%B5%D1%82
200 PASSEDr#  )r   r*   r  )rP   r  r+  
path_bytess       r   r   zTestInternational.applicationD  st    I
 	6#**955J-z:::02wxxx|&D%EFFF	r   c           	      2   |                                  5 }|                    d                    dd                     |                                5 }t	          |dddd           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )	Ns   GET /%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82?%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81=%D0%BE%D1%82%D0%B2%D0%B5%D1%82 HTTP/1.1
Host: localhost
Connection: close

   
r8   PASSEDFrt   r   )rL   rK   rJ   rz   )r   sendallr  r   r   )rP   r   r.   s      r   testzTestInternational.testO  s<   \\^^ 	XtLL GE7    XB"Xe"UVWWWWX X X X X X X X X X X X X X X	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	Xs5   >BA4(B4A8	8B;A8	<BBBr   r   r   r   r   r  r   r   r   r  r  A  s<        I	 	 		X 	X 	X 	X 	Xr   r  c                   D     e Zd ZdZdZdZeZ fdZ fdZ	d Z
d Z xZS )"TestNonLatin1HeaderFromApplicationFNs   Ὂ3c                 d    t          t          |                                            g | _        d S rS   )r   r
  r   errorsr   s    r   r   z(TestNonLatin1HeaderFromApplication.setUpb  s+    0$77==???r   c                 d    g | _         t          t          |                                            d S rS   )r  r   r
  r   r   s    r   r   z+TestNonLatin1HeaderFromApplication.tearDownf  s-    0$77@@BBBBBr   c                     	  |ddd| j         fg           n9#  | j                            t          j                    d d                     xY wg S )Nr  r#  zCustom-Headerr7   )rf   r  r   sysexc_infor  s      r   r   z.TestNonLatin1HeaderFromApplication.applicationj  sj    	N<:,dk:<= = = =	Ks|~~bqb1222	s	    6Ac                    |                                  5 }|                                  |                    d           |                                5 }| j        rt          |dd           |                     t          j                   | 	                    t          | j                  d           | j        d         \  }}|                     |t                     n:t          |dd	           | 	                    t          | j                  d           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )
Ns   GET / HTTP/1.1

r   r   )rM   rL   )
where_typer"   r   r   r  )r   expect_one_errorr  r   should_errorr   assert_errorr   SecureEnvironr  r~  r  assertIsInstanceUnicodeError)rP   r   r.   r  vs        r   r  z'TestNonLatin1HeaderFromApplication.testu  s   \\^^ 	:t!!###LL6777 	:B$ :bs3JKKKK%%1E%FFF$$S%5%5q999;q>DAq))!\::::bs8<<<<$$S%5%5q999	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:s6   >D?CD'D?'D+	+D?.D+	/D??EE)r   r   r   error_fatalr   rf   r   r  r   r   r   r  r   r   s   @r   r
  r
  [  s        KIFL    C C C C C	 	 	: : : : : : :r   r
  c                       e Zd ZdZdZdS ))TestNonLatin1UnicodeHeaderFromApplicationu   Ὂ3TN)r   r   r   rf   r  r   r   r   r  r    s        F LLLr   r  c                       e Zd ZdZd Zd ZdS )TestInputReadlineNc                    |d         }g }	 |                                 }|snDt          r|                    d          n|}|                    t	          |          dz              [ |dg            t          rd |D             n|S )Nrb  Trj   rD   	200 helloc                 8    g | ]}|                     d           S rj   rm   r%   ls     r   r   z1TestInputReadline.application.<locals>.<listcomp>  $    111a!!111r   )r)   r   r*   r   r;   rP   r  r+  inputr  r1   s         r   r   zTestInputReadline.application  s    %	+>>##D +.84;;w'''DDLLdc)***	+ 	{B'''58C1151111eCr   c                     |                                  5 }d}|                    dt          |          d|           |                                 t	          |dd           d d d            d S # 1 swxY w Y   d S )Nzhello

world
123zEPOST / HTTP/1.1
Host: localhost
Connection: close
Content-Length: z

helloz'hello\n' '\n' 'world\n' '123' )rL   rJ   )r   r   r~  r  r   )rP   r.   contents      r   r  zTestInputReadline.test  s    ]]__ 	U+GHHH7:7||||WWN O O OHHJJJb/STTTT	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	Us   AA33A7:A7r  r   r   r   r  r    sA        
 I
D 
D 
DU U U U Ur   r  c                       e Zd Zd ZdS )TestInputIterc                     |d         }g }|D ]I}|s nDt           r|                    d          n|}|                    t          |          dz              J |dg            t           rd |D             n|S )Nrb  rj   rD   r   c                 8    g | ]}|                     d           S r"  r#  r$  s     r   r   z-TestInputIter.application.<locals>.<listcomp>  r&  r   )r   r*   r   r;   r'  s         r   r   zTestInputIter.application  s    % 	+ 	+D +.84;;w'''DDLLdc)****{B'''58C1151111eCr   NrH  r   r   r   r-  r-    s(        	D 	D 	D 	D 	Dr   r-  c                       e Zd Zd ZdS )TestInputReadlinesc                     |d         }d |                                 D             }d |D             } |dg            t          rd |D             n|S )Nrb  c                 J    g | ] }t           r|                    d           n|!S r"  )r   r*   r$  s     r   r   z2TestInputReadlines.application.<locals>.<listcomp>  s.    LLLQc0'"""qLLLr   c                 2    g | ]}t          |          d z   S )rD   )r;   )r%   r1   s     r   r   z2TestInputReadlines.application.<locals>.<listcomp>  s#    444ddc!444r   r   c                 8    g | ]}|                     d           S r"  r#  r$  s     r   r   z2TestInputReadlines.application.<locals>.<listcomp>  r&  r   )	readlinesr   )rP   r  r+  r(  r  s        r   r   zTestInputReadlines.application  sm    %LL%//:K:KLLL44e444{B'''58C1151111eCr   NrH  r   r   r   r1  r1    s(        D D D D Dr   r1  c                       e Zd ZdZd Zd ZdS )
TestInputNNc                 T    |d                              d            |dg            g S )Nrb     r"  r  r  s      r   r   zTestInputN.application  s2    ""1%%%x$$$	r   c                 .    |                                   d S rS   r   rT   s    r   r  zTestInputN.test      r   r  r   r   r   r8  r8    s9         I  
    r   r8  c                   2    e Zd Z e            ZdZd Zd ZdS )TestErrorInApplicationFc                 B    t          j        d          | _        | j        )NzTestError.applicationr   r
   r  rl  s      r   r   z"TestErrorInApplication.application  s    01HII
jr   c                     |                                   |                     d           |                     t          j        | j                   d S )Nr   r8  )r  r   r  r   r
   r  rT   s    r   r  zTestErrorInApplication.test  sI    #)5tzBBBBBr   N)r   r   r   r   r  r  r   r  r   r   r   r?  r?    sG        FHHEK  C C C C Cr   r?  c                       e Zd Zd ZdS )TestError_after_start_responsec                 \    t          j        d          | _         |ddg           | j        )Nz*TestError_after_start_response.applicationr"  r#  rA  rl  s      r   r   z*TestError_after_start_response.application  s3    01]^^
x"@!ABBBjr   NrH  r   r   r   rD  rD    s#            r   rD  c                   *    e Zd Zed             Zd ZdS )TestEmptyYieldc              #   4   K    |ddg           dV  dV  d S Nr"  r#  r   r   rX  s     r   r   zTestEmptyYield.application  s2      x"@!ABBB								r   c                    g }|                                  5 }|                    d           t          |d|           |                                }d d d            n# 1 swxY w Y   |                     |dd|z             d S )Nr{  rt   rs  r   zgot garbage: %rr   r   r   r:   r  rP   rK   r.   garbages       r   test_errzTestEmptyYield.test_err  s    ]]__ 	 HHUVVVbr&1111ggiiG	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	#'87'BCCCCCs   <AA#&A#Nr   r   r   r   r   rN  r   r   r   rG  rG    sA          \
	D 	D 	D 	D 	Dr   rG  c                   *    e Zd Zed             Zd ZdS )TestFirstEmptyYieldc              #   4   K    |ddg           dV  dV  d S )Nr"  r#  r      hellor   rX  s     r   r   zTestFirstEmptyYield.application  s2      x"@!ABBB			r   c                    dg}|                                  5 }|                    d           t          |d|           |                                }d d d            n# 1 swxY w Y   |                     |d           d S )NrS  r{  r*  rs  r   rK  rL  s       r   rN  zTestFirstEmptyYield.test_err  s    ]]__ 	 HHUVVVbwv6666ggiiG	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	#&&&&&s   <A  A$'A$NrO  r   r   r   rQ  rQ    s<          \
	' 	' 	' 	' 	'r   rQ  c                   *    e Zd Zed             Zd ZdS )TestEmptyYield304c              #   2   K    |dg            dV  dV  d S )N304 Not modifiedr   r   rX  s     r   r   zTestEmptyYield304.application  s/      )2...								r   c                    |                                  5 }|                    d           t          |ddd           |                                }d d d            n# 1 swxY w Y   |                     |d           d S )Nr{  i0  rt   F)rM   rJ   rK   r   rK  )rP   r.   rM  s      r   rN  zTestEmptyYield304.test_err  s    ]]__ 	 HHUVVVbsE::::ggiiG	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	#&&&&&r2  NrO  r   r   r   rV  rV    s<          \
' ' ' ' 'r   rV  c                       e Zd ZdZd Zd ZdS )TestContentLength304Nc                     	  |ddg           n*# t           $ r} |dg            |j        cY d }~S d }~ww xY wt          d          )NrX  )r   100z
200 Raisedz)start_response did not fail but it should)r  rX   )rP   r*  r+  r  s       r   r   z TestContentLength304.application$  st    	N-0I/JKKKK 	 	 	N<,,,7NNNNNN	 HIIIs    
7277c                    d}|                                  5 }|                    d           t          |dd|d           |                                }d d d            n# 1 swxY w Y   |                     |d           d S )NzGInvalid Content-Length for 304 response: '100' (must be absent or zero)r{  r   RaisedF)rM   rL   rJ   rK   r   rK  )rP   rJ   r.   rM  s       r   rN  zTestContentLength304.test_err,  s    X]]__ 	 HHUVVVbs8$uMMMMggiiG		  	  	  	  	  	  	  	  	  	  	  	  	  	  	 
 	#&&&&&s   >A!!A%(A%r   r   r   r   r   rN  r   r   r   r[  r[  !  s:        IJ J J' ' ' ' 'r   r[  c                       e Zd ZdZd Zd ZdS )TestBody304Nc                       |dg            dgS )NrX  s   bodyr   rl  s      r   r   zTestBody304.application9  s    )2...yr   c                 `   |                                  5 }|                    d           |                     t                    5 }t	          |           d d d            n# 1 swxY w Y   |j        }|                     t          |          d           d d d            d S # 1 swxY w Y   d S )Nr{  "The 304 response must have no body)r   r   r  r  r   r  r  rl   rP   r.   excr  s       r   rN  zTestBody304.test_err=  s,   ]]__ 	LHHUVVV"">22 c"              BSWW&JKKK	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	Ls5   0B#A!B#!A%	%B#(A%	)-B##B'*B'r`  r   r   r   rb  rb  6  s<        I  L L L L Lr   rb  c                   "    e Zd ZdZdZd Zd ZdS )TestWrite304Nc                      |dg           }d| _         	  |d           d S # t          $ r}d| _         t          |j         d }~ww xY w)NrX  FrJ   T)error_raisedr  r   rX   )rP   r*  r+  r   r  s        r   r   zTestWrite304.applicationJ  sf    1266!	3E&MMMMM 	3 	3 	3 $D("'22	3s   " 
AAAc                    |                                  5 }|                    d           |                     t                    5 }t	          |           d d d            n# 1 swxY w Y   |j        }d d d            n# 1 swxY w Y   |                     t          |          d           |                     | j	        d           d S )Ns6   GET / HTTP/1.1
Host: localhost
Connection: close

re  zwrite() must raise)
r   r   r  r  r   r  r  rl   r   rk  rf  s       r   rN  zTestWrite304.test_errS  s*   ]]__ 	HHVWWW"">22 c"              B		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	R"FGGG)+?@@@@@s5   0A?A!A?!A%	%A?(A%	)
A??BB)r   r   r   r   rk  r   rN  r   r   r   ri  ri  F  sA        IL3 3 3A A A A Ar   ri  c                   $    e Zd Zed             ZdS )TestEmptyWritec                 L     |ddg          } |d            |d           g S rI  r   )r*  r+  r   s      r   r   zTestEmptyWrite.application`  s6    x*H)IJJc


c


	r   NrN  r   r   r   rn  rn  ^  s-          \  r   rn  c                   p    e Zd ZdZdZej        j        sJ  G d dej                  Zd Zd Z	d Z
d ZdS )BadRequestTestsNc                       e Zd Zd ZdS )BadRequestTests.handler_classc                      t          d          )NzShould not print a tracebackr  rT   s    r   _print_unexpected_excz3BadRequestTests.handler_class._print_unexpected_excp  s     !?@@@r   N)r   r   r   rv  r   r   r   r   rs  o  s(        	A 	A 	A 	A 	Ar   r   c                 d    |                      |d         | j                    |ddg           dgS )Nrv   r"  r#  rS  )r  rz   rl  s      r   r   zBadRequestTests.applications  s?    -.0CDDDx"@!ABBBzr   c                     d| _         |                                 5 }|                    d| j         z             t          |d           d d d            d S # 1 swxY w Y   d S )Nz-1007GET / HTTP/1.1
Host: localhost
Content-Length: %s

r   r  r8  rz   r   r   r   rt  s     r   test_negative_content_lengthz,BadRequestTests.test_negative_content_lengthx  s    $]]__ 	+HHVY]Yllmmmbz****	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+   /AAAc                     d| _         |                                 5 }|                    d| j         z             t          |d           d d d            d S # 1 swxY w Y   d S )Nr  ry  rz  r8  r{  rt  s     r   test_illegal_content_lengthz+BadRequestTests.test_illegal_content_length~  s    #]]__ 	+HHVY]Yllmmmbz****	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+r}  c                     d}|                                  5 }|                    |           t          |d           d d d            d S # 1 swxY w Y   d S )NzGET / HTTP %
r  r8  r  )rP   bad_requestr.   s      r   "test_bad_request_line_with_percentz2BadRequestTests.test_bad_request_line_with_percent  s     )]]__ 	$HH[!!!bs####	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$r  )r   r   r   r   rz   r   r   rv  r   r|  r  r  r   r   r   rq  rq  h  s        IN!7777A A A A A. A A A  
+ + ++ + +$ $ $ $ $r   rq  c                   \    e Zd ZdZdZd ZddZddZd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZdS )ChunkedInputTestsrt   Nc                 D   |d         }g }|d         }|dk    r|                     d          }|g}na|dk    r|D ]}|                    |           n@|dk    r+|                     d           |                    d           nt          d	           |d
dg           |S )Nrb  r!  z/short-readr  z/linesz/pingr"   s   pongzbad pathr"  r#  )r:   r   RuntimeError)rP   r*  r+  r(  r   pidr&   s           r   r   zChunkedInputTests.application  s    L!

2AsHH8^^ # #""""#7]]JJqMMMOOG$$$$z***x"@!ABBBr   c                 6    || j         }t          ||          S )Ndirt)r  chunk_encode)rP   rK   r  s      r   r  zChunkedInputTests.chunk_encode  s!    <9DF....r   c                 4    |                      g d|          S )N)thisz is rr   z
linez 2
line3rt   r  )r  )rP   r  s     r   rJ   zChunkedInputTests.body  s#      !_!_!_fj kkkr   c                 R    |                     d           t          |d           d S )NzGET /ping HTTP/1.1

pongr   )r   r   rt  s     r   pingzChunkedInputTests.ping  s.    
-..."6""""""r   c                 0    |                      |           d S rS   )r  rt  s     r   ping_if_possiblez"ChunkedInputTests.ping_if_possible  s    		"r   c                 d   |                                  }d|z   }|                                 5 }|                    d          5 }|                    |           t	          |d           |                     |           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )NsN   POST /short-read HTTP/1.1
transfer-encoding: Chunked
Content-Length:1000

r"   r   
this is chr   )rJ   r   r   r   r   r  )rP   rJ   reqr   r.   s        r   #test_short_read_with_content_lengthz5ChunkedInputTests.test_short_read_with_content_length  s%   yy{{gjnn\\^^ 	*tq)) *R"<0000%%b)))	* * * * * * * * * * * * * * *	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s5   B%<BB%B	B%B	B%%B),B)c                    |                                  }d|z   }|                                 5 }|                    |           t          |d           |                     |           d d d            d S # 1 swxY w Y   d S )NsK   POST /short-read HTTP/1.1
transfer-encoding: Chunked
Content-Length:0

r  r   rJ   r   r   r   r  rP   rJ   r  r.   s       r   (test_short_read_with_zero_content_lengthz:ChunkedInputTests.test_short_read_with_zero_content_length  s    yy{{dgkk ]]__ 	&HHSMMMb|,,,,!!"%%%		& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&   <A77A;>A;c                    |                                  }d|z   }|                                 5 }|                    |           t          |d           |                     |           d d d            d S # 1 swxY w Y   d S )N9   POST /short-read HTTP/1.1
transfer-encoding: Chunked

r  r   r  r  s       r   test_short_readz!ChunkedInputTests.test_short_read  s    yy{{PSWW]]__ 	&HHSMMMb|,,,,!!"%%%		& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&r  c                    |                      d          }d|z   }|                                 5 }|                    |           t          |d           |                     |           d d d            d S # 1 swxY w Y   d S )Nz; here is dirt blar  s3   POST /ping HTTP/1.1
transfer-encoding: Chunked

r  r   r  r  s       r   	test_dirtzChunkedInputTests.test_dirt  s    yy3y44JTQ]]__ 	&HHSMMMbv&&&&!!"%%%		& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   <A99A= A=c                 ,   |                                  }dt          |          z  }|                    d          }||z  }|                                 5 }|                    |           t          |d           d d d            d S # 1 swxY w Y   d S )NzHPOST /lines HTTP/1.1
Content-Length: %s
transfer-encoding: Chunked

r    zthis is chunked
line 2
line3r   )rJ   r~  rm   r   r   r   r  s       r   test_chunked_readlinez'ChunkedInputTests.test_chunked_readline  s    yy{{`dghldmdmnjj##t]]__ 	AHHSMMMb?@@@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	As   'B		BBc                 6   |                                   d}d|z   }|                                 5 }|                    dd          5 }|                    |           |                                 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                                 ~~t          j                    j                                         t          j	        d           t          j        r~dd l}|                                 t          j	        d           t          j                    j                                         |                                 t          j	        d           |                     t          d           d S )	Ns   4
thir  r"   wb)r   r   g{Gz?r   z1unexpected end of file while parsing chunked data)r  r   r   r   r   r   get_hubloop
update_nowsleepr   r	   r   r   r  IOError)rP   rJ   r  r   r.   r   s         r   test_close_before_finishedz,ChunkedInputTests.test_close_before_finished  s   PSWW\\^^ 	tqt44 


              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	

((***T> 	 IIIJJLLLLN!,,...JJLLLL 	'#VWWWWWs5   B*A>2B>B	BB	BBBrS   )r   r   r   r  r   r   r  rJ   r  r  r  r  r  r  r  r  r   r   r   r  r    s        DI  */ / / /l l l l# # #  * * *	& 	& 	&& & && & &A A A+X +X +X +X +Xr   r  c                       e Zd ZdZd Zd ZdS )Expect100ContinueTestsNc           	      ,   t          |d                   }|dk    r |dddg           dgS |d                             d          }||d                             |dz
            z  } |d	d
t          t          |                    fdg           |gS )Nrv   i   z417 Expectation Failed)r   7r#  s   failurerb  r"   r"  r   )r9   r:   rl   r~  )rP   r  r+  rz   texts        r   r   z"Expect100ContinueTests.application  s    W%5677D  N36MOm5nooo< |$))!,,%**>A+=>>>x#3ST^^"DFd!efffvr   c                    |                                  5 }d}|                    d|z              t          |dd           |                    d           t          |d           t          |d	
           d d d            n# 1 swxY w Y   |                                  5 }d}d                    t	          |          |          }|                    d                    t	          |          |                     t          |dd           |                    d           t          |d           t          |d	
           d d d            d S # 1 swxY w Y   d S )N  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazOPUT / HTTP/1.1
Host: localhost
Content-length: 1025
Expect: 100-continue

i  failure)rM   rJ   zSPUT / HTTP/1.1
Host: localhost
Content-length: 7
Expect: 100-continue

testingrq   r8  testingr     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazOPUT / HTTP/1.1
Host: localhost
Content-length: {}
Expect: 100-continue

{})r   r   r   formatr~  )rP   r.   paddingrJ   s       r   test_continuez$Expect100ContinueTests.test_continue(  s   ]]__ 	*GHHpszz{{{bs3333HHtuuubs####by))))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* ]]__ 
	*Gnuuvy  {B  wC  wC  EL  M  MDHHpwwx{  }A  yB  yB  DH  I  I  J  J  Jbs3333HHtuuubs####by))))
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	* 
	*s%   A$BB	B	$B%EEE)r   r   r   r   r   r  r   r   r   r  r    s7        I  * * * * *r   r  c                       e Zd ZdZd Zd ZdS )MultipleCookieHeadersTestNc                     |                      |d         d           |                      |d         d            |dg            g S )NHTTP_COOKIEzname1="value1"; name2="value2"HTTP_COOKIE2znameA="valueA"; nameB="valueB"r"  )r  r  s      r   r   z%MultipleCookieHeadersTest.applicationC  sQ    /1QRRR02RSSSx$$$	r   c                     |                                  5 }|                    d                    dd                     t          |           d d d            d S # 1 swxY w Y   d S )Nz~GET / HTTP/1.1
Host: localhost
Cookie: name1="value1"
Cookie2: nameA="valueA"
Cookie2: nameB="valueB"
Cookie: name2="value2"

r  r   )r   r   r  r   rt  s     r   r  zMultipleCookieHeadersTest.testI  s    ]]__ 	HH 
 &gdF335 5 5 bMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   9AA"Ar  r   r   r   r  r  ?  s7        I      r   r  c                   .    e Zd ZdZdZd Zd Zd Zd ZdS )TestLeakInputNc                 V    t                               |            d | _        d | _        d S rS   )r   r   _leak_wsgi_input_leak_environrT   s    r   r   zTestLeakInput.tearDownY  s,    $ $!r   c           	          |d         }|d         | _         || _        |dk    rt          j        d          |d<   d} |ddt	          t          |                    fd	g           |gS )
Nr!  rb  z/leak-framer   _leaks   foobarr"  r   r#  )r  r  r  	_getframerl   r~  )rP   r  r+  r  r  s        r   r   zTestLeakInput.application^  sv    [! ' 5$"}Q//GGx#3ST^^"DFd!efffvr   c                    |                                  5 }|                    d           |                                }d d d            n# 1 swxY w Y   |                     |                    d          |           d S )Ns%   GET / HTTP/1.0
Connection: close

   HTTP/1.1 200 OK)r   r   r:   r   
startswithrP   r.   r  s      r   !test_connection_close_leak_simplez/TestLeakInput.test_connection_close_leak_simplei  s    ]]__ 	HHCDDD		A	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	%788!<<<<<   *AAAc                 6   |                                  5 }|                    d           |                                }d d d            n# 1 swxY w Y   |                     |                    d          |           | j                            d           d S )Ns/   GET /leak-frame HTTP/1.0
Connection: close

r  r  )r   r   r:   r   r  r  r   r  s      r    test_connection_close_leak_framez.TestLeakInput.test_connection_close_leak_frameo  s    ]]__ 	HHMNNN		A	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	%788!<<<w'''''r  )	r   r   r   r  r  r   r   r  r  r   r   r   r  r  T  s[        M" " "
	 	 	= = =( ( ( ( (r   r  c                   H    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S )TestHTTPResponseSplittingNr"  r   c                     t                               |            d | _        t          j        | _        t          j        | _        d S rS   )r   r   	start_excr  r  r0   rT   s    r   r   zTestHTTPResponseSplitting.setUp  s3    t/608r   c                 H    t                               |            d | _        d S rS   )r   r   r  rT   s    r   r   z"TestHTTPResponseSplitting.tearDown  s!    $r   c                     	  || j         | j                   d | _        n# t          $ r}|| _        Y d }~nd }~ww xY wdS )Nr   )r  r0   r  rO   )rP   r  r+  es       r   r   z%TestHTTPResponseSplitting.application  sa    	"N4;555 "DNN  	 	 	DNNNNNN	 rs     
;6;c                 <   |                                  5 }|                    d           |                                 d d d            n# 1 swxY w Y   |                     | j        t
                     |                     | j        j        d         |           d S )N#GET / HTTP/1.0
Host: localhost

r   )r   r   r:   r  r  
ValueErrorr  rX   )rP   messager.   s      r   _assert_failurez)TestHTTPResponseSplitting._assert_failure  s    ]]__ 	HH@AAAGGIII	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	dnj999,Q/99999r  c                 >    d| _         |                     d           d S )Nz0200 OK
Connection: close
Content-Length: 0

z$carriage return or newline in status)r  r  rT   s    r   test_newline_in_statusz0TestHTTPResponseSplitting.test_newline_in_status  s$    PCDDDDDr   c                 @    dg| _         |                     d           d S )N)TestzHi
Connection: closez*carriage return or newline in header valuer0   r  rT   s    r   test_newline_in_header_valuez6TestHTTPResponseSplitting.test_newline_in_header_value  s'    ;<IJJJJJr   c                 @    dg| _         |                     d           d S )N)zTest
Hiz)carriage return or newline in header namer  rT   s    r   test_newline_in_header_namez5TestHTTPResponseSplitting.test_newline_in_header_name  s'    *+HIIIIIr   )r   r   r   r   r  r0   r  r   r   r   r  r  r  r  r   r   r   r  r  v  s         IFGI9 9 9    : : :E E EK K KJ J J J Jr   r  c                       e Zd ZdZd Zd ZdS )TestInvalidEnvironNc                     |                                 D ]9\  }}|dv s|                    d          r|dk    rt          d|d|          : |dg            g S )N)rv   rW  HTTP_	HTTP_HOSTz!Unexpected environment variable: =r"  )r   r  r   )rP   r  r+  r2   r3   s        r   r   zTestInvalidEnviron.application  s    !--// 	% 	%JC888CNN7<S<S8+%%00UU2$ % % %x$$$	r   c                 H   |                                  5 }|                    d           t          |           d d d            n# 1 swxY w Y   |                                  5 }|                    d           t          |           d d d            d S # 1 swxY w Y   d S )Nr  r   r  rt  s     r   r  zTestInvalidEnviron.test  s   ]]__ 	HH@AAAbMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ]]__ 	HH@AAAbMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s#   %AA
A
%%BBBr  r   r   r   r  r    s7        I      r   r  c                       e Zd ZdZd Zd ZdS )TestInvalidHeadersDroppedNc                 J    |                      d|            |dg            g S )NHTTP_X_AUTH_USERr"  )assertNotInr  s      r   r   z%TestInvalidHeadersDropped.application  s0    +W555x$$$	r   c                     |                                  5 }|                    d           t          |           d d d            d S # 1 swxY w Y   d S )Nz$GET / HTTP/1.0
x-auth_user: bob

r  rt  s     r   r  zTestInvalidHeadersDropped.test  s    ]]__ 	HHABBBbMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   %AAAr  r   r   r   r  r    s7        I  
    r   r  c                   D    e Zd ZdZ G d dej                  Zd Zd ZdS )TestHandlerSubclassNc                       e Zd Zd ZdS )!TestHandlerSubclass.handler_classc                 V   | j                             d          }|d         dk    rh|| j                             d          z  }|                                dk    r| j                            d           n|                     d|           d S || j                                         z   S )N   r   <      s   <policy-file-request/>   HELLOzInvalid request: %r)rfiler:   r$   r   r  	log_errorr)   )rP   r>   s     r   read_requestlinez2TestHandlerSubclass.handler_class.read_requestline  s    :??1%%DAw'!!
 
+++::<<#<<<K''1111NN#8$???t$*--////r   N)r   r   r   r  r   r   r   r   r    s#        	0 	0 	0 	0 	0r   r   c                      |dg            g S )Nr"  r   r  s      r   r   zTestHandlerSubclass.application  s    x$$$	r   c                    |                                  5 }|                    d           |                                 |                     |                                d           d d d            n# 1 swxY w Y   |                                  5 }|                    d           |                                 t          |           d d d            n# 1 swxY w Y   |                                  5 }|                    d           |                                 |                     |                                d           d d d            d S # 1 swxY w Y   d S )Ns   <policy-file-request/> r  r{  z<policy-file-XXXuest/> r   )r   r   r  r  r:   r   rt  s     r   r  zTestHandlerSubclass.test  s   ]]__ 	2HH2333HHJJJRWWYY111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2
 ]]__ 	HHUVVVHHJJJbMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 ]]__ 	-HH1222HHJJJRWWYY,,,		- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s7   AA33A7:A79CCC6AEEE)r   r   r   r   r   r   r   r  r   r   r   r  r    sd        I0 0 0 0 0. 0 0 0"  - - - - -r   r  c                   .    e Zd ZdZed             Zd ZdS )TestErrorAfterChunkNc              #   P   K    |ddg           dV  t          j        d          )Nr"  r#  rS  r  )r   r
   rX  s     r   r   zTestErrorAfterChunk.application  s7      x"@!ABBB)*?@@@r   c                 p   |                                  5 }|                                  |                    d           |                     t                    5  t          |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     t          j                   d S )Nz;GET / HTTP/1.1
Host: localhost
Connection: keep-alive

)	r   r  r   r  r  r   r  r   r
   rt  s     r   r  zTestErrorAfterChunk.test  s   ]]__ 	!!###HHZ[[["":..  "              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 	)566666s6   ABA5)B5A9	9B<A9	=BBB)r   r   r   r   r   r   r  r   r   r   r  r    sD        IA A \A
7 7 7 7 7r   r  c                 v    |d}d}| D ]/}dt          |          ||fz  }||                    d          z  }0|S )Nrt   r   z
%x%s
%s
rj   )r~  rm   )rK   r  bcr&   s        r   r  r    sT    |A  Aa00	QXXgHr   c                        e Zd ZddZerd f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 xZS )TestInputRawNFc                     t          |t                    rt          |          }d}n1t          |t                    rt          r|                    d          }t          t          |          ||          S )NTrj   )rz   chunked_input)rk   rw   r  rl   r   rm   r   StringIO)rP   r>   rz   r  s       r   
make_inputzTestInputRaw.make_input  sn    dD!! 	(%%D MMc"" 	(s 	(;;w''DXd^^NR_````r   c                     t          |t                    r|                    d          }t          t          |                               |||           d S r   )rk   rl   rm   r   r	  r  )rP   firstsecondmsgrW   s       r   r  zTestInputRaw.assertEqual  sN    &#&& 0w//,%%11%EEEEEr   c                 t    |                      dd          }|                     t          |j                   d S N1r7   rz   r  r  r  r:   rP   is     r   test_short_postzTestInputRaw.test_short_post"  s5    OOCO22'16*****r   c                 v    |                      dd          }|                     t          |j        d           d S r  r  r  s     r    test_short_post_read_with_lengthz-TestInputRaw.test_short_post_read_with_length&  s7    OOCO22'161-----r   c                 t    |                      dd          }|                     t          |j                   d S r  r  r  r  r)   r  s     r   test_short_post_readlinez%TestInputRaw.test_short_post_readline*  s5    OOCO22'1:.....r   c                     |                      dd          }|                                }|                     |d           d S )N12r7   r  r  r:   r  rP   r  r>   s      r   	test_postzTestInputRaw.test_post.  s@    OODO33vvxxt$$$$$r   c                     |                      dd          }|                    d          }|                     |d           d S )Nr   r7   r  r  r!  r"  s      r   test_post_read_with_lengthz'TestInputRaw.test_post_read_with_length3  sB    OODO33vvbzzt$$$$$r   c                     |                      g d          }|                                }|                     |d           d S )Nr  2rt   r   r!  r"  s      r   test_chunkedzTestInputRaw.test_chunked8  s@    OONNN++vvxxt$$$$$r   c                     |                      g d          }|                    d          }|                     |d           d S )Nr'  r  r   r!  r"  s      r   test_chunked_read_with_lengthz*TestInputRaw.test_chunked_read_with_length=  sB    OONNN++vvbzzt$$$$$r   c                 t    |                      ddg          }|                     t          |j                   d S Nr  r(  r  r  s     r   test_chunked_missing_chunkz'TestInputRaw.test_chunked_missing_chunkB  s5    OOS#J'''16*****r   c                 v    |                      ddg          }|                     t          |j        d           d S )Nr  r(  r  r  r  s     r   +test_chunked_missing_chunk_read_with_lengthz8TestInputRaw.test_chunked_missing_chunk_read_with_lengthF  s7    OOS#J'''162.....r   c                 t    |                      ddg          }|                     t          |j                   d S r-  r  r  s     r   #test_chunked_missing_chunk_readlinez0TestInputRaw.test_chunked_missing_chunk_readlineJ  s5    OOS#J'''1:.....r   c                 t    |                      dd          }|                     t          |j                   d S N2
1Tr  r  r  s     r   test_chunked_short_chunkz%TestInputRaw.test_chunked_short_chunkN  s5    OOHDO99'16*****r   c                 v    |                      dd          }|                     t          |j        d           d S )Nr5  Tr6  r7   r  r  s     r   )test_chunked_short_chunk_read_with_lengthz6TestInputRaw.test_chunked_short_chunk_read_with_lengthR  s7    OOHDO99'161-----r   c                 t    |                      dd          }|                     t          |j                   d S r4  r  r  s     r   !test_chunked_short_chunk_readlinez.TestInputRaw.test_chunked_short_chunk_readlineV  s5    OOHDO99'1:.....r   c                    d}dt           j        dz   z  }|dz  }||z  }d}d}t          |d          r(|                     |                                d           t
          s5t          s.|                     t          t          |          j
        |           |                     ||	          }|                     |
                                d
           |                     |
                    |          d           |                     |
                    |          |           |                     ||z   t          |          dz   	          }|                     |
                                d
           |                     |
                    |          d           |                     |
                    |          |           |                     |
                    |          d           d S )Ns
   asdf
ghij
r  r  r  s   qjk
l    :;$ 
bit_length#   r  s   asdf
s   ghij
r"      q)r   r  r^   r  r=  r   r	   r  OverflowErrorr  r)   r  r~  )rP   r>   	long_datapartial_datanr  s         r   test_32bit_overflowz TestInputRaw.test_32bit_overflowZ  s    F3b89	U		1l## 	1Q\\^^R000 	I4 	ImXd^^-DaHHHOODO33y111A	222A	222 OOD</D		AONNy111A	222A	222 	A-----r   )NFrS   )r   r   r   r  r   r  r  r  r  r#  r%  r)  r+  r.  r0  r2  r7  r9  r;  rD  r   r   s   @r   r	  r	    s8       a a a a  F	F 	F 	F 	F 	F 	F
+ + +. . ./ / /% % %
% % %
% % %
% % %
+ + +/ / // / /+ + +. . ./ / /. . . . . . .r   r	  c                   *    e Zd Zed             Zd ZdS )Test414c                      t          d          )Nzshould not get thereru  rX  s     r   r   zTest414.application|  s    3444r   c                     ddz  }|                                  5 }|                    d|z                      d                     t          |d           d d d            d S # 1 swxY w Y   d S )Nr&   i N  z"GET /%s HTTP/1.0
Hello: world

r    i  r8  )r   r   rm   r   )rP   longliner.   s      r   r  zTest414.test  s    ;]]__ 	$HHDxOWWXabbcccbs####	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   =A$$A(+A(N)r   r   r   r   r   r  r   r   r   rF  rF  z  s<        5 5 \5$ $ $ $ $r   rF  c                   X    e Zd Z G d de          Zd Zed             Zd Zd Z	d Z
dS )	TestLoggingc                   ,    e Zd ZdZdZdZd Zd Zd ZdS )TestLogging.LoggerNc                     ||f| _         d S rS   )logged)rP   levelr  s      r   r   zTestLogging.Logger.log  s     #,DKKKr   c                     || _         d S rS   )accessedrP   r  s     r   accesszTestLogging.Logger.access  s    DMMMr   c                     | j         S rS   )thingrT   s    r   	get_thingzTestLogging.Logger.get_thing  s
    :r   )	r   r   r   rR  rO  rV  r   rT  rW  r   r   r   LoggerrM    sP        	' 	' 	'	  	  	 	 	 	 	 	r   rX  c                 *    |                                  S rS   )rX  rT   s    r   r   zTestLogging.init_logger  s    {{}}r   c                 "     |ddg           dgS )Nr"  r#  rS  r   rX  s     r   r   zTestLogging.application  s     x"@!ABBBzr   c                    |                      t          | j        j        t          j                             | j        j                            d           | j        j                            d           |                     | j        j        j	        d           |                     | j        j        j
        d           d S )NrT  r   )   r   )r   rk   r   r   r   LoggingLogAdapterrT  r   r  rR  rO  rT   s    r   test_proxy_methods_on_logz%TestLogging.test_proxy_methods_on_log  s     	
4;?F4LMMNNNx(((g&&&18<<</?????r   c                    d| j         j        _        |                     | j         j                                        d           | j         j        `|                     | j         j                                        d            d S )N*   )r   r   rV  r  rW  rT   s    r   test_set_attributeszTestLogging.test_set_attributes  sj     "2244b999KO!2244d;;;;;r   c                     |                                   | j        j        j        d         }|                     d|v |           |                     d|v|           d S )Nr"   z"GET / HTTP/1.1" 200 r  )r   r   r   rO  r   rS  s     r   test_status_logzTestLogging.test_status_log  sZ    ko$Q'/36<<< 	C-----r   N)r   r   r   r   rX  r   r   r   r^  ra  rc  r   r   r   rK  rK    s                    \@ @ @< < <. . . . .r   rK  c                   F     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
 xZS )	TestEnvironNc                     t          t          |                               |           t          j        | j        _        d S rS   )r   re  r   r   r  r   environ_class)rP   r   rW   s     r   r   zTestEnviron.init_server  s4    k4  ,,[999$*$8!!!r   c                 `    |                      |t          j                    |ddg           g S rk  )r  r   r  rl  s      r   r   zTestEnviron.application  s6    c6#7888x"@!ABBB	r   c                 .    |                                   d S rS   r<  rT   s    r   !test_environ_is_secure_by_defaultz-TestEnviron.test_environ_is_secure_by_default  r=  r   c                    t          j                    }|                     dt          |                     |                     dt	          |                     d|d<   |                     dt          |                     |                     dt	          |                     d|_        |                     t	          ddi          t	          |                     |                     t          ddi          t          |                     |`d|_        |                     t	          ddi          t	          |                     |                     t          ddi          t          |                     d|_        |                     t	          ddi          t	          |                     |                     t          ddi          t          |                     |`d S )	Nz'<pywsgi.SecureEnviron dict (keys: 0) atr3   r2   z'<pywsgi.SecureEnviron dict (keys: 1) atF)zmissing valuez<MASKED>r2   )r   r  assertInr;   rl   secure_reprr  whitelist_keys)rP   r  s     r   test_default_secure_reprz$TestEnviron.test_default_secure_repr  s   &((?gOOO?WNNN ?gOOO?WNNN#eW-..G===ug.//g???!3eZ0113w<<@@@uj122DMMBBB!)eW-..G===ug.//g???"""r   c                     G d dt           j                  } |            }|                     |j                   d|_        |                     |j                   |                     t          i           t          |                     |                     t          i           t          |                     d|_        d|_	        d|d<   |                     t          ddi          t          |                     |                     t          ddi          t          |                     ~~dd l
}|                                 d S )	Nc                       e Zd ZdZdS )>TestEnviron.test_override_class_defaults.<locals>.EnvironClassr   N)r   r   r   	__slots__r   r   r   EnvironClassrs    s        IIIr   ru  FTrl  r"   r2   r   )r   r  r   rn  default_secure_reprr   r  rl   r;   default_whitelist_keysr   r   )rP   ru  r  r   s       r   test_override_class_defaultsz(TestEnviron.test_override_class_defaults  s<   	 	 	 	 	6/ 	 	 	 ,..+,,,+0(,---R#g,,///b4==111+/(.6+eQZ#g,,777uaj))4==999 			2::<<<<<r   c                     t           j        t           j        fD ]2}|                      |                                            |           3d S rS   )r   Environr  r  r   )rP   ry   s     r   test_copy_still_securez"TestEnviron.test_copy_still_secure  sL    NF$89 	5 	5C!!##%%**,,4444	5 	5r   c                 r   dd l }dd l}t          j        t          j        fD ]}ddi} ||          }|                     ||           |                     ||           |                     ||           t          d|j        dz             D ]k}|	                    ||          }| 
                    d|           |                    |          }|                     t          |          t                     l|                     |	                    |          |	                    |                     d S )Nr   r2   r3   r"   s   Environ)picklejsonr   rz  r  r  r  r  HIGHEST_PROTOCOLdumpsr  loadstyper   )	rP   r}  r~  ry   bltinr*  protocolenv_dumploadeds	            r   test_pickle_copy_returns_dictz)TestEnviron.test_pickle_copy_returns_dict  sA    	NF$89 	A 	ACG$E#e**C!!#s+++UC(((S%(((!!V%<q%@AA 5 5 "<<X66  X666h//  ft4444TZZ..

3@@@@	A 	Ar   )r   r   r   r   r   r   rj  rp  rx  r{  r  r   r   s   @r   re  re    s         I9 9 9 9 9  
  # # #2     45 5 5A A A A A A Ar   re  __main__rS   )dr   r   	patch_all
contextlibr   urllib.parser   r  r  ior   r  r   r  wsgiref.validater   gevent.testingr  r   r   r	   gevent.testing.exceptionr
   r   r   gevent.pywsgir   r  r   rv   r  ru   rO   r   r4   r?   r   rA   r:   r   r   r   r  r4  rB  rD  rF  rJ  rP  rU  r`  ri  rw  r  r  r  r  r  r  r  r   r  HAVE_SSLCONTEXTr  r  r  r  r
  r  r  r-  r1  r8  r?  rD  rG  rQ  rV  r[  rb  ri  rn  rq  r  r  r  r  r  r  r  r  r  r  BaseTestCaser	  rF  rK  re  r   mainr   r   r   <module>r     s  *            % % % % % % ! ! ! ! ! ! 				 



 " " " " " "   & & & & & & " " " " " "  $ $ $ $ $ $ $ $ 6 6 6 6 6 6                  & & & & &. & & & "3  
	  	 	 	 	 	y 	 	 	" " "*+ + +X X X X Xv X X Xt M	S S S S Sy! S S SlQ, Q, Q, Q, Q,f Q, Q, Q,h-5 -5 -5 -5 -5?H -5 -5 -5^* * * * *\ * * *&    \   
    n   # # # # # # # # 
 
 
 
 
 
 
 
) ) ) ) )OX ) ) )    (   *6 6 6 6 6 6 6 68) ) ) ) )H ) ) )4D D D D DX D D D>    N   ) ) ) ) )x ) ) )4) ) ) ) )8 ) ) )6G( G( G( G( G(h G( G( G(T-L -L -L -L -L8 -L -L -L`0 0 0 0 0H 0 0 0@    '&*&>?? NN N N N N- N N N
. 
. 
. 
. 
. 
. 
. 
.      6	   X X X X X X X X4': ': ': ': ': ': ': ':T    0R   U U U U U U U U8D D D D D% D D DD D D D D* D D D       "C C C C CX C C C    %;   D D D D DX D D D(' ' ' ' '( ' ' '(' ' ' ' ' ' ' ' ' ' ' ' '8 ' ' '*L L L L L( L L L A A A A A8 A A A0    ^   #$ #$ #$ #$ #$h #$ #$ #$LGX GX GX GX GX GX GX GXT$* $* $* $* $*X $* $* $*N       * (  (  (  (  (H  (  (  (D-J -J -J -J -J -J -J -J`       ,       (- (- (- (- (-( (- (- (-V7 7 7 7 7( 7 7 7$   d. d. d. d. d.9) d. d. d.N
$ 
$ 
$ 
$ 
$h 
$ 
$ 
$3. 3. 3. 3. 3.( 3. 3. 3.j^A ^A ^A ^A ^A( ^A ^A ^AB zIN r   