a
    ((a<                  
   @   s  d dl Z ddlT 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T 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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,dLd2d3Z-d4d5 Z.d6d7 Z/d8d9 Z0d:d; Z1d<d= Z2d>d? Z3d@dA Z4dBdC Z5dDdE Z6dFdG Z7dHdI Z8dJdK Z9dS )M    N   )*)Headersnormalize_and_validate)_obsolete_line_foldChunkedReaderContentLengthReaderHttp10ReaderREADERSReceiveBuffer)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

      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,   X/Users/bob/PycharmProjects/fastapi/venv/lib/python3.9/site-packages/h11/tests/test_io.pydowrite=   s    r.   c                 C   s   t | |}||ksJ d S N)r.   )r*   r+   expectedgotr,   r,   r-   twC   s    
r2   c                 C   s   t  }|| 7 }|S r/   r   )databufr,   r,   r-   makebufH   s    r5   c                    s    fdd}t |}|| | |r(J t }tt|D ](}| |d u sNJ ||||d  7 }q:|| | t |}|d7 }|| | t|dksJ d S )Nc                    sP   |  ksJ t | dg D ]2\}}t|| t|tu s:J t|tu sJ qd S )Nr!   )getattrprinttypebytes)r1   namevaluer0   r,   r-   checkO   s
    
ztr.<locals>.checkr      trailing)r5   r   rangelenr9   )readerr3   r0   r=   r4   ir,   r<   r-   trN   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_simplek   s    rJ   c                  C   s,   t D ]"\\} }}}tt| |f || qd S r/   )rD   rC   r
   rE   r,   r,   r-   test_readers_simplep   s    rK   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    n1 s`0    Y  tt( t t	t
ddgd	dd  W d    n1 s0    Y  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   r   pytestraisesr   r   Requestr   Responser,   r,   r,   r-   test_writers_unusualu   s2    
"
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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g dd t	t
$ t tttf dd  W d    n1 s0    Y  t	t
$ t tttf d d  W d    n1 s0    Y  t	t
$ t tttf d!d  W d    n1 s.0    Y  t	t
$ t tttf d!d  W d    n1 sn0    Y  t	t
$ t tttf d"d  W d    n1 s0    Y  d S )#Ns$   HEAD /foo HTTP/1.0
Some: header

HEAD/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#   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)rZ   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_unusual   s    







	






	
$
$
$
$re   c                   C   s&   t tg ddtddgks"J d S )N)   aaas   bbbs     ccc   dddrf   s   bbb cccrg   )listr   	bytearrayr,   r,   r,   r-   test__obsolete_line_fold_bytes4  s
    rj   c                 c   sB   | |}|d u rq(|V  t |tu r q(q |r>|r4J |  V  d S r/   )r8   EndOfMessageZread_eof)rA   r4   do_eofrH   r,   r,   r-   _run_reader_iterA  s    rm   c                  G   s   t t|  }t|S r/   )rh   rm   r   )argseventsr,   r,   r-   _run_readerP  s    rp   Fc           	      C   s   t d t|}t|  |||ks&J t d |  }t }g }tt|D ](}|t||d7 }||||d  7 }qJ|t|||7 }t||ksJ tdd |D }|r|st|d }t|  |d|ksJ d S )NzTest 1zTest 2Fr   c                 s   s   | ]}t |tu V  qd S r/   )r8   rk   ).0rH   r,   r,   r-   	<genexpr>f  r'   z t_body_reader.<locals>.<genexpr>r>   )r7   r5   rp   r   r?   r@   r   any)	Zthunkr3   r0   rl   r4   rA   ro   rB   Zis_completer,   r,   r-   t_body_readerU  s     rt   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>m  r'   z*test_ContentLengthReader.<locals>.<lambda>r'   c                   S   s   t dS )N
   ru   r,   r,   r,   r-   rv   p  r'   s
   0123456789r3   )rt   rk   Datar,   r,   r,   r-   test_ContentLengthReaderl  s    rz   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)rl   s   asdfrx   F)rt   r	   rk   ry   r,   r,   r,   r-   test_Http10Readerv  s
    r{   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    n1 s0    Y  tt t tdd  W d    n1 s0    Y  t tdtddt g d S )N   0

s   0
Some: header

rY   r!   s3   5
01234
10
0123456789abcdef
0
Some: header

s   012340123456789abcdefrx   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)rt   r   rk   ry   rR   rS   r   r,   r,   r,   r-   test_ChunkedReader~  s@    
2*r~   c                  C   s  t d} t| tdddks J t| tdddks8J t| t dksLJ t d} tt  t| tdd W d    n1 s0    Y  t d} t| tdd tt  t| tdd W d    n1 s0    Y  t d} t| tdd tt t| t  W d    n1 s&0    Y  t d} t| tdddk t| tdddk tt" t| tdgd	 W d    n1 s0    Y  d S )
N   s   123rx   s   45r'   s   123456s   456ZEtagZasdfr}   )r   r.   ry   rk   rR   rS   r   wr,   r,   r-   test_ContentLengthWriter  s(    ..,r   c                  C   s   t  } t| tdddksJ t| tdddks6J t| tdddksNJ t| t dksbJ t| tdd	gd
dks~J d S )Nrf   rx   s   3
aaa
s   aaaaaaaaaaaaaaaaaaaas   14
aaaaaaaaaaaaaaaaaaaa
r'   r|   r   )abr}   s   0
Etag: asdf
a: b

)r   r.   ry   rk   r   r,   r,   r-   test_ChunkedWriter  s    r   c                  C   sr   t  } t| tdddksJ t| t dks2J tt" t| tdgd W d    n1 sd0    Y  d S )Ns   1234rx   r'   r   r}   )r   r.   ry   rk   rR   rS   r   r   r,   r,   r-   test_Http10Writer  s
    r   c                   C   sB   t t$ ttttf dd  W d    n1 s40    Y  d S )Ns   HTTP/1.0 200 OK xxxx

)rR   rS   r   rC   r
   rc   rd   r,   r,   r,   r-   &test_reject_garbage_after_request_line  s    r   c                   C   sB   t t$ ttttf dd  W d    n1 s40    Y  d S )Ns&   HEAD /foo HTTP/1.1 xxxxxx
Host: a

rR   rS   r   rC   r
   ra   rb   r,   r,   r,   r-   'test_reject_garbage_after_response_line  s    
r   c                   C   sB   t t$ ttttf dd  W d    n1 s40    Y  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   sh   dD ]^} t d}||  |d tt$ tttt	f |d  W d    q1 sX0    Y  qd S )Ns     s   HEAD /s    HTTP/1.1
Host: foobar

)
ri   r(   extendrR   rS   r   rC   r
   ra   rb   )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

rW   rX   r   )z
Set-Cookiez-___utmvafIumyLc=kUdUpAt; path=/; Max-Age=900r   )rC   r
   ra   rb   rT   r,   r,   r,   r-   "test_allow_some_garbage_in_cookies	  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):rR   Z_events_headersr   r   _readersr   r   r   r	   r
   Z_receivebufferr   _stateZ_utilr   _writersr   r   r   r   r   r   r   Zhelpersr   ra   rb   rT   rc   rd   rU   ZInformationalResponserD   r.   r2   r5   rC   rJ   rK   rV   re   rj   rm   rp   rt   rz   r{   r~   r   r   r   r   r   r   r   r   r   r,   r,   r,   r-   <module>   sx   $	
# !

7			
