a
    äze8 ã                   @   s4  d dl Z d dlmZmZ d dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlmZ ejZd dlmZ d dlmZ ej e¡Zej ed¡Zej ed¡Zej ed¡Zd	Zd
ZdZdZde d ZdZ dZ!ej"Z"G dd„ dƒZ#G dd„ de#ƒZ$G dd„ dej%ƒZ&G dd„ dej'ƒZ(G dd„ deƒZ)G dd„ deƒZ*G dd„ deƒZ+G dd„ deƒZ,G d d!„ d!eƒZ-G d"d#„ d#e-ƒZ.G d$d%„ d%ƒZ/G d&d'„ d'eƒZ0G d(d)„ d)eƒZ1G d*d+„ d+eƒZ2G d,d-„ d-eƒZ3G d.d/„ d/eƒZ4G d0d1„ d1eƒZ5G d2d3„ d3eƒZ6G d4d5„ d5eƒZ7e8d6kr0ej9d7d8 dS )9é    N)ÚclientÚ
HTTPStatus)Úmock)Úsupport)Úsocket_helperzkeycert.pemzkeycert2.pemzselfsigned_pythontestdotnet.pemz{HTTP/1.1 200 OK
Transfer-Encoding: chunked

a
hello worl
3
d! 
8
and now 
22
for something completely different
s7   hello world! and now for something completely differentz;foo=barz0
Ú0ú
zX-Dummy: foo
X-Dumm2: bar
c                   @   sH   e Zd Zejddfdd„Zdd„ Zddd„Zdd	„ Zd
d„ Z	dd„ Z
dS )Ú
FakeSocketNc                 C   sB   t |tƒr| d¡}|| _|| _d| _d| _d| _|| _|| _	d S )NÚasciió    r   F)
Ú
isinstanceÚstrÚencodeÚtextÚ	fileclassÚdataÚsendall_callsÚfile_closedÚhostÚport)Úselfr   r   r   r   © r   ú'/usr/lib/python3.9/test/test_httplib.pyÚ__init__2   s    

zFakeSocket.__init__c                 C   s    |  j d7  _ |  j|7  _d S ©Né   )r   r   ©r   r   r   r   r   Úsendall=   s    zFakeSocket.sendallc                 C   s6   |dkr|dkrt  ¡ ‚|  | j¡| _| j| j_| jS )NÚrÚrb)r   ZUnimplementedFileModer   r   ÚfileÚ
file_closeÚclose)r   ÚmodeÚbufsizer   r   r   ÚmakefileA   s
    
zFakeSocket.makefilec                 C   s
   d| _ d S )NT)r   ©r   r   r   r   r!   I   s    zFakeSocket.file_closec                 C   s   d S ©Nr   r&   r   r   r   r"   L   s    zFakeSocket.closec                 C   s   d S r'   r   )r   ÚlevelZoptnameÚvaluer   r   r   Ú
setsockoptO   s    zFakeSocket.setsockopt)N)Ú__name__Ú
__module__Ú__qualname__ÚioÚBytesIOr   r   r%   r!   r"   r*   r   r   r   r   r	   1   s   
r	   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚEPipeSocketc                 C   s   t  | |¡ || _d S r'   )r	   r   Úpipe_trigger)r   r   r1   r   r   r   r   T   s    zEPipeSocket.__init__c                 C   s(   | j |v rttjdƒ‚|  j|7  _d S )NZgotcha)r1   ÚOSErrorÚerrnoÚEPIPEr   r   r   r   r   r   Y   s    
zEPipeSocket.sendallc                 C   s   d S r'   r   r&   r   r   r   r"   ^   s    zEPipeSocket.closeN)r+   r,   r-   r   r   r"   r   r   r   r   r0   R   s   r0   c                   @   s    e Zd Zddd„Zddd„ZdS )	ÚNoEOFBytesIOéÿÿÿÿc                 C   s"   t j | |¡}|dkrtdƒ‚|S ©Nr   zcaller tried to read past EOF)r.   r/   ÚreadÚAssertionError)r   Únr   r   r   r   r8   g   s    zNoEOFBytesIO.readNc                 C   s"   t j | |¡}|dkrtdƒ‚|S r7   )r.   r/   Úreadliner9   )r   Úlengthr   r   r   r   r;   m   s    zNoEOFBytesIO.readline)r6   )N)r+   r,   r-   r8   r;   r   r   r   r   r5   a   s   
r5   c                       s0   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚFakeSocketHTTPConnectionc                    s$   d| _ tƒ  d¡ || _| j| _d S )Nr   úexample.com)ÚconnectionsÚsuperr   Úfake_socket_argsÚcreate_connectionÚ_create_connection)r   Úargs©Ú	__class__r   r   r   v   s    z!FakeSocketHTTPConnection.__init__c                    s   |  j d7  _ tƒ  ¡ S r   )r?   r@   Úconnectr&   rE   r   r   rG   |   s    z FakeSocketHTTPConnection.connectc                 O   s
   t | jŽ S r'   )r	   rA   ©r   ÚposÚkwr   r   r   rB      s    z*FakeSocketHTTPConnection.create_connection)r+   r,   r-   r   rG   rB   Ú__classcell__r   r   rE   r   r=   s   s   r=   c                   @   sL   e Z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S )ÚHeaderTestsc                 C   sˆ   G dd„ dt ƒ}dD ]n}dD ]d}t d¡}tdƒ|_|ƒ |_d}i }|rXtt|ƒƒ||< | dd	||¡ |  	|jj
| ¡  d
¡ qqd S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z;HeaderTests.test_auto_headers.<locals>.HeaderCountingBufferc                 S   s
   i | _ d S r'   )Úcountr&   r   r   r   r   Š   s    zDHeaderTests.test_auto_headers.<locals>.HeaderCountingBuffer.__init__c                 S   sX   |  d¡}t|ƒdkrH|d  d¡ ¡ }| j |d¡ | j|  d7  < t | |¡ d S )Nó   :r   r   r
   )ÚsplitÚlenÚdecodeÚlowerrM   Ú
setdefaultÚlistÚappend)r   ÚitemÚkvZlcKeyr   r   r   rU   Œ   s    
zBHeaderTests.test_auto_headers.<locals>.HeaderCountingBuffer.appendN©r+   r,   r-   r   rU   r   r   r   r   ÚHeaderCountingBuffer‰   s   rY   )TF)úContent-lengthZHostzAccept-encodingr>   ZblahblahblahZspamspamspamÚPOSTú/r   )rT   r   ÚHTTPConnectionr	   ÚsockÚ_bufferr   rP   ÚrequestÚassertEqualrM   rR   )r   rY   Zexplicit_headerÚheaderÚconnÚbodyÚheadersr   r   r   Útest_auto_headers…   s    

zHeaderTests.test_auto_headersc                 C   sf  G dd„ dt ƒ}d}d}t ||¡D ]J\}}t d¡}td ƒ|_|ƒ |_| |d|¡ |  	|jj
dd |¡¡ q$d	}|D ]F}t d¡}td ƒ|_|ƒ |_| |dd ¡ |  	|jj
d d
 |¡¡ qx|D ]F}t d¡}td ƒ|_|ƒ |_| |dd¡ |  	|jj
dd |¡¡ qÄt ||¡D ]H}t d¡}td ƒ|_|ƒ |_| |dd¡ |  	|jj
dd |¡¡ qd S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z?HeaderTests.test_content_length_0.<locals>.ContentLengthCheckerc                 S   s   t  | ¡ d | _d S r'   )rT   r   Úcontent_lengthr&   r   r   r   r   ¥   s    
zHHeaderTests.test_content_length_0.<locals>.ContentLengthChecker.__init__c                 S   sF   |  dd¡}t|ƒdkr6|d  ¡ dkr6|d  ¡ | _t | |¡ d S )NrN   r   r   s   content-length)rO   rP   rR   Ústriprg   rT   rU   )r   rV   rW   r   r   r   rU   ¨   s    zFHeaderTests.test_content_length_0.<locals>.ContentLengthChecker.appendNrX   r   r   r   r   ÚContentLengthChecker¤   s   ri   )NÚ )ÚPUTr[   ZPATCHr>   r\   ó   0z%Header Content-Length incorrect on {})ÚGETÚCONNECTZDELETEÚHEADZOPTIONSZTRACEz.Header Content-Length set for empty body on {}rj   ú ó   1)rT   Ú	itertoolsÚproductr   r]   r	   r^   r_   r`   ra   rg   ÚformatÚchain)r   ri   ZbodiesZmethods_with_bodyÚmethodrd   rc   Zmethods_without_bodyr   r   r   Útest_content_length_0¢   sP    

þ

þ

þ

þz!HeaderTests.test_content_length_0c                 C   s’  t  d¡}td ƒ|_| dd¡ | dd¡ |  d|j¡ | dd¡ |  d	|j¡ | d
d¡ |  d|j¡ | dd¡ |  d|j¡ | ddd¡ |  d|j¡ | dd¡ |  d|j¡ | dd¡ |  d|j¡ | dd¡ |  d|j¡ | dd¡ |  d|j¡ | d d!¡ |  d"|j¡ | d#d$¡ |  d%|j¡ | d&d$¡ |  d'|j¡ | d(d$¡ |  d)|j¡ | d*d$¡ |  d+|j¡ d S ),Nr>   rm   r\   rZ   é*   s   Content-length: 42ZFooz bar s
   Foo:  bar ZBarz	baz	s
   Bar: 	baz	ZAuthorizationzBearer mytokens   Authorization: Bearer mytokenZ
IterHeaderZIterAZIterBs   IterHeader: IterA
	IterBZLatinHeaderó   ÿs   LatinHeader: ÿZ
Utf8Headers   Ã€s   Utf8Header: Ã€z
C1-Controls	   next…lines   C1-Control: next…linezEmbedded-Fold-Spacezis
 alloweds!   Embedded-Fold-Space: is
 allowedzEmbedded-Fold-Tabzis
	alloweds   Embedded-Fold-Tab: is
	allowedz	Key Spacer)   s   Key Space: valuez	KeySpace s   KeySpace : values   Nonbreak Spaces   Nonbreak Space: values    NonbreakSpaces    NonbreakSpace: value)r   r]   r	   r^   Ú
putrequestÚ	putheaderÚassertInr_   ©r   rc   r   r   r   Útest_putheaderä   s>    

zHeaderTests.test_putheaderc                 C   sx   d}t  d¡}tdƒ}||_| dd¡ |  |j |¡¡ d}t  d¡}tdƒ}||_| dd¡ |  |j |¡¡ d S )NsC   GET /foo HTTP/1.1
Host: [2001::]:81
Accept-Encoding: identity

z[2001::]:81rj   rm   ú/foosE   GET /foo HTTP/1.1
Host: [2001:102A::]
Accept-Encoding: identity

z[2001:102A::])r   r]   r	   r^   r`   Ú
assertTruer   Ú
startswith©r   Úexpectedrc   r^   r   r   r   Útest_ipv6host_header  s    

z HeaderTests.test_ipv6host_headerc                 C   sF   d}t |ƒ}t |¡}| ¡  |  | d¡d¡ |  | d¡d¡ d S )Nz4HTTP/1.1 200 OK
First: val
: nval
Second: val

ZFirstÚvalZSecond)r	   r   ÚHTTPResponseÚbeginra   Ú	getheader©r   rd   r^   Úrespr   r   r   Ú!test_malformed_headers_coped_with  s    
z-HeaderTests.test_malformed_headers_coped_withc                 C   s,  dt tddƒƒ d t tddƒƒ d }t|ƒ}t |¡}| ¡  |  | d¡d	¡ |  |jd d	¡ |  | d
¡d¡ |  |jd
 d¡ d 	t
ttddƒƒ¡}|  | d¡|¡ |  |jd |¡ |  | d¡¡ |  d|j¡ | d¡|jd fD ]0}|  | d¡¡ |  d|¡ |  | d¡¡ qöd S )Ns0   HTTP/1.1 200 OK
!#$%&'*+-.^_`|~: value
VCHAR: é!   é   s   
obs-text: é€   é   sM   
obs-fold: text
 folded with space
	folded with tab
Content-Length: 0

úContent-Lengthr   z!#$%&'*+-.^_`|~r)   rj   ZVCHARzobs-textzobs-foldr   z folded with spacezfolded with tab)ÚbytesÚranger	   r   r†   r‡   ra   rˆ   ÚmsgÚjoinÚmapÚchrZassertIsNotNoner|   r€   r   Úendswith)r   rd   r^   rŠ   ZvcharZfoldedr   r   r   Útest_parse_all_octets#  s4    þþýýÿ
z!HeaderTests.test_parse_all_octetsc              
   C   sœ   t  d¡}tdƒ|_| dd¡ d}|D ]n\}}|  ||f¡H |  td¡ | ||¡ W d   ƒ n1 sn0    Y  W d   ƒ q(1 sŒ0    Y  q(d S )Nr>   rj   rm   r\   ))s   Invalid
Nameó
   ValidValue)s   InvalidNamer™   )s   Invalid
Namer™   )s   
InvalidNamer™   )s   InvalidNamer™   )s   
InvalidNamer™   )s    InvalidNamer™   )s   	InvalidNamer™   )s   Invalid:Namer™   )s   :InvalidNamer™   )ó	   ValidNames   Invalid
Value)rš   s   InvalidValue)rš   s   Invalid
Value)rš   s   InvalidValue
)rš   s   InvalidValue)rš   s   InvalidValue
zInvalid header)	r   r]   r	   r^   rz   ÚsubTestÚassertRaisesRegexÚ
ValueErrorr{   )r   rc   ÚcasesÚnamer)   r   r   r   Útest_invalid_headersA  s    

z HeaderTests.test_invalid_headersc                 C   sš   d}t |ƒ}tj|dd}t ¡ }| ¡  W d   ƒ n1 s@0    Y  | ¡  ¡ }|  |d d¡ |  |d d¡ |  |d d¡ |  |d	 d
¡ d S )Ns9   HTTP/1.1 200 OK
First: val
Second: val1
Second: val2
r   )Z
debuglevelr   zreply: 'HTTP/1.1 200 OK\r\n'zheader: First: valé   zheader: Second: val1é   zheader: Second: val2)	r	   r   r†   r   Úcaptured_stdoutr‡   ÚgetvalueÚ
splitlinesra   )r   rd   r^   rŠ   ÚoutputÚlinesr   r   r   Útest_headers_debuglevel_  s    ÿ
&z#HeaderTests.test_headers_debuglevelN)r+   r,   r-   rf   rw   r~   r„   r‹   r˜   r    r¨   r   r   r   r   rL   „   s   B"
rL   c                   @   s   e Zd Zdd„ ZdS )ÚHttpMethodTestsc              	   C   s`   d}|D ]R}|   td¡2 t d¡}td ƒ|_|j|dd W d   ƒ q1 sP0    Y  qd S )N)	zGETzPOST
zPUT
z
POST
ValuezPOST
HOST:abczGET
rHost:abc
zPOSTRemainder:z
GETHOST:
z
PUTz'method can't contain control charactersr>   r\   )rv   Úurl)rœ   r   r   r]   r	   r^   r`   )r   Úmethodsrv   rc   r   r   r   Útest_invalid_method_namesr  s    ÿ

z)HttpMethodTests.test_invalid_method_namesN)r+   r,   r-   r¬   r   r   r   r   r©   q  s   r©   c                   @   sJ   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„Zdd„ Z	dd„ Z
dS )ÚTransferEncodingTests   It's just a flesh woundc                 C   sb   t  d¡}tdƒ|_| dd¡ |j|  ¡ dd |  |jj¡\}}}|  	|¡}|  
|| j¡ d S )Nr>   r   r[   r\   T)Úencode_chunked)r   r]   r	   r^   rz   Z
endheadersÚ
_make_bodyÚ_parse_requestr   Ú_parse_chunkedra   Úexpected_body)r   rc   Ú_rd   r   r   r   Útest_endheaders_chunkedŠ  s    


z,TransferEncodingTest.test_endheaders_chunkedc                 C   sv  t  d¡}tdƒ|_| dd|  ¡ ddi¡ |  |jj¡\}}}|  ddd	„ | 	¡ D ƒ¡ |  
|d d¡ |  
|| j¡ t  d¡}tdƒ|_| dd| j d
¡ddi¡ |  |jj¡\}}}|  ddd	„ | 	¡ D ƒ¡ |  
|d d¡ |  
|| j¡ t  d¡}tdƒ|_|jddddid|  ¡ d |  |jj¡\}}}|  ddd	„ |D ƒ¡ |  
|d d¡ |  
|  |¡| j¡ d S )Nr>   r   r[   r\   úTransfer-EncodingÚchunkedúcontent-lengthc                 S   s   g | ]}|  ¡ ‘qS r   ©rR   ©Ú.0Úkr   r   r   Ú
<listcomp>ž  r   z>TransferEncodingTest.test_explicit_headers.<locals>.<listcomp>úlatin-1c                 S   s   g | ]}|  ¡ ‘qS r   r¸   r¹   r   r   r   r¼   ª  r   zgzip, chunkedT)re   r®   rd   c                 S   s   g | ]}|  ¡ ‘qS r   r¸   r¹   r   r   r   r¼   ¶  r   )r   r]   r	   r^   r`   r¯   r°   r   ÚassertNotInÚkeysra   r²   rQ   r±   ©r   rc   r³   re   rd   r   r   r   Útest_explicit_headers”  s<    

ÿ

þ

ýz*TransferEncodingTest.test_explicit_headersc                 C   sŠ   dD ]€}t  d¡}tdƒ|_| dd| j|d¡ |  |jj¡\}}}|  |¡}|  	|| j
¡ |  	|d d¡ |  d	d
d„ |D ƒ¡ qd S )N)FTr>   r   r[   r\   )Úempty_linesrµ   r¶   r·   c                 S   s   g | ]}|  ¡ ‘qS r   r¸   r¹   r   r   r   r¼   È  r   z5TransferEncodingTest.test_request.<locals>.<listcomp>)r   r]   r	   r^   r`   r¯   r°   r   r±   ra   r²   r¾   )r   rÂ   rc   r³   re   rd   r   r   r   Útest_requestº  s    

ÿ
z!TransferEncodingTest.test_requestc                 C   sl   t  d¡}tdƒ|_| ddd¡ |  |jj¡\}}}|  |d d¡ |  dd	d
„ |D ƒ¡ |  |d¡ d S )Nr>   r   r[   r\   r   rµ   r¶   r·   c                 S   s   g | ]}|  ¡ ‘qS r   r¸   r¹   r   r   r   r¼   Ñ  r   z8TransferEncodingTest.test_empty_body.<locals>.<listcomp>s   0

)	r   r]   r	   r^   r`   r°   r   ra   r¾   rÀ   r   r   r   Útest_empty_bodyÊ  s    

z$TransferEncodingTest.test_empty_bodyFc                 c   sV   | j  d¡}t|ƒD ]<\}}|r.|d r.dV  |t|ƒd k rJ|d V  q|V  qd S )Nó    r¡   r   r   )r²   rO   Ú	enumeraterP   )r   rÂ   r§   ÚidxÚliner   r   r   r¯   Ô  s    zTransferEncodingTest._make_bodyc                 C   sŽ   |  d¡}|d }i }d}|t|ƒk rrt|| ƒdkrr||   d¡\}}| d¡ ¡ }| d¡ ¡ ||< |d7 }q||d ||d d … ¡fS )Nó   
r   r   rN   r½   )rO   rP   rQ   rh   r”   )r   r   r§   r`   re   r:   Úkeyr…   r   r   r   r°   ß  s    

z#TransferEncodingTest._parse_requestc                 C   s‚   g }i }d}|  d¡}|||d … \}}t|dƒ}|dkrF|d7 }qx|  |t|ƒ¡ | |¡ |d7 }|t|ƒkrqxqd |¡S )Nr   rÉ   r¡   é   r   r   )rO   Úintra   rP   rU   r”   )r   r   rd   Útrailersr:   r§   ÚsizeÚchunkr   r   r   r±   ì  s    


z#TransferEncodingTest._parse_chunkedN)F)r+   r,   r-   r²   r´   rÁ   rÃ   rÄ   r¯   r°   r±   r   r   r   r   r­   ‡  s   
&

r­   c                   @   sŒ  e Z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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'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*dQdR„ Z+dSdT„ Z,dUdV„ Z-dWdX„ Z.dYdZ„ Z/d[d\„ Z0d]d^„ Z1d_d`„ Z2daS )bÚ	BasicTestc                 C   s"   |   h d£tttdƒƒƒk¡ d S )N>   r)   ÚdescriptionrŸ   Úphraseé”  )r€   ÚsetÚdirr   r&   r   r   r   Ú&test_dir_with_added_behavior_on_status  s    z0BasicTest.test_dir_with_added_behavior_on_statusc                 C   s²   d}t |ƒ}t |¡}| ¡  |  | d¡d¡ |  | ¡ ¡ |  |j¡ |  | ¡ d¡ |  	| ¡ ¡ |  |j¡ | 
¡  |  	|j¡ d}t |ƒ}t |¡}|  tj|j¡ d S )NúHTTP/1.1 200 Ok

Textr   r   s   TextzHTTP/1.1 400.100 Not Ok

Text)r	   r   r†   r‡   ra   r8   ÚassertFalseÚisclosedÚclosedr€   r"   ÚassertRaisesÚBadStatusLiner‰   r   r   r   Útest_status_lines  s     

zBasicTest.test_status_linesc                 C   s   t  d¡}|  t|ƒd¡ d S )Nrj   zBadStatusLine("''"))r   rÜ   ra   Úrepr)r   Úexcr   r   r   Útest_bad_status_repr!  s    
zBasicTest.test_bad_status_reprc                 C   s‚   d}t |ƒ}t |¡}| ¡  |  | d¡d¡ |  | ¡ ¡ |  | d¡d¡ |  | ¡ ¡ |  |j	¡ | 
¡  |  |j	¡ d S ©Nz*HTTP/1.1 200 Ok
Content-Length: 4

Textr¡   ó   Teó   xt©r	   r   r†   r‡   ra   r8   rØ   rÙ   r€   rÚ   r"   r‰   r   r   r   Útest_partial_reads%  s    
zBasicTest.test_partial_readsc                 C   s~   d}t |ƒ}t |¡}| ¡  |  | ¡ d¡ |  | ¡ ¡ |  | ¡ d¡ |  	| ¡ ¡ |  |j
¡ | ¡  |  	|j
¡ d S )Nz4HTTP/1.1 200 Ok
Content-Length: 13

Text
Anothers   Text
s   Another)r	   r   r†   r‡   ra   r;   rØ   rÙ   r8   r€   rÚ   r"   r‰   r   r   r   Útest_mixed_reads4  s    
zBasicTest.test_mixed_readsc                 C   s²   d}t |ƒ}t |¡}| ¡  tdƒ}| |¡}|  |d¡ |  t|ƒd¡ |  | 	¡ ¡ | |¡}|  |d¡ |  t|ƒd¡ |  
| 	¡ ¡ |  |j¡ | ¡  |  
|j¡ d S rá   ©r	   r   r†   r‡   Ú	bytearrayÚreadintora   r‘   rØ   rÙ   r€   rÚ   r"   ©r   rd   r^   rŠ   Úbr:   r   r   r   Útest_partial_readintosC  s     


z BasicTest.test_partial_readintosc                 C   s”   d}t |ƒ}t |¡}| ¡  |  | d¡d¡ |  | ¡ ¡ |  | d¡d¡ |  | d¡d¡ |  | ¡ ¡ |  |j	¡ | 
¡  |  |j	¡ d S )Nr×   r¡   râ   rã   r   r   rä   r‰   r   r   r   Ú$test_partial_reads_no_content_lengthW  s    
z.BasicTest.test_partial_reads_no_content_lengthc                 C   s¨   d}t |ƒ}t |¡}| ¡  tdƒ}| |¡}|  |d¡ |  t|ƒd¡ |  | 	¡ ¡ | |¡}|  |d¡ |  t|ƒd¡ | |¡}|  |d¡ |  
| 	¡ ¡ d S )Nr×   r¡   râ   rã   r   )r	   r   r†   r‡   rè   ré   ra   r‘   rØ   rÙ   r€   rê   r   r   r   Ú(test_partial_readintos_no_content_lengthg  s    



z2BasicTest.test_partial_readintos_no_content_lengthc                 C   st   d}t |ƒ}t |¡}| ¡  |  | d¡d¡ |  | ¡ ¡ |  | d¡d¡ |  | d¡d¡ |  | ¡ ¡ d S )Nú+HTTP/1.1 200 Ok
Content-Length: 10

Textr¡   râ   rã   r   r   )	r	   r   r†   r‡   ra   r8   rØ   rÙ   r€   r‰   r   r   r   Ú"test_partial_reads_incomplete_bodyz  s    
z,BasicTest.test_partial_reads_incomplete_bodyc                 C   sÈ   d}t |ƒ}t |¡}| ¡  tdƒ}| |¡}|  |d¡ |  t|ƒd¡ |  | 	¡ ¡ | |¡}|  |d¡ |  t|ƒd¡ | |¡}|  |d¡ |  
| 	¡ ¡ |  |j¡ | ¡  |  
|j¡ d S )Nrï   r¡   râ   rã   r   rç   rê   r   r   r   Ú&test_partial_readintos_incomplete_body‡  s$    



z0BasicTest.test_partial_readintos_incomplete_bodyc                 C   sV   dD ]}|   tjtj|¡ qdD ]0\}}}t |¡}|  ||j¡ |  ||j¡ q d S )N©zwww.python.org:abczuser:password@www.python.org)©z[fe80::207:e9ff:fe9b]:8000úfe80::207:e9ff:fe9bi@  )zwww.python.org:80úwww.python.orgéP   )úwww.python.org:rõ   rö   )rõ   rõ   rö   )ú[fe80::207:e9ff:fe9b]rô   rö   )ú[fe80::207:e9ff:fe9b]:rô   rö   )rÛ   r   Ú
InvalidURLr]   ra   r   r   ©r   ZhpÚhÚpÚcr   r   r   Útest_host_port  s    
zBasicTest.test_host_portc                 C   s<   d}d}t |ƒ}t |¡}| ¡  | d¡}|  ||¡ d S )Nz¨HTTP/1.1 200 OK
Set-Cookie: Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"
Set-Cookie: Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"

No body
zrCustomer="WILE_E_COYOTE"; Version="1"; Path="/acme", Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"z
Set-Cookie)r	   r   r†   r‡   rˆ   ra   )r   r   ZhdrÚsr   Zcookiesr   r   r   Útest_response_headers®  s    

zBasicTest.test_response_headersc                 C   s6   t dtƒ}tj|dd}| ¡  | ¡ r2|  d¡ d S )Nú*HTTP/1.1 200 OK
Content-Length: 14432

ro   ©rv   ú)Did not expect response from HEAD request)r	   r5   r   r†   r‡   r8   Úfail©r   r^   rŠ   r   r   r   Útest_read_headÀ  s    üzBasicTest.test_read_headc                 C   sT   t dtƒ}tj|dd}| ¡  tdƒ}| |¡dkr@|  d¡ |  t	|ƒd¡ d S )Nr  ro   r  é   r   r  ó        )
r	   r5   r   r†   r‡   rè   ré   r  ra   r‘   )r   r^   rŠ   rë   r   r   r   Útest_readinto_headÍ  s    ü
zBasicTest.test_readinto_headc                 C   sR   d  dd„ ttjd ƒD ƒ¡d }d| }t|ƒ}t |¡}|  tjd|j¡ d S )Nr   c                 s   s   | ]}d | V  qdS )zHeader%d: fooNr   )rº   Úir   r   r   Ú	<genexpr>Ý  s   ÿz2BasicTest.test_too_many_headers.<locals>.<genexpr>r   zHTTP/1.1 200 OK
zgot more than \d+ headers)	r”   r’   r   Z_MAXHEADERSr	   r†   rœ   ÚHTTPExceptionr‡   )r   re   r   r   r   r   r   r   Útest_too_many_headersÜ  s    
ÿÿ
ÿzBasicTest.test_too_many_headersc              	   C   s‚   d}t tdƒ`}t d¡}t|ƒ}||_| dd|¡ |  |j 	|¡d|jd t
|ƒ… |f ¡ W d   ƒ n1 st0    Y  d S )Ns_   GET /foo HTTP/1.1
Host: example.com
Accept-Encoding: identity
Transfer-Encoding: chunked

r   r>   rm   r   z%r != %r)ÚopenÚ__file__r   r]   r	   r^   r`   r€   r   r   rP   ©r   rƒ   rd   rc   r^   r   r   r   Útest_send_fileå  s    
ÿzBasicTest.test_send_filec                 C   s‚   d}t  d¡}td ƒ}||_| |¡ |  ||j¡ d|_| t d|¡¡ |  ||j¡ d|_| t 	|¡¡ |  ||j¡ d S )Ns"   this is a test this is only a testr>   r   rë   )
r   r]   r	   r^   Úsendra   r   Úarrayr.   r/   r‚   r   r   r   Ú	test_sendó  s    

zBasicTest.test_sendc                    sX   dd„ ‰ G ‡ fdd„dt jƒ}d}t d¡}tdƒ}||_| |ƒ ¡ |  |j|¡ d S )Nc                   s   s   dV  d V  dV  d S )Nr   Zdata_twor   r   r   r   r   r     s    z/BasicTest.test_send_updating_file.<locals>.datac                       s    e Zd ZdZ” ƒ Zddd„ZdS )z7BasicTest.test_send_updating_file.<locals>.UpdatingFiler   r6   c                 S   s
   t | jƒS r'   )ÚnextÚd)r   Ú	blocksizer   r   r   r8   
  s    z<BasicTest.test_send_updating_file.<locals>.UpdatingFile.readN)r6   )r+   r,   r-   r#   r  r8   r   ©r   r   r   ÚUpdatingFile  s   r  s   datar>   rj   )	r.   Ú
TextIOBaser   r]   r	   r^   r  ra   r   )r   r  rƒ   rc   r^   r   r  r   Útest_send_updating_file  s    
z!BasicTest.test_send_updating_filec                 C   sL   d}dd„ }t  d¡}tdƒ}||_| dd|ƒ dd	i¡ |  |j|¡ d S )
Nsb   GET /foo HTTP/1.1
Host: example.com
Accept-Encoding: identity
Content-Length: 11

onetwothreec                   s   s   dV  dV  dV  d S )Ns   ones   twos   threer   r   r   r   r   rd     s    z&BasicTest.test_send_iter.<locals>.bodyr>   rj   rm   r   r   Z11)r   r]   r	   r^   r`   ra   r   r  r   r   r   Útest_send_iter  s    
zBasicTest.test_send_iterc                 C   sv   d}t jd|d}td ƒ}||_d| d }| ddt |¡dd	i¡ |  |jd
¡ |j	 
dd¡d }|  ||¡ d S )Né   r>   ©r  ó   aó   brk   r\   r   Ú9r¢   ó   

r   )r   r]   r	   r^   r`   r.   r/   ra   r   r   rO   )r   r  rc   r^   rƒ   rd   r   r   r   Útest_blocksize_request&  s    z BasicTest.test_blocksize_requestc                 C   s\   d}t jd|d}td ƒ}||_d| d }| t |¡¡ |  |jd¡ |  |j	|¡ d S )Nr  r>   r  r   r!  r¡   )
r   r]   r	   r^   r  r.   r/   ra   r   r   )r   r  rc   r^   rƒ   r   r   r   Útest_blocksize_send2  s    zBasicTest.test_blocksize_sendc                 C   sP   t  d¡}tdƒ|_|  t¡ | dd|¡ W d   ƒ n1 sB0    Y  d S )Nr>   rj   r[   Útest)r   r]   r	   r^   rÛ   Ú	TypeErrorr`   r}   r   r   r   Útest_send_type_error=  s    

zBasicTest.test_send_type_errorc                 C   sf  t }ttt t ƒ}tj|dd}| ¡  |  | 	¡ |¡ | 
¡  tddƒD ]V}ttt t ƒ}tj|dd}| ¡  |  | 	|¡| 	|¡ | 	¡  |¡ | 
¡  qLdD ]¸}tt| ƒ}tj|dd}| ¡  z†z| 	¡  W nb tjy> } zF|  |j|¡ dt|ƒ }|  t|ƒ|¡ |  t|ƒ|¡ W Y d }~nd }~0 0 |  d¡ W | 
¡  q¨| 
¡  0 q¨d S )Nrm   r  r   é   ©rj   zfoo
úIncompleteRead(%d bytes read)úIncompleteRead expected)Úchunked_expectedr	   Úchunked_startÚ
last_chunkÚchunked_endr   r†   r‡   ra   r8   r"   r’   ÚIncompleteReadÚpartialrP   rÞ   r   r  )r   rƒ   r^   rŠ   r:   Úxr  Úexpected_messager   r   r   Útest_chunkedD  s2    $
&zBasicTest.test_chunkedc                 C   sÚ  t }t|ƒ}tdƒ}ttt t ƒ}tj|dd}| 	¡  | 
|¡}|  |d |… |¡ |  ||¡ | ¡  tddƒD ]œ}ttt t ƒ}tj|dd}| 	¡  t|ƒ}| 
|d|… ¡}|| 
|||| … ¡7 }|| 
||d … ¡7 }|  |d |… |¡ |  ||¡ | ¡  qvdD ]¼}	tt|	 ƒ}tj|dd}| 	¡  zˆz| 
|¡}W nb tjy° } zF|  |j|¡ dt|ƒ }
|  t|ƒ|
¡ |  t|ƒ|
¡ W Y d }~nd }~0 0 |  d	¡ W | ¡  n
| ¡  0 qd S )
NrŽ   rm   r  r   r)  r   r*  r+  r,  )r-  rP   rè   r	   r.  r/  r0  r   r†   r‡   ré   ra   r"   r’   Ú
memoryviewr1  r2  rÞ   r   r  )r   rƒ   Z	nexpectedrë   r^   rŠ   r:   Úmr  r3  r4  r   r   r   Útest_readinto_chunkedd  sD    

&zBasicTest.test_readinto_chunkedc                 C   sˆ   d}t |t t ƒ}tj|dd}| ¡  |  | ¡ d¡ |  |jd¡ |  |j	d¡ |  
| ¡ ¡ |  |j¡ | ¡  |  
|j¡ d S )NúEHTTP/1.1 200 OK
Transfer-Encoding: chunked

a
hello world
1
d
ro   r  r   éÈ   ÚOK)r	   r/  r0  r   r†   r‡   ra   r8   ÚstatusÚreasonr€   rÙ   rØ   rÚ   r"   )r   r.  r^   rŠ   r   r   r   Útest_chunked_head  s    ÿzBasicTest.test_chunked_headc                 C   s¦   d}t |t t ƒ}tj|dd}| ¡  tdƒ}| |¡}|  |d¡ |  t	|ƒd¡ |  |j
d¡ |  |jd¡ |  | ¡ ¡ |  |j¡ | ¡  |  |j¡ d S )	Nr9  ro   r  r  r   r	  r:  r;  )r	   r/  r0  r   r†   r‡   rè   ré   ra   r‘   r<  r=  r€   rÙ   rØ   rÚ   r"   )r   r.  r^   rŠ   rë   r:   r   r   r   Útest_readinto_chunked_head£  s    ÿ
z$BasicTest.test_readinto_chunked_headc                 C   s@   t dƒ}tj|dd}| ¡  |  | ¡ d¡ |  | ¡ ¡ d S )Nz.HTTP/1.1 200 OK
Content-Length: -1

Hello
rm   r  ó   Hello
)r	   r   r†   r‡   ra   r8   r€   rÙ   r  r   r   r   Útest_negative_content_lengthº  s    ÿz&BasicTest.test_negative_content_lengthc              
   C   sœ   t dƒ}tj|dd}| ¡  z| ¡  W nb tjyŒ } zH|  |jd¡ |  t|ƒd¡ |  t	|ƒd¡ |  
| ¡ ¡ W Y d }~nd }~0 0 |  d¡ d S )Nz.HTTP/1.1 200 OK
Content-Length: 10

Hello
rm   r  r@  z-IncompleteRead(7 bytes read, 3 more expected)r,  )r	   r   r†   r‡   r8   r1  ra   r2  rÞ   r   r€   rÙ   r  )r   r^   rŠ   r  r   r   r   Útest_incomplete_readÂ  s    
ÿ
ÿ$zBasicTest.test_incomplete_readc                    sZ   t ddƒ}t d¡‰ |ˆ _|  t‡ fdd„¡ ˆ  ¡ }|  d|j¡ |  d| 	d¡¡ d S )	NzgHTTP/1.0 401 Authorization Required
Content-type: text/html
WWW-Authenticate: Basic realm="example"
s   Content-Lengthr>   c                      s   ˆ   ddd¡S )Nrk   ú/urlrd   )r`   r   ©rc   r   r   Ú<lambda>Û  r   z&BasicTest.test_epipe.<locals>.<lambda>i‘  zBasic realm="example"zwww-authenticate)
r0   r   r]   r^   rÛ   r2   Úgetresponsera   r<  rˆ   r  r   rD  r   Ú
test_epipeÒ  s    ü

ÿÿzBasicTest.test_epipec                 C   s8   ddd  d }t  t|ƒ¡}|  t jt jf|j¡ d S )NúHTTP/1.1 200 Okr»   é   r   )r   r†   r	   rÛ   ÚLineTooLongrÜ   r‡   ©r   rd   rŠ   r   r   r   Útest_overflowing_status_lineã  s    z&BasicTest.test_overflowing_status_linec                 C   s2   ddd  d }t  t|ƒ¡}|  t j|j¡ d S )NzHTTP/1.1 200 OK
X-Foo: barr   rI  z

)r   r†   r	   rÛ   rJ  r‡   rK  r   r   r   Útest_overflowing_header_lineè  s    ÿÿÿz&BasicTest.test_overflowing_header_linec                 C   sr   dd }t  t|ƒ¡}|  t j¡}| ¡  W d   ƒ n1 s@0    Y  |  dt|jƒ¡ |  dt|jƒ¡ d S )NzHTTP/1.1 100 OK
r
i €  zgot more than re   )	r   r†   r	   rÛ   r  r‡   r|   r   Ú	exception)r   rd   rŠ   Úcmr   r   r   Ú'test_overflowing_header_limit_after_100ð  s    ÿÿ&z1BasicTest.test_overflowing_header_limit_after_100c                 C   s:   ddd  d }t  t|ƒ¡}| ¡  |  t j|j¡ d S )Nz/HTTP/1.1 200 OK
Transfer-Encoding: chunked

r   rI  za
hello world
0

)r   r†   r	   r‡   rÛ   rJ  r8   rK  r   r   r   Útest_overflowing_chunked_lineý  s    þþÿz'BasicTest.test_overflowing_chunked_linec                 C   s`   d}t |ƒ}t |¡}| ¡  |  | ¡ d¡ |  | ¡ ¡ |  |j	¡ | 
¡  |  |j	¡ d S )NrH  r   )r	   r   r†   r‡   ra   r8   r€   rÙ   rØ   rÚ   r"   r‰   r   r   r   Útest_early_eof
  s    
zBasicTest.test_early_eofc                    sn   t  d¡}d ‰ G ‡ fdd„dt jƒ}||_tdƒ|_| dd¡ |  t j|j	¡ |  
ˆ j¡ |  
|jj¡ d S )Nr>   c                       s   e Zd Z‡ fdd„ZdS )z+BasicTest.test_error_leak.<locals>.Responsec                    s"   | ‰ t jj| g|¢R i |¤Ž d S r'   )r   r†   r   rH   ©Úresponser   r   r     s    z4BasicTest.test_error_leak.<locals>.Response.__init__N)r+   r,   r-   r   r   rS  r   r   ÚResponse  s   rU  zInvalid status linerm   r\   )r   r]   r†   Zresponse_classr	   r^   r`   rÛ   rÜ   rF  r€   rÚ   r   )r   rc   rU  r   rS  r   Útest_error_leak  s    

zBasicTest.test_error_leakc                 C   sR   d}t d }tt| t t ƒ}tj|dd}| ¡  |  | 	¡ |¡ | 
¡  d S )Nz3;foo=bar
abc
s   abcrm   r  )r-  r	   r.  Úlast_chunk_extendedr0  r   r†   r‡   ra   r8   r"   )r   Úextrarƒ   r^   rŠ   r   r   r   Útest_chunked_extension&  s    z BasicTest.test_chunked_extensionc                 C   sB   t }ttt ƒ}tj|dd}| ¡  |  | ¡ |¡ | 	¡  d S ©Nrm   r  )
r-  r	   r.  r/  r   r†   r‡   ra   r8   r"   ©r   rƒ   r^   rŠ   r   r   r   Útest_chunked_missing_end0  s    z"BasicTest.test_chunked_missing_endc                 C   s\   t }ttt t t ƒ}tj|dd}| ¡  |  	| 
¡ |¡ |  	|j 
¡ d¡ | ¡  d S )Nrm   r  r   )r-  r	   r.  r/  rÍ   r0  r   r†   r‡   ra   r8   r    r"   r[  r   r   r   Útest_chunked_trailers9  s    zBasicTest.test_chunked_trailersc                 C   sj   t }d}ttt t t | ƒ}tj|dd}| ¡  |  	| 
¡ |¡ |  	|j 
¡ | d¡¡ | ¡  d S )NÚ	extradatarm   r  r
   )r-  r	   r.  r/  rÍ   r0  r   r†   r‡   ra   r8   r    r   r"   )r   rƒ   r^  r^   rŠ   r   r   r   Útest_chunked_syncD  s    zBasicTest.test_chunked_syncc                 C   s\   d}d}t d| | ƒ}tj|dd}| ¡  |  | ¡ |¡ |  |j ¡ |¡ | ¡  d S )Nó	   extradataó
   Hello123
ó'   HTTP/1.1 200 OK
Content-Length: 10

rm   r  )r	   r   r†   r‡   ra   r8   r    r"   ©r   r^  rƒ   r^   rŠ   r   r   r   Útest_content_length_syncP  s    z"BasicTest.test_content_length_syncc                 C   s`   d}d}t d| | ƒ}tj|dd}| ¡  |  | d¡|g¡ |  |j ¡ |¡ | ¡  d S ©Nr`  ra  rb  rm   r  iÐ  )	r	   r   r†   r‡   ra   Ú	readlinesr    r8   r"   rc  r   r   r   Útest_readlines_content_length\  s    z'BasicTest.test_readlines_content_lengthc                 C   s^   d}d}t d| | ƒ}tj|dd}| ¡  |  | d¡|¡ |  |j ¡ |¡ | ¡  d S re  )	r	   r   r†   r‡   ra   Úread1r    r8   r"   rc  r   r   r   Útest_read1_content_lengthg  s    z#BasicTest.test_read1_content_lengthc                 C   sp   d}d}t d| | ƒ}tj|dd}| ¡  |  | d¡|¡ |  | d¡d¡ |  |j ¡ |¡ | ¡  d S )Nr`  ra  rb  rm   r  é
   r   )	r	   r   r†   r‡   ra   r;   r    r8   r"   rc  r   r   r   Ú"test_readline_bound_content_lengthr  s    z,BasicTest.test_readline_bound_content_lengthc                 C   sv   d}d}t d|d  | ƒ}tj|dd}| ¡  |  | d¡|d ¡ |  | ¡ |¡ |  |j ¡ |¡ | ¡  d S )	Nr`  ra  s'   HTTP/1.1 200 OK
Content-Length: 30

r¢   rm   r  é   r¡   )	r	   r   r†   r‡   ra   rh  r8   r    r"   rc  r   r   r   Útest_read1_bound_content_length~  s    z)BasicTest.test_read1_bound_content_lengthc                    sö   t  tdf¡‰|  ˆj¡ d ‰ ‡ ‡fdd„}tj|d}| ¡  |  |jt	dƒ¡ t
jˆ ¡ Ž }| dd¡ | ¡ }zV|  |jt
j¡ t j | ¡ d}z| d	¡ W | ¡  n
| ¡  0 W | ¡  | ¡  n| ¡  | ¡  0 | ¡  |  ˆ d	¡ d S )
Nr   c               	      s†   ˆ  ¡ \} }| b |  d¡8}| ¡ }| d¡sq4q|  d¡ | ¡ ‰ W d   ƒ n1 sZ0    Y  W d   ƒ n1 sx0    Y  d S )Nr   rÉ   s'   HTTP/1.1 200 Connection established

)Úacceptr%   r;   Úrstripr   r8   )rc   ÚaddressÚreaderrÈ   ©ÚresultÚservr   r   Ú
run_server  s    

z2BasicTest.test_response_fileno.<locals>.run_server)Útargetr   rn   z
dummy:1234)Úfilenos   proxied data
)ÚsocketÚcreate_serverÚHOSTÚ
addCleanupr"   Ú	threadingÚThreadÚstartr”   Úfloatr   r]   Úgetsocknamer`   rF  ra   r<  r;  rw  r   Údetach)r   ru  Úthreadrc   rT  r   r   rr  r   Útest_response_filenoŠ  s,    
ÿ
zBasicTest.test_response_filenoc                 C   s4   G dd„ dt jƒ}|dƒ}tdƒ|_| dd¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )zRBasicTest.test_putrequest_override_domain_validation.<locals>.UnsafeHTTPConnectionc                 S   s   d S r'   r   ©r   rª   r   r   r   Ú_validate_pathµ  s    zaBasicTest.test_putrequest_override_domain_validation.<locals>.UnsafeHTTPConnection._validate_pathN)r+   r,   r-   r…  r   r   r   r   ÚUnsafeHTTPConnection´  s   r†  r>   rj   rm   z/ ©r   r]   r	   r^   rz   ©r   r†  rc   r   r   r   Ú*test_putrequest_override_domain_validation¯  s    
z4BasicTest.test_putrequest_override_domain_validationc                 C   s8   G dd„ dt jƒ}|dƒ}tdƒ|_|jdddd d S )	Nc                   @   s   e Zd Zdd„ ZdS )zPBasicTest.test_putrequest_override_host_validation.<locals>.UnsafeHTTPConnectionc                 S   s   d S r'   r   r„  r   r   r   Ú_validate_host¾  s    z_BasicTest.test_putrequest_override_host_validation.<locals>.UnsafeHTTPConnection._validate_hostN)r+   r,   r-   rŠ  r   r   r   r   r†  ½  s   r†  zexample.com
rj   rm   r\   r   )Z	skip_hostr‡  rˆ  r   r   r   Ú(test_putrequest_override_host_validation¼  s    
z2BasicTest.test_putrequest_override_host_validationc                 C   s4   G dd„ dt jƒ}|dƒ}tdƒ|_| dd¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )zIBasicTest.test_putrequest_override_encoding.<locals>.UnsafeHTTPConnectionc                 S   s
   |  d¡S )Nzutf-8)r   )r   Zstr_urlr   r   r   Ú_encode_requestÎ  s    zYBasicTest.test_putrequest_override_encoding.<locals>.UnsafeHTTPConnection._encode_requestN)r+   r,   r-   rŒ  r   r   r   r   r†  Í  s   r†  r>   rj   rm   u   /â˜ƒr‡  rˆ  r   r   r   Ú!test_putrequest_override_encodingÇ  s    
z+BasicTest.test_putrequest_override_encodingN)3r+   r,   r-   rÖ   rÝ   rà   rå   ræ   rì   rí   rî   rð   rñ   rÿ   r  r  r
  r  r  r  r  r  r$  r%  r(  r5  r8  r>  r?  rA  rB  rG  rL  rM  rP  rQ  rR  rV  rY  r\  r]  r_  rd  rg  ri  rk  rm  rƒ  r‰  r‹  r  r   r   r   r   rÐ     s`   	 +
	%rÐ   c                   @   st   e Zd ZdZee d¡d…  d¡Z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S )ÚExtendedReadTestzOHTTP/1.1 200 OK

hello world!
and now 
for something completely different
fooZhelloNr
   úŠHTTP/1.1 200 OK
Transfer-Encoding: chunked

a
hello worl
3
d!

9
and now 

23
for something completely different

3
foo
0

c                 C   s8   t | jƒ}tj|dd}| ¡  t |j¡|_|| _d S rZ  )	r	   r§   r   r†   r‡   r.   ÚBufferedReaderÚfprŠ   r  r   r   r   ÚsetUpô  s
    
zExtendedReadTest.setUpc                    sÊ   | j }|jj‰ d‡ fdd„	}||j_g }| d¡}|rŽ|  t|ƒd¡ | ¡ }|  t|ƒt|ƒ¡ |  | |¡¡ | t|ƒ¡}|  	||¡ n| ¡ }|  
|¡ | |¡ |s(q²q(|  	d |¡| j¡ d S )Nr6   c                    s(   ˆ | ƒ}| dkr|d | … S |d d… S )Nr   rj  r   )r:   rý   ©Zoldpeekr   r   Úmypeek  s    z*ExtendedReadTest.test_peek.<locals>.mypeekr¢   r   r   )r6   )rŠ   r‘  ÚpeekÚassertGreaterrP   ZassertGreaterEqualr€   r   r8   ra   rØ   rU   r”   Úlines_expected)r   rŠ   r”  Úallrý   Zp2r  r   r“  r   Ú	test_peeký  s&    


zExtendedReadTest.test_peekc                 C   s   | j }|  | j j| j¡ d S r'   )rŠ   Ú_verify_readliner;   r—  )r   rŠ   r   r   r   Útest_readline  s    zExtendedReadTest.test_readlinec                 C   s\   g }|dƒ}|r4|dkr4t |ƒdk r4|  | d¡¡ | |¡ |sqFq|  d |¡|¡ d S )Nr  ó   fooó   
r   )rP   r€   r—   rU   ra   r”   )r   r;   rƒ   r˜  rÈ   r   r   r   rš     s    
z!ExtendedReadTest._verify_readlinec                    s0   ˆj ‰ ‡ ‡fdd„}t|ƒ}ˆ |jˆj¡ d S )Nc                     s   ˆ   d¡} ˆ t| ƒd¡ | S )Né   )rh  ÚassertLessEqualrP   )Úres©rŠ   r   r   r   r   /  s    
z&ExtendedReadTest.test_read1.<locals>.r)rŠ   Ú	Readlinerrš  r;   r—  )r   r   Z	readlinerr   r¡  r   Ú
test_read1-  s    zExtendedReadTest.test_read1c                 C   s<   | j }g }| ¡ }|sq$| |¡ q
|  d |¡| j¡ d S ©Nr   )rŠ   rh  rU   ra   r”   r—  ©r   rŠ   r˜  r   r   r   r   Útest_read1_unbounded6  s    z%ExtendedReadTest.test_read1_unboundedc                 C   sN   | j }g }| d¡}|sq6|  t|ƒd¡ | |¡ q
|  d |¡| j¡ d S )Nrj  r   )rŠ   rh  rŸ  rP   rU   ra   r”   r—  r¥  r   r   r   Útest_read1_bounded@  s    
z#ExtendedReadTest.test_read1_boundedc                 C   s   |   | j d¡d¡ d S )Nr   r   )ra   rŠ   rh  r&   r   r   r   Útest_read1_0K  s    zExtendedReadTest.test_read1_0c                 C   s    | j  d¡}|  dt|ƒ¡ d S ©Nr   )rŠ   r•  rŸ  rP   )r   rý   r   r   r   Útest_peek_0N  s    zExtendedReadTest.test_peek_0)r+   r,   r-   r§   Úfindr   r—  Zlines_chunkedr’  r™  r›  rš  r£  r¦  r§  r¨  rª  r   r   r   r   rŽ  Ö  s   ÿÿ		
rŽ  c                   @   s   e Zd ZdZdS )ÚExtendedReadTestChunkedr  N)r+   r,   r-   r§   r   r   r   r   r¬  S  s   ÿr¬  c                   @   s   e Zd Zdd„ Zdd„ ZdS )r¢  c                 C   s   || _ d| _d S r¤  )ÚreadfuncÚ	remainder)r   r­  r   r   r   r   m  s    zReadliner.__init__c                 C   s°   g }d}| j }z‚| d¡}|dkr$q^|t|ƒ |kr@|| d }| |¡ |  ¡ }|sd}q^q|d7 }| |d |… ¡ ||d … | _ d |¡W S    d |¡| _ ‚ Y n0 d S )Nr   r  r6   r   r   )r®  r«  rP   rU   r­  r”   )r   Úlimitr   Zdatalenr8   rÇ   r   r   r   r;   q  s*    

zReadliner.readlineN)r+   r,   r-   r   r;   r   r   r   r   r¢  i  s   r¢  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚOfflineTestc                 C   sf   dh}ddh}t tƒD ]<}| d¡s||v r.qtt|ƒ}t|dd ƒdkr| |¡ q|  tj|¡ d S )NÚ	responsesZHTTPMessageÚparse_headersr³   r,   zhttp.client)rÕ   r   r   ÚgetattrÚaddZassertCountEqualÚ__all__)r   rƒ   Z	blacklistrŸ   Zmodule_objectr   r   r   Útest_allŒ  s    
zOfflineTest.test_allc                 C   s   |   tjtj d¡ d S )Nz	Not Found)ra   r   r±  Ú	NOT_FOUNDr&   r   r   r   Útest_responsesš  s    zOfflineTest.test_responsesc              	   C   sR   g d¢}|D ]@}| j |d  |  tt|ƒ¡ W d   ƒ q1 sB0    Y  qd S )N):ZCONTINUEZSWITCHING_PROTOCOLSZ
PROCESSINGr;  ZCREATEDZACCEPTEDZNON_AUTHORITATIVE_INFORMATIONZ
NO_CONTENTZRESET_CONTENTZPARTIAL_CONTENTZMULTI_STATUSZIM_USEDZMULTIPLE_CHOICESZMOVED_PERMANENTLYZFOUNDZ	SEE_OTHERZNOT_MODIFIEDZ	USE_PROXYZTEMPORARY_REDIRECTZBAD_REQUESTZUNAUTHORIZEDZPAYMENT_REQUIREDZ	FORBIDDENr·  ZMETHOD_NOT_ALLOWEDZNOT_ACCEPTABLEZPROXY_AUTHENTICATION_REQUIREDZREQUEST_TIMEOUTZCONFLICTZGONEZLENGTH_REQUIREDZPRECONDITION_FAILEDZREQUEST_ENTITY_TOO_LARGEZREQUEST_URI_TOO_LONGZUNSUPPORTED_MEDIA_TYPEZREQUESTED_RANGE_NOT_SATISFIABLEZEXPECTATION_FAILEDZIM_A_TEAPOTZMISDIRECTED_REQUESTZUNPROCESSABLE_ENTITYZLOCKEDZFAILED_DEPENDENCYZUPGRADE_REQUIREDZPRECONDITION_REQUIREDZTOO_MANY_REQUESTSZREQUEST_HEADER_FIELDS_TOO_LARGEZUNAVAILABLE_FOR_LEGAL_REASONSZINTERNAL_SERVER_ERRORZNOT_IMPLEMENTEDZBAD_GATEWAYZSERVICE_UNAVAILABLEZGATEWAY_TIMEOUTZHTTP_VERSION_NOT_SUPPORTEDZINSUFFICIENT_STORAGEZNOT_EXTENDEDZNETWORK_AUTHENTICATION_REQUIREDZEARLY_HINTSZ	TOO_EARLY)Zconstant)r›   r€   Úhasattrr   )r   rƒ   Úconstr   r   r   Útest_client_constants  s    <z!OfflineTest.test_client_constantsN)r+   r,   r-   r¶  r¸  r»  r   r   r   r   r°  ‹  s   r°  c                   @   s@   e Zd Zdd„ Zdd„ Zdd„ Ze ee	dƒ d¡d	d
„ ƒZ
dS )ÚSourceAddressTestc                 C   s>   t   t jt j¡| _t | j¡| _t ¡ | _| j 	¡  d | _
d S r'   )rx  ÚAF_INETÚSOCK_STREAMrt  r   Ú	bind_portr   Zfind_unused_portÚsource_portÚlistenrc   r&   r   r   r   r’  á  s
    

zSourceAddressTest.setUpc                 C   s*   | j r| j  ¡  d | _ | j ¡  d | _d S r'   )rc   r"   rt  r&   r   r   r   ÚtearDownè  s
    

zSourceAddressTest.tearDownc                 C   sB   t jt| jd| jfd| _| j ¡  |  | jj 	¡ d | j¡ d S )Nrj   ©Úsource_addressr   )
r   r]   rz  r   rÀ  rc   rG   ra   r^   r€  r&   r   r   r   ÚtestHTTPConnectionSourceAddressï  s
    
ÿ
z1SourceAddressTest.testHTTPConnectionSourceAddressÚHTTPSConnectionz'http.client.HTTPSConnection not definedc                 C   s   t jt| jd| jfd| _d S )Nrj   rÃ  )r   rÆ  rz  r   rÀ  rc   r&   r   r   r   Ú testHTTPSConnectionSourceAddressõ  s    
ÿz2SourceAddressTest.testHTTPSConnectionSourceAddressN)r+   r,   r-   r’  rÂ  rÅ  ÚunittestÚskipIfr¹  r   rÇ  r   r   r   r   r¼  à  s   ÿr¼  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )ÚTimeoutTestNc                 C   s.   t   t jt j¡| _t | j¡t_| j ¡  d S r'   )	rx  r½  r¾  rt  r   r¿  rÊ  ÚPORTrÁ  r&   r   r   r   r’    s    zTimeoutTest.setUpc                 C   s   | j  ¡  d | _ d S r'   )rt  r"   r&   r   r   r   rÂ    s    
zTimeoutTest.tearDownc              	   C   s  |   t ¡ ¡ t d¡ z$t ttj¡}| 	¡  W t d ¡ nt d ¡ 0 |  
|j ¡ d¡ | ¡  |   t ¡ ¡ t d¡ z(tjttjd d}| 	¡  W t d ¡ nt d ¡ 0 |  
|j ¡ d ¡ | ¡  tjttjdd}| 	¡  |  
|j ¡ d¡ | ¡  d S ©Né   )Útimeout)ÚassertIsNonerx  ÚgetdefaulttimeoutÚsetdefaulttimeoutr   r]   rz  rÊ  rË  rG   ra   r^   Ú
gettimeoutr"   )r   ZhttpConnr   r   r   ÚtestTimeoutAttribute  s,    



ÿ
z TimeoutTest.testTimeoutAttribute)r+   r,   r-   rË  r’  rÂ  rÓ  r   r   r   r   rÊ  ÿ  s   rÊ  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚPersistenceTestc              
   C   sú   d}|D ]ì\}}}| j ||dÄ d ||¡}t|ƒ}|  |j¡ | dd¡ | ¡ ,}|  |jd u | ¡ | ¡  W d   ƒ n1 sˆ0    Y  |  |jd u | ¡ |  |j	d¡ | dd¡ |  |j	|rÐdnd¡ W d   ƒ q1 sê0    Y  qd S )	N))ú1.0rj   F)rÕ  zConnection: keep-alive
T)ú1.1rj   T)rÖ  zConnection: close
F)rÕ  zConnection: keep-ALIVE
T)rÖ  zConnection: cloSE
F)Úversionrb   z4HTTP/{} 200 OK
{}Content-Length: 12

Dummy body
rm   z/open-connectionr   z/subsequent-requestr¡   )
r›   rt   r=   rÏ  r^   r`   rF  ra   r8   r?   )r   Útestsr×  rb   Zreuser“   rc   rT  r   r   r   Útest_reuse_reconnect/  s"    ÿú
&z$PersistenceTest.test_reuse_reconnectc              	   C   s¤   dd„ }t jtjf|tff}|D ]~\}}| j|dZ td|ƒ}| dd¡ |  ||j	¡ |  
|j¡ | dd¡ |  |jd¡ W d   ƒ q 1 s”0    Y  q d S )	Nc                    s&   t  | ¡‰ ‡ fdd„}|ˆ _t  ˆ ¡S )Nc                    s    t j ˆ | ¡}|dkrtƒ ‚|S r©  )r.   r/   ré   ÚConnectionResetError)ÚbufferrÎ   ©Ústreamr   r   ré   R  s    zNPersistenceTest.test_disconnected.<locals>.make_reset_reader.<locals>.readinto)r.   r/   ré   r  )r   ré   r   rÜ  r   Úmake_reset_readerO  s    
z<PersistenceTest.test_disconnected.<locals>.make_reset_reader)rN  r   rm   z/eof-responseú
/reconnectr¡   )r.   r/   r   ÚRemoteDisconnectedrÚ  r›   r=   r`   rÛ   rF  rÏ  r^   ra   r?   )r   rÞ  rØ  Zstream_factoryrN  rc   r   r   r   Útest_disconnectedM  s    
þ
z!PersistenceTest.test_disconnectedc                 C   sV   t dƒ}|jddddid |  tj|j¡ |  |j¡ | dd¡ |  |j	d¡ d S )	Ns   HTTP/1.1 100 Continue

rm   r\   ZExpectz100-continue)re   rß  r¡   )
r=   r`   rÛ   r   rà  rF  rÏ  r^   ra   r?   r}   r   r   r   Útest_100_closeh  s    ÿzPersistenceTest.test_100_closeN)r+   r,   r-   rÙ  rá  râ  r   r   r   r   rÔ  -  s   rÔ  c                   @   sŽ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zej	dd„ ƒZ
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Ze eedƒ d¡dd„ ƒZdd„ ZdS )Ú	HTTPSTestc                 C   s   t tdƒs|  d¡ d S )NrÆ  zssl support required)r¹  r   ÚskipTestr&   r   r   r   r’  w  s    
zHTTPSTest.setUpc                 C   s   ddl m} || |dS )Nr   )Úmake_https_server)Úcertfile)Ztest.ssl_serversrå  )r   ræ  rå  r   r   r   Úmake_server{  s    zHTTPSTest.make_serverc                 C   s$   t jttjdd}|  |jd¡ d S rÌ  )r   rÆ  rz  rÊ  rË  ra   rÎ  )r   rü   r   r   r   Útest_attributes  s    zHTTPSTest.test_attributesc              	   C   s”   dd l }t d¡ t d¡d t dd¡}|  |j¡}| 	dd¡ W d   ƒ n1 sX0    Y  |  
|jjd¡ W d   ƒ n1 s†0    Y  d S )Nr   Únetworkúself-signed.pythontest.neté»  rm   r\   ÚCERTIFICATE_VERIFY_FAILED)Ússlr   Úrequiresr   Útransient_internetr   rÆ  rÛ   ÚSSLErrorr`   ra   rN  r=  )r   rí  rü   Úexc_infor   r   r   Útest_networked„  s    
*zHTTPSTest.test_networkedc                 C   sŽ   dd l }t d¡ t d¡^ | ¡ }tjdd|d}| dd¡ | 	¡ }| 
¡  |  d| d	¡¡ | 
¡  W d   ƒ n1 s€0    Y  d S )
Nr   ré  rê  rë  ©Úcontextrm   r\   ÚnginxÚserver)rí  r   rî  r   rï  Z_create_unverified_contextr   rÆ  r`   rF  r"   r|   rˆ   )r   rí  rô  rü   rŠ   r   r   r   Útest_networked_noverificationŽ  s    
ÿz'HTTPSTest.test_networked_noverificationc                 C   s~   t  d¡ t d¡V t dd¡}| dd¡ | ¡ }| d¡}| 	¡  | 	¡  |  
d|¡ W d   ƒ n1 sp0    Y  d S )Nré  rõ   rë  rm   r\   zcontent-typez	text/html)r   rî  r   rï  r   rÆ  r`   rF  rˆ   r"   r|   )r   rü   rŠ   Zcontent_typer   r   r   Ú&test_networked_trusted_by_default_certœ  s    

z0HTTPSTest.test_networked_trusted_by_default_certc           	      C   s  dd l }t d¡ d}t |¡è | |j¡}|  |j|j	¡ |  |j
d¡ | t¡ z(tj|d|d}| dd¡ | ¡ }W nT |jyÒ } z:t|ƒ}t d	|¡r¼t d
|› d|› d¡‚‚ W Y d }~n
d }~0 0 | d¡}| ¡  | ¡  |  d|¡ W d   ƒ n1 s0    Y  d S )Nr   ré  rê  Trë  ró  rm   r\   z(?i)key.too.weakzGot z trying to connect to z). See https://bugs.python.org/issue36816.rö  rõ  )rí  r   rî  r   rï  Ú
SSLContextÚPROTOCOL_TLS_CLIENTra   Zverify_modeZCERT_REQUIREDÚcheck_hostnameÚload_verify_locationsÚ CERT_selfsigned_pythontestdotnetr   rÆ  r`   rF  rð  r   ÚreÚsearchrÈ  ZSkipTestrˆ   r"   r|   )	r   rí  Zselfsigned_pythontestdotnetrô  rü   rŠ   Zssl_errZssl_err_strZserver_stringr   r   r   Útest_networked_good_cert©  s6    

ÿÿÿ
z"HTTPSTest.test_networked_good_certc              	   C   s®   dd l }t d¡ t d¡~ | |j¡}| t¡ t	j
dd|d}|  |j¡}| dd¡ W d   ƒ n1 sr0    Y  |  |jjd¡ W d   ƒ n1 s 0    Y  d S )	Nr   ré  rê  rë  ró  rm   r\   rì  )rí  r   rî  r   rï  rù  rú  rü  ÚCERT_localhostr   rÆ  rÛ   rð  r`   ra   rN  r=  )r   rí  rô  rü   rñ  r   r   r   Útest_networked_bad_certÊ  s    

*z!HTTPSTest.test_networked_bad_certc                 C   sl   dd l }|  t¡}t d|j¡}|  |j¡}| dd¡ W d   ƒ n1 sN0    Y  |  	|j
jd¡ d S )Nr   Ú	localhostrm   r\   rì  )rí  rç  r  r   rÆ  r   rÛ   rð  r`   ra   rN  r=  )r   rí  rö  rü   rñ  r   r   r   Útest_local_unknown_certÖ  s    
*z!HTTPSTest.test_local_unknown_certc                 C   sx   dd l }|  t¡}| |j¡}| t¡ tjd|j|d}|  	|j
¡ | dd¡ | ¡ }|  	|j
¡ |  |jd¡ d S )Nr   r  ró  rm   ú/nonexistentrÓ   )rí  rç  r  rù  rú  rü  r   rÆ  r   r{  r"   r`   rF  ra   r<  ©r   rí  rö  rô  rü   rŠ   r   r   r   Útest_local_good_hostnameß  s    

z"HTTPSTest.test_local_good_hostnamec                 C   s4  dd l }|  t¡}| |j¡}| t¡ tjd|j|d}|  	|j
¡ | dd¡ W d   ƒ n1 sh0    Y  t dtf¡$ tjd|j|dd}W d   ƒ n1 sª0    Y  |  	|j
¡ | dd¡ W d   ƒ n1 sâ0    Y  d	|_t dtf¡$ tjd|j|d	d}W d   ƒ n1 s,0    Y  | dd
¡ | ¡ }| ¡  | ¡  |  |jd¡ d	|_tjd|j|d}| dd
¡ | ¡ }|  |jd¡ | ¡  | ¡  t dtf¡$ tjd|j|dd}W d   ƒ n1 sì0    Y  |  	|j
¡ | dd¡ W d   ƒ n1 s&0    Y  d S )Nr   r  ró  rm   r\   rj   T)rô  rû  Fr  rÓ   )rí  rç  ÚCERT_fakehostnamerù  rú  rü  r   rÆ  r   rÛ   ZCertificateErrorr`   r   Zcheck_warningsÚDeprecationWarningrû  rF  r"   ra   r<  r  r   r   r   Útest_local_bad_hostnameì  sH    

*
ÿ$*
ÿ&
ÿ&z!HTTPSTest.test_local_bad_hostnamerÆ  z)http.client.HTTPSConnection not availablec                 C   sV   dD ]}|   tjtj|¡ qdD ]0\}}}t |¡}|  ||j¡ |  ||j¡ q d S )Nrò   )ró   )zwww.python.org:443rõ   rë  )r÷   rõ   rë  )rõ   rõ   rë  )rø   rô   rë  )rù   rô   rë  )rÛ   r   rú   rÆ  ra   r   r   rû   r   r   r   rÿ     s    
zHTTPSTest.test_host_portc                 C   sÐ   dd l }|js|  d¡ t dd¡}|  |jj¡ | |j	¡}|  
|j¡ tjdd|d}|  |j|¡ |  
|jj¡ t ¡ 0 t ddt¡ tjdd|td}W d   ƒ n1 s´0    Y  |  |jj¡ d S )	Nr   zTLS 1.3 support requiredr  rë  ró  Úignorez5key_file, cert_file and check_hostname are deprecated)rô  Z	cert_file)rí  ZHAS_TLSv1_3rä  r   rÆ  r€   Z_contextZpost_handshake_authrù  rú  rØ   ZassertIsÚwarningsÚcatch_warningsÚfilterwarningsr	  r  )r   rí  rü   rô  r   r   r   Útest_tls13_pha*  s$    

ÿ
ÿ$zHTTPSTest.test_tls13_phaN)r+   r,   r-   r’  rç  rè  rò  r÷  r   Zsystem_must_validate_certrø  r   r  r  r  r
  rÈ  rÉ  r¹  r   rÿ   r  r   r   r   r   rã  u  s"   

!	*ÿ
rã  c                   @   sT   e Z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S )ÚRequestBodyTestc                 C   s,   t  d¡| _tdƒ | j_| _| j| j_d S )Nr>   rj   )r   r]   rc   r	   r^   r&   r   r   r   r’  C  s    zRequestBodyTest.setUpc                 C   s(   t  | jj¡}| ¡  t |¡}||fS r'   )r.   r/   r^   r   r;   r   r²  ©r   ÚfÚmessager   r   r   Úget_headers_and_fpH  s    
z"RequestBodyTest.get_headers_and_fpc              	   C   sÀ   ddgdfdf}|D ]¦\}}|   |¡„ t d¡| _tdƒ | j_| _| j dd|¡ |  ¡ \}}|  d	|¡ |  d
|¡ |  	| 
d¡d¡ |  	|| ¡ ¡ W d   ƒ q1 s°0    Y  qd S )Nrœ  ó   baró   3
foo
3
bar
0

))rœ  r  r  r>   rj   rk   rC  zContent-Typer   rµ   r¶   )r›   r   r]   rc   r	   r^   r`   r  r¾   ra   Úgetr8   )r   rž   rd   rƒ   r“   r  r   r   r   Útest_list_bodyN  s    
þzRequestBodyTest.test_list_bodyc                 C   sL   | j  dddddi¡ |  ¡ \}}|  d| d¡¡ |  dt| ¡ ƒ¡ d S )Nrk   rC  rd   r   Z42r·   rž  )rc   r`   r  ra   r  rP   r8   ©r   r  r  r   r   r   Útest_manual_content_lengthb  s    ÿz*RequestBodyTest.test_manual_content_lengthc                 C   s`   | j  ddd¡ |  ¡ \}}|  d| ¡ ¡ |  | ¡ ¡ |  d| d¡¡ |  d| ¡ ¡ d S )Nrk   rC  rd   ú
text/plainÚ4r·   s   body©	rc   r`   r  ra   Úget_content_typerÏ  Úget_charsetr  r8   r  r   r   r   Útest_ascii_bodyk  s    zRequestBodyTest.test_ascii_bodyc                 C   s`   | j  ddd¡ |  ¡ \}}|  d| ¡ ¡ |  | ¡ ¡ |  d| d¡¡ |  d| ¡ ¡ d S )Nrk   rC  u   bodyÃr  Ú5r·   ó   bodyÁr  r  r   r   r   Útest_latin1_bodys  s    z RequestBodyTest.test_latin1_bodyc                 C   s`   | j  ddd¡ |  ¡ \}}|  d| ¡ ¡ |  | ¡ ¡ |  d| d¡¡ |  d| ¡ ¡ d S )Nrk   rC  r"  r  r!  r·   r  r  r   r   r   Útest_bytes_body{  s    zRequestBodyTest.test_bytes_bodyc                 C   sà   |   tjtj¡ ttjdƒ}| d¡ W d   ƒ n1 s<0    Y  ttjƒ|}| j dd|¡ |  ¡ \}}|  	d| 
¡ ¡ |  | ¡ ¡ |  | d¡¡ |  	d| d¡¡ |  	d	| ¡ ¡ W d   ƒ n1 sÒ0    Y  d S )
NÚwrd   rk   rC  r  r·   r¶   ztransfer-encodings   4
body
0

)r{  r   ÚunlinkÚTESTFNr  Úwriterc   r`   r  ra   r  rÏ  r  r  r8   r  r   r   r   Útest_text_file_bodyƒ  s    (z#RequestBodyTest.test_text_file_bodyc                 C   sÞ   |   tjtj¡ ttjdƒ}| d¡ W d   ƒ n1 s<0    Y  ttjdƒx}| j dd|¡ |  ¡ \}}|  	d| 
¡ ¡ |  | ¡ ¡ |  	d| d¡¡ |  d	|¡ |  	d
| ¡ ¡ W d   ƒ n1 sÐ0    Y  d S )NÚwbr"  r   rk   rC  r  r¶   rµ   r   s   5
bodyÁ
0

)r{  r   r&  r'  r  r(  rc   r`   r  ra   r  rÏ  r  r  r¾   r8   r  r   r   r   Útest_binary_file_body’  s    (z%RequestBodyTest.test_binary_file_bodyN)r+   r,   r-   r’  r  r  r  r   r#  r$  r)  r+  r   r   r   r   r  @  s   	r  c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚHTTPResponseTestc                 C   s&   d}t |ƒ}t |¡| _| j ¡  d S )NzXHTTP/1.1 200 Ok
My-Header: first-value
My-Header:                 second-value

Text)r	   r   r†   rŠ   r‡   )r   rd   r^   r   r   r   r’  ¢  s    zHTTPResponseTest.setUpc                 C   s6   | j  d¡}|  |d¡ | j  dd¡}|  |d¡ d S )Nz	My-Headerzfirst-value, second-valuezsome default©rŠ   rˆ   ra   ©r   rb   r   r   r   Útest_getting_header©  s    z$HTTPResponseTest.test_getting_headerc                 C   s   | j  dd¡}|  |d¡ d S )NúNo-Such-Headerzdefault-valuer-  r.  r   r   r   Ú3test_getting_nonexistent_header_with_string_default°  s    zDHTTPResponseTest.test_getting_nonexistent_header_with_string_defaultc                 C   s<   | j  dddg¡}|  |d¡ | j  dd¡}|  |d¡ d S )Nr0  ÚdefaultÚvalueszdefault, values)r2  r3  r-  r.  r   r   r   Ú5test_getting_nonexistent_header_with_iterable_default´  s    zFHTTPResponseTest.test_getting_nonexistent_header_with_iterable_defaultc                 C   s   | j  d¡}|  |d ¡ d S )Nr0  r-  r.  r   r   r   Ú/test_getting_nonexistent_header_without_default»  s    z@HTTPResponseTest.test_getting_nonexistent_header_without_defaultc                 C   s    | j jddd}|  |d¡ d S )Nr0  rx   )r2  r-  r.  r   r   r   Útest_getting_header_defaultint¿  s    z/HTTPResponseTest.test_getting_header_defaultintN)	r+   r,   r-   r’  r/  r1  r4  r5  r6  r   r   r   r   r,     s   r,  c                   @   sT   e Z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S )ÚTunnelTestsc                 C   s*   d}d| _ t | j ¡| _|  |¡| j_d S )Nz:HTTP/1.0 200 OK

HTTP/1.1 200 OK
Content-Length: 42

z	proxy.com)r   r   r]   rc   rC   )r   Úresponse_textr   r   r   r’  Ä  s
    ÿzTunnelTests.setUpc                 C   s   | j  ¡  d S r'   )rc   r"   r&   r   r   r   rÂ  Î  s    zTunnelTests.tearDownc                    s   d‡ fdd„	}|S )Nc                    s   t ˆ | d | d dS )Nr   r   )r   r   )r	   )rp  rÎ  rÄ  ©r8  r   r   rB   Ò  s    z9TunnelTests._create_connection.<locals>.create_connection)NNr   )r   r8  rB   r   r9  r   rC   Ñ  s    zTunnelTests._create_connectionc                 C   sŽ   d}d}ddi}| j j|||d | j  ddd¡ |  | j jj| j¡ |  | j jjtj¡ |  | j j	|¡ |  | j j
|¡ |  | j j|¡ d S )	Núdestination.comi¸"  z
User-Agentz!Mozilla/5.0 (compatible, MSIE 11))r   re   ro   r\   rj   )rc   Ú
set_tunnelr`   ra   r^   r   r   r   Ú	HTTP_PORTZ_tunnel_hostZ_tunnel_portZ_tunnel_headers)r   Ztunnel_hostZtunnel_portZtunnel_headersr   r   r   Ú!test_set_tunnel_host_port_headersÖ  s    
ÿz-TunnelTests.test_set_tunnel_host_port_headersc                 C   s    | j  ¡  |  t| j jd¡ d S )Nr:  )rc   rG   rÛ   ÚRuntimeErrorr;  r&   r   r   r   Ú&test_disallow_set_tunnel_after_connectã  s    
ÿz2TunnelTests.test_disallow_set_tunnel_after_connectc                 C   s   | j  d¡ | j  ddd¡ |  | j jj| j¡ |  | j jjtj¡ |  	d| j jj
¡ |  d| j jj
¡ |  	d| j jj
¡ |  d| j jj
¡ d S )	Nr:  ro   r\   rj   ó   CONNECT destination.coms   Host: destination.com:Noneó   Host: destination.coms   Host: proxy.com)rc   r;  r`   ra   r^   r   r   r   r<  r|   r   r¾   r&   r   r   r   Útest_connect_with_tunnelé  s    z$TunnelTests.test_connect_with_tunnelc                 C   s¶   t j | jd¡4}| j d¡ | j ¡  | j dd¡ W d   ƒ n1 sJ0    Y  | ¡  | jt	|j
ƒdd|j
› d |j
d d d }|  d	|¡ | j| d
¡d|›d d S )Nr  r:  rm   r\   r   z!unexpected number of send calls: )r“   r   r@  r#  zunexpected proxy data sent )r   ZpatchÚobjectrc   r;  rG   r`   Zassert_calledr–  rP   Z
mock_callsr|   r€   r—   )r   Z	mock_sendZproxy_setup_data_sentr   r   r   Ú0test_tunnel_connect_single_send_connection_setupö  s    
,

þþz<TunnelTests.test_tunnel_connect_single_send_connection_setupc                 C   sl   | j  d¡ | j  ddd¡ |  | j jj| j¡ |  | j jjtj¡ |  	d| j jj
¡ |  	d| j jj
¡ d S )Nr:  rk   r\   rj   r@  rA  )rc   r;  r`   ra   r^   r   r   r   r<  r|   r   r&   r   r   r   Útest_connect_put_request  s    z$TunnelTests.test_connect_put_requestc                 C   sŽ   d}d  |¡}| j d¡ |  |¡| j_| j d¡ t ¡  }| j ddd¡ W d   ƒ n1 sb0    Y  | ¡  	¡ }|  
d  |¡|¡ d S )	Nz
X-Dummy: 1zHTTP/1.0 200 OK
{}

r   r:  rk   r\   rj   z
header: {})rt   rc   Zset_debuglevelrC   r;  r   r£   r`   r¤   r¥   r|   )r   Zexpected_headerr8  r¦   r§   r   r   r   Útest_tunnel_debuglog  s    

.z TunnelTests.test_tunnel_debuglogN)r+   r,   r-   r’  rÂ  rC   r=  r?  rB  rD  rE  rF  r   r   r   r   r7  Ã  s   
r7  Ú__main__r¡   )Ú	verbosity):r3   Úhttpr   r   r.   rr   Úosr  rþ  rx  r|  r  rÈ  r   ZTestCaser&  r   Ztest.supportr   ÚpathÚdirnamer  Úherer”   r  r  rý  r.  r-  Zchunk_extensionr/  rW  rÍ   r0  rz  r	   r0   r/   r5   r]   r=   rL   r©   r­   rÐ   rŽ  r¬  r¢  r°  r¼  rÊ  rÔ  rã  r  r,  r7  r+   Úmainr   r   r   r   Ú<module>   sp   ÿ! n      T}"U.H L`#Z
