o
    U˟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[dd{d|Z\G d}d~ d~ej]Z^G dd de(Z_G dd de(Z`G dd de(Zaebdk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   a/var/www/apps/myagent/mysuperagent/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sJ ||
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 sw   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 )N6GET / 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  )Nu   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 sw   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-1007GET / 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  )N9   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{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)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