B
    Ce@              
   @   s  d dl mZmZmZmZ d dlZddlmZmZm	Z	m
Z
mZmZmZ ddlmZmZ ddlmZmZmZmZmZ ddlmZ ddlmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# dd	l$m%Z% dd
l&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/ eefeddddgddfe"e!feddgdddfe"e!fedg dddfe"e!feddgdddfe"e!fedg dddfgZ0ed ee1ddd Z2eeedd!d"d#Z3e1ed$d%d&Z4ee1edd'd(d)Z5dd*d+d,Z6dd*d-d.Z7dd*d/d0Z8dd*d1d2Z9dd*d3d4Z:ee1e;eeddf d5d6d7Z<eee
 d8d9d:Z=dWee1ee;dd<d=d>Z>dd*d?d@Z?dd*dAdBZ@dd*dCdDZAdd*dEdFZBdd*dGdHZCdd*dIdJZDdd*dKdLZEdd*dMdNZFdd*dOdPZGdd*dQdRZHdd*dSdTZIdd*dUdVZJdS )X    )AnyCallable	GeneratorListN   )ConnectionClosedDataEndOfMessageEventInformationalResponseRequestResponse)Headersnormalize_and_validate)_obsolete_line_foldChunkedReaderContentLengthReaderHttp10ReaderREADERS)ReceiveBuffer)
CLIENTCLOSEDDONEIDLEMIGHT_SWITCH_PROTOCOL
MUST_CLOSE	SEND_BODYSEND_RESPONSESERVERSWITCHED_PROTOCOL)LocalProtocolError)ChunkedWriterContentLengthWriterHttp10Writerwrite_any_responsewrite_headerswrite_requestWRITERS   )normalize_data_eventsGETz/a)Hostfoo)
Connectionclose)methodtargetheaderss1   GET /a HTTP/1.1
Host: foo
Connection: close

   s   OK)status_coder1   reasons&   HTTP/1.1 200 OK
Connection: close

s   HTTP/1.1 200 OK

e   )ZUpgradeZ	websockets   Upgrades,   HTTP/1.1 101 Upgrade
Upgrade: websocket

s   HTTP/1.1 101 Upgrade

).N)writerobjreturnc             C   s   g }| ||j  d|S )N    )appendjoin)r6   r7   Zgot_list r<   e/var/www/downstreamdata.science/rtclock/rtclock-venv/lib/python3.7/site-packages/h11/tests/test_io.pydowriteR   s    r>   )r6   r7   expectedr8   c             C   s   t | |}||kstd S )N)r>   AssertionError)r6   r7   r?   gotr<   r<   r=   twX   s    
rB   )datar8   c             C   s   t  }|| 7 }|S )N)r   )rC   bufr<   r<   r=   makebuf]   s    rE   )readerrC   r?   r8   c                s   t d d fdd}t|}|| | |r0tt }x8tt|D ](}| |d ksXt||||d  7 }qDW || | t|}|d7 }|| | t|dkstd S )N)rA   r8   c                sJ   |  kst x8t| dg D ](\}}t|tks2t t|tkst qW d S )Nr1   )r@   getattrtypebytes)rA   namevalue)r?   r<   r=   checkd   s    ztr.<locals>.checkr(   s   trailing)r   rE   r@   r   rangelenrI   )rF   rC   r?   rL   rD   ir<   )r?   r=   trc   s    	rP   )r8   c              C   s0   x*t D ]"\\} }}}tt| |f || qW d S )N)SIMPLE_CASESrB   r'   )rolestateeventbinaryr<   r<   r=   test_writers_simple   s    rV   c              C   s0   x*t D ]"\\} }}}tt| |f || qW d S )N)rQ   rP   r   )rR   rS   rT   rU   r<   r<   r=   test_readers_simple   s    rW   c            	   C   s   t ttddgd t ttg d tt" t ttddddgd	d
d  W d Q R X tt t t	t
ddgd	dd  W d Q R X d S )N)r,   bar)ZbazZquuxs   foo: bar
baz: quux

s   
r*   /)r+   r,   )r-   r.   z1.0)r/   r0   r1   http_versionr2   )r3   r1   rZ   )rB   r%   r   r   pytestraisesr    r&   r   r$   r   r<   r<   r<   r=   test_writers_unusual   s(    
r]   c            
   C   sR  t tttf dtdddgdd t tttf dtddg dd t tttf dtd	dgdd
d t tttf dtd	dgdd
d t tttf dtd	dgdd
d t tttf dtd	dgdd
d t tttf dtd	dgddd t tttf dtd	dgddd t tttf dtd	ddgddd t tttf dtd	ddgddd t tttf dtdddddd gd! t	t
 t tttf d"d  W d Q R X t	t
 t tttf d#d  W d Q R X t	t
 t tttf d$d  W d Q R X t	t
 t tttf d$d  W d Q R X t	t
 t tttf d%d  W d Q R X d S )&Ns$   HEAD /foo HTTP/1.0
Some: header

HEADz/foo)Someheaderz1.0)r/   r0   r1   rZ   s   HEAD /foo HTTP/1.0

s!   HTTP/1.0 200 OK
Some: header

r2   s   OK)r3   r1   rZ   r4   s$   HTTP/1.0 200 OK
Foo: a a a a a 

)Fooz	a a a a as   HTTP/1.0 200 OK
Foo:

)ra    s   HTTP/1.0 200 OK
Foo: 	 	 

s   HTTP/1.0 200
Foo: bar

)ra   rX   r9   s#   HTTP/1.1 200 OK
SomeHeader: val

)Z
SomeHeadervalz1.1OKs5   HTTP/1.1 200 OK
SomeHeader1: val1
SomeHeader2: val2

)ZSomeHeader1Zval1)ZSomeHeader2Zval2s7   HTTP/1.1 200 OK
SomeHeader1: val1
SomeHeader2: val2

s   HEAD /foo HTTP/1.1
Host: example.com
Some: multi-line
 header
	nonsense
    	   		I guess
Connection: close
More-nonsense: in the
    last header  

)r+   zexample.com)r_   z"multi-line header nonsense I guess)r-   r.   )zMore-nonsensezin the last header)r/   r0   r1   s&   HEAD /foo HTTP/1.1
  folded: line

s#   HEAD /foo HTTP/1.1
foo  : line

s"   HEAD /foo HTTP/1.1
foo	: line

s   HEAD /foo HTTP/1.1
: line

)rP   r   r   r   r   r   r   r   r[   r\   r    r<   r<   r<   r=   test_readers_unusual   s    
















	



re   c               C   s*   t tddddgdtddgks&td S )Ns   aaas   bbbs     cccs   ddds   bbb ccc)listr   	bytearrayr@   r<   r<   r<   r=   test__obsolete_line_fold_bytesH  s    rh   )rF   rD   do_eofr8   c             c   sF   x*| |}|d krP |V  t |tkrP qW |rB|r8t|  V  d S )N)rH   r	   r@   Zread_eof)rF   rD   ri   rT   r<   r<   r=   _run_reader_iterU  s    rj   )argsr8   c              G   s   t t|  }t|S )N)rf   rj   r)   )rk   eventsr<   r<   r=   _run_readerf  s    rm   F)thunkrC   r?   ri   r8   c       	      C   s   t d t|}t|  |||ks&tt d |  }t }g }x8tt|D ](}|t||d7 }||||d  7 }qLW |t|||7 }t||ksttdd |D }|r|st|d }t|  |d|kstd S )NzTest 1zTest 2Fr(   c             s   s   | ]}t |tkV  qd S )N)rH   r	   ).0rT   r<   r<   r=   	<genexpr>|  s    z t_body_reader.<locals>.<genexpr>s   trailing)	printrE   rm   r@   r   rM   rN   r)   any)	rn   rC   r?   ri   rD   rF   rl   rO   Zis_completer<   r<   r=   t_body_readerk  s     rs   c               C   s4   t dd dt g t dd dtddt g d S )Nc               S   s   t dS )Nr   )r   r<   r<   r<   r=   <lambda>  r9   z*test_ContentLengthReader.<locals>.<lambda>r9   c               S   s   t dS )N
   )r   r<   r<   r<   r=   rt     r9   s
   0123456789)rC   )rs   r	   r   r<   r<   r<   r=   test_ContentLengthReader  s
    rv   c               C   sL   t tdt gdd t tdtddgdd t tdtddt gdd d S )Nr9   T)ri   s   asdf)rC   F)rs   r   r	   r   r<   r<   r<   r=   test_Http10Reader  s    rw   c            	   C   s   t tdt g t tdtdgdg t tdtddtdgdg t tdtddt g t td	td
dt g tt t tdtddg W d Q R X tt t tdd  W d Q R X t tdtddt g t tdtddt g d S )Ns   0

s   0
Some: header

)r_   r`   )r1   s3   5
01234
10
0123456789abcdef
0
Some: header

s   012340123456789abcdef)rC   s%   5
01234
10
0123456789abcdef
0

s   aA
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
0

s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsi   9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
xxxs   xxxs   10 
xxxsG   5; hello=there
xxxxx
0; random="junk"; some=more; canbe=lonnnnngg

s   xxxxxs   5   	 
01234
0

s   01234)rs   r   r	   r   r[   r\   r    r<   r<   r<   r=   test_ChunkedReader  s<    rx   c           	   C   sN  t d} t| tdddks tt| tdddks8tt| t dksLtt d} tt t| tdd W d Q R X t d} t| tdd tt t| tdd W d Q R X t d} t| tdd tt t| t  W d Q R X t d} t| tdddk t| tdddk tt t| tdgd	 W d Q R X d S )
N   s   123)rC   s   45r9   s   123456s   456)Etagasdf)r1   )r"   r>   r   r@   r	   r[   r\   r    )wr<   r<   r=   test_ContentLengthWriter  s(    r}   c              C   s   t  } t| tdddkstt| tdddks6tt| tdddksNtt| t dksbtt| tdd	gd
dks~td S )Ns   aaa)rC   s   3
aaa
s   aaaaaaaaaaaaaaaaaaaas   14
aaaaaaaaaaaaaaaaaaaa
r9   s   0

)rz   r{   )ab)r1   s   0
Etag: asdf
a: b

)r!   r>   r   r@   r	   )r|   r<   r<   r=   test_ChunkedWriter  s    r   c           	   C   s^   t  } t| tdddkstt| t dks2ttt t| tdgd W d Q R X d S )Ns   1234)rC   r9   )rz   r{   )r1   )r#   r>   r   r@   r	   r[   r\   r    )r|   r<   r<   r=   test_Http10Writer  s
    r   c            	   C   s.   t t ttttf dd  W d Q R X d S )Ns   HTTP/1.0 200 OK xxxx

)r[   r\   r    rP   r   r   r   r<   r<   r<   r=   &test_reject_garbage_after_request_line  s    r   c            	   C   s.   t t ttttf dd  W d Q R X d S )Ns&   HEAD /foo HTTP/1.1 xxxxxx
Host: a

)r[   r\   r    rP   r   r   r   r<   r<   r<   r=   'test_reject_garbage_after_response_line	  s
    
r   c            	   C   s.   t t ttttf dd  W d Q R X d S )Ns%   HEAD /foo HTTP/1.1
Host: foo bar

)r[   r\   r    rP   r   r   r   r<   r<   r<   r=   "test_reject_garbage_in_header_line  s
    
r   c           
   C   sX   xRdD ]J} t d}||  |d tt tttt	f |d  W d Q R X qW d S )Ns     s   HEAD /s    HTTP/1.1
Host: foobar

)
rg   r:   extendr[   r\   r    rP   r   r   r   )Zbad_charmessager<   r<   r=   test_reject_non_vchar_in_path  s    


r   c               C   s&   t tttf dtddddgd d S )Ns\   HEAD /foo HTTP/1.1
Host: foo
Set-Cookie: ___utmvafIumyLc=kUdUpAt; path=/; Max-Age=900

r^   z/foo)r+   r,   )z
Set-Cookiez-___utmvafIumyLc=kUdUpAt; path=/; Max-Age=900)r/   r0   r1   )rP   r   r   r   r   r<   r<   r<   r=   "test_allow_some_garbage_in_cookies%  s    
r   c               C   s   t ttddgd d S )N)r,   rX   )r+   zexample.coms   Host: example.com
foo: bar

)rB   r%   r   r<   r<   r<   r=   test_host_comes_first7  s    
r   )F)Ktypingr   r   r   r   r[   Z_eventsr   r   r	   r
   r   r   r   _headersr   r   _readersr   r   r   r   r   Z_receivebufferr   _stater   r   r   r   r   r   r   r   r   r   Z_utilr    _writersr!   r"   r#   r$   r%   r&   r'   helpersr)   rQ   rI   r>   rB   rE   rP   rV   rW   r]   re   rh   boolrj   rm   rs   rv   rw   rx   r}   r   r   r   r   r   r   r   r   r<   r<   r<   r=   <module>   sl   $	0$	
 !
=			
