U
    Ź¼µbv  ć                   @   s,  d dl Z ddlmZmZ ddlT ddlT ddlmZmZm	Z	m
Z
mZ ddlmZmZm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d$d% Zd&d' Zd(d) Z d*d+ Z!d,d- Z"d.d/ Z#d0d1 Z$d2d3 Z%d4d5 Z&d6d7 Z'd8d9 Z(d:d; Z)dS )<é    Né   )ŚLocalProtocolErrorŚRemoteProtocolError)Ś*)Ś_keep_aliveŚ_body_framingŚ
ConnectionŚ	NEED_DATAŚPAUSEDé   )ŚConnectionPairŚget_all_eventsŚreceive_and_getc                   C   s¾   t tdddgdstt tddddgdr2tt tddddgdrLtt tddg ddrdtt td	g d
sxtt td	dgd
rtt td	dgd
r¤tt td	g ddrŗtd S )NŚGETś/)ŚHostzExample.com©ŚmethodŚtargetŚheaders©r   Śclose)r   za, b, cLOse, fooś1.0©r   r   r   Śhttp_versionéČ   ©Śstatus_coder   ©r   r   r   )r   ŚRequestŚAssertionErrorŚResponse© r"   r"   ś=/tmp/pip-unpacked-wheel-rko__zic/h11/tests/test_connection.pyŚtest__keep_alive   s@    ’’’’’’’
’’’’’r$   c                     sT  dd  d fdd	} d fdd	}i d	d
iddid
ddfD ]X}d| f |fd| f ddi|fd| f ddi|ffD ]\}}t ||dksztqzq>ddid
ddfD ]<}d |f |fd| f |ffD ]\}}t ||dksŹtqŹqŖd |d
dfd| d
dffD ]\}}t ||dkstqt d | dks:tt d|  dksPtd S )Nc                 S   s0   g }| d k	r|  dt| f” |r,|  d” |S )NśContent-Length©zTransfer-EncodingŚchunked)ŚappendŚstr)ŚclŚter   r"   r"   r#   r   &   s    
z#test__body_framing.<locals>.headersr   Fc                    s   t |  ||dS )Nr   )r!   )r   r*   r+   ©r   r"   r#   Śresp.   s    z test__body_framing.<locals>.respc                    s"    | |}|dg7 }t dd|dS )N©r   zexample.comr   r   r   )r   )r*   r+   Śhr,   r"   r#   Śreq1   s    

ztest__body_framing.<locals>.reqr*   éd   r+   T)r*   r+   ó   HEADó   GETr   éĢ   i0  )ścontent-length)r   )r'   r"   )r*   )r5   )r1   )zhttp/1.0r"   )r   NF)NF)r   r    )r-   r0   ŚkwargsŚmethŚrr"   r,   r#   Śtest__body_framing%   s     ž$$r9   c               	   C   s  t  t” td W 5 Q R X t } | jt jtks8t| jt j	t
ksLt| jt
 jt
ks`t| jt
 j	tkstt|  ttddddgd”}|dkst| jD ]}|jttt
tiks tq | jt jtksŠt| jt jtksät| jt
 jtksųt| jt
 jtkst| jt jd ks$t| jt
 jdks:t|  t
td	g d
”}|dks\t|  t
tddgd
”}|dkst| jD ]}|jttt
tikstq| jt jdks¼t| jt
 jdksŅt|  ttdd”}|dksņt| jttddtddt gd}|dks"t| jtt g d}|dksBt| jD ]}|jttt
tiksHtqH|  t
tdd”}|dkst| jt
tddtddt gd}|dksøt| jt
t g d}|dksŲt| jD ]}|jttt
tiksŽtqŽd S )NŚCLIENTr   r   r.   ©r%   Ś10r   s9   GET / HTTP/1.1
host: example.com
content-length: 10

ó   1.1r1   r   s   HTTP/1.1 100 

r   )r%   Z11s%   HTTP/1.1 200 
content-length: 11

ó   12345©Śdataó   67890©Śexpectó    ó
   1234567890ó   1)ŚpytestŚraisesŚ
ValueErrorr   r   Śconnr:   Śour_roler    Z
their_roleŚSERVERŚsendr   ŚconnsŚstatesŚ	SEND_BODYŚSEND_RESPONSEŚ	our_stateŚtheir_stateZtheir_http_versionŚInformationalResponser!   ŚDataŚEndOfMessageŚDONE©Śpr@   rJ   r"   r"   r#   Ś)test_Connection_basics_and_content_lengthK   sv    ’’’’

’’’
’
’
rZ   c                  C   s  t  } |  ttddddgd” |  ttdddd”}|d	ksBt|  ttd
ddd”}|dksdt| jttddg d}|dkst|  ttdgd”}|dks¦t|  ttddgd” |  ttdddd” |  ttdddd” |  tt ” | j	D ]}|j
ttttiksütqüd S )Nr   r   r.   r&   r   rE   T©r@   Zchunk_startZ	chunk_ends   a
1234567890
s   abcdes
   5
abcde
rD   r?   rB   )ZhelloZtherer,   s   0
hello: there

r   r   s   54321r>   )r   rM   r:   r   rU   r    rV   rL   r!   rN   rO   rW   rX   r"   r"   r#   Śtest_chunked   s<    ’’’’’’’
r\   c                  C   s8  t td} d}|  |” |  ” tddddgdks6t|  ” tksFt|  d” |  ” td	d
d
dksjt|  d” |  ” tdd
ddkst|  d” |  ” tddddks²t|  d” |  ” tddd
dksÖt|  d” |  ” td	d
d
dksśt|  d” |  ” tkst|  d” |  ” t ks4td S )N©rK   óB   POST / HTTP/1.1
Host: example.com
Transfer-Encoding: chunked

ŚPOSTr   r.   r&   r   s
   5
hello
s   helloTr[   s   5
hels   helFó   ls   o
ó   os   5
helloó   
s   0

)	r   rL   Śreceive_dataŚ
next_eventr   r    r	   rU   rV   )rJ   Śrequestr"   r"   r#   Śtest_chunk_boundaries©   sX    
’
ż
  ’
  ’
  ’
  ’
  ’

rf   c                  C   sĘ   t t} |  tdddgd” |  t ” | jtks8tt| dt	dg ddd	gksXt| jt
ksftt| d
td
dgkstt| dtddgkstt| dt t gks“t| jtksĀtd S )Nr   r   r.   r   s   HTTP/1.0 200 OK

r   r   s   OK)r   r   r   Śreasonr>   r?   rA   rD   )r   r:   rM   r   rV   rR   rW   r    r   r!   Ś
MUST_CLOSErU   ŚConnectionClosedrS   ŚCLOSED©Ścr"   r"   r#   Ś$test_client_talking_to_http10_serverŁ   s    
’’rm   c                  C   s  t t} t| dtddg ddt gks,t| jtks:t|  t	dg d”dksTt|  t
d	d
”d	kslt|  t ”dkst| jtkstt t} t| dtdddgddt
dd
gksĄtt| dt
dd
t gksŽt| jtksģtt| dt gkstd S )Nó   GET / HTTP/1.0

r   r   r   r   r   r   ó$   HTTP/1.1 200 
connection: close

r>   r?   rD   s(   POST / HTTP/1.0
Content-Length: 10

1r_   r;   rF   s	   234567890)r   rL   r   r   rV   r    rS   rh   rM   r!   rU   rR   ri   rk   r"   r"   r#   Ś$test_server_talking_to_http10_clientč   s>    žü
’’žżž’rp   c               	   C   s¤   dgg ddgfD ]} t  }| ttdddgdt g” |jttd| dtddgdd	 tt}t|d
 | td| d”dkst	| t
dd”dkst	qd S )Nr&   ©r%   Z100r   r   r.   r   r   r   rB   rn   ro   r>   r?   )r   rM   r:   r   rV   rL   r!   r   r   r    rU   )Zuser_headersrY   rl   r"   r"   r#   Ś,test_automatic_transfer_encoding_in_response
  s6    ’ü’ż’’ż
’rr   c                  C   s   t  } |  ttddddgdt g” | jD ]}|jt tks,tq,| jt	t
dg dt gt
ddgdt gd	 | jD ]}|jttt	tiksxtqxd S )
Nr   r   r.   r   r   r4   r   )Ś
connectionr   rB   )r   rM   r:   r   rV   rN   rO   rh   r    rL   r!   ©rY   rJ   r"   r"   r#   Ś(test_automagic_connection_close_handling+  s0    ’’ż’

’’žū
ru   c                  C   sŗ   dd } |  }|  ttdg d” |jD ]}|jr6t|jr(tq(|  }|  ttddgd” |jD ]}|jrrt|jrdtqd|  }|  tt	dd” |jD ]}|jrŖt|jrtqd S )	Nc               	   S   s\   t  } |  ttdddddgd” | jD ]}|js(tq(| jt jrHt| jt	 jsXt| S )Nr   r   r.   rq   )ZExpectz100-continuer   )
r   rM   r:   r   rN   Ś"client_is_waiting_for_100_continuer    rJ   Ś!they_are_waiting_for_100_continuerL   rt   r"   r"   r#   ŚsetupD  s    ž’’
z test_100_continue.<locals>.setupr1   r   r   r&   r>   r?   )
rM   rL   rT   rN   rv   r    rw   r!   r:   rU   ©rx   rY   rJ   r"   r"   r#   Śtest_100_continueC  s,    
’

’’



rz   c               	   C   s  t t} |  d” |  ” tks"tt t” |  d” |  ”  q.W 5 Q R X t tdd} |  d” |  d” |  d” t	| t
dd	d
dgdt gkstt tdd} |  d” |  d” t t” |  ”  W 5 Q R X t tdd} |  d” |  ddd  ” t	| t
dd	d
dgdtdd dt gks2tt tdd} |  d” t	| t
dddgdt gkslt|  d” |  tdg d” |  t ” |  ”  t	| t
dddgdt gksĄt|  tdg d” |  t ” |  ”  t t” |  ”  W 5 Q R X d S )Ns   GET / HTTP/1.0
Endless: s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaai  )Zmax_incomplete_event_sizes   GET / HTTP/1.0
Big: s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas   

r   r   r   )ŚbigA   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)r   r   r   r   i   s%   GET / HTTP/1.0
Content-Length: 10000ó   ai'  )r%   Z10000r?   r1   s   GET /1 HTTP/1.1
Host: a

GET /2 HTTP/1.1
Host: b

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXś/1)ŚhostŚar   sč  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr   r   ś/2)r~   Śb)r   rL   rc   rd   r	   r    rG   rH   r   r   r   rV   rU   rM   r!   Śstart_next_cyclerk   r"   r"   r#   Ś-test_max_incomplete_event_size_countermeasurei  sd    




’ż



’ü
ž
žr   c                  C   s¤   t  } |  ttdddgdt g” |  ttdg dt g” | jD ]"}|jtt	tt	iks^t
| ”  qD|  ttdddgdt g” |  ttd	g dt g” d S )
Nr   r   ©r   r   r   r   r   ŚDELETEś/fooé  )r   rM   r:   r   rV   rL   r!   rN   rO   rW   r    r   rt   r"   r"   r#   Śtest_reuse_simple®  s0    ’’
’’

’’
’’r   c               	   C   s  t t} |  ” tkst|  d” t| tddddgdtddt	 gksNt| j
tks\t| jtksjt|  ” tkszt|  td	g d
” |  t	 ” | j
tks¦t| jtks“t|  ”  t| tddddgdtddt	 gksčt|  ” tksųt|  td	g d
” |  t	 ” |  ”  t| tdddgdt	 gksBt|  ” tksTt|  td	g d
” |  t	 ” |  ” tkst|  d” |  ” tks t| jdks°t|  d” | jdksŹt|  ” tksÜt|  d” |  ” tksųtt t” |  d” W 5 Q R X d S )Ns   GET /1 HTTP/1.1
Host: a.com
Content-Length: 5

12345GET /2 HTTP/1.1
Host: a.com
Content-Length: 5

67890GET /3 HTTP/1.1
Host: a.com

r   r}   )r   śa.com)r%   Ś5r   r>   r?   r   r   r   rA   z/3ó   SADF)r   FrD   )r   Ts   FDSA)r   rL   rd   r	   r    rc   r   r   rU   rV   rS   rW   rR   rQ   r
   rM   r!   r   Śtrailing_datarG   rH   ŚRuntimeErrorrk   r"   r"   r#   Śtest_pipeliningĮ  sf    ’’ü
’ü
’ż


r   c               
      sJ  t ddddgdtdg dtdg dft d	d
dddgdtdg dtddgdft dddddgdtdg dtdg dft dddddgdtdg dtddgdffD ]\ } } fdd}| }| t| ” |jD ]}|jtttt	iksÖt
qÖ| tt ” |jD ]}| ”  q| }| t|” |jD ]f}|jttttiksJt
| d” | ” tksft
| d” | ” tkst
|jdks.t
q.| }|jt }| d” | ” tksĀt
|jdksŅt
| | ” | ” tksīt
| t ” | ”  t|t d	d
g ddt gks&t
| }|jt }| d” | ” tksRt
|jdksbt
| t|” | ” tkst
| }|jt }| d”g k | ” tks°t
| | ” | ” t ksĪt
| }t t”" |jt  t d	d
dgd” W 5 Q R X | }| t|” t t” |jt  tdd” W 5 Q R X q¦d S )NZCONNECTzexample.com:443)r   Zfoo)r%   Ś1r   r   r   r   r   r   )ŚUpgradeza, bée   )r   r   )r   r   c                     s   t  } |  t ” | jD ]}|jt tkstq|  ttddt g” | jD ]}|jt t	ksNtqN| j
t  ” tks|t| S )NrF   r?   )r   rM   r:   rN   rO   rP   r    rU   rV   ZMIGHT_SWITCH_PROTOCOLrJ   rL   rd   r
   rt   ©r0   r"   r#   rx   #  s    

z#test_protocol_switch.<locals>.setupó   123s   456)s   123456Frn   )rn   Fr   r   rD   )rD   Tr   r?   )r   r!   rT   rM   rL   rN   rO   r:   rW   rP   r    rV   r   ZSWITCHED_PROTOCOLrc   rd   r
   r   rJ   r   ri   rG   rH   r   rU   )ZdenyŚacceptrx   rY   rJ   Zscr"   r   r#   Śtest_protocol_switch  sŗ    ’

żž’
’ūž’

śž’
’śź 


 ’




ž




’r   c               
      s.  t tftt ffD ]\  fdd} |  }|j  ” t ksFt|j  ” t ks^t|j  d” |j  ” t kst|  }| t ” |jD ] }|j	t
ks²t|jt
ks tq |  }t t” |j  d” W 5 Q R X |  }|j   d” t t” |j   ”  W 5 Q R X qd S )Nc                     s:   t  } |   t ” | jD ]}|j ttikstq| S ©N)r   rM   ri   rN   rO   rj   rh   r    rt   ©Zwho_shot_firstZwho_shot_secondr"   r#   rx   }  s    
  žz test_close_simple.<locals>.setuprD   r   r3   )r:   rL   rJ   rd   ri   r    rc   rM   rN   rR   rj   rS   rG   rH   r   r   ry   r"   r   r#   Śtest_close_simplev  s*    ž
r   c               	   C   s6  t dddgdt g} tdg dt g}t }| tt ” |jD ]}|jtt	t
tiksBtqBt }| t| ” | tt ” |jD ]}|jtt	t
tikstqt }| t| ” t t” |jt
  t ” W 5 Q R X |jt  d” t t” |jt  ”  W 5 Q R X t }| t| ” | t
|” | t
t ” |jD ]}|jttt
t	iks@tq@t }| t| ” | t
|” | tt ” | t
t ” | tt ” | t
t ” t }| tt dddd	gd” t t” |jt  t ” W 5 Q R X |jt
  d” t t” |jt
  ”  W 5 Q R X d S )
Nr   r   r   r   r   r   rD   r   r;   )r   rV   r!   r   rM   r:   ri   rN   rO   rj   rL   rh   r    rQ   rG   rH   r   rJ   rc   r   rd   )r0   r-   rY   rJ   r"   r"   r#   Śtest_close_different_states  sX    ’


’’r   c                  C   s6  t t} |  d” |  d” t| tddddgdtdd	t gksHt| jt	 t
ksZt|  td
g d” |  t ” | jt t
kst|  ”  t| tddddgdtdd	t t gksĀt| jt	tttiksŲt|  td
g d” |  t ” | jt	tttikst|  t ” | jt	tttiks2td S )Nsp   GET /1 HTTP/1.1
Host: a.com
Content-Length: 5

12345GET /2 HTTP/1.1
Host: a.com
Content-Length: 5

67890rD   r   r}   )r~   r   )r5   r   r   r>   r?   r   r   r   rA   )r   rL   rc   r   r   rU   rV   r    rO   r:   rW   rM   r!   r   ri   rj   rQ   rh   rk   r"   r"   r#   Śtest_pipelined_closeŲ  s>    ’
’ü
’ū
r   c                     s°   G dd d} |    fdd}|dd\}}| gks<t | t ” |dd\}} |ksbt d||  ”< d	 |”d
kst |d d\}}| gkst |jtks¬t d S )Nc                   @   s   e Zd Zdd ZdS )z*test_sendfile.<locals>.SendfilePlaceholderc                 S   s   dS )Né
   r"   )Śselfr"   r"   r#   Ś__len__ü  s    z2test_sendfile.<locals>.SendfilePlaceholder.__len__N)Ś__name__Ś
__module__Ś__qualname__r   r"   r"   r"   r#   ŚSendfilePlaceholderū  s   r”   c                    sV   t t}t|d |” d” g }| r0| | ” | td|d” || t	 d”fS )NzGET / HTTP/{}
Host: a

Śasciir   r   r?   )
r   rL   r   ŚformatŚencoder(   rM   r!   Zsend_with_data_passthroughrU   )Śheaderr   rl   r   ©Śplaceholderr"   r#   rx      s    ’ž’
ztest_sendfile.<locals>.setupr;   z1.1r&   s
   xxxxxxxxxxrD   s   a
xxxxxxxxxx
r   )r    rM   rV   ŚindexŚjoinrR   rP   )r”   rx   rl   r@   Ś_r"   r¦   r#   Śtest_sendfileś  s    r«   c               
   C   sō  t tfD ]} t| d}| d” t t” | ”  W 5 Q R X |jt	ksLt
|jt	k	sZt
t|jj t t” | ”  W 5 Q R X | tkr| tdg d”dkst
qdd }t tfD ]4} | t krźtdd	d
gd}tdd	d
gdd}n$| tkrtdg d}tdg dd}|| }| |” |jt	k	s0t
|| }t t” | |” W 5 Q R X |jt	ksht
|jt	k	sxt
t t” | |” W 5 Q R X || }| ”  |jt	ksøt
|jt	k	sČt
| ”  |jt	ksąt
|jt	k	søt
qød S )Nr]   s   gibberish

i  r   s$   HTTP/1.1 400 
connection: close

c                 S   s.   t | d}| tkr*t|d |jtks*t|S )Nr]   rn   )r   rL   r   rR   rQ   r    ©Śrolerl   r"   r"   r#   rJ   0  s
    

ztest_errors.<locals>.connr   r   r.   r   r   r   r   r   )r:   rL   r   rc   rG   rH   r   rd   rS   ŚERRORr    rR   ŚprintZ_cstaterO   rM   r!   r   r   Zsend_failed)r­   rl   rJ   ZgoodŚbadr"   r"   r#   Śtest_errors  sX    

’
’ž

r±   c                  C   s*   t tfD ]} t| }| ” tkstqd S r   )r:   rL   r   rd   r	   r    r¬   r"   r"   r#   Śtest_idle_receive_nothing\  s    r²   c               	   C   sN   t t} |  d” |  ” tks"t|  d” t t” |  ”  W 5 Q R X d S )Ns   GET /rD   )	r   rL   rc   rd   r	   r    rG   rH   r   rk   r"   r"   r#   Śtest_connection_dropb  s    

r³   c                  C   s   t  } |  ttdg d” d S )Ni  r   )r   rM   rL   r!   )rY   r"   r"   r#   Śtest_408_request_timeoutj  s    r“   c               	   C   s4   t t} |  d” t t” |  ”  W 5 Q R X d S )Nrb   )r   rL   rc   rG   rH   r   rd   rk   r"   r"   r#   Śtest_empty_requestq  s    
rµ   c               	   C   sJ   t t} |  tdddgd” |  d” t t” |  ”  W 5 Q R X d S )Nr   r   r   r   rb   )	r   r:   rM   r   rc   rG   rH   r   rd   rk   r"   r"   r#   Śtest_empty_responsex  s
    
r¶   c                  C   s   dd } dD ]t}| |d}|  tdg d”dks4t| |d}|  tdg d”d	ksXt| |d}|  tdd
dgd”dkstqd S )Nc                 S   sN   t t}| | d | d d ” t| ” tks6tt| ” tksJt|S )Ns    / HTTP/rb   s   Host: example.com

)r   rL   rc   Śtyperd   r   r    rV   )r   r   rl   r"   r"   r#   rx     s    ’z(test_HEAD_framing_headers.<locals>.setup)r3   r2   r=   r   r   s-   HTTP/1.1 200 
transfer-encoding: chunked

s   1.0ro   rq   r&   )rM   r!   r    )rx   r   rl   r"   r"   r#   Śtest_HEAD_framing_headers  s$    
’
’
’’żrø   c               	   C   s4  t t} |  d” t|  ” tks&t|  ” tks6t|  d” |  ” tddksVt|  d” t	 
t”}|  ”  W 5 Q R X dt|jkstdt|jks¢tt t} |  d” t|  ” tksČt|  ” tksŲt|  d” |  ” jd	ksōt|  d” t	 
t”}|  ”  W 5 Q R X d
t|jks0td S )Ns;   POST / HTTP/1.1
Host: example.com
Content-Length: 100

r>   r?   rD   zreceived 5 byteszexpected 100r^   s	   8
012345s   012345zincomplete chunked read)r   rL   rc   r·   rd   r   r    r	   rU   rG   rH   r   r)   Śvaluer@   )rl   Śexcinfor"   r"   r#   Ś;test_special_exceptions_for_lost_connection_in_message_body”  s*    





r»   )*rG   Z_utilr   r   Z_eventsŚ_stateŚ_connectionr   r   r   r	   r
   Zhelpersr   r   r   r$   r9   rZ   r\   rf   rm   rp   rr   ru   rz   r   r   r   r   r   r   r   r«   r±   r²   r³   r“   rµ   r¶   rø   r»   r"   r"   r"   r#   Ś<module>   s>   &B0"!&EAt)9"!A