U
    ʼb3                  
   @   s  d dl Z ddlmZ ddlmZ ddlmZ ddlT ddlT ddl	m
Z
mZmZmZmZmZmZ ddl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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/d0 Z+dHd2d3Z,d4d5 Z-d6d7 Z.d8d9 Z/d:d; Z0d<d= Z1d>d? Z2d@dA Z3dBdC Z4dDdE Z5dFdG Z6dS )I    N   )LocalProtocolErrorReceiveBuffer)normalize_and_validate)*)WRITERSwrite_headerswrite_requestwrite_any_responseContentLengthWriterChunkedWriterHttp10Writer)READERSContentLengthReaderChunkedReaderHttp10Reader_obsolete_line_fold   )normalize_data_eventsGETz/aHostfoo
Connectionclosemethodtargetheaderss1   GET /a HTTP/1.1
host: foo
connection: close

      OK)status_coder    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

c                 C   s   g }| ||j  d|S )N    )appendjoin)writerobjZgot_list r+   5/tmp/pip-unpacked-wheel-rko__zic/h11/tests/test_io.pydowrite.   s    r-   c                 C   s   t | |}||kstd S N)r-   AssertionError)r)   r*   expectedgotr+   r+   r,   tw3   s    
r2   c                 C   s   t  }|| 7 }|S r.   r   )databufr+   r+   r,   makebuf7   s    r5   c                    s    fdd}t |}|| | |r(tt }tt|D ](}| |d ksNt||||d  7 }q:|| | t |}|d7 }|| | t|dkstd S )Nc                    sP   |  kst t| dg D ]2\}}t|| t|tks:t t|tkst qd S )Nr    )r/   getattrprinttypebytes)r1   namevaluer0   r+   r,   check=   s
    
ztr.<locals>.checkr      trailing)r5   r/   r   rangelenr9   )readerr3   r0   r=   r4   ir+   r<   r,   tr<   s    
rC   c                  C   s,   t D ]"\\} }}}tt| |f || qd S r.   )SIMPLE_CASESr2   r   rolestateeventbinaryr+   r+   r,   test_writers_simpleX   s    rJ   c                  C   s,   t D ]"\\} }}}tt| |f || qd S r.   )rD   rC   r   rE   r+   r+   r,   test_readers_simple\   s    rK   c                	   C   s   t ttddgd t tg d tt" t ttddddgd	d
d  W 5 Q R X tt t tt	ddgd	dd  W 5 Q R X d S )Nr   bar)ZbazZquuxs   foo: bar
baz: quux

s   
r   /r   r   1.0r   r   r    http_versionr!   )r#   r    rQ   )
r2   r	   r   pytestraisesr   r
   Requestr   Responser+   r+   r+   r,   test_writers_unusual`   s(    
rV   c                
   C   s  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ddddgd t	t
 t tttf dd  W 5 Q R X t	t
 t tttf dd  W 5 Q R X t	t
 t tttf dd  W 5 Q R X t	t
 t tttf dd  W 5 Q R X t	t
 t tttf dd  W 5 Q R X d S )Ns$   HEAD /foo HTTP/1.0
Some: header

HEADz/fooSomeheaderrO   rP   s   HEAD /foo HTTP/1.0

s!   HTTP/1.0 200 OK
Some: header

r!   r"   )r#   r    rQ   r$   s$   HTTP/1.0 200 OK
Foo: a a a a a 

)Fooz	a a a a as   HTTP/1.0 200 OK
Foo:

)r[    s   HTTP/1.0 200 OK
Foo: 	 	 

s   HTTP/1.0 200
Foo: bar

)r[   rM   r&   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)rY   z"multi-line header nonsense I guessr   )zMore-nonsensezin the last headerr   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

)rC   r   CLIENTIDLErT   SERVERSEND_RESPONSErU   rR   rS   r   r+   r+   r+   r,   test_readers_unusualt   s    
     	rb   c                   C   s*   t tddddgdtddgks&td S )N   aaas   bbbs     cccs   ddds   bbb ccc)listr   	bytearrayr/   r+   r+   r+   r,   test__obsolete_line_fold_bytes   s    rf   c                 c   sB   | |}|d krq(|V  t |tkr q(q |r>|r4t|  V  d S r.   )r8   EndOfMessager/   Zread_eof)rA   r4   do_eofrH   r+   r+   r,   _run_reader_iter   s    ri   c                  G   s   t t|  }t|S r.   )rd   ri   r   )argseventsr+   r+   r,   _run_reader   s    rl   Fc           	      C   s   t d t|}t|  |||ks&tt d |  }t }g }tt|D ](}|t||d7 }||||d  7 }qJ|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 r.   )r8   rg   ).0rH   r+   r+   r,   	<genexpr>   s     z t_body_reader.<locals>.<genexpr>r>   )	r7   r5   rl   r/   r   r?   r@   r   any)	Zthunkr3   r0   rh   r4   rA   rk   rB   Zis_completer+   r+   r,   t_body_reader   s     rp   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>  r&   z*test_ContentLengthReader.<locals>.<lambda>r&   c                   S   s   t dS )N
   rq   r+   r+   r+   r,   rr     r&   s
   0123456789r3   )rp   rg   Datar+   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 )Nr&   T)rh   s   asdfrt   F)rp   r   rg   ru   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 5 Q R X tt t tdd  W 5 Q R X t tdtddt g d S )N   0

s   0
Some: header

rX   r    s3   5
01234
10
0123456789abcdef
0
Some: header

s   012340123456789abcdefrt   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   xxxxx)rp   r   rg   ru   rR   rS   r   r+   r+   r+   r,   test_ChunkedReader  sB    

rz   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 5 Q R X t d} t| tdd tt t| tdd W 5 Q R X t d} t| tdd tt t| t  W 5 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 5 Q R X d S )
N   s   123rt   s   45r&   s   123456s   456ZEtagZasdfry   )r   r-   ru   r/   rg   rR   rS   r   wr+   r+   r,   test_ContentLengthWriterE  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 )Nrc   rt   s   3
aaa
s   aaaaaaaaaaaaaaaaaaaas   14
aaaaaaaaaaaaaaaaaaaa
r&   rx   r|   )abry   s   0
etag: asdf
a: b

)r   r-   ru   r/   rg   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 5 Q R X d S )Ns   1234rt   r&   r|   ry   )r   r-   ru   r/   rg   rR   rS   r   r}   r+   r+   r,   test_Http10Writerk  s
    r   c                	   C   s.   t t ttttf dd  W 5 Q R X d S )Ns   HTTP/1.0 200 OK xxxx

)rR   rS   r   rC   r   r`   ra   r+   r+   r+   r,   &test_reject_garbage_after_request_lines  s
    r   c                	   C   s.   t t ttttf dd  W 5 Q R X d S )Ns&   HEAD /foo HTTP/1.1 xxxxxx
Host: a

rR   rS   r   rC   r   r^   r_   r+   r+   r+   r,   'test_reject_garbage_after_response_liney  s
    r   c                	   C   s.   t t ttttf dd  W 5 Q R X d S )Ns%   HEAD /foo HTTP/1.1
Host: foo bar

r   r+   r+   r+   r,   "test_reject_garbage_in_header_line  s
    r   c                   C   s   t ttddgd d S )NrL   r]   s   host: example.com
foo: bar

)r2   r	   r   r+   r+   r+   r,   test_host_comes_first  s    
r   )F)7rR   Z_utilr   Z_receivebufferr   _headersr   _stateZ_events_writersr   r	   r
   r   r   r   r   _readersr   r   r   r   r   Zhelpersr   r^   r_   rT   r`   ra   rU   ZInformationalResponserD   r-   r2   r5   rC   rJ   rK   rV   rb   rf   ri   rl   rp   rv   rw   rz   r   r   r   r   r   r   r   r+   r+   r+   r,   <module>   sp   $ \

	2