o
    h3                  
   @   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+   Y/var/www/html/magazine_api/magazine_env/lib/python3.10/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,   tw3   s   
r1   c                 C   s   t  }|| 7 }|S r.   r   )databufr+   r+   r,   makebuf7   s   r4   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)r0   namevaluer/   r+   r,   check=   s   
ztr.<locals>.checkr      trailing)r4   r   rangelenr8   )readerr2   r/   r<   r3   ir+   r;   r,   tr<   s   
rB   c                  C   s,   t D ]\\} }}}tt| |f || qd S r.   )SIMPLE_CASESr1   r   Zrolestateeventbinaryr+   r+   r,   test_writers_simpleX      rH   c                  C   s,   t D ]\\} }}}tt| |f || qd S r.   )rC   rB   r   rD   r+   r+   r,   test_readers_simple\   rI   rJ   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 d    n1 s.w   Y  tt t tt	ddgd	dd  W d    d S 1 sPw   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    rP   )
r1   r	   r   pytestraisesr   r
   Requestr   Responser+   r+   r+   r,   test_writers_unusual`   s,   
"rU   c                	   C   sL  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 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 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    d S 1 sw   Y  d S )Ns$   HEAD /foo HTTP/1.0
Some: header

HEADz/fooSomeheaderrN   rO   s   HEAD /foo HTTP/1.0

s!   HTTP/1.0 200 OK
Some: header

r!   r"   )r#   r    rP   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:

)rZ    s   HTTP/1.0 200 OK
Foo: 	 	 

s   HTTP/1.0 200
Foo: bar

)rZ   rL   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)rX   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

)rB   r   CLIENTIDLErS   SERVERSEND_RESPONSErT   rQ   rR   r   r+   r+   r+   r,   test_readers_unusualt   s   
	$ra   c                   C   s&   t tg ddtddgksJ d S )N)   aaas   bbbs     ccc   dddrb   s   bbb cccrc   )listr   	bytearrayr+   r+   r+   r,   test__obsolete_line_fold_bytes   s   rf   c                 c   sJ    	 | |}|d u rn|V  t |tu rnq|r#|rJ |  V  d S d S r.   )r7   EndOfMessageZread_eof)r@   r3   do_eofrF   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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 r.   )r7   rg   ).0rF   r+   r+   r,   	<genexpr>   s    z t_body_reader.<locals>.<genexpr>r=   )r6   r4   rl   r   r>   r?   r   any)	Zthunkr2   r/   rh   r3   r@   rk   rA   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      t dS )Nr   r   r+   r+   r+   r,   <lambda>      z*test_ContentLengthReader.<locals>.<lambda>r&   c                   S   rq   )N
   rr   r+   r+   r+   r,   rs     rt   s
   0123456789r2   )rp   rg   Datar+   r+   r+   r,   test_ContentLengthReader  s   rx   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   asdfrv   F)rp   r   rg   rw   r+   r+   r+   r,   test_Http10Reader  s   
ry   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

rW   r    s3   5
01234
10
0123456789abcdef
0
Some: header

s   012340123456789abcdefrv   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   rw   rQ   rR   r   r+   r+   r+   r,   test_ChunkedReader  sF   

	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   123rv   s   45r&   s   123456s   456ZEtagZasdfr{   )r   r-   rw   rg   rQ   rR   r   wr+   r+   r,   test_ContentLengthWriterE  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 )Nrb   rv   s   3
aaa
s   aaaaaaaaaaaaaaaaaaaas   14
aaaaaaaaaaaaaaaaaaaa
r&   rz   r~   )abr{   s   0
etag: asdf
a: b

)r   r-   rw   rg   r   r+   r+   r,   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   1234rv   r&   r~   r{   )r   r-   rw   rg   rQ   rR   r   r   r+   r+   r,   test_Http10Writerk  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

)rQ   rR   r   rB   r   r_   r`   r+   r+   r+   r,   &test_reject_garbage_after_request_lines  s   "r   c                   C   r   )Ns&   HEAD /foo HTTP/1.1 xxxxxx
Host: a

rQ   rR   r   rB   r   r]   r^   r+   r+   r+   r,   'test_reject_garbage_after_response_liney     "r   c                   C   r   )Ns%   HEAD /foo HTTP/1.1
Host: foo bar

r   r+   r+   r+   r,   "test_reject_garbage_in_header_line  r   r   c                   C   s   t ttddgd d S )NrK   r\   s   host: example.com
foo: bar

)r1   r	   r   r+   r+   r+   r,   test_host_comes_first  s   
r   )F)7rQ   Z_utilr   Z_receivebufferr   _headersr   _stateZ_events_writersr   r	   r
   r   r   r   r   _readersr   r   r   r   r   Zhelpersr   r]   r^   rS   r_   r`   rT   ZInformationalResponserC   r-   r1   r4   rB   rH   rJ   rU   ra   rf   ri   rl   rp   rx   ry   r|   r   r   r   r   r   r   r   r+   r+   r+   r,   <module>   sp    $\

	2