o
    ,wÖi]# ã                   @   s¤  d dl mZ e ¡  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„ deeƒZdZejZdddœZG dd„ de ƒZ!dd„ Z"dd„ Z#G dd„ de$ƒZ%e%j&Z'G dd„ dej(ƒZ(G dd„ de$ƒZ)G dd„ de)e(ƒZ*G d d!„ d!e*ƒZ+G d"d#„ d#e*ƒZ,G d$d%„ d%e,ƒZ-G d&d'„ d'e*ƒZ.G d(d)„ d)e)e(ƒZ/G d*d+„ d+e)e(ƒZ0G d,d-„ d-e(ƒZ1G d.d/„ d/e(ƒZ2G d0d1„ d1e(ƒZ3G d2d3„ d3e(ƒZ4G d4d5„ d5e4ƒZ5G d6d7„ d7e(ƒZ6G d8d9„ d9e(ƒZ7G d:d;„ d;e(ƒZ8G d<d=„ d=e(ƒZ9G d>d?„ d?e(ƒZ:d dl;Z e<e j=d@ƒZ>e>r;G dAdB„ dBe:ƒZ?G dCdD„ dDe:ƒZ@e>rOG dEdF„ dFe?e@ƒZAG dGdH„ dHe(ƒZBG dIdJ„ dJe(ƒZCG dKdL„ dLeCƒZDG dMdN„ dNe(ƒZEG dOdP„ dPeEƒZFG dQdR„ dReEƒZGG dSdT„ dTe(ƒZHG dUdV„ dVe(ƒZIG dWdX„ dXeIƒZJG dYdZ„ dZe(ƒZKG d[d\„ d\e(ƒZLG d]d^„ d^e(ƒZMG d_d`„ d`e(ƒZNG dadb„ dbe(ƒZOG dcdd„ dde(ƒZPG dedf„ dfeKƒZQG dgdh„ dhe(ƒZRG didj„ dje(ƒZSG dkdl„ dle(ƒZTG dmdn„ dne(ƒZUG dodp„ dpe(ƒZVG dqdr„ dre(ƒZWG dsdt„ dte(ƒZXG dudv„ dve(ƒZYG dwdx„ dxe(ƒZZG dydz„ dze(ƒZ[d†d{d|„Z\G d}d~„ d~ej]ƒZ^G dd€„ d€e(ƒZ_G dd‚„ d‚e(ƒZ`G dƒd„„ d„e(ƒZaebd…krPe c¡  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__© r   r   úV/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/gevent/tests/test__pywsgi.pyr   ,   ó    r   úContent-LengthÚOKúInternal Server Error)éÈ   éô  c                   @   ó   e Zd ZdS )ÚConnectionClosedN©r   r   r   r   r   r   r   r   8   ó    r   c                 C   s¢   |   ¡ }|st‚| d¡}i }	 |   ¡  ¡ }|s	 ||fS | d¡}z
| dd¡\}}W n   td|f ƒ ‚ | ¡ dd„ |D ƒvsLJ d|||f ƒ‚|||< q)	Núlatin-1Tz: é   zFailed to split: %rc                 S   s   h | ]}|  ¡ ’qS r   )Úlower)Ú.0Úxr   r   r   Ú	<setcomp>L   s    zread_headers.<locals>.<setcomp>z$Header %r:%r sent more than once: %r)Úreadliner   ÚdecodeÚstripÚsplitÚprintr!   )ÚfdÚresponse_lineÚheadersÚlineÚkeyÚvaluer   r   r   Úread_headers<   s&   
	
ø(õr0   c                 c   sx    	 |   ¡ }| ¡ }t|dƒ}|dkr$|  d¡}|dks"J t|ƒƒ‚d S |  |¡}|V  |  d¡}|dks;J t|ƒƒ‚q)NTé   r   é   ó   
)r%   r'   ÚintÚreadÚrepr)r*   r-   Ú
chunk_sizeÚcrlfÚdatar   r   r   Úiread_chunksQ   s   €



õr:   c                   @   s^   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
e		ddd„ƒZdS )ÚResponsec                 C   sž   || _ || _d | _d| _z4|d d…  dd¡\}}| _t|ƒ| _| d¡\}| _|dks2J t	|ƒƒ‚| jdv s>J t	| jƒƒ‚W d S  t
yN   td| ƒ ‚ w )	NFéþÿÿÿú r2   ú/ÚHTTP)ú1.0ú1.1z	Error: %r)Ústatus_liner,   ÚbodyÚchunksr(   Úreasonr4   ÚcodeÚversionr6   Ú	Exceptionr)   )ÚselfrB   r,   rG   rF   r?   r   r   r   Ú__init__b   s   
þzResponse.__init__c                 c   s    | j V  | jV  | jV  d S ©N)rB   r,   rC   ©rI   r   r   r   Ú__iter__q   s   €zResponse.__iter__c                 C   s"   | j j| j| j| j| jf}d| S )Nz0<%s status_line=%r headers=%r body=%r chunks=%r>)Ú	__class__r   rB   r,   rC   rD   )rI   Úargsr   r   r   Ú__str__v   s   zResponse.__str__c                 C   sN   t |dƒr| j|v sJ d| j|| f ƒ‚d S | j|ks%J d| j|| f ƒ‚d S )NÚ__contains__z$Unexpected code: %r (expected %r)
%s)ÚhasattrrF   )rI   rF   r   r   r   Ú
assertCodez   s   
""zResponse.assertCodec                 C   ó"   | j |ksJ d| j || f ƒ‚d S )Nz&Unexpected reason: %r (expected %r)
%s)rE   )rI   rE   r   r   r   ÚassertReason€   ó   "zResponse.assertReasonc                 C   rT   )Nz'Unexpected version: %r (expected %r)
%s)rG   )rI   rG   r   r   r   ÚassertVersionƒ   rV   zResponse.assertVersionc                 C   s.   | j  |d¡}||ksJ d|||| f ƒ‚d S )NFz)Unexpected header %r: %r (expected %r)
%s)r,   Úget)rI   Úheaderr/   Ú
real_valuer   r   r   ÚassertHeader†   s   
ÿzResponse.assertHeaderc                 C   s:   t |tƒrtr| d¡}| j|ksJ d| j|| f ƒ‚d S )NÚasciiz$Unexpected body: %r (expected %r)
%s)Ú
isinstanceÚstrr   ÚencoderC   )rI   rC   r   r   r   Ú
assertBody‹   s   
"zResponse.assertBodyr   ÚdefaultrA   Nc                 C   s2  t |ƒ\}}	| ||	ƒ}
|dur|
 |¡ |dkrt |¡}|dur&|
 |¡ |dur/|
 |¡ |
jdkr6|
S |durIt|tƒrCt	|ƒ}|
 
d|¡ d|	 dd¡v rht|	v rYtdƒ tt|ƒƒ|
_d	 |
j¡|
_nt|	v ryt|	t ƒ}| |¡|
_n| ¡ |
_|dur‡|
 |¡ |dur—||
jks—J ||
jfƒ‚|
S )
zo
        Read an HTTP response, optionally perform assertions,
        and return the Response object.
        Nra   éd   r   ÚchunkedúTransfer-EncodingÚ zhWARNING: server used chunked transfer-encoding despite having Content-Length header (libevent 1.x's bug)ó    )r0   rS   ÚREASONSrX   rU   rW   rF   r]   r4   r^   r[   ÚCONTENT_LENGTHr)   Úlistr:   rD   ÚjoinrC   r5   r`   )Úclsr*   rF   rE   rG   rC   rD   Úcontent_lengthÚ_status_liner,   rI   Únumr   r   r   r5      s<   








zResponse.read)r   ra   rA   NNN)r   r   r   rJ   rM   rP   rS   rU   rW   r[   r`   Úclassmethodr5   r   r   r   r   r;   `   s    ÿr;   c                       s°   e Zd ZdZeeƒZdZejZ	ej
ZG dd„ dejƒZdd„ Zdd„ Zdd	„ Zejr7ejr7d
d„ Z‡ fdd„Zdd„ Zedd„ ƒZedd„ ƒZdd„ ZdZi Zddd„Z‡  ZS )ÚTestCaseNc                   @   s   e Zd ZeZdS )zTestCase.handler_classN)r   r   r   r   ÚApplicationErrorr   r   r   r   Úhandler_classÊ   r   rr   c                 C   s"   dd l }| d¡}| |j¡ |S )Nr   zgevent.tests.pywsgi)ÚloggingÚ	getLoggerÚsetLevelÚCRITICAL)rI   rs   Úloggerr   r   r   Úinit_loggerÍ   s   
zTestCase.init_loggerc                 C   s0   |   ¡  }| _tj| jdf|||| jd| _d S )Nr   )ÚlogÚ	error_logrr   )rx   rw   r   Ú
WSGIServerÚlisten_addrrr   Úserver)rI   Úapplicationrw   r   r   r   Úinit_serverÓ   s   üzTestCase.init_serverc                 C   sj   | j }| jd ur|  |¡}|  |¡ | j ¡  | jjs#tdƒ | jjr| jj| _| js-J ‚tj	 
| ¡ d S )NzWaiting on server port)r~   r   r   r}   ÚstartÚserver_portr)   ÚportÚ	greentestrp   ÚsetUp©rI   r~   r   r   r   r„   Ü   s   



ÿ

zTestCase.setUpc                 C   s   | j  t |¡¡ |S rK   )Úclose_on_teardownÚappendÚweakrefÚref)rI   Úresourcer   r   r   Ú_close_on_teardownð   s   zTestCase._close_on_teardownc                    s$   dd„ | j D ƒ| _ tt| ƒ ¡  d S )Nc                 S   s   g | ]
}|ƒ d ur|ƒ ‘qS rK   r   )r"   Úrr   r   r   Ú
<listcomp>õ   s    z5TestCase._tearDownCloseOnTearDown.<locals>.<listcomp>)r†   Úsuperrp   Ú_tearDownCloseOnTearDownrL   ©rN   r   r   r   ô   s   z!TestCase._tearDownCloseOnTearDownc                 C   sx   t j | ¡ | jd ur&tj d¡ | j ¡  W d   ƒ n1 s!w   Y  d | _t jr:dd l	}| 
¡  | 
¡  d S d S )Nç      à?r   )rƒ   rp   ÚtearDownr}   ÚgeventÚTimeoutÚ	start_newÚstopr   ÚgcÚcollect)rI   r—   r   r   r   r’   ø   s   
ÿýzTestCase.tearDownc                 #   sl    t  ˆjˆjf¡‰ ˆ }tr&ˆ j‰‡‡fdd„‰G ‡ ‡fdd„dtƒ}|ƒ }z
|V  W | ¡  d S | ¡  w )Nc                     sh   d|v r|  d¡|d< d|v rˆ| i |¤ŽS d|d< ˆ| i |¤Ž}|j‰ ‡ fdd„}||_ˆ |¡ |S )NÚbufsizeÚ	bufferingÚmodeÚrwbc                    s   t | tƒr
|  d¡} ˆ | ƒS ©Nr\   )r]   r^   r_   )r9   ©Ú_rconn_writer   r   Úwrite  s   

z1TestCase.connect.<locals>.makefile.<locals>.write)Úpopr    r‹   )rO   ÚkwargsÚrconnr    )Úconn_makefilerI   rž   r   Úmakefile  s   
z"TestCase.connect.<locals>.makefilec                       s   e Zd Z‡ ‡fdd„ZdS )zTestCase.connect.<locals>.proxyc                    s   |dkrˆS t ˆ |ƒS )Nr¥   )Úgetattr)rI   Úname©Úconnr¥   r   r   Ú__getattribute__!  s   
z0TestCase.connect.<locals>.proxy.__getattribute__N)r   r   r   rª   r   r¨   r   r   Úproxy   ó    r«   )r
   Úcreate_connectionÚconnect_addrr‚   r   r¥   ÚobjectÚclose)rI   Úresultr«   r   )r©   r¤   r¥   rI   r   Úconnect  s   €zTestCase.connectc              	   c   sZ    |   ¡ }z|jdd}|V  W | ¡  n| ¡  w W d   ƒ d S 1 s&w   Y  d S )Nr    ©r™   )r²   r¥   r°   )rI   Úsockr±   r   r   r   r¥   +  s   €
"ûzTestCase.makefilec              	   O   sˆ   |   ¡ 6}|jdd}| d¡ t|g|¢R i |¤ŽW  d   ƒ W  d   ƒ S 1 s-w   Y  W d   ƒ d S 1 s=w   Y  d S )Nr    r³   ú#GET / HTTP/1.1
Host: localhost

)r²   r¥   r    Ú	read_http)rI   rO   r¢   r´   r*   r   r   r   Úurlopen4  s   

þÿ"ÿzTestCase.urlopenrA   ÚGETr>   c                 K   s^   | j  ¡ }| |¡ |}d dd„ | ¡ D ƒ¡}|r|d n|}d}|t||| j|d }|S )Nú
c                 s   s    | ]}d | V  qdS )z%s: %sNr   )r"   Úitemr   r   r   Ú	<genexpr>B  s   € z*TestCase.format_request.<locals>.<genexpr>zE%(method)s %(path)s HTTP/%(http_ver)s
Host: localhost
%(headers)s
)ÚmethodÚpathÚhttp_verr,   )ÚDEFAULT_EXTRA_CLIENT_HEADERSÚcopyÚupdaterj   ÚitemsÚdictÚHTTP_CLIENT_VERSION)rI   r¼   r½   r,   Údef_headersr±   r   r   r   Úformat_request=  s   

ÿüzTestCase.format_request)r¸   r>   )r   r   r   r}   Ústaticmethodr   r~   rƒ   ÚDEFAULT_BIND_ADDRr|   ÚDEFAULT_LOCAL_HOST_ADDRr®   r   ÚWSGIHandlerrr   rx   r   r„   ÚCPYTHONÚPY2r‹   r   r’   r   r²   r¥   r·   rÄ   r¿   rÆ   Ú__classcell__r   r   r   r   rp   ½   s,    	
&
rp   c                   @   sB   e Zd ZdZdZdZdd„ Zdd„ Zdd„ Ze	 
d	¡d
d„ ƒZdS )ÚCommonTestMixinr   Fc                 C   sÜ   |   ¡ `}| |  ¡ ¡ t|dd}|j d¡dkr,|  | jd¡ |d fW  d   ƒ S |  | j¡ | j	r;| 
dd¡ | | jdd¡ t|d	d
dd}| |  ¡ ¡ t|dd}||fW  d   ƒ S 1 sgw   Y  d S )Núhello world©rC   Ú
Connectionr°   ú,Server closed connection, not expecting thatú
keep-aliveú	/notexist©r½   é”  ú	Not Foundú	not found©rF   rE   rC   )r¥   r    rÆ   r¶   r,   rX   Ú
assertTrueÚEXPECT_CLOSEÚassertFalseÚEXPECT_KEEPALIVEr[   )rI   r*   ÚresponseÚdne_responser   r   r   Ú
test_basicX  s    
û$òzCommonTestMixin.test_basicc                 C   sú   t dƒ}|  ¡ k}| |  ¡ | jdd ¡ t|dd ztjjd|d}zt|dd	d
d W | ¡  n| ¡  w W n  | j	yD   Y n t yZ } z||urP‚ W Y d }~nd }~ww W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 svw   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)rI   rá   r*   ÚtimeoutÚexr   r   r   Útest_pipelinek  s.   
ÿ€ÿý÷õ"ózCommonTestMixin.test_pipelinec                 C   s   |   ¡ ‚}| |  ¡ ¡ t|ƒ}|j d¡dkr(|  | jd¡ 	 W d   ƒ d S |  | j¡ | j	r7| 
dd¡ | | jdd¡ t|ƒ | |  ¡ ¡ z| ¡ }W n tjyl } z|jd tvrb‚ W Y d }~nd }~ww |  |d|f ¡ W d   ƒ d S W d   ƒ d S 1 s‰w   Y  d S )NrÑ   r°   rÒ   rÓ   )rÑ   r   zCThe remote side is expected to close the connection, but it sent %r)r¥   r    rÆ   r¶   r,   rX   rÚ   rÛ   rÜ   rÝ   r[   r%   r
   ÚerrorrO   ÚCONN_ABORTED_ERRORS)rI   r*   rÞ   r±   rå   r   r   r   Útest_connection_close}  s<   
ûÿ€ÿÿþë"îz%CommonTestMixin.test_connection_closezNot surec                 C   sˆ   g }t dƒD ]}| d¡ qd |¡}|  ¡ #}d| }| |¡ | ¡ }| d¡d }|  |d¡ W d   ƒ d S 1 s=w   Y  d S )Ni¸  r½   r>   z%GET /%s HTTP/1.0
Host: localhost

r=   r    Ú414)Úranger‡   rj   r¥   r    r%   r(   ÚassertEqual)rI   Ú
path_partsÚ_r½   r*   Úrequestr±   Ústatusr   r   r   Útest_006_reject_long_urls˜  s   


"ûz)CommonTestMixin.test_006_reject_long_urlsN)r   r   r   rã   rÛ   rÝ   rà   ræ   ré   ÚunittestÚskiprñ   r   r   r   r   rÎ   S  s    rÎ   c                       s>   e Zd ZdZdZddd„Zdd„ Z‡ fdd„Zd	d
„ Z‡  Z	S )ÚTestNoChunksNTc                 C   s.   |r|   | j d¡¡ d S |  | jd ¡ d S )Núwsgi.input_terminated)rÚ   Úlast_environrX   rÜ   )rI   Úinput_terminatedr   r   r   Ú_check_environ­  s   zTestNoChunks._check_environc                 C   sd   || _ |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_INFOr>   ú200 OK©zContent-Typez
text/plainó   hello ó   worldú
/websocketz101 Switching Protocols)rÑ   r°   rf   s   upgrading tos	   websocketú404 Not Foundó   not ó   found)rö   )rI   ÚenvÚstart_responser½   r    r   r   r   r~   ³  s   üÿzTestNoChunks.applicationc                    sZ   t t| ƒ ¡ \}}|  ¡  |  |j¡ | dd¡ |d ur+|  |j¡ | dd¡ d S d S )Nr   Ú11Ú9)rŽ   rô   rà   rø   rÜ   rD   r[   )rI   rÞ   rß   r   r   r   rà   Å  s   þzTestNoChunks.test_basicc                 C   sn   |   ¡ }| | jdd¡ t|dddd}W d   ƒ n1 s w   Y  |  |j¡ |  ¡  | dd¡ d S )	NrÔ   rÕ   rÖ   r×   rØ   rÙ   r   r  )r¥   r    rÆ   r¶   rÜ   rD   rø   r[   ©rI   r*   rÞ   r   r   r   Útest_dneÎ  s   
þzTestNoChunks.test_dne)T)
r   r   r   r   rö   rø   r~   rà   r  rÍ   r   r   r   r   rô   §  s    
	rô   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestConnectionUpgradesc                 C   ód   |   ¡ }| | jddd¡ t|dd}W d   ƒ n1 sw   Y  | jdd |  |j¡ d S )Nrþ   Úupgrade)r½   rÑ   ée   ©rF   F©r÷   ©r¥   r    rÆ   r¶   rø   rÜ   rD   r  r   r   r   Útest_connection_upgradeØ  ó   
þz.TestConnectionUpgrades.test_connection_upgradec                 C   r	  )Nrþ   Ú	websocket)r½   ÚUpgrader  r  Fr  r  r  r   r   r   Útest_upgrade_websocketà  r  z-TestConnectionUpgrades.test_upgrade_websocketN)r   r   r   r  r  r   r   r   r   r  Ö  s    r  c                   @   s   e Zd ZdZefZdZdS )ÚTestNoChunks10r@   TN)r   r   r   rÄ   r   rã   rÛ   r   r   r   r   r  é  s    r  c                   @   s   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   r   r  î  s
    ÿr  c                   @   ó   e Zd Zdd„ ZdS )ÚTestExplicitContentLengthc                 C   sR   || _ |  | d¡¡ |d }|dkr|dddgƒ ddgS |d	dd
gƒ ddgS )Nrõ   rù   r>   rú   rû   )r   r  rü   rý   rÿ   )r   r  r   r  )rö   rÚ   rX   )rI   r  r  r½   r   r   r   r~   ú  s   z%TestExplicitContentLength.applicationN©r   r   r   r~   r   r   r   r   r  ö  s    r  c                   @   ó   e Zd Zedd„ ƒZdS )Ú	TestYieldc                 c   s>    | d }|dkr|ddgƒ dV  d S |ddgƒ dV  d S )Nrù   r>   rú   rû   s   hello worldrÿ   ó	   not foundr   ©r  r  r½   r   r   r   r~     s   €

zTestYield.applicationN©r   r   r   rÇ   r~   r   r   r   r   r    ó    r  c                   @   s   e Zd ZdZedd„ ƒZdS )ÚTestBytearrayNc                 C   sB   | d }|dkr|ddgƒ t dƒt dƒgS |ddgƒ t dƒgS )	Nrù   r>   rú   rû   rü   rý   rÿ   r  ©Ú	bytearrayr  r   r   r   r~     s   
zTestBytearray.application)r   r   r   r   rÇ   r~   r   r   r   r   r    s    r  c                   @   ó    e Zd Zedd„ ƒZdd„ ZdS )ÚTestMultiLineHeaderc                 C   s"   d| d v sJ ‚|ddgƒ dgS )Nztest.submitÚCONTENT_TYPErú   rû   s   okr   ©r  r  r   r   r   r~   "  s   zTestMultiLineHeader.applicationc                 C   sJ   d  d¡}|  ¡ }| |¡ t|ƒ W d  ƒ dS 1 s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: 0re   re   N©rj   r¥   r    r¶   ©rI   rï   r*   r   r   r   Útest_multiline_116(  s
   



"þz&TestMultiLineHeader.test_multiline_116N)r   r   r   rÇ   r~   r*  r   r   r   r   r#  !  s    
r#  c                   @   r"  )Ú
TestGetArgc                 C   sR   | d   d¡}tr| d¡}t|ƒ ddg¡d }|ddgƒ d	||f  d¡gS )
Nú
wsgi.inputé   r\   Úar    r   rú   rû   za is %s, body is %s)r5   r   r&   r   rX   r_   )r  r  rC   r.  r   r   r   r~   8  s   
zTestGetArg.applicationc                 C   sX   d  d¡}|  ¡ }| |¡ | d¡ t|dd W d   ƒ d S 1 s%w   Y  d S )Nr¹   )r&  r'  zContent-Length: 3re   za=aÚ01234567890123456789za is a, body is a=arÐ   r(  r)  r   r   r   Útest_007_get_argA  s   



"ûzTestGetArg.test_007_get_argN)r   r   r   rÇ   r~   r0  r   r   r   r   r+  6  s    
r+  c                   @   s4   e Zd ZdZdd„ Zdd„ ZdZdd„ Zd	d
„ ZdS )ÚTestCloseIterNc                 C   s   |ddgƒ | S ©Nrú   rû   r   ©rI   r  r  r   r   r   r~   W  s   zTestCloseIter.applicationc                 c   s    t dƒV  dV  d S )Nó   Hello Worldó   !r   rL   r   r   r   rM   [  s   €

zTestCloseIter.__iter__Fc                 C   s   |  j d7  _ d S )Nr    )ÚclosedrL   r   r   r   r°   a  ó   zTestCloseIter.closec                 C   s\   d| _ |  ¡ }| d¡ t|dddgd W d   ƒ n1 s w   Y  |  | j d¡ d S )NFrµ   s   Hello World!r4  r5  ©rC   rD   r    )r6  r¥   r    r¶   rì   ©rI   r*   r   r   r   Útest_close_is_calledd  s   

þz"TestCloseIter.test_close_is_called)	r   r   r   r   r~   rM   r6  r°   r:  r   r   r   r   r1  R  s    r1  c                   @   s4   e Zd Zg d¢Zdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚTestChunkedApp)s   thiss   iss   chunkedc                 C   s   d  | j¡S )Nrf   )rj   rD   rL   r   r   r   rC   p  ó   zTestChunkedApp.bodyc                 c   s.    |   | d¡¡ |ddgƒ | jE d H  d S )Nrõ   rú   rû   )rÚ   rX   rD   r3  r   r   r   r~   s  s   €zTestChunkedApp.applicationc                 C   sd   |   ¡ }| d¡ t||  ¡ d d}W d   ƒ n1 sw   Y  | dd¡ |  |j| j¡ d S )Nú6GET / HTTP/1.1
Host: localhost
Connection: close

r8  rd   rc   )r¥   r    r¶   rC   r[   rì   rD   r  r   r   r   Útest_chunked_responsex  s   

þz$TestChunkedApp.test_chunked_responsec                 C   s”   |   ¡ }| d¡ t|ƒ}W d   ƒ n1 sw   Y  |  |j|  ¡ ¡ |  |j d¡d ¡ |j d¡}|d urH|  |tt|  ¡ ƒƒ¡ d S d S )Nz6GET / HTTP/1.0
Host: localhost
Connection: close

rd   r   )	r¥   r    r¶   rì   rC   r,   rX   r^   Úlen)rI   r*   rÞ   rl   r   r   r   Útest_no_chunked_http_1_0€  s   


þÿz'TestChunkedApp.test_no_chunked_http_1_0N)r   r   r   rD   rC   r~   r>  r@  r   r   r   r   r;  l  s    r;  c                   @   s   e Zd Zdd gd ZdS )ÚTestBigChunksó   ai    r-  N)r   r   r   rD   r   r   r   r   rA  ‹  r¬   rA  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestNegativeReadc                 C   s@   |   | d¡¡ |ddgƒ |d dkr|d  d¡}|gS d S )Nrõ   rú   rû   rù   z/readr,  éÿÿÿÿ)rÚ   rX   r5   )rI   r  r  r9   r   r   r   r~   ‘  s   þzTestNegativeRead.applicationc                 C   óH   d}|   ¡ }| |¡ t|dd W d   ƒ d S 1 s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¶   ©rI   r9   r*   r   r   r   Útest_negative_chunked_read˜  ó
   

"þz+TestNegativeRead.test_negative_chunked_readc                 C   rE  )NsT   POST /read HTTP/1.1
Host: localhost
Connection: close
Content-Length: 6

oh hairF  rÐ   rG  rH  r   r   r   Útest_negative_nonchunked_read   rJ  z.TestNegativeRead.test_negative_nonchunked_readN)r   r   r   r~   rI  rK  r   r   r   r   rC    s    rC  c                   @   s,   e Zd ZdZedd„ ƒZdd„ Zdd„ ZdS )ÚTestNegativeReadlineNc                 C   s0   |ddgƒ | d dkr| d   d¡}|gS d S )Nrú   rû   rù   z	/readliner,  rD  )r%   )r  r  r9   r   r   r   r~   ¬  s
   þz TestNegativeReadline.applicationc                 C   rE  )Nsp   POST /readline HTTP/1.1
Host: localhost
Connection: close
Transfer-Encoding: chunked

2
oh
4
 hai
0

rF  rÐ   rG  rH  r   r   r   Útest_negative_chunked_readline³  rJ  z3TestNegativeReadline.test_negative_chunked_readlinec                 C   rE  )NsX   POST /readline HTTP/1.1
Host: localhost
Connection: close
Content-Length: 6

oh hairF  rÐ   rG  rH  r   r   r   Ú!test_negative_nonchunked_readline»  rJ  z6TestNegativeReadline.test_negative_nonchunked_readline)r   r   r   r   rÇ   r~   rM  rN  r   r   r   r   rL  ©  s    
rL  c                       sÄ   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Ze d¡dd„ ƒZe d¡dd„ ƒZe d¡dd„ ƒZe d¡dd„ ƒZe d¡dd„ ƒZe d¡dd„ ƒZ‡  ZS )ÚTestChunkedPostr   c                    s   t ƒ  ¡  d| _d S )Nr   )rŽ   r„   ÚcallsrL   r   r   r   r„   È  ó   

zTestChunkedPost.setUpc                    s¤   |  j d7  _ |  ˆ  d¡¡ |ddgƒ ˆ d dkr%ˆ d  d¡}|gS ˆ d d	kr8tt‡ fd
d„dƒƒ}|S ˆ d dkrItt‡ fdd„dƒƒS dˆ d  d¡gS )Nr    rõ   rú   rû   rù   z/ar,  é   z/bc                      ó   ˆ d   d¡S )Nr,  rR  ©r5   r   ©r  r   r   Ú<lambda>Õ  ó    z-TestChunkedPost.application.<locals>.<lambda>rf   z/cc                      rS  )Nr,  r    rT  r   rU  r   r   rV  Ù  rW  s   We should not get herer\   )rP  rÚ   rX   r5   ri   Úiterr_   )rI   r  r  r9   Úlinesr   rU  r   r~   Ì  s   zTestChunkedPost.applicationc                 C   sÔ   d}|   ¡ }| |¡ t|dd W d   ƒ n1 sw   Y  |   ¡ }| | dd¡¡ t|dd W d   ƒ n1 s?w   Y  |   ¡ }| | dd¡¡ t|dd W d   ƒ d S 1 scw   Y  d S )Nsi   POST /a HTTP/1.1
Host: localhost
Connection: close
Transfer-Encoding: chunked

2
oh
4
 hai
0

rF  rÐ   s   /as   /bs   /c)r¥   r    r¶   ÚreplacerH  r   r   r   Útest_014_chunked_postÝ  s   

þ
þ
"þz%TestChunkedPost.test_014_chunked_postc                 C   rE  )Nst   POST /a HTTP/1.1
Host: localhost
Connection: close
Content-Length: 12
Transfer-Encoding: chunked

{"hi": "ho"}é  r  rG  rH  r   r   r   Ú#test_229_incorrect_chunk_no_newlineî  s
   

"þz3TestChunkedPost.test_229_incorrect_chunk_no_newlinec                 C   rE  )Nsv   POST /a HTTP/1.1
Host: localhost
Connection: close
Content-Length: 12
Transfer-Encoding: chunked

{"hi": "ho"}
r\  r  rG  rH  r   r   r   Ú test_229_incorrect_chunk_non_hexû  s
   

"þz0TestChunkedPost.test_229_incorrect_chunk_non_hexc                 C   rE  )Nsw   POST /a HTTP/1.1
Host: localhost
Connection: close
Transfer-Encoding: chunked

2;token="oh hi"
oh
4
 hai
0

rF  rÐ   rG  rH  r   r   r   Ú!test_229_correct_chunk_quoted_ext  rJ  z1TestChunkedPost.test_229_correct_chunk_quoted_extc                 C   rE  )Nóu   POST /a HTTP/1.1
Host: localhost
Connection: close
Transfer-Encoding: chunked

2;token=oh_hi
oh
4
 hai
0

rF  rÐ   rG  rH  r   r   r   Ú test_229_correct_chunk_token_ext  rJ  z0TestChunkedPost.test_229_correct_chunk_token_extc                 C   sX   d}|  ddd ¡}|  ¡ }| |¡ t|dd W d   ƒ d S 1 s%w   Y  d S )Nr`  s   oh_his   _oh_hii   r\  r  )rZ  r¥   r    r¶   rH  r   r   r   Ú+test_229_incorrect_chunk_token_ext_too_long  s   

"þz;TestChunkedPost.test_229_incorrect_chunk_token_ext_too_longzMaybe hangsc                 C   sn   d}d}|   ¡ }| |¡ t|dd | |¡ t|dd W d   ƒ n1 s)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
rF  rÐ   úoh byer2   ©r¥   r    r¶   rì   rP  )rI   Údata1Údata2r*   r   r   r   Útest_trailers_keepalive_ignored#  s   ÿÿ



üz/TestChunkedPost.test_trailers_keepalive_ignoredc              	   C   sŠ   d}|   ¡ 5}| |¡ t|dd |  t¡ t|ƒ W d   ƒ n1 s&w   Y  W d   ƒ d S W d   ƒ d S 1 s>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

rF  rÐ   )r¥   r    r¶   ÚassertRaisesr   rH  r   r   r   Útest_trailers_close_ignoredG  s   ÿ


ÿý"ýz+TestChunkedPost.test_trailers_close_ignoredc              	   C   sœ   d}|dt j 7 }|  ¡ 7}| |¡ t|dd |  t¡ t|dd W d   ƒ n1 s/w   Y  W d   ƒ d S W d   ƒ d S 1 sGw   Y  d S )Ns|   POST /a HTTP/1.1
Host: localhost
Connection: keep-alive
Transfer-Encoding: chunked

2
oh
4
 hai
0
trailer2: value2ó   trF  rÐ   rc  )r   ÚMAX_REQUEST_LINEr¥   r    r¶   rh  r   rH  r   r   r   Útest_trailers_too_long`  s   ÿ

ÿý"ýz&TestChunkedPost.test_trailers_too_longc              	   C   s†   d}|   ¡ ,}| |¡ t|dd |  t¡ t|ƒ W d   ƒ n1 s&w   Y  W d   ƒ n1 s5w   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

rF  rÐ   r    ©r¥   r    r¶   rh  r   rì   rP  rH  r   r   r   Ú=test_trailers_request_smuggling_missing_last_chunk_keep_alivey  s   	ÿ


ÿ€ýzMTestChunkedPost.test_trailers_request_smuggling_missing_last_chunk_keep_alivec              	   C   sŠ   d}|   ¡ .}| |¡ t|dd |  t¡ t|dd W d   ƒ n1 s(w   Y  W d   ƒ n1 s7w   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

rF  rÐ   r\  r  r    rm  rH  r   r   r   Ú,test_trailers_request_smuggling_header_firstš  s   ÿ

ÿ€ýz<TestChunkedPost.test_trailers_request_smuggling_header_firstc                 C   s`   d}|   ¡ }| |¡ t|dd t|dd W d   ƒ n1 s"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

rF  rÐ   r\  r  r    rd  rH  r   r   r   Ú>test_trailers_request_smuggling_request_terminates_then_header´  s   ÿ

ýzNTestChunkedPost.test_trailers_request_smuggling_request_terminates_then_header)r   r   r   rP  r„   r~   r[  r]  r^  r_  ra  rb  rƒ   ÚskipOnWindowsrg  ri  rl  rn  ro  rp  rÍ   r   r   r   r   rO  Ä  s,    
#


 
rO  c                   @   sD   e Zd ZdZdZeeee ƒƒZdd„ Zdd„ Z	dd„ Z
d	d
„ ZdS )ÚTestUseWrites   abcdes   endc                 C   s˜   |d dkr|ddd| j fgƒ}|| jƒ | jgS |d dkr.|ddgƒ}|| jƒ | jgS |d dkrH|ddgƒ}|| jƒ || jƒ | jgS tdƒ‚)	Nrù   z/explicit-content-lengthrú   rû   r   z/no-content-lengthz/no-content-length-twicezInvalid url)rl   rC   rH   Úend)rI   r  r  r    r   r   r   r~   Ô  s    ÿ
ö
ù

ÿzTestUseWrite.applicationc                 C   sd   |   ¡ }| d¡ t|| j| j d}W d   ƒ n1 sw   Y  | d| j¡ | dd¡ d S )NzMGET /explicit-content-length HTTP/1.1
Host: localhost
Connection: close

rÐ   r   rd   F)r¥   r    r¶   rC   rs  r[   rl   r  r   r   r   Útest_explicit_content_lengthå  s   

þz)TestUseWrite.test_explicit_content_lengthc                 C   sb   |   ¡ }| d¡ t|| j| j d}W d   ƒ n1 sw   Y  | dd¡ | dd¡ d S )NzGGET /no-content-length HTTP/1.1
Host: localhost
Connection: close

rÐ   r   Frd   rc   )r¥   r    r¶   rC   rs  r[   r  r   r   r   Útest_no_content_lengthì  s   

þz#TestUseWrite.test_no_content_lengthc                 C   s‚   |   ¡ }| d¡ t|| j| j | j d}W d   ƒ n1 s!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   Frd   rc   )r¥   r    r¶   rC   rs  r[   rì   rD   r  r   r   r   Útest_no_content_length_twiceô  s   

þz)TestUseWrite.test_no_content_length_twiceN)r   r   r   rC   rs  r^   r?  rl   r~   rt  ru  rv  r   r   r   r   rr  Î  s    rr  c                   @   sR   e Zd Zej ej e¡d¡Zej ej e¡d¡Z	dd„ Z
ddd„Zd	d
„ ZdS )ÚHttpsTestCaseztest_server.crtztest_server.keyc                 C   s"   t j| jdf|| j| jd| _d S )Nr   ©ÚcertfileÚkeyfile)r   r{   r|   ry  rz  r}   r…   r   r   r   r     s   ÿzHttpsTestCase.init_serverr¸   Nc              
   K   s$  dd l }|  ¡ €}| |¡b}|jddL}| d| ¡ |d ur;| dt|ƒ ¡ | |¡ | d¡d u r:||d< n| d¡ | ¡  t|fi |¤ŽW  d   ƒ W  d   ƒ W  d   ƒ S 1 sdw   Y  W d   ƒ n1 ssw   Y  W d   ƒ d S W d   ƒ d S 1 s‹w   Y  d S )Nr   r    r³   z %s / HTTP/1.1
Host: localhost
zContent-Length: %s

rC   r¹   )	Ússlr²   Úwrap_socketr¥   r    r?  rX   Úflushr¶   )rI   r¼   Ú	post_bodyr¢   r{  Úraw_sockr´   r*   r   r   r   r·     s,   

€
õÿÿÿÿ"ÿzHttpsTestCase.urlopenc                 C   s4   |d dksJ |d ƒ‚|ddgƒ |d   d¡gS )Nzwsgi.url_schemeÚhttpsrú   rû   r,  é
   rT  ©rI   Úenvironr  r   r   r   r~     s   zHttpsTestCase.application)r¸   N)r   r   r   Úosr½   rj   ÚdirnameÚ__file__ry  rz  r   r·   r~   r   r   r   r   rw  þ  s    
rw  Úcreate_default_contextc                   @   r  )ÚHttpsSslContextTestCasec                 C   s@   ddl m} |ƒ }|j| j| jd tj| jdf||d| _d S )Nr   )Ú_create_unverified_contextrx  )Ússl_context)	Ú
gevent.sslr‰  Úload_cert_chainry  rz  r   r{   r|   r}   )rI   r~   r‰  Úcontextr   r   r   r   #  s   ÿz#HttpsSslContextTestCase.init_serverN)r   r   r   r   r   r   r   r   rˆ  "  ó    rˆ  c                   @   s*   e Zd Zeedƒrdd„ Zdd„ ZdS dS )Ú	TestHttpsr{  c                 C   s    | j ddd}|  |jd¡ d S )NÚPOSTÚabc)r¼   r~  ©r·   rì   rC   ©rI   r±   r   r   r   Útest_012_ssl_server5  ó   zTestHttps.test_012_ssl_serverc                 C   s   |   ¡ }|  |jd¡ d S )Nre   r’  r“  r   r   r   Útest_013_empty_return9  s   zTestHttps.test_013_empty_returnN)r   r   r   rR   r
   r”  r–  r   r   r   r   r  1  s
    
úr  c                   @   r   )ÚTestHttpsWithContextNr   r   r   r   r   r—  >  r   r—  c                   @   ó    e Zd ZdZdd„ Zdd„ ZdS )ÚTestInternationalNc                 C   sB   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ì   )rI   rƒ  r  Ú
path_bytesr   r   r   r~   D  s   
zTestInternational.applicationc              	   C   sŠ   |   ¡ 7}| d dd¡¡ | ¡ }t|ddddd W d   ƒ n1 s&w   Y  W d   ƒ d S W d   ƒ d S 1 s>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

ó   
r3   ÚPASSEDFre   r   )rE   rD   rC   rl   )r²   ÚsendallrZ  r¥   r¶   )rI   r´   r*   r   r   r   ÚtestO  s   
û
ÿù"ùzTestInternational.test©r   r   r   r   r~   r   r   r   r   r   r™  A  s    r™  c                       sH   e Zd ZdZdZdZeZ‡ fdd„Z‡ fdd„Z	dd	„ Z
d
d„ Z‡  ZS )Ú"TestNonLatin1HeaderFromApplicationFNs   á½Š3c                    s   t t| ƒ ¡  g | _d S rK   )rŽ   r¢  r„   ÚerrorsrL   r   r   r   r„   b  s   
z(TestNonLatin1HeaderFromApplication.setUpc                    s   g | _ tt| ƒ ¡  d S rK   )r£  rŽ   r¢  r’   rL   r   r   r   r’   f  s   z+TestNonLatin1HeaderFromApplication.tearDownc                 C   s<   z|ddd| j fgƒ W g S    | j t ¡ d d… ¡ ‚ )Nr›  rû   zCustom-Headerr2   )rY   r£  r‡   ÚsysÚexc_infor‚  r   r   r   r~   j  s   ÿÿýz.TestNonLatin1HeaderFromApplication.applicationc              	   C   sè   |   ¡ f}|  ¡  | d¡ | ¡ @}| jr;t|ddd | jtjd |  	t
| jƒd¡ | jd \}}|  |t¡ nt|dd	d |  	t
| jƒd¡ W d   ƒ n1 sUw   Y  W d   ƒ d S W d   ƒ d S 1 smw   Y  d S )
Ns   GET / HTTP/1.1

r   r   )rF   rE   )Ú
where_typer    r   r   rž  )r²   Úexpect_one_errorrŸ  r¥   Úshould_errorr¶   Úassert_errorr   ÚSecureEnvironrì   r?  r£  ÚassertIsInstanceÚUnicodeError)rI   r´   r*   rî   Úvr   r   r   r   u  s"   


€÷ý"ýz'TestNonLatin1HeaderFromApplication.test)r   r   r   Úerror_fatalr   rY   r   r¨  r„   r’   r~   r   rÍ   r   r   r   r   r¢  [  s    r¢  c                   @   s   e Zd ZdZdZdS )Ú)TestNonLatin1UnicodeHeaderFromApplicationu   á½Š3TN)r   r   r   rY   r¨  r   r   r   r   r¯  …  s    r¯  c                   @   r˜  )ÚTestInputReadlineNc                 C   sb   |d }g }	 |  ¡ }|sntr| d¡n|}| t|ƒd ¡ q|dg ƒ tr/dd„ |D ƒS |S )Nr,  Tr\   r=   ú	200 helloc                 S   ó   g | ]}|  d ¡‘qS ©r\   ©r_   ©r"   Úlr   r   r   r   ž  ó    z1TestInputReadline.application.<locals>.<listcomp>)r%   r   r&   r‡   r6   ©rI   rƒ  r  ÚinputrY  r-   r   r   r   r~   ”  s   û
zTestInputReadline.applicationc                 C   s^   |   ¡ !}d}| dt|ƒ|f ¡ | ¡  t|ddd W d   ƒ d S 1 s(w   Y  d S )Nzhello

world
123zMPOST / HTTP/1.1
Host: localhost
Connection: close
Content-Length: %s

%sÚhelloz'hello\n' '\n' 'world\n' '123' )rE   rC   )r¥   r    r?  r}  r¶   )rI   r*   Úcontentr   r   r   r      s   

ÿ"ûzTestInputReadline.testr¡  r   r   r   r   r°    s    r°  c                   @   r  )ÚTestInputIterc                 C   sb   |d }g }|D ]}|s nt r| d¡n|}| t|ƒd ¡ q|dg ƒ t r/dd„ |D ƒS |S )Nr,  r\   r=   r±  c                 S   r²  r³  r´  rµ  r   r   r   r   ´  r·  z-TestInputIter.application.<locals>.<listcomp>)r   r&   r‡   r6   r¸  r   r   r   r~   «  s   
zTestInputIter.applicationNr  r   r   r   r   r¼  ©  ó    r¼  c                   @   r  )ÚTestInputReadlinesc                 C   sH   |d }dd„ |  ¡ D ƒ}dd„ |D ƒ}|dg ƒ tr"dd„ |D ƒS |S )Nr,  c                 S   s   g | ]}t r| d ¡n|‘qS r³  )r   r&   rµ  r   r   r   r   »  s    z2TestInputReadlines.application.<locals>.<listcomp>c                 S   s   g | ]}t |ƒd  ‘qS )r=   )r6   )r"   r-   r   r   r   r   ¼  s    r±  c                 S   r²  r³  r´  rµ  r   r   r   r   ¾  r·  )Ú	readlinesr   )rI   rƒ  r  r¹  rY  r   r   r   r~   ¹  s
   
zTestInputReadlines.applicationNr  r   r   r   r   r¾  ·  r½  r¾  c                   @   r˜  )Ú
TestInputNNc                 C   s   |d   d¡ |dg ƒ g S )Nr,  é   rú   rT  r‚  r   r   r   r~   É  s   
zTestInputN.applicationc                 C   ó   |   ¡  d S rK   ©r·   rL   r   r   r   r   Î  r<  zTestInputN.testr¡  r   r   r   r   rÀ  Á  s    rÀ  c                   @   s&   e Zd Zeƒ ZdZdd„ Zdd„ ZdS )ÚTestErrorInApplicationFc                 C   s   t  d¡| _| j‚)NzTestError.application©rƒ   r	   rç   r3  r   r   r   r~   ×  s   z"TestErrorInApplication.applicationc                 C   s(   |   ¡  | jdd |  tj| j¡ d S )Nr   r  )r§  r·   r©  rƒ   r	   rç   rL   r   r   r   r   Û  s   zTestErrorInApplication.testN)r   r   r   r¯   rç   r®  r~   r   r   r   r   r   rÄ  Ò  s
    rÄ  c                   @   r  )ÚTestError_after_start_responsec                 C   s   t  d¡| _|ddgƒ | j‚)Nú*TestError_after_start_response.applicationrú   rû   rÅ  r3  r   r   r   r~   ã  s   rÇ  Nr  r   r   r   r   rÆ  á  r½  rÆ  c                   @   r"  )ÚTestEmptyYieldc                 c   s    |ddgƒ dV  dV  d S ©Nrú   rû   rf   r   r%  r   r   r   r~   ë  ó   €
zTestEmptyYield.applicationc                 C   sb   g }|   ¡ }| d¡ t|d|d | ¡ }W d   ƒ n1 s!w   Y  |  |dd| ¡ d S )Nr=  re   r8  rf   zgot garbage: %r©r¥   r    r¶   r5   rì   ©rI   rD   r*   Úgarbager   r   r   Útest_errñ  s   


ûzTestEmptyYield.test_errN©r   r   r   rÇ   r~   rÎ  r   r   r   r   rÈ  é  ó    
rÈ  c                   @   r"  )ÚTestFirstEmptyYieldc                 c   s    |ddgƒ dV  dV  d S )Nrú   rû   rf   ó   hellor   r%  r   r   r   r~   ÿ  rÊ  zTestFirstEmptyYield.applicationc                 C   s^   dg}|   ¡ }| d¡ t|d|d | ¡ }W d   ƒ n1 s"w   Y  |  |d¡ d S )NrÒ  r=  rº  r8  rf   rË  rÌ  r   r   r   rÎ    s   


ûzTestFirstEmptyYield.test_errNrÏ  r   r   r   r   rÑ  ý  rÐ  rÑ  c                   @   r"  )ÚTestEmptyYield304c                 c   s    |dg ƒ dV  dV  d S )Nú304 Not modifiedrf   r   r%  r   r   r   r~     s   €

zTestEmptyYield304.applicationc                 C   sZ   |   ¡ }| d¡ t|dddd | ¡ }W d   ƒ n1 s w   Y  |  |d¡ d S )Nr=  i0  re   F)rF   rC   rD   rf   rË  )rI   r*   rÍ  r   r   r   rÎ    s   


ýzTestEmptyYield304.test_errNrÏ  r   r   r   r   rÓ    rÐ  rÓ  c                   @   r˜  )ÚTestContentLength304Nc              
   C   sL   z|ddgƒ W t dƒ‚ t y% } z|dg ƒ |jW  Y d }~S d }~ww )NrÔ  )r   Ú100z
200 Raisedz)start_response did not fail but it should)râ   rO   )rI   r  r  rå   r   r   r   r~   $  s   ý
€þz TestContentLength304.applicationc                 C   s`   d}|   ¡ }| d¡ t|dd|dd | ¡ }W d   ƒ n1 s#w   Y  |  |d¡ d S )NzGInvalid Content-Length for 304 response: '100' (must be absent or zero)r=  r   ÚRaisedF)rF   rE   rC   rD   rf   rË  )rI   rC   r*   rÍ  r   r   r   rÎ  ,  s   


üzTestContentLength304.test_err©r   r   r   r   r~   rÎ  r   r   r   r   rÕ  !  s    rÕ  c                   @   r˜  )ÚTestBody304Nc                 C   s   |dg ƒ dgS )NrÔ  s   bodyr   r3  r   r   r   r~   9  s   
zTestBody304.applicationc              	   C   s€   |   ¡ 2}| d¡ |  t¡}t|ƒ W d   ƒ n1 sw   Y  |j}|  t|ƒd¡ W d   ƒ d S 1 s9w   Y  d S )Nr=  ú"The 304 response must have no body)r¥   r    rh  râ   r¶   rá   rì   r^   ©rI   r*   Úexcrå   r   r   r   rÎ  =  s   


ÿ"ûzTestBody304.test_errrØ  r   r   r   r   rÙ  6  s    rÙ  c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚTestWrite304Nc              
   C   sH   |dg ƒ}d| _ z|dƒ W d S  ty# } zd| _ t|jŽ ‚d }~ww )NrÔ  FrC   T)Úerror_raisedrâ   r   rO   )rI   r  r  r    rå   r   r   r   r~   J  s   

€þzTestWrite304.applicationc              	   C   sŒ   |   ¡ )}| d¡ |  t¡}t|ƒ W d   ƒ n1 sw   Y  |j}W d   ƒ n1 s0w   Y  |  t|ƒd¡ |  | j	d¡ d S )Ns6   GET / HTTP/1.1
Host: localhost
Connection: close

rÚ  zwrite() must raise)
r¥   r    rh  râ   r¶   rá   rì   r^   rÚ   rÞ  rÛ  r   r   r   rÎ  S  s   


ÿüzTestWrite304.test_err)r   r   r   r   rÞ  r~   rÎ  r   r   r   r   rÝ  F  s
    	rÝ  c                   @   r  )ÚTestEmptyWritec                 C   s    |ddgƒ}|dƒ |dƒ g S rÉ  r   )r  r  r    r   r   r   r~   `  s   zTestEmptyWrite.applicationNr  r   r   r   r   rß  ^  r  rß  c                   @   sR   e Zd ZdZdZejjsJ ‚G dd„ dejƒZdd„ Zdd„ Z	dd	„ Z
d
d„ ZdS )ÚBadRequestTestsNc                   @   r  )zBadRequestTests.handler_classc                 C   ó   t dƒ‚)NzShould not print a traceback©râ   rL   r   r   r   Ú_print_unexpected_excp  ó   z3BadRequestTests.handler_class._print_unexpected_excN)r   r   r   rã  r   r   r   r   rr   o  rŽ  rr   c                 C   s$   |   |d | j¡ |ddgƒ dgS )Nrh   rú   rû   rÒ  )rì   rl   r3  r   r   r   r~   s  s   zBadRequestTests.applicationc                 C   óP   d| _ |  ¡ }| d| j  ¡ t|dd W d   ƒ d S 1 s!w   Y  d S )Nz-100ú7GET / HTTP/1.1
Host: localhost
Content-Length: %s

©r   r\  r  ©rl   r¥   r    r¶   r9  r   r   r   Útest_negative_content_lengthx  ó
   
"þz,BadRequestTests.test_negative_content_lengthc                 C   rå  )Nr‘  ræ  rç  r  rè  r9  r   r   r   Útest_illegal_content_length~  rê  z+BadRequestTests.test_illegal_content_lengthc                 C   rE  )NzGET / HTTP %
r\  r  rG  )rI   Úbad_requestr*   r   r   r   Ú"test_bad_request_line_with_percent„  s
   

"þz2BadRequestTests.test_bad_request_line_with_percent)r   r   r   r   rl   rp   rr   rã  r~   ré  rë  rí  r   r   r   r   rà  h  s    rà  c                   @   sp   e Zd ZdZdZdd„ Zddd„Zddd„Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚChunkedInputTestsre   Nc                 C   s‚   |d }g }|d }|dkr|  d¡}|g}n"|dkr&|D ]}| |¡ qn|dkr5|  d¡ | d¡ ntd	ƒ‚|d
dgƒ |S )Nr,  rù   z/short-readr  z/linesz/pingr    s   pongzbad pathrú   rû   )r5   r‡   ÚRuntimeError)rI   r  r  r¹  rÞ   ÚpiÚdr#   r   r   r   r~   ’  s    
ÿ
zChunkedInputTests.applicationc                 C   s   |d u r| j }t||dS )N©Údirt)ró  Úchunk_encode)rI   rD   ró  r   r   r   rô  §  s   zChunkedInputTests.chunk_encodec                 C   s   | j g d¢|dS )N)Úthisz is rc   z
linez 2Ú
Úline3re   rò  )rô  )rI   ró  r   r   r   rC   ­  r7  zChunkedInputTests.bodyc                 C   s   |  d¡ t|dd d S )NzGET /ping HTTP/1.1

ÚpongrÐ   )r    r¶   r9  r   r   r   Úping°  s   
zChunkedInputTests.pingc                 C   s   |   |¡ d S rK   )rù  r9  r   r   r   Úping_if_possible´  ó   z"ChunkedInputTests.ping_if_possiblec              	   C   sš   |   ¡ }d| }|  ¡ 7}|jdd}| |¡ t|dd |  |¡ W d   ƒ n1 s.w   Y  W d   ƒ d S W d   ƒ d S 1 sFw   Y  d S )NsN   POST /short-read HTTP/1.1
transfer-encoding: Chunked
Content-Length:1000

r    r³   ú
this is chrÐ   )rC   r²   r¥   r    r¶   rú  )rI   rC   Úreqr©   r*   r   r   r   Ú#test_short_read_with_content_length·  s   

üÿ"ÿz5ChunkedInputTests.test_short_read_with_content_lengthc                 C   ó^   |   ¡ }d| }|  ¡ }| |¡ t|dd |  |¡ W d   ƒ d S 1 s(w   Y  d S )NsK   POST /short-read HTTP/1.1
transfer-encoding: Chunked
Content-Length:0

rü  rÐ   ©rC   r¥   r    r¶   rú  ©rI   rC   rý  r*   r   r   r   Ú(test_short_read_with_zero_content_lengthÁ  s   

"üz:ChunkedInputTests.test_short_read_with_zero_content_lengthc                 C   rÿ  )Nó9   POST /short-read HTTP/1.1
transfer-encoding: Chunked

rü  rÐ   r   r  r   r   r   Útest_short_readÌ  s   

"üz!ChunkedInputTests.test_short_readc                 C   sb   | j dd}d| }|  ¡ }| |¡ t|dd |  |¡ W d   ƒ d S 1 s*w   Y  d S )Nz; here is dirt blarò  s3   POST /ping HTTP/1.1
transfer-encoding: Chunked

rø  rÐ   r   r  r   r   r   Ú	test_dirtÖ  s   

"üzChunkedInputTests.test_dirtc                 C   sj   |   ¡ }dt|ƒ }| d¡}||7 }|  ¡ }| |¡ t|dd W d   ƒ d S 1 s.w   Y  d S )NzHPOST /lines HTTP/1.1
Content-Length: %s
transfer-encoding: Chunked

r   zthis is chunked
line 2
line3rÐ   )rC   r?  r_   r¥   r    r¶   r  r   r   r   Útest_chunked_readlineà  s   


"þz'ChunkedInputTests.test_chunked_readlinec              	   C   sð   |   ¡  d}d| }|  ¡ (}|jddd}| |¡ | ¡  W d   ƒ n1 s*w   Y  W d   ƒ n1 s9w   Y  | ¡  ~~t ¡ j ¡  t 	d¡ t
jrpdd l}| ¡  t 	d¡ t ¡ j ¡  | ¡  t 	d¡ |  td¡ d S )	Ns   4
thir  r    Úwb)r™   r›   g{®Gáz„?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)rI   rC   rý  r´   r*   r—   r   r   r   Útest_close_before_finishedê  s.   


þ€ÿ



z,ChunkedInputTests.test_close_before_finishedrK   )r   r   r   ró  r   r~   rô  rC   rù  rú  rþ  r  r  r  r  r  r   r   r   r   rî  Ž  s    





rî  c                   @   r˜  )ÚExpect100ContinueTestsNc                 C   sl   t |d ƒ}|dkr|dddgƒ dgS |d  d¡}||d  |d ¡7 }|d	d
tt|ƒƒfdgƒ |gS )Nrh   i   z417 Expectation Failed)r   Ú7rû   s   failurer,  r    rú   r   )r4   r5   r^   r?  )rI   rƒ  r  rl   Útextr   r   r   r~     s   z"Expect100ContinueTests.applicationc                 C   sò   |   ¡ )}d}| d| ¡ t|ddd | d¡ t|dd t|d	d
 W d   ƒ n1 s0w   Y  |   ¡ 6}d}d t|ƒ|¡}| d t|ƒ|¡¡ t|ddd | d¡ t|dd t|d	d
 W d   ƒ d S 1 srw   Y  d S )NÁ  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazOPUT / HTTP/1.1
Host: localhost
Content-length: 1025
Expect: 100-continue

i¡  Úfailure)rF   rC   zSPUT / HTTP/1.1
Host: localhost
Content-length: 7
Expect: 100-continue

testingrb   r  ÚtestingrÐ   Á³  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazOPUT / HTTP/1.1
Host: localhost
Content-length: {}
Expect: 100-continue

{})r¥   r    r¶   Úformatr?  )rI   r*   ÚpaddingrC   r   r   r   Útest_continue(  s"   

ù
	
"öz$Expect100ContinueTests.test_continue)r   r   r   r   r~   r  r   r   r   r   r    s    r  c                   @   r˜  )ÚMultipleCookieHeadersTestNc                 C   s.   |   |d d¡ |   |d d¡ |dg ƒ g S )NÚHTTP_COOKIEzname1="value1"; name2="value2"ÚHTTP_COOKIE2znameA="valueA"; nameB="valueB"rú   )rì   r‚  r   r   r   r~   C  s   
z%MultipleCookieHeadersTest.applicationc                 C   sH   |   ¡ }| d dd¡¡ t|ƒ W d   ƒ d S 1 s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    rZ  r¶   r9  r   r   r   r   I  s   
û
"ùzMultipleCookieHeadersTest.testr¡  r   r   r   r   r  ?  s    r  c                   @   s4   e Zd ZdZdZdd„ Zdd„ Zdd„ Zdd	„ ZdS )
ÚTestLeakInputNc                 C   s   t  | ¡ d | _d | _d S rK   )rp   r’   Ú_leak_wsgi_inputÚ_leak_environrL   r   r   r   r’   Y  s   

zTestLeakInput.tearDownc                 C   sR   |d }|d | _ || _|dkrt d¡|d< d}|ddtt|ƒƒfd	gƒ |gS )
Nrù   r,  z/leak-framer   Ú_leaks   foobarrú   r   rû   )r  r  r¤  Ú	_getframer^   r?  )rI   rƒ  r  rð  r  r   r   r   r~   ^  s   
zTestLeakInput.applicationc                 C   sP   |   ¡ }| d¡ | ¡ }W d   ƒ n1 sw   Y  |  | d¡|¡ d S )Ns%   GET / HTTP/1.0
Connection: close

ó   HTTP/1.1 200 OK)r¥   r    r5   rÚ   Ú
startswith©rI   r*   rñ  r   r   r   Ú!test_connection_close_leak_simplei  s
   


þz/TestLeakInput.test_connection_close_leak_simplec                 C   s\   |   ¡ }| d¡ | ¡ }W d   ƒ n1 sw   Y  |  | d¡|¡ | j d¡ d S )Ns/   GET /leak-frame HTTP/1.0
Connection: close

r   r  )r¥   r    r5   rÚ   r!  r  r¡   r"  r   r   r   Ú test_connection_close_leak_frameo  s   


þz.TestLeakInput.test_connection_close_leak_frame)	r   r   r   r  r  r’   r~   r#  r$  r   r   r   r   r  T  s    r  c                   @   sT   e Zd ZdZdZdZdZdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ Zdd„ ZdS )ÚTestHTTPResponseSplittingNrú   r   c                 C   s$   t  | ¡ d | _tj| _tj| _d S rK   )rp   r„   Ú	start_excr%  rð   r,   rL   r   r   r   r„     s   
zTestHTTPResponseSplitting.setUpc                 C   s   t  | ¡ d | _d S rK   )rp   r’   r&  rL   r   r   r   r’   …  rQ  z"TestHTTPResponseSplitting.tearDownc              
   C   sJ   z	|| j | jƒ W n ty } z
|| _W Y d }~dS d }~ww d | _dS )Nr   )rð   r,   rH   r&  )rI   rƒ  r  Úer   r   r   r~   ‰  s   €üz%TestHTTPResponseSplitting.applicationc                 C   s`   |   ¡ }| d¡ | ¡  W d   ƒ n1 sw   Y  |  | jt¡ |  | jjd |¡ d S )Nú#GET / HTTP/1.0
Host: localhost

r   )r¥   r    r5   r«  r&  Ú
ValueErrorrì   rO   )rI   Úmessager*   r   r   r   Ú_assert_failure’  s   


þz)TestHTTPResponseSplitting._assert_failurec                 C   s   d| _ |  d¡ d S )Nz0200 OK
Connection: close
Content-Length: 0

z$carriage return or newline in status)rð   r+  rL   r   r   r   Útest_newline_in_status™  s   z0TestHTTPResponseSplitting.test_newline_in_statusc                 C   ó   dg| _ |  d¡ d S )N)ÚTestzHi
Connection: closez*carriage return or newline in header value©r,   r+  rL   r   r   r   Útest_newline_in_header_value  ó   z6TestHTTPResponseSplitting.test_newline_in_header_valuec                 C   r-  )N)zTest
ÚHiz)carriage return or newline in header namer/  rL   r   r   r   Útest_newline_in_header_name¡  r1  z5TestHTTPResponseSplitting.test_newline_in_header_name)r   r   r   r   rð   r,   r&  r„   r’   r~   r+  r,  r0  r3  r   r   r   r   r%  v  s    	r%  c                   @   r˜  )ÚTestInvalidEnvironNc                 C   sJ   |  ¡ D ]\}}|dv s| d¡r|dkrtd||f ƒ‚q|dg ƒ g S )N)rh   r$  ÚHTTP_Ú	HTTP_HOSTz&Unexpected environment variable: %s=%rrú   )rÂ   r!  r   )rI   rƒ  r  r.   r/   r   r   r   r~   ª  s   ÿ€
zTestInvalidEnviron.applicationc                 C   sz   |   ¡ }| d¡ t|ƒ W d   ƒ n1 sw   Y  |   ¡ }| d¡ t|ƒ W d   ƒ d S 1 s6w   Y  d S )Nr(  rµ   rG  r9  r   r   r   r   ³  s   


þ


"þzTestInvalidEnviron.testr¡  r   r   r   r   r4  ¦  s    	r4  c                   @   r˜  )ÚTestInvalidHeadersDroppedNc                 C   s   |   d|¡ |dg ƒ g S )NÚHTTP_X_AUTH_USERrú   )ÚassertNotInr‚  r   r   r   r~   À  s   
z%TestInvalidHeadersDropped.applicationc                 C   s@   |   ¡ }| d¡ t|ƒ W d   ƒ d S 1 sw   Y  d S )Nz$GET / HTTP/1.0
x-auth_user: bob

rG  r9  r   r   r   r   Å  s   


"þzTestInvalidHeadersDropped.testr¡  r   r   r   r   r7  ¼  s    r7  c                   @   s2   e Zd ZdZG dd„ dejƒZdd„ Zdd„ ZdS )ÚTestHandlerSubclassNc                   @   r  )z!TestHandlerSubclass.handler_classc                 C   sb   | j  d¡}|d dkr*|| j  d¡7 }| ¡ dkr"| j d¡ d S |  d|¡ d S || j  ¡  S )Né   r   é<   é   s   <policy-file-request/>ó   HELLOzInvalid request: %r)Úrfiler5   r!   r
   rŸ  Ú	log_errorr%   )rI   r9   r   r   r   Úread_requestlineÑ  s   ÿz2TestHandlerSubclass.handler_class.read_requestlineN)r   r   r   rA  r   r   r   r   rr   Ï  r½  rr   c                 C   s   |dg ƒ g S )Nrú   r   r‚  r   r   r   r~   à  s   
zTestHandlerSubclass.applicationc                 C   sÜ   |   ¡ }| d¡ | ¡  |  | ¡ d¡ W d   ƒ n1 s w   Y  |   ¡ }| d¡ | ¡  t|ƒ W d   ƒ n1 sAw   Y  |   ¡ }| d¡ | ¡  |  | ¡ d¡ W d   ƒ d S 1 sgw   Y  d S )Ns   <policy-file-request/> r>  r=  z<policy-file-XXXuest/> rf   )r¥   r    r}  rì   r5   r¶   r9  r   r   r   r   ä  s   

ý


ý

"üzTestHandlerSubclass.test)r   r   r   r   rp   rr   r~   r   r   r   r   r   r:  Ë  s
    r:  c                   @   s$   e Zd ZdZedd„ ƒZdd„ ZdS )ÚTestErrorAfterChunkNc                 c   s    |ddgƒ dV  t  d¡‚)Nrú   rû   rÒ  rB  )rƒ   r	   r%  r   r   r   r~   ù  rÊ  zTestErrorAfterChunk.applicationc              	   C   s|   |   ¡ *}|  ¡  | d¡ |  t¡ t|ƒ W d   ƒ n1 s"w   Y  W d   ƒ n1 s1w   Y  |  tj¡ d S )Nz;GET / HTTP/1.1
Host: localhost
Connection: keep-alive

)	r¥   r§  r    rh  r)  r¶   r©  rƒ   r	   r9  r   r   r   r   ÿ  s   


ÿ€ýzTestErrorAfterChunk.test)r   r   r   r   rÇ   r~   r   r   r   r   r   rB  ö  s
    
rB  c                 C   s>   |d u rd}d}| D ]}dt |ƒ||f }|| d¡7 }q
|S )Nre   rf   z
%x%s
%s
r\   )r?  r_   )rD   ró  ÚbÚcr#   r   r   r   rô    s   rô  c                       sœ   e Zd Zd#dd„Zerd$‡ fdd„	Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Z‡  ZS )%ÚTestInputRawNFc                 C   sB   t |tƒrt|ƒ}d}nt |tƒrtr| d¡}tt|ƒ||dS )NTr\   )rl   Úchunked_input)r]   ri   rô  r^   r   r_   r   ÚStringIO)rI   r9   rl   rF  r   r   r   Ú
make_input  s   

zTestInputRaw.make_inputc                    s,   t |tƒr
| d¡}tt| ƒ |||¡ d S r   )r]   r^   r_   rŽ   rE  rì   )rI   ÚfirstÚsecondÚmsgr   r   r   rì     s   

zTestInputRaw.assertEqualc                 C   ó    | j ddd}|  t|j¡ d S ©NÚ1r2   ©rl   ©rH  rh  r  r5   ©rI   Úir   r   r   Útest_short_post"  r•  zTestInputRaw.test_short_postc                 C   s"   | j ddd}|  t|jd¡ d S rM  rP  rQ  r   r   r   Ú test_short_post_read_with_length&  ó   z-TestInputRaw.test_short_post_read_with_lengthc                 C   rL  rM  ©rH  rh  r  r%   rQ  r   r   r   Útest_short_post_readline*  r•  z%TestInputRaw.test_short_post_readlinec                 C   s&   | j ddd}| ¡ }|  |d¡ d S )NÚ12r2   rO  ©rH  r5   rì   ©rI   rR  r9   r   r   r   Ú	test_post.  ó   zTestInputRaw.test_postc                 C   s(   | j ddd}| d¡}|  |d¡ d S )NrX  r2   rO  r  rY  rZ  r   r   r   Útest_post_read_with_length3  ó   
z'TestInputRaw.test_post_read_with_lengthc                 C   s&   |   g d¢¡}| ¡ }|  |d¡ d S )N©rN  Ú2re   rX  rY  rZ  r   r   r   Útest_chunked8  r\  zTestInputRaw.test_chunkedc                 C   s(   |   g d¢¡}| d¡}|  |d¡ d S )Nr_  r  rX  rY  rZ  r   r   r   Útest_chunked_read_with_length=  r^  z*TestInputRaw.test_chunked_read_with_lengthc                 C   ó    |   ddg¡}|  t|j¡ d S ©NrN  r`  rP  rQ  r   r   r   Útest_chunked_missing_chunkB  r•  z'TestInputRaw.test_chunked_missing_chunkc                 C   s"   |   ddg¡}|  t|jd¡ d S )NrN  r`  r  rP  rQ  r   r   r   Ú+test_chunked_missing_chunk_read_with_lengthF  rU  z8TestInputRaw.test_chunked_missing_chunk_read_with_lengthc                 C   rc  rd  rV  rQ  r   r   r   Ú#test_chunked_missing_chunk_readlineJ  r•  z0TestInputRaw.test_chunked_missing_chunk_readlinec                 C   rL  ©Nú2
1T©rF  rP  rQ  r   r   r   Útest_chunked_short_chunkN  r•  z%TestInputRaw.test_chunked_short_chunkc                 C   s"   | j ddd}|  t|jd¡ d S )Nri  Trj  r2   rP  rQ  r   r   r   Ú)test_chunked_short_chunk_read_with_lengthR  rU  z6TestInputRaw.test_chunked_short_chunk_read_with_lengthc                 C   rL  rh  rV  rQ  r   r   r   Ú!test_chunked_short_chunk_readlineV  r•  z.TestInputRaw.test_chunked_short_chunk_readlinec                 C   s  d}dt jd  }|d7 }||7 }d}d}t|dƒr"|  | ¡ d¡ ts0ts0|  tt	|ƒj
|¡ | j||d	}|  | 
¡ d
¡ |  | 
|¡d¡ |  | 
|¡|¡ | j|| t|ƒd d	}|  | 
¡ d
¡ |  | 
|¡d¡ |  | 
|¡|¡ |  | 
|¡d¡ d S )Ns
   asdf
ghij
rB  r  r  s   qjk
l    :;$ Ú
bit_lengthé#   rO  s   asdf
s   ghij
r    ó   q)r   rk  rR   rì   rn  r   r   rh  ÚOverflowErrorrG  r%   rH  r?  )rI   r9   Ú	long_dataÚpartial_dataÚnrR  r   r   r   Útest_32bit_overflowZ  s&   
z TestInputRaw.test_32bit_overflow)NFrK   )r   r   r   rH  r   rì   rS  rT  rW  r[  r]  ra  rb  re  rf  rg  rk  rl  rm  ru  rÍ   r   r   r   r   rE    s$    
rE  c                   @   r"  )ÚTest414c                 C   rá  )Nzshould not get thererâ  r%  r   r   r   r~   |  s   zTest414.applicationc                 C   sV   dd }|   ¡ }| d|  d¡¡ t|dd W d   ƒ d S 1 s$w   Y  d S )Nr#   i N  z"GET /%s HTTP/1.0
Hello: world

r   iž  r  )r¥   r    r_   r¶   )rI   Úlongliner*   r   r   r   r   €  s
   
"þzTest414.testN)r   r   r   rÇ   r~   r   r   r   r   r   rv  z  s    
rv  c                   @   sH   e Zd ZG dd„ deƒZdd„ Zedd„ ƒZdd„ Zd	d
„ Z	dd„ Z
dS )ÚTestLoggingc                   @   s0   e Zd ZdZdZdZdd„ Zdd„ Zdd„ ZdS )zTestLogging.LoggerNc                 C   s   ||f| _ d S rK   )Úlogged)rI   ÚlevelrK  r   r   r   ry     rû  zTestLogging.Logger.logc                 C   s
   || _ d S rK   )Úaccessed©rI   rK  r   r   r   Úaccess’  s   
zTestLogging.Logger.accessc                 C   s   | j S rK   )ÚthingrL   r   r   r   Ú	get_thing•  s   zTestLogging.Logger.get_thing)	r   r   r   r{  ry  r~  ry   r}  r  r   r   r   r   ÚLoggerŠ  s    r€  c                 C   s   |   ¡ S rK   )r€  rL   r   r   r   rx   ˜  rä  zTestLogging.init_loggerc                 C   s   |ddgƒ dgS )Nrú   rû   rÒ  r   r%  r   r   r   r~   ›  s   zTestLogging.applicationc                 C   sZ   |   t| jjtjƒ¡ | jj d¡ | jj d¡ |  | jjj	d¡ |  | jjj
d¡ d S )Nr}  r    )é   r    )rÚ   r]   r}   ry   r   ÚLoggingLogAdapterr}  r    rì   r{  ry  rL   r   r   r   Útest_proxy_methods_on_log¢  s
   z%TestLogging.test_proxy_methods_on_logc                 C   s>   d| j j_|  | j j ¡ d¡ | j j`|  | j j ¡ d ¡ d S )Né*   )r}   ry   r~  rì   r  rL   r   r   r   Útest_set_attributes«  s   
zTestLogging.test_set_attributesc                 C   s:   |   ¡  | jjjd }|  d|v |¡ |  d|v|¡ d S )Nr    z"GET / HTTP/1.1" 200 rö  )r·   r}   ry   ry  rÚ   r|  r   r   r   Útest_status_log³  s   zTestLogging.test_status_logN)r   r   r   r¯   r€  rx   rÇ   r~   rƒ  r…  r†  r   r   r   r   rx  ‡  s    
	rx  c                       sP   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
‡  ZS )ÚTestEnvironNc                    s   t t| ƒ |¡ tj| j_d S rK   )rŽ   r‡  r   r   rª  r}   Úenviron_classr…   r   r   r   r   Â  s   zTestEnviron.init_serverc                 C   s   |   |tj¡ |ddgƒ g S r2  )r«  r   rª  r3  r   r   r   r~   Æ  s   zTestEnviron.applicationc                 C   rÂ  rK   rÃ  rL   r   r   r   Ú!test_environ_is_secure_by_defaultË  r<  z-TestEnviron.test_environ_is_secure_by_defaultc                 C   sþ   t  ¡ }|  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) atr/   r.   z'<pywsgi.SecureEnviron dict (keys: 1) atF)zmissing valuez<MASKED>©r.   )r   rª  ÚassertInr6   r^   Úsecure_reprrì   Úwhitelist_keys)rI   rƒ  r   r   r   Útest_default_secure_reprÎ  s"   z$TestEnviron.test_default_secure_reprc                 C   sº   G d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                   @   r   )z>TestEnviron.test_override_class_defaults.<locals>.EnvironClassr   N)r   r   r   Ú	__slots__r   r   r   r   ÚEnvironClassè  r   r  FTrŠ  r    r.   r   )r   rª  rÚ   rŒ  Údefault_secure_reprrÜ   rì   r^   r6   Údefault_whitelist_keysr—   r˜   )rI   r  rƒ  r—   r   r   r   Útest_override_class_defaultsç  s   z(TestEnviron.test_override_class_defaultsc                 C   s(   t jt jfD ]}|  |ƒ  ¡ |¡ qd S rK   )r   ÚEnvironrª  r«  rÀ   )rI   rk   r   r   r   Útest_copy_still_secure  s   ÿz"TestEnviron.test_copy_still_securec           	      C   sº   dd l }dd l}tjtjfD ]L}ddi}||ƒ}|  ||¡ |  ||¡ |  ||¡ td|jd ƒD ]}| 	||¡}|  
d|¡ | |¡}|  t|ƒt¡ q2|  | 	|¡| 	|¡¡ qd S )Nr   r.   r/   r    s   Environ)ÚpickleÚjsonr   r”  rª  r«  rì   rë   ÚHIGHEST_PROTOCOLÚdumpsr9  ÚloadsÚtyperÃ   )	rI   r–  r—  rk   Úbltinr  ÚprotocolÚenv_dumpÚloadedr   r   r   Útest_pickle_copy_returns_dict  s   
ñz)TestEnviron.test_pickle_copy_returns_dict)r   r   r   r   r   r~   r‰  rŽ  r“  r•  r   rÍ   r   r   r   r   r‡  ¼  s    r‡  Ú__main__rK   )dr“   r   Ú	patch_allÚ
contextlibr   Úurllib.parser   r„  r¤  Úior   rG  rˆ   rò   Úwsgiref.validater   Úgevent.testingr  rƒ   r   r   Úgevent.testing.exceptionr	   r
   r   Úgevent.pywsgir   râ   r   rh   rè   rg   rH   r   r0   r:   r¯   r;   r5   r¶   rp   rÎ   rô   r  r  r  r  r  r  r#  r+  r1  r;  rA  rC  rL  rO  rr  rw  r‹  r¦   r{  ÚHAVE_SSLCONTEXTrˆ  r  r—  r™  r¢  r¯  r°  r¼  r¾  rÀ  rÄ  rÆ  rÈ  rÑ  rÓ  rÕ  rÙ  rÝ  rß  rà  rî  r  r  r  r%  r4  r7  r:  rB  rô  ÚBaseTestCaserE  rv  rx  r‡  r   Úmainr   r   r   r   Ú<module>   s¸   þZ T/  0 *

& '"0+
g5
aÿ