o
    4Zc<                  
   @   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   )Upgrade	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objgot_list r/   G/var/www/chikooza/env/lib/python3.10/site-packages/h11/tests/test_io.pydowrite=   s   
r1   c                 C   s   t | |}||ksJ d S N)r1   )r,   r-   expectedgotr/   r/   r0   twC   s   
r5   c                 C   s   t  }|| 7 }|S r2   r   )databufr/   r/   r0   makebufH   s   r8   c                    s    fdd}t |}|| | |rJ t }tt|D ]}| |d u s'J ||||d  7 }q|| | t |}|d7 }|| | t|dksNJ d S )Nc                    sP   |  ksJ t | dg D ]\}}t|| t|tu sJ t|tu s%J qd S )Nr!   )getattrprinttypebytes)r4   namevaluer3   r/   r0   checkO   s   
ztr.<locals>.checkr      trailing)r8   r   rangelenr<   )readerr6   r3   r@   r7   ir/   r?   r0   trN   s   
rF   c                  C   s,   t D ]\\} }}}tt| |f || qd S r2   )SIMPLE_CASESr5   r   rolestateeventbinaryr/   r/   r0   test_writers_simplek      rM   c                  C   s,   t D ]\\} }}}tt| |f || qd S r2   )rG   rF   r
   rH   r/   r/   r0   test_readers_simplep   rN   rO   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 s0w   Y  tt t t	t
ddgd	dd  W d    d S 1 sRw   Y  d S )Nr   bar)bazquuxs   foo: bar
baz: quux

s   
r   /r   r   1.0r   r    r!   http_versionr"   )r$   r!   rW   )r5   r   r   r   pytestraisesr   r   Requestr   Responser/   r/   r/   r0   test_writers_unusualu   s6   
"r\   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 sw   Y  t	t
 t tttf d d  W d    n1 sw   Y  t	t
 t tttf d!d  W d    n	1 sw   Y  t	t
 t tttf d!d  W d    n	1 s5w   Y  t	t
 t tttf d"d  W d    d S 1 sVw   Y  d S )#Ns$   HEAD /foo HTTP/1.0
Some: header

HEAD/fooSomeheaderrU   rV   s   HEAD /foo HTTP/1.0

s!   HTTP/1.0 200 OK
Some: header

r"   r#   )r$   r!   rW   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:

)rb    s   HTTP/1.0 200 OK
Foo: 	 	 

s   HTTP/1.0 200
Foo: bar

)rb   rQ   r)   s#   HTTP/1.1 200 OK
SomeHeader: val

)
SomeHeadervalz1.1OKs5   HTTP/1.1 200 OK
SomeHeader1: val1
SomeHeader2: val2

)SomeHeader1val1)SomeHeader2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 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

)rF   r
   CLIENTIDLErZ   SERVERSEND_RESPONSEr[   rX   rY   r   r/   r/   r/   r0   test_readers_unusual   s   







	






	



$rp   c                   C   s&   t tg ddtddgksJ d S )N)   aaas   bbbs     ccc   dddrq   s   bbb cccrr   )listr   	bytearrayr/   r/   r/   r0   test__obsolete_line_fold_bytes4  s
   ru   c                 c   sJ    	 | |}|d u rn|V  t |tu rnq|r#|rJ |  V  d S d S r2   )r;   EndOfMessageread_eof)rD   r7   do_eofrK   r/   r/   r0   _run_reader_iterA  s   	ry   c                  G   s   t t|  }t|S r2   )rs   ry   r   )argseventsr/   r/   r0   _run_readerP  s   r|   Fc           	      C   s   t d t|}t|  |||ksJ t d |  }t }g }tt|D ]}|t||d7 }||||d  7 }q%|t|||7 }t||ksJJ tdd |D }|rh|sjt|d }t|  |d|kslJ d S d S d S )NzTest 1zTest 2Fr   c                 s   s    | ]	}t |tu V  qd S r2   )r;   rv   ).0rK   r/   r/   r0   	<genexpr>f  s    z t_body_reader.<locals>.<genexpr>rA   )r:   r8   r|   r   rB   rC   r   any)	thunkr6   r3   rx   r7   rD   r{   rE   is_completer/   r/   r0   t_body_readerU  s$   r   c                   C   s4   t dd dt g t dd dtddt g d S )Nc                   S      t dS )Nr   r   r/   r/   r/   r0   <lambda>m      z*test_ContentLengthReader.<locals>.<lambda>r)   c                   S   r   )N
   r   r/   r/   r/   r0   r   p  r   s
   0123456789r6   )r   rv   Datar/   r/   r/   r0   test_ContentLengthReaderl  s   r   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)rx   s   asdfr   F)r   r	   rv   r   r/   r/   r/   r0   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 sTw   Y  tt t tdd  W d    n1 sow   Y  t tdtddt g d S )N   0

s   0
Some: header

r_   r!   s3   5
01234
10
0123456789abcdef
0
Some: header

s   012340123456789abcdefr   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)r   r   rv   r   rX   rY   r   r/   r/   r/   r0   test_ChunkedReader~  sD   
r   c                  C   s  t d} t| tdddksJ t| tdddksJ t| t dks&J t d} tt t| tdd W d    n1 sBw   Y  t d} t| tdd tt t| tdd W d    n1 skw   Y  t d} t| tdd tt t| t  W d    n1 sw   Y  t d} t| tdddk t| tdddk tt t| tdgd	 W d    d S 1 sw   Y  d S )
N   s   123r   s   45r)   s   123456s   456Etagasdfr   )r   r1   r   rv   rX   rY   r   wr/   r/   r0   test_ContentLengthWriter  s0   "r   c                  C   s   t  } t| tdddksJ t| tdddksJ t| tdddks'J t| t dks1J t| tdd	gd
dks?J d S )Nrq   r   s   3
aaa
s   aaaaaaaaaaaaaaaaaaaas   14
aaaaaaaaaaaaaaaaaaaa
r)   r   r   )abr   s   0
Etag: asdf
a: b

)r   r1   r   rv   r   r/   r/   r0   test_ChunkedWriter  s   
r   c                  C   st   t  } t| tdddksJ t| t dksJ tt t| tdgd W d    d S 1 s3w   Y  d S )Ns   1234r   r)   r   r   )r   r1   r   rv   rX   rY   r   r   r/   r/   r0   test_Http10Writer  s   "r   c                   C   D   t t ttttf dd  W d    d S 1 sw   Y  d S )Ns   HTTP/1.0 200 OK xxxx

)rX   rY   r   rF   r
   rn   ro   r/   r/   r/   r0   &test_reject_garbage_after_request_line  s   "r   c                   C   r   )Ns&   HEAD /foo HTTP/1.1 xxxxxx
Host: a

rX   rY   r   rF   r
   rl   rm   r/   r/   r/   r0   'test_reject_garbage_after_response_line     
"r   c                   C   r   )Ns%   HEAD /foo HTTP/1.1
Host: foo bar

r   r/   r/   r/   r0   "test_reject_garbage_in_header_line  r   r   c               	   C   sh   dD ]/} t d}||  |d tt tttt	f |d  W d    n1 s,w   Y  qd S )Ns     s   HEAD /s    HTTP/1.1
Host: foobar

)
rt   r*   extendrX   rY   r   rF   r
   rl   rm   )bad_charmessager/   r/   r0   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]   r^   r   )z
Set-Cookiez-___utmvafIumyLc=kUdUpAt; path=/; Max-Age=900r   )rF   r
   rl   rm   rZ   r/   r/   r/   r0   "test_allow_some_garbage_in_cookies	  s   
r   c                   C   s   t ttddgd d S )NrP   rk   s   Host: example.com
foo: bar

)r5   r   r   r/   r/   r/   r0   test_host_comes_first  s
   
r   )F):rX   _events_headersr   r   _readersr   r   r   r	   r
   _receivebufferr   _state_utilr   _writersr   r   r   r   r   r   r   helpersr   rl   rm   rZ   rn   ro   r[   InformationalResponserG   r1   r5   r8   rF   rM   rO   r\   rp   ru   ry   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r/   r/   r/   r0   <module>   sz    $	
# !

7			
