U
    Ê¼µbÀ3  ã                
   @   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sœt‚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s”t‚tdd„ |D ƒƒ}|rÐ|sÐt|d ƒ}t| ƒ |dƒ|ksÐt‚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