
    wg@                        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fe"e!f eddgd      dfe"e!f edg d      dfe"e!f eddgd      dfe"e!f edg d      dfgZ0ded   ded e1fd!Z2deded"ed dfd#Z3d$e1d efd%Z4d&ed$e1d"ed dfd'Z5d@d(Z6d@d)Z7d@d*Z8d@d+Z9d@d,Z:d&ed-e1d.e;d eeddf   fd/Z<d0ed ee
   fd1Z=dAd2ed$e1d"ed.e;d df
d3Z>d@d4Z?d@d5Z@d@d6ZAd@d7ZBd@d8ZCd@d9ZDd@d:ZEd@d;ZFd@d<ZGd@d=ZHd@d>ZId@d?ZJy)B    )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_coder6   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                 N    g } | ||j                          dj                  |      S )N    )appendjoin)r>   r?   got_lists      V/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/h11/tests/test_io.pydowriterG   R   s$    H
3 88HrB   expectedc                 *    t        | |      }||k(  sJ y N)rG   )r>   r?   rH   gots       rF   twrL   X   s    
&#
C(??rB   datac                 $    t               }|| z  }|S rJ   r   )rM   bufs     rF   makebufrP   ]   s    
/C4KCJrB   readerc                 D   dt         dd ffd}t        |      } | | |             |rJ t               }t        t	        |            D ]  } | |      J ||||dz    z  }  | | |             t        |      }|dz  } | | |             t        |      dk(  sJ y )NrK   r@   c                     | k(  sJ t        | dg       D ]+  \  }}t        |      t        u sJ t        |      t        u r+J  y )Nr6   )getattrtypebytes)rK   namevaluerH   s      rF   checkztr.<locals>.checkd   sQ    h #3	26 	(KD%:&&&;%'''	(rB   r*      trailing)r   rP   r   rangelenrV   )rQ   rM   rH   rY   rO   is     `   rF   trr^   c   s    (3 (4 ( $-C	&+N7 /C3t9 c{"""tAA 
&+ $-C;C	&+:$$$rB   c                  T    t         D ]  \  \  } }}}t        t        | |f   ||       ! y rJ   )SIMPLE_CASESrL   r)   rolestateeventbinarys       rF   test_writers_simplerf      s1    *6 0&$v
74;/0rB   c                  T    t         D ]  \  \  } }}}t        t        | |f   ||       ! y rJ   )r`   r^   r   ra   s       rF   test_readers_simplerh      s1    *6 0&$v
74;/0rB   c            
         t        t        t        ddg      d       t        t        t        g       d       t	        j
                  t              5  t        t        t        ddddgd	
      d        d d d        t	        j
                  t              5  t        t        t        ddgd	      d        d d d        y # 1 sw Y   JxY w# 1 sw Y   y xY w)Nr/   bar)bazquuxs   foo: bar
baz: quux

s   
r,   /r-   r0   1.0r4   r5   r6   http_versionr7   )r9   r6   rq   )rL   r'   r   r   pytestraisesr"   r(   r   r&   r    rB   rF   test_writers_unusualru      s    @A(
 }gbk7+ 
)	* 


(*AB"	 		


 
)	* 

*A)BQV 	

 


 


 
s   !B:C:CCc            
         t        t        t        t        f   dt	        dddgd             t        t        t        t        f   dt	        ddg 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
             t        t        t
        t        f   dt        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             t        t        t
        t        f   dt        d	dgdd             t        t        t
        t        f   dt        d	ddgdd             t        t        t
        t        f   dt        d	ddgdd             t        t        t        t        f   dt	        ddg d             t        j                  t              5  t        t        t        t        f   dd        d d d        t        j                  t              5  t        t        t        t        f   d d        d d d        t        j                  t              5  t        t        t        t        f   d!d        d d d        t        j                  t              5  t        t        t        t        f   d!d        d d d        t        j                  t              5  t        t        t        t        f   d"d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   oxY w# 1 sw Y   y xY w)#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

r7   r8   )r9   r6   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|   rk   rB   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)rz   z"multi-line header nonsense I guessr0   )zMore-nonsensezin the last headerr3   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

)r^   r   r   r   r   r    r   r   rr   rs   r"   rt   rB   rF   test_readers_unusualr      sG   5'(		
	 %vfbuM %&2'(		
	 %&9)*		
	 %&.k]u	
 %&5k]u	
 %&/n%5ERU	
 %&3*+		
	 %&D,.EF		
	 %&H,.EF		
	 	% 			
. 
)	* 

FDL!?	

 
)	* 

FDL!<	

 
)	* 

FDL!<	

 
)	* 

FDL!<	

 
)	* U
764< "MtTU U3
 

 

 

 
U Us<   ?L'?L4?M ?M?M'L14L= M	MM!c                  R    t        t        g d            dt        d      dgk(  sJ y )N)   aaas   bbbs     ccc   dddr   s   bbb cccr   )listr   	bytearrayrt   rB   rF   test__obsolete_line_fold_bytesr   H  s6     #$FGH*M   rB   rO   do_eofc              #      K   	  | |      }|n| t        |      t        u rn"|r|rJ | j                          y y wrJ   )rU   r
   read_eof)rQ   rO   r   rd   s       rF   _run_reader_iterr   U  sU      s= ;,&  woo s   >A argsc                  :    t        t        |        }t        |      S rJ   )r   r   r+   )r   eventss     rF   _run_readerr   f  s    "D)*F ((rB   thunkc                    t        d       t        |      }t         |        ||      |k(  sJ t        d        |        }t               }g }t	        t        |            D ]  }|t        ||d      z  }||||dz    z  } |t        |||      z  }t        |      |k(  sJ t        d |D              }|r)|s&t        |dz         }t         |        |d      |k(  sJ y y y )NzTest 1zTest 2Fr*   c              3   >   K   | ]  }t        |      t        u   y wrJ   )rU   r
   ).0rd   s     rF   	<genexpr>z t_body_reader.<locals>.<genexpr>|  s     Hed5k\1Hs   rZ   )printrP   r   r   r[   r\   r+   any)	r   rM   rH   r   rO   rQ   r   r]   is_completes	            rF   t_body_readerr   k  s    	(O
$-CuwV,888 
(OWF
/CF3t9 +fc511tAA k&#v..F (H444HxHHK6d[()57C/8;;; "{rB   c                  v    t        d dt               g       t        d dt        d      t               g       y )Nc                      t        d      S )Nr   r   rt   rB   rF   <lambda>z*test_ContentLengthReader.<locals>.<lambda>  s    -a0 rB   rB   c                      t        d      S )N
   r   rt   rB   rF   r   z*test_ContentLengthReader.<locals>.<lambda>  s    #B' rB   s
   0123456789rM   )r   r
   r	   rt   rB   rF   test_ContentLengthReaderr     s1    0#7GH'	=	!<>2rB   c                      t        t        dt               gd       t        t        dt        d      gd       t        t        dt        d      t               gd       y )NrB   T)r   s   asdfr   F)r   r   r
   r	   rt   rB   rF   test_Http10Readerr     sH    ,ln%5dC,$G*<)=eLg' 2LNCDrB   c                     t        t        dt               g       t        t        dt        dg      g       t        t        dt        d      t        dg      g       t        t        dt        d      t               g       t        t        d	t        d
      t               g       t	        j
                  t              5  t        t        dt        d      g       d d d        t	        j
                  t              5  t        t        dd        d d d        t        t        dt        d      t               g       t        t        dt        d      t               g       y # 1 sw Y   xY w# 1 sw Y   `xY w)N   0

s   0
Some: header

ry   r6   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	   rr   rs   r"   rt   rB   rF   test_ChunkedReaderr     sP   -/?@$	12	34 	"
 ./"4!56	

 H	+	,ln= 8	;	0 
)	* S 	m%<t?P>QRS 
)	* =m%5t<= 	B 
8	ln- -	8	ln-'S S= =s   E&E2&E/2E;c                     t        d      } t        | t        d            dk(  sJ t        | t        d            dk(  sJ t        | t                     dk(  sJ t        d      } t	        j
                  t              5  t        | t        d             d d d        t        d      } t        | t        d             t	        j
                  t              5  t        | t        d             d d d        t        d      } t        | t        d             t	        j
                  t              5  t        | t                      d d d        t        d      } t        | t        d            dk(   t        | t        d            dk(   t	        j
                  t              5  t        | t        dg	             d d d        y # 1 sw Y   1xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)
N   s   123r   s   45rB   s   123456s   456Etagasdfr   )r$   rG   r	   r
   rr   rs   r"   ws    rF   test_ContentLengthWriterr     s   AA1d'(F2221d&'50001ln%,,,AA	)	* )4Y'() 	AAAt !	)	* &4V$%& 	AAAt !	)	* #<>"# 	AAAt !V+At E)	)	* =<)9(:;<= =!) )
& &
# #= =s0   ?GG1G$G*GGG'*G3c                  &   t               } t        | t        d            dk(  sJ t        | t        d            dk(  sJ t        | t        d            dk(  sJ t        | t                     dk(  sJ t        | t        dd	g
            dk(  sJ y )Nr   r   s   3
aaa
s   aaaaaaaaaaaaaaaaaaaas   14
aaaaaaaaaaaaaaaaaaaa
rB   r   r   )abr   s   0
Etag: asdf
a: b

)r#   rG   r	   r
   r   s    rF   test_ChunkedWriterr     s    A1d'(O;;;1d	*+/NNNN1dn%,,,1ln%555 	<)9:(FGH-	.	.rB   c                  
   t               } t        | t        d            dk(  sJ t        | t                     dk(  sJ t	        j
                  t              5  t        | t        dg             d d d        y # 1 sw Y   y xY w)Ns   1234r   rB   r   r   )r%   rG   r	   r
   rr   rs   r"   r   s    rF   test_Http10Writerr     so    A1d()W4441ln%,,,	)	* =<)9(:;<= = =s   A99Bc                      t        j                  t              5  t        t        t
        t        f   dd        d d d        y # 1 sw Y   y xY w)Ns   HTTP/1.0 200 OK xxxx

)rr   rs   r"   r^   r   r    r   rt   rB   rF   &test_reject_garbage_after_request_liner     s?    	)	* U
76=()+MtTU U U   AAc                      t        j                  t              5  t        t        t
        t        f   dd        d d d        y # 1 sw Y   y xY w)Ns&   HEAD /foo HTTP/1.1 xxxxxx
Host: a

rr   rs   r"   r^   r   r   r   rt   rB   rF   'test_reject_garbage_after_response_liner   	  s>    	)	* 

FDL!?	

 
 
r   c                      t        j                  t              5  t        t        t
        t        f   dd        d d d        y # 1 sw Y   y xY w)Ns%   HEAD /foo HTTP/1.1
Host: foo bar

r   rt   rB   rF   "test_reject_garbage_in_header_liner     s>    	)	* 

FDL!A	

 
 
r   c                     dD ]o  } t        d      }|j                  |        |j                  d       t        j                  t
              5  t        t        t        t        f   |d        d d d        q y # 1 sw Y   |xY w)Ns     s   HEAD /s    HTTP/1.1
Host: foobar

)
r   rC   extendrr   rs   r"   r^   r   r   r   )bad_charmessages     rF   test_reject_non_vchar_in_pathr     sp    ' 5I&x ;<]]-. 	5wvt|$gt4	5 	5	5	5 	5s   A66A?	c            
      \    t        t        t        t        f   dt	        ddddg             y )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=900r3   )r^   r   r   r   r   rt   rB   rF   "test_allow_some_garbage_in_cookiesr   %  s6    	 	R	
rB   c                  <    t        t        t        ddg      d       y )Nrj   r   s   Host: example.com
foo: bar

)rL   r'   r   rt   rB   rF   test_host_comes_firstr   7  s    0GHI0rB   )r@   N)F)Ktypingr   r   r   r   rr   _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`   rV   rG   rL   rP   r^   rf   rh   ru   r   r   boolr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rt   rB   rF   <module>r      sO   1 1    7  +   '   + 
$&=>	

 	E 
S+B*CER7 
S"U;" 
&>%?
	
 	> 
#r*M'7 FHY' c e s    
% M %s %% %3 %4 %80
0

>]U@
   %) sD$ ")s )tE{ )
< <E <S <$ <SW <.:z=6=U


5$rB   