o
    h@                     @   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Z0ded ded e1fd!d"Z2deded#ed dfd$d%Z3d&e1d efd'd(Z4d)ed&e1d#ed dfd*d+Z5dYd,d-Z6dYd.d/Z7dYd0d1Z8dYd2d3Z9dYd4d5Z:d)ed6e1d7e;d eeddf fd8d9Z<d:ed ee
 fd;d<Z=dZd>ed&e1d#ed7e;d df
d?d@Z>dYdAdBZ?dYdCdDZ@dYdEdFZAdYdGdHZBdYdIdJZCdYdKdLZDdYdMdNZEdYdOdPZFdYdQdRZGdYdSdTZHdYdUdVZIdYdWdXZJdS )[    )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

      OK)status_coder5   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

writer).Nobjreturnc                 C   s   g }| ||j  d|S )N    )appendjoin)r=   r>   got_list rD   e/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/h11/tests/test_io.pydowriteR   s   
rF   expectedc                 C   s   t | |}||ksJ d S N)rF   )r=   r>   rG   gotrD   rD   rE   twX   s   
rJ   datac                 C   s   t  }|| 7 }|S rH   r   )rK   bufrD   rD   rE   makebuf]   s   rM   readerc                    s   dt dd f fdd}t|}|| | |rJ t }tt|D ]}| |d u s,J ||||d  7 }q"|| | t|}|d7 }|| | t|dksSJ d S )NrI   r?   c                    sF   |  ksJ t | dg D ]\}}t|tu sJ t|tu s J qd S )Nr5   )getattrtypebytes)rI   namevaluerG   rD   rE   checkd   s
   ztr.<locals>.checkr)      trailing)r   rM   r   rangelenrQ   )rN   rK   rG   rU   rL   irD   rT   rE   trc   s   	rZ   c                  C   s,   t D ]\\} }}}tt| |f || qd S rH   )SIMPLE_CASESrJ   r(   rolestateeventbinaryrD   rD   rE   test_writers_simple      ra   c                  C   s,   t D ]\\} }}}tt| |f || qd S rH   )r[   rZ   r   r\   rD   rD   rE   test_readers_simple   rb   rc   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r3   r4   r5   http_versionr6   )r8   r5   rk   )rJ   r&   r   r   pytestraisesr!   r'   r   r%   r   rD   rD   rD   rE   test_writers_unusual   s6   
"rn   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headerri   rj   s   HEAD /foo HTTP/1.0

s!   HTTP/1.0 200 OK
Some: header

r6   r7   )r8   r5   rk   r9   s$   HTTP/1.0 200 OK
Foo: a a a a a 

)Fooz	a a a a as   HTTP/1.0 200 OK
Foo:

)rt    s   HTTP/1.0 200 OK
Foo: 	 	 

s   HTTP/1.0 200
Foo: bar

)rt   re   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)rr   z"multi-line header nonsense I guessr/   )zMore-nonsensezin the last headerr2   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

)rZ   r   r   r   r   r   r   r   rl   rm   r!   rD   rD   rD   rE   test_readers_unusual   s   







	






	



$r~   c                   C   s&   t tg ddtddgksJ d S )N)   aaas   bbbs     ccc   dddr   s   bbb cccr   )listr   	bytearrayrD   rD   rD   rE   test__obsolete_line_fold_bytesH  s
   r   rL   do_eofc                 c   sJ    	 | |}|d u rn|V  t |tu rnq|r#|rJ |  V  d S d S rH   )rP   r	   read_eof)rN   rL   r   r_   rD   rD   rE   _run_reader_iterU  s   	r   argsc                  G   s   t t|  }t|S rH   )r   r   r*   )r   eventsrD   rD   rE   _run_readerf  s   r   Fthunkc           	      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 rH   )rP   r	   ).0r_   rD   rD   rE   	<genexpr>|  s    z t_body_reader.<locals>.<genexpr>rV   )printrM   r   r   rW   rX   r*   any)	r   rK   rG   r   rL   rN   r   rY   is_completerD   rD   rE   t_body_readerk  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   rD   rD   rD   rE   <lambda>      z*test_ContentLengthReader.<locals>.<lambda>r@   c                   S   r   )N
   r   rD   rD   rD   rE   r     r   s
   0123456789rK   )r   r	   r   rD   rD   rD   rE   test_ContentLengthReader  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)r   s   asdfr   F)r   r   r	   r   rD   rD   rD   rE   test_Http10Reader  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 t tdtddt g d S )N   0

s   0
Some: header

rq   r5   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   xxxxxs   5   	 
01234
0

s   01234)r   r   r	   r   rl   rm   r!   rD   rD   rD   rE   test_ChunkedReader  sN   
	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#   rF   r   r	   rl   rm   r!   wrD   rD   rE   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 )Nr   r   s   3
aaa
s   aaaaaaaaaaaaaaaaaaaas   14
aaaaaaaaaaaaaaaaaaaa
r@   r   r   )abr   s   0
Etag: asdf
a: b

)r"   rF   r   r	   r   rD   rD   rE   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$   rF   r   r	   rl   rm   r!   r   rD   rD   rE   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

)rl   rm   r!   rZ   r   r   r   rD   rD   rD   rE   &test_reject_garbage_after_request_line  s   "r   c                   C   r   )Ns&   HEAD /foo HTTP/1.1 xxxxxx
Host: a

rl   rm   r!   rZ   r   r   r   rD   rD   rD   rE   'test_reject_garbage_after_response_line	     
"r   c                   C   r   )Ns%   HEAD /foo HTTP/1.1
Host: foo bar

r   rD   rD   rD   rE   "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

)
r   rA   extendrl   rm   r!   rZ   r   r   r   )bad_charmessagerD   rD   rE   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

ro   rp   r,   )z
Set-Cookiez-___utmvafIumyLc=kUdUpAt; path=/; Max-Age=900r2   )rZ   r   r   r   r   rD   rD   rD   rE   "test_allow_some_garbage_in_cookies%  s   
r   c                   C   s   t ttddgd d S )Nrd   r}   s   Host: example.com
foo: bar

)rJ   r&   r   rD   rD   rD   rE   test_host_comes_first7  s
   
r   )r?   N)F)Ktypingr   r   r   r   rl   _eventsr   r   r	   r
   r   r   r   _headersr   r   _readersr   r   r   r   r   _receivebufferr   _stater   r   r   r   r   r   r   r   r   r    _utilr!   _writersr"   r#   r$   r%   r&   r'   r(   helpersr*   r[   rQ   rF   rJ   rM   rZ   ra   rc   rn   r~   r   boolr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rD   rD   rD   rE   <module>   s    $	0$	
#



 
!
 




=


	

	
	

