B
    18™\›! ã               @   sø  d dl Z d dl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	e	j
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!ƒ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/e
ƒZ/G d0d1„ d1e
ƒZ0e1d2krôe	j2d3d4 dS )5é    N)Úclient)Úsupportz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
Ú0z
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   úU/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_httplib.pyÚ__init__.   s    

zFakeSocket.__init__c             C   s    |  j d7  _ |  j|7  _d S )Né   )r   r   )r   r   r   r   r   Úsendall9   s    zFakeSocket.sendallc             C   s6   |dkr|dkrt  ¡ ‚|  | j¡| _| j| j_| jS )NÚrÚrb)r   ÚUnimplementedFileModer   r   ÚfileÚ
file_closeÚclose)r   ÚmodeÚbufsizer   r   r   Úmakefile=   s
    
zFakeSocket.makefilec             C   s
   d| _ d S )NT)r   )r   r   r   r   r   E   s    zFakeSocket.file_closec             C   s   d S )Nr   )r   r   r   r   r   H   s    zFakeSocket.closec             C   s   d S )Nr   )r   ÚlevelÚoptnameÚvaluer   r   r   Ú
setsockoptK   s    zFakeSocket.setsockopt)N)Ú__name__Ú
__module__Ú__qualname__ÚioÚBytesIOr   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 )ÚEPipeSocketc             C   s   t  | |¡ || _d S )N)r   r   Úpipe_trigger)r   r   r+   r   r   r   r   P   s    zEPipeSocket.__init__c             C   s(   | j |krttjdƒ‚|  j|7  _d S )NZgotcha)r+   ÚOSErrorÚerrnoÚEPIPEr   )r   r   r   r   r   r   U   s    
zEPipeSocket.sendallc             C   s   d S )Nr   )r   r   r   r   r   Z   s    zEPipeSocket.closeN)r%   r&   r'   r   r   r   r   r   r   r   r*   N   s   r*   c               @   s$   e Zd ZdZddd„Zd	dd„ZdS )
ÚNoEOFBytesIOz«Like BytesIO, but raises AssertionError on EOF.

    This is used below to test that http.client doesn't try to read
    more from the underlying file than it should.
    éÿÿÿÿ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   r1   c   s    zNoEOFBytesIO.readNc             C   s"   t j | |¡}|dkrtdƒ‚|S )Nr   zcaller tried to read past EOF)r(   r)   Úreadliner2   )r   Úlengthr   r   r   r   r4   i   s    zNoEOFBytesIO.readline)r0   )N)r%   r&   r'   Ú__doc__r1   r4   r   r   r   r   r/   ]   s   
r/   c                   s4   e Zd ZdZ‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚFakeSocketHTTPConnectionz@HTTPConnection subclass using FakeSocket; counts connect() callsc                s$   d| _ tƒ  d¡ || _| j| _d S )Nr   zexample.com)ÚconnectionsÚsuperr   Úfake_socket_argsÚcreate_connectionÚ_create_connection)r   Úargs)Ú	__class__r   r   r   r   s    z!FakeSocketHTTPConnection.__init__c                s   |  j d7  _ tƒ  ¡ S )z.Count the number of times connect() is invokedr   )r8   r9   Úconnect)r   )r>   r   r   r?   x   s    z FakeSocketHTTPConnection.connectc             O   s
   t | jŽ S )N)r   r:   )r   ÚposÚkwr   r   r   r;   }   s    z*FakeSocketHTTPConnection.create_connection)r%   r&   r'   r6   r   r?   r;   Ú__classcell__r   r   )r>   r   r7   o   s   r7   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 ƒ}xzdD ]r}xldD ]d}t d¡}tdƒ|_|ƒ |_d}i }|r\tt|ƒƒ||< | dd	||¡ |  	|jj
| ¡  d
¡ q W qW 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 )N)Úcount)r   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ÚlowerrD   Ú
setdefaultÚlistÚappend)r   ÚitemÚkvZlcKeyr   r   r   rL   ˆ   s    
zBHeaderTests.test_auto_headers.<locals>.HeaderCountingBuffer.appendN)r%   r&   r'   r   rL   r   r   r   r   ÚHeaderCountingBuffer…   s   rO   )TF)zContent-lengthÚHostzAccept-encodingzexample.comZblahblahblahZspamspamspamÚPOSTú/r   )rK   r   ÚHTTPConnectionr   ÚsockÚ_bufferr	   rG   ÚrequestÚassertEqualrD   rI   )r   rO   Zexplicit_headerÚheaderÚconnÚbodyÚheadersr   r   r   Útest_auto_headers   s    



zHeaderTests.test_auto_headersc             C   sv  G dd„ dt ƒ}d}d}xZt ||¡D ]J\}}t d¡}td ƒ|_|ƒ |_| |d|¡ |  	|jj
dd |¡¡ q&W d	}xN|D ]F}t d¡}td ƒ|_|ƒ |_| |dd ¡ |  	|jj
d d
 |¡¡ q~W xN|D ]F}t d¡}td ƒ|_|ƒ |_| |dd¡ |  	|jj
dd |¡¡ qÎW xXt ||¡D ]H}t d¡}td ƒ|_|ƒ |_| |dd¡ |  	|jj
dd |¡¡ q&W 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 )N)rK   r   Úcontent_length)r   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 )NrE   r   r   s   content-length)rF   rG   rI   Ústripr]   rK   rL   )r   rM   rN   r   r   r   rL   ¤   s    zFHeaderTests.test_content_length_0.<locals>.ContentLengthChecker.appendN)r%   r&   r'   r   rL   r   r   r   r   ÚContentLengthChecker    s   r_   )NÚ )ÚPUTrQ   ÚPATCHzexample.comrR   ó   0z%Header Content-Length incorrect on {})ÚGETÚCONNECTÚDELETEÚHEADZOPTIONSZTRACEz.Header Content-Length set for empty body on {}r`   ú ó   1)rK   Ú	itertoolsÚproductr   rS   r   rT   rU   rV   rW   r]   ÚformatÚchain)r   r_   ZbodiesZmethods_with_bodyÚmethodrZ   rY   Zmethods_without_bodyr   r   r   Útest_content_length_0ž   sH    









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 ),Nzexample.comrd   rR   zContent-lengthé*   s   Content-length: 42ÚFooz bar s
   Foo:  bar ÚBarz	baz	s
   Bar: 	baz	Ú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   rS   r   rT   Ú
putrequestÚ	putheaderÚassertInrU   )r   rY   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::]:81r`   rd   z/foosE   GET /foo HTTP/1.1
Host: [2001:102A::]
Accept-Encoding: identity

z[2001:102A::])r   rS   r   rT   rV   Ú
assertTruer   Ú
startswith)r   ÚexpectedrY   rT   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

ÚFirstÚvalÚSecond)r   r   ÚHTTPResponseÚbeginrW   Ú	getheader)r   rZ   rT   Úrespr   r   r   Ú!test_malformed_headers_coped_with  s    
z-HeaderTests.test_malformed_headers_coped_withc             C   s0  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¡ xH| d¡|jd fD ]0}|  | d¡¡ |  d|¡ |  | d¡¡ qøW 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

zContent-Lengthr   z!#$%&'*+-.^_`|~r#   r`   ZVCHARzobs-textzobs-foldr   z folded with spacezfolded with tab)ÚbytesÚranger   r   r€   r   rW   r‚   ÚmsgÚjoinÚmapÚchrÚassertIsNotNonerw   ry   rz   Úendswith)r   rZ   rT   rƒ   ZvcharÚfoldedr   r   r   Útest_parse_all_octets  s"    (
z!HeaderTests.test_parse_all_octetsc             C   sx   t  d¡}tdƒ|_| dd¡ d}xN|D ]F\}}|  ||f¡* |  td¡ | ||¡ W d Q R X W d Q R X q*W d S )Nzexample.comr`   rd   rR   ))s   Invalid
Names
   ValidValue)s   InvalidNames
   ValidValue)s   Invalid
Names
   ValidValue)s   
InvalidNames
   ValidValue)s   InvalidNames
   ValidValue)s   
InvalidNames
   ValidValue)s    InvalidNames
   ValidValue)s   	InvalidNames
   ValidValue)s   Invalid:Names
   ValidValue)s   :InvalidNames
   ValidValue)s	   ValidNames   Invalid
Value)s	   ValidNames   InvalidValue)s	   ValidNames   Invalid
Value)s	   ValidNames   InvalidValue
)s	   ValidNames   InvalidValue)s	   ValidNames   InvalidValue
zInvalid header)	r   rS   r   rT   ru   ÚsubTestÚassertRaisesRegexÚ
ValueErrorrv   )r   rY   ÚcasesÚnamer#   r   r   r   Útest_invalid_headers=  s    

z HeaderTests.test_invalid_headersc          	   C   sv   d}t |ƒ}tj|dd}t ¡ }| ¡  W d Q R X | ¡  ¡ }|  |d d¡ |  |d d¡ |  |d d¡ d S )	Ns*   HTTP/1.1 200 OK
First: val
Second: val
r   )Ú
debuglevelr   zreply: 'HTTP/1.1 200 OK\r\n'zheader: First: valé   zheader: Second: val)	r   r   r€   r   Úcaptured_stdoutr   ÚgetvalueÚ
splitlinesrW   )r   rZ   rT   rƒ   ÚoutputÚlinesr   r   r   Útest_headers_debuglevel[  s    
z#HeaderTests.test_headers_debuglevelN)r%   r&   r'   r\   ro   rx   r|   r„   r’   r˜   r    r   r   r   r   rC   €   s   B"
rC   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 )Nzexample.comr   rQ   rR   T)Úencode_chunked)r   rS   r   rT   ru   Ú
endheadersÚ
_make_bodyÚ_parse_requestr   Ú_parse_chunkedrW   Úexpected_body)r   rY   Ú_rZ   r   r   r   Útest_endheaders_chunkedn  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 )Nzexample.comr   rQ   rR   zTransfer-EncodingÚchunkedzcontent-lengthc             S   s   g | ]}|  ¡ ‘qS r   )rI   )Ú.0Úkr   r   r   ú
<listcomp>‚  s    z>TransferEncodingTest.test_explicit_headers.<locals>.<listcomp>zlatin-1c             S   s   g | ]}|  ¡ ‘qS r   )rI   )r«   r¬   r   r   r   r­   Ž  s    zgzip, chunkedT)r[   r¢   rZ   c             S   s   g | ]}|  ¡ ‘qS r   )rI   )r«   r¬   r   r   r   r­   š  s    )r   rS   r   rT   rV   r¤   r¥   r   ÚassertNotInÚkeysrW   r§   rH   r¦   )r   rY   r¨   r[   rZ   r   r   r   Útest_explicit_headersx  s6    






z*TransferEncodingTest.test_explicit_headersc             C   sŽ   xˆdD ]€}t  d¡}tdƒ|_| dd| j|d¡ |  |jj¡\}}}|  |¡}|  	|| j
¡ |  	|d d¡ |  d	d
d„ |D ƒ¡ qW d S )N)FTzexample.comr   rQ   rR   )Úempty_lineszTransfer-Encodingrª   zcontent-lengthc             S   s   g | ]}|  ¡ ‘qS r   )rI   )r«   r¬   r   r   r   r­   ¬  s    z5TransferEncodingTest.test_request.<locals>.<listcomp>)r   rS   r   rT   rV   r¤   r¥   r   r¦   rW   r§   r®   )r   r±   rY   r¨   r[   rZ   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 )Nzexample.comr   rQ   rR   r   zTransfer-Encodingrª   zcontent-lengthc             S   s   g | ]}|  ¡ ‘qS r   )rI   )r«   r¬   r   r   r   r­   µ  s    z8TransferEncodingTest.test_empty_body.<locals>.<listcomp>s   0

)	r   rS   r   rT   rV   r¥   r   rW   r®   )r   rY   r¨   r[   rZ   r   r   r   Útest_empty_body®  s    

z$TransferEncodingTest.test_empty_bodyFc             c   sZ   | j  d¡}xHt|ƒD ]<\}}|r0|d r0dV  |t|ƒd k rL|d V  q|V  qW d S )Nó    rš   r   r   )r§   rF   Ú	enumeraterG   )r   r±   rŸ   ÚidxÚliner   r   r   r¤   ¸  s    zTransferEncodingTest._make_bodyc             C   s’   |  d¡}|d }i }d}xZ|t|ƒk rtt|| ƒdkrt||   d¡\}}| d¡ ¡ }| d¡ ¡ ||< |d7 }qW ||d ||d d … ¡fS )Ns   
r   r   rE   zlatin-1)rF   rG   rH   r^   rŒ   )r   r   rŸ   rV   r[   r3   Úkeyr~   r   r   r   r¥   Ã  s    
z#TransferEncodingTest._parse_requestc             C   s†   g }i }d}|  d¡}xd|||d … \}}t|dƒ}|dkrH|d7 }P |  |t|ƒ¡ | |¡ |d7 }|t|ƒkrP qW d |¡S )Nr   s   
rš   é   r   r   )rF   ÚintrW   rG   rL   rŒ   )r   r   rZ   Útrailersr3   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¡   k  s   
&

r¡   c               @   sd  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-dWS )XÚ	BasicTestc             C   s²   d}t |ƒ}t |¡}| ¡  |  | d¡d¡ |  | ¡ ¡ |  |j¡ |  | ¡ d¡ |  	| ¡ ¡ |  |j¡ | 
¡  |  	|j¡ d}t |ƒ}t |¡}|  tj|j¡ d S )NzHTTP/1.1 200 Ok

Textr   r   s   TextzHTTP/1.1 400.100 Not Ok

Text)r   r   r€   r   rW   r1   ÚassertFalseÚisclosedÚclosedry   r   ÚassertRaisesÚBadStatusLine)r   rZ   rT   rƒ   r   r   r   Útest_status_linesì  s     

zBasicTest.test_status_linesc             C   s   t  d¡}|  t|ƒd¡ d S )Nr`   zBadStatusLine("''"))r   rÃ   rW   Ú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š   s   Tes   xt)r   r   r€   r   rW   r1   r¿   rÀ   ry   rÁ   r   )r   rZ   rT   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   rW   r4   r¿   rÀ   r1   ry   rÁ   r   )r   rZ   rT   rƒ   r   r   r   Útest_mixed_reads  s    
zBasicTest.test_mixed_readsc             C   s²   d}t |ƒ}t |¡}| ¡  tdƒ}| |¡}|  |d¡ |  t|ƒd¡ |  | 	¡ ¡ | |¡}|  |d¡ |  t|ƒd¡ |  
| 	¡ ¡ |  |j¡ | ¡  |  
|j¡ d S )Nz*HTTP/1.1 200 Ok
Content-Length: 4

Textrš   s   Tes   xt)r   r   r€   r   Ú	bytearrayÚreadintorW   r‰   r¿   rÀ   ry   rÁ   r   )r   rZ   rT   rƒ   Úbr3   r   r   r   Útest_partial_readintos#  s     


z BasicTest.test_partial_readintosc             C   s”   d}t |ƒ}t |¡}| ¡  |  | d¡d¡ |  | ¡ ¡ |  | d¡d¡ |  | d¡d¡ |  | ¡ ¡ |  |j	¡ | 
¡  |  |j	¡ d S )NzHTTP/1.1 200 Ok

Textrš   s   Tes   xtr   r   )r   r   r€   r   rW   r1   r¿   rÀ   ry   rÁ   r   )r   rZ   rT   rƒ   r   r   r   Ú$test_partial_reads_no_content_length7  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 )NzHTTP/1.1 200 Ok

Textrš   s   Tes   xtr   )r   r   r€   r   rÊ   rË   rW   r‰   r¿   rÀ   ry   )r   rZ   rT   rƒ   rÌ   r3   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 )Nz+HTTP/1.1 200 Ok
Content-Length: 10

Textrš   s   Tes   xtr   r   )	r   r   r€   r   rW   r1   r¿   rÀ   ry   )r   rZ   rT   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 )Nz+HTTP/1.1 200 Ok
Content-Length: 10

Textrš   s   Tes   xtr   )r   r   r€   r   rÊ   rË   rW   r‰   r¿   rÀ   ry   rÁ   r   )r   rZ   rT   rƒ   rÌ   r3   r   r   r   Ú&test_partial_readintos_incomplete_bodyg  s$    



z0BasicTest.test_partial_readintos_incomplete_bodyc             C   s^   xdD ]}|   tjtj|¡ qW x8dD ]0\}}}t |¡}|  ||j¡ |  ||j¡ q&W d S )N)zwww.python.org:abczuser:password@www.python.org))z[fe80::207:e9ff:fe9b]:8000zfe80::207:e9ff:fe9bi@  )zwww.python.org:80zwww.python.orgéP   )zwww.python.org:zwww.python.orgrÒ   )zwww.python.orgzwww.python.orgrÒ   )z[fe80::207:e9ff:fe9b]zfe80::207:e9ff:fe9brÒ   )z[fe80::207:e9ff:fe9b]:zfe80::207:e9ff:fe9brÒ   )rÂ   r   Ú
InvalidURLrS   rW   r   r   )r   Ú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‚   rW   )r   r   ÚhdrÚsr   Ú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 )Nz*HTTP/1.1 200 OK
Content-Length: 14432

rg   )rn   z)Did not expect response from HEAD request)r   r/   r   r€   r   r1   Úfail)r   rT   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 )Nz*HTTP/1.1 200 OK
Content-Length: 14432

rg   )rn   é   r   z)Did not expect response from HEAD requests        )
r   r/   r   r€   r   rÊ   rË   rÝ   rW   r‰   )r   rT   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 )Nz
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   Ú_MAXHEADERSr   r€   r”   ÚHTTPExceptionr   )r   r[   r   rÚ   r   r   r   r   Útest_too_many_headers¼  s    

zBasicTest.test_too_many_headersc          	   C   sn   d}t tdƒV}t d¡}t|ƒ}||_| dd|¡ |  |j 	|¡d|jd t
|ƒ… |f ¡ W d Q R X d S )Ns_   GET /foo HTTP/1.1
Host: example.com
Accept-Encoding: identity
Transfer-Encoding: chunked

r   zexample.comrd   z/fooz%r != %r)ÚopenÚ__file__r   rS   r   rT   rV   ry   r   rz   rG   )r   r{   rZ   rY   rT   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 testzexample.comr   rÌ   )
r   rS   r   rT   ÚsendrW   r   Úarrayr(   r)   )r   r{   rY   rT   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   r0   c             S   s
   t | jƒS )N)ÚnextÚd)r   Ú	blocksizer   r   r   r1   ê  s    z<BasicTest.test_send_updating_file.<locals>.UpdatingFile.readN)r0   )r%   r&   r'   r   rí   r1   r   )r   r   r   ÚUpdatingFileç  s   rï   s   datazexample.comr`   )	r(   Ú
TextIOBaser   rS   r   rT   ré   rW   r   )r   rï   r{   rY   rT   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   rZ   û  s    z&BasicTest.test_send_iter.<locals>.bodyzexample.comr`   rd   z/foozContent-LengthÚ11)r   rS   r   rT   rV   rW   r   )r   r{   rZ   rY   rT   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 )z8Check that request() respects the configured block size.é   zexample.com)rî   Nó   aó   bra   rR   zContent-LengthÚ9é   s   

r   )r   rS   r   rT   rV   r(   r)   rW   r   r   rF   )r   rî   rY   rT   r{   rZ   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 )z5Check that send() respects the configured block size.rô   zexample.com)rî   Nrõ   rö   rš   )
r   rS   r   rT   ré   r(   r)   rW   r   r   )r   rî   rY   rT   r{   r   r   r   Útest_blocksize_send  s    zBasicTest.test_blocksize_sendc          	   C   s<   t  d¡}tdƒ|_|  t¡ | dd|¡ W d Q R X d S )Nzexample.comr`   rQ   Útest)r   rS   r   rT   rÂ   Ú	TypeErrorrV   )r   rY   r   r   r   Útest_send_type_error  s    

zBasicTest.test_send_type_errorc             C   sd  t }ttt t ƒ}tj|dd}| ¡  |  | 	¡ |¡ | 
¡  xdtddƒD ]V}ttt t ƒ}tj|dd}| ¡  |  | 	|¡| 	|¡ | 	¡  |¡ | 
¡  qNW x¶dD ]®}tt| ƒ}tj|dd}| ¡  z|y| 	¡  W n` tjk
rB } z>|  |j|¡ dt|ƒ }|  t|ƒ|¡ |  t|ƒ|¡ W d d }~X Y nX |  d¡ W d | 
¡  X q®W d S )Nrd   )rn   r   é   )r`   zfoo
zIncompleteRead(%d bytes read)zIncompleteRead expected)Úchunked_expectedr   Úchunked_startÚ
last_chunkÚchunked_endr   r€   r   rW   r1   r   rŠ   ÚIncompleteReadÚpartialrG   rÅ   r	   rÝ   )r   r{   rT   rƒ   r3   Úxrá   Úexpected_messager   r   r   Útest_chunked$  s2    $
"zBasicTest.test_chunkedc             C   sØ  t }t|ƒ}tdƒ}ttt t ƒ}tj|dd}| 	¡  | 
|¡}|  |d |… |¡ |  ||¡ | ¡  xªtddƒD ]œ}ttt t ƒ}tj|dd}| 	¡  t|ƒ}| 
|d|… ¡}|| 
|||| … ¡7 }|| 
||d … ¡7 }|  |d |… |¡ |  ||¡ | ¡  qxW xºdD ]²}	tt|	 ƒ}tj|dd}| 	¡  z~y| 
|¡}W n` tjk
r´ } z>|  |j|¡ dt|ƒ }
|  t|ƒ|
¡ |  t|ƒ|
¡ W d d }~X Y nX |  d	¡ W d | ¡  X qW d S )
Nr‡   rd   )rn   r   rþ   r   )r`   zfoo
zIncompleteRead(%d bytes read)zIncompleteRead expected)rÿ   rG   rÊ   r   r   r  r  r   r€   r   rË   rW   r   rŠ   Ú
memoryviewr  r  rÅ   r	   rÝ   )r   r{   Z	nexpectedrÌ   rT   rƒ   r3   Úmrá   r  r  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 )NzEHTTP/1.1 200 OK
Transfer-Encoding: chunked

a
hello world
1
d
rg   )rn   r   éÈ   ÚOK)r   r  r  r   r€   r   rW   r1   ÚstatusÚreasonry   rÀ   r¿   rÁ   r   )r   r   rT   rƒ   r   r   r   Útest_chunked_heado  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 )	NzEHTTP/1.1 200 OK
Transfer-Encoding: chunked

a
hello world
1
d
rg   )rn   rß   r   s        r  r  )r   r  r  r   r€   r   rÊ   rË   rW   r‰   r  r  ry   rÀ   r¿   rÁ   r   )r   r   rT   rƒ   rÌ   r3   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
rd   )rn   s   Hello
)r   r   r€   r   rW   r1   ry   rÀ   )r   rT   rƒ   r   r   r   Útest_negative_content_lengthš  s    z&BasicTest.test_negative_content_lengthc          
   C   sš   t dƒ}tj|dd}| ¡  y| ¡  W n` tjk
rŠ } z@|  |jd¡ |  t|ƒd¡ |  t	|ƒd¡ |  
| ¡ ¡ W d d }~X Y nX |  d¡ d S )Nz.HTTP/1.1 200 OK
Content-Length: 10

Hello
rd   )rn   s   Hello
z-IncompleteRead(7 bytes read, 3 more expected)zIncompleteRead expected)r   r   r€   r   r1   r  rW   r  rÅ   r	   ry   rÀ   rÝ   )r   rT   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-Lengthzexample.comc                  s   ˆ   ddd¡S )Nra   z/urlrZ   )rV   r   )rY   r   r   Ú<lambda>»  r   z&BasicTest.test_epipe.<locals>.<lambda>i‘  zBasic realm="example"zwww-authenticate)
r*   r   rS   rT   rÂ   r,   ÚgetresponserW   r  r‚   )r   rT   rƒ   r   )rY   r   Ú
test_epipe²  s    
zBasicTest.test_epipec             C   s8   ddd  d }t  t|ƒ¡}|  t jt jf|j¡ d S )NzHTTP/1.1 200 Okr¬   i   z
)r   r€   r   rÂ   ÚLineTooLongrÃ   r   )r   rZ   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   i   z

)r   r€   r   rÂ   r  r   )r   rZ   rƒ   r   r   r   Útest_overflowing_header_lineÈ  s    z&BasicTest.test_overflowing_header_linec             C   s:   ddd  d }t  t|ƒ¡}| ¡  |  t j|j¡ d S )Nz/HTTP/1.1 200 OK
Transfer-Encoding: chunked

r   i   za
hello world
0

)r   r€   r   r   rÂ   r  r1   )r   rZ   rƒ   r   r   r   Útest_overflowing_chunked_lineÐ  s    z'BasicTest.test_overflowing_chunked_linec             C   s`   d}t |ƒ}t |¡}| ¡  |  | ¡ d¡ |  | ¡ ¡ |  |j	¡ | 
¡  |  |j	¡ d S )NzHTTP/1.1 200 Okr   )r   r   r€   r   rW   r1   ry   rÀ   r¿   rÁ   r   )r   rZ   rT   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 )Nzexample.comc                   s   e Zd Z‡ fdd„ZdS )z+BasicTest.test_error_leak.<locals>.Responsec                s   | ‰ t jj| f|ž|Ž d S )N)r   r€   r   )r   r@   rA   )Úresponser   r   r   î  s    z4BasicTest.test_error_leak.<locals>.Response.__init__N)r%   r&   r'   r   r   )r  r   r   ÚResponseí  s   r  zInvalid status linerd   rR   )r   rS   r€   Úresponse_classr   rT   rV   rÂ   rÃ   r  ry   rÁ   r   )r   rY   r  r   )r  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   abcrd   )rn   )rÿ   r   r   Úlast_chunk_extendedr  r   r€   r   rW   r1   r   )r   Úextrar{   rT   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 )z9some servers may serve up a short chunked encoding streamrd   )rn   N)
rÿ   r   r   r  r   r€   r   rW   r1   r   )r   r{   rT   rƒ   r   r   r   Útest_chunked_missing_end  s    z"BasicTest.test_chunked_missing_endc             C   s\   t }ttt t t ƒ}tj|dd}| ¡  |  	| 
¡ |¡ |  	|j 
¡ d¡ | ¡  dS )z&See that trailers are read and ignoredrd   )rn   r   N)rÿ   r   r   r  r»   r  r   r€   r   rW   r1   r   r   )r   r{   rT   rƒ   r   r   r   Útest_chunked_trailers  s    zBasicTest.test_chunked_trailersc             C   sj   t }d}ttt t t | ƒ}tj|dd}| ¡  |  	| 
¡ |¡ |  	|j 
¡ | d¡¡ | ¡  dS )zDCheck that we don't read past the end of the chunked-encoding streamÚ	extradatard   )rn   r   N)rÿ   r   r   r  r»   r  r   r€   r   rW   r1   r   r
   r   )r   r{   r$  rT   rƒ   r   r   r   Útest_chunked_sync  s    zBasicTest.test_chunked_syncc             C   s\   d}d}t d| | ƒ}tj|dd}| ¡  |  | ¡ |¡ |  |j ¡ |¡ | ¡  dS )zBCheck that we don't read past the end of the Content-Length streams	   extradatas
   Hello123
s'   HTTP/1.1 200 OK
Content-Length: 10

rd   )rn   N)r   r   r€   r   rW   r1   r   r   )r   r$  r{   rT   rƒ   r   r   r   Útest_content_length_sync#  s    z"BasicTest.test_content_length_syncc             C   s`   d}d}t d| | ƒ}tj|dd}| ¡  |  | d¡|g¡ |  |j ¡ |¡ | ¡  d S )Ns	   extradatas
   Hello123
s'   HTTP/1.1 200 OK
Content-Length: 10

rd   )rn   iÐ  )	r   r   r€   r   rW   Ú	readlinesr   r1   r   )r   r$  r{   rT   rƒ   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 )Ns	   extradatas
   Hello123
s'   HTTP/1.1 200 OK
Content-Length: 10

rd   )rn   iÐ  )	r   r   r€   r   rW   Úread1r   r1   r   )r   r$  r{   rT   rƒ   r   r   r   Útest_read1_content_length:  s    z#BasicTest.test_read1_content_lengthc             C   sp   d}d}t d| | ƒ}tj|dd}| ¡  |  | d¡|¡ |  | d¡d¡ |  |j ¡ |¡ | ¡  d S )Ns	   extradatas
   Hello123
s'   HTTP/1.1 200 OK
Content-Length: 10

rd   )rn   é
   r   )	r   r   r€   r   rW   r4   r   r1   r   )r   r$  r{   rT   rƒ   r   r   r   Ú"test_readline_bound_content_lengthE  s    z,BasicTest.test_readline_bound_content_lengthc             C   sv   d}d}t d|d  | ƒ}tj|dd}| ¡  |  | d¡|d ¡ |  | ¡ |¡ |  |j ¡ |¡ | ¡  d S )	Ns	   extradatas
   Hello123
s'   HTTP/1.1 200 OK
Content-Length: 30

rø   rd   )rn   é   rš   )	r   r   r€   r   rW   r)  r1   r   r   )r   r$  r{   rT   rƒ   r   r   r   Útest_read1_bound_content_lengthQ  s    z)BasicTest.test_read1_bound_content_lengthc                sú   t   t jt jt j¡‰|  ˆj¡ ˆ tdf¡ ˆ ¡  d ‰ ‡ ‡fdd„}t	j
|d}| ¡  |  |jtdƒ¡ tjˆ ¡ Ž }| dd¡ | ¡ }z>|  |jtj¡ t j | ¡ d}z| d	¡ W d | ¡  X W d | ¡  | ¡  X | ¡  |  ˆ d	¡ d S )
Nr   c           
      sb   ˆ  ¡ \} }| H |  d¡2}x| ¡ }| d¡s P q W |  d¡ | ¡ ‰ W d Q R X W d Q R X d S )Nr   s   
s'   HTTP/1.1 200 Connection established

)Úacceptr    r4   Úrstripr   r1   )rY   ÚaddressÚreaderr·   )ÚresultÚservr   r   Ú
run_serverf  s    

z2BasicTest.test_response_fileno.<locals>.run_server)Útargetr   re   z
dummy:1234)Úfilenos   proxied data
)ÚsocketÚAF_INETÚSOCK_STREAMÚIPPROTO_TCPÚ
addCleanupr   ÚbindÚHOSTÚlistenÚ	threadingÚThreadÚstartrŒ   Úfloatr   rS   ÚgetsocknamerV   r  rW   r  r  r7  r   Údetach)r   r5  ÚthreadrY   r  rÚ   r   )r3  r4  r   Útest_response_fileno]  s.    
zBasicTest.test_response_filenoN).r%   r&   r'   rÄ   rÇ   rÈ   rÉ   rÍ   rÎ   rÏ   rÐ   rÑ   rØ   rÜ   rÞ   rà   rå   rè   rë   rñ   ró   rù   rú   rý   r  r
  r  r  r  r  r  r  r  r  r  r  r!  r"  r#  r%  r&  r(  r*  r,  r.  rG  r   r   r   r   r¾   ë  sV   	 +
	r¾   c               @   sx   e Zd 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 )ÚExtendedReadTestz*
    Test peek(), read1(), readline()
    zOHTTP/1.1 200 OK

hello world!
and now 
for something completely different
fooÚhelloNr   zŠ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 )Nrd   )rn   )	r   rŸ   r   r€   r   r(   ÚBufferedReaderÚfprƒ   )r   rT   rƒ   r   r   r   ÚsetUp£  s
    
zExtendedReadTest.setUpc                sÎ   | j }|jj‰ d‡ fdd„	}||j_g }xŒ| d¡}|r|  t|ƒd¡ | ¡ }|  t|ƒt|ƒ¡ |  | |¡¡ | t|ƒ¡}|  	||¡ n| ¡ }|  
|¡ | |¡ |s*P q*W |  	d |¡| j¡ d S )Nr0   c                s(   ˆ | ƒ}| dkr|d | … S |d d… S )Nr   r+  r   )r3   rÖ   )Úoldpeekr   r   Úmypeek°  s    z*ExtendedReadTest.test_peek.<locals>.mypeekrø   r   r   )r0   )rƒ   rK  ÚpeekÚassertGreaterrG   ÚassertGreaterEqualry   rz   r1   rW   r¿   rL   rŒ   Úlines_expected)r   rƒ   rN  ÚallrÖ   Úp2rì   r   )rM  r   Ú	test_peek¬  s(    


zExtendedReadTest.test_peekc             C   s   | j }|  | j j| j¡ d S )N)rƒ   Ú_verify_readliner4   rR  )r   rƒ   r   r   r   Útest_readlineË  s    zExtendedReadTest.test_readlinec             C   s`   g }xD|dƒ}|r6|dkr6t |ƒdk r6|  | d¡¡ | |¡ |sP qW |  d |¡|¡ d S )Nrß   s   fooó   
r   )rG   ry   r   rL   rW   rŒ   )r   r4   r{   rS  r·   r   r   r   rV  Ï  s    
z!ExtendedReadTest._verify_readlinec                s0   ˆj ‰ ‡ ‡fdd„}t|ƒ}ˆ |jˆj¡ d S )Nc                 s   ˆ   d¡} ˆ t| ƒd¡ | S )Né   )r)  ÚassertLessEqualrG   )Úres)rƒ   r   r   r   r   Þ  s    
z&ExtendedReadTest.test_read1.<locals>.r)rƒ   Ú	ReadlinerrV  r4   rR  )r   r   Z	readlinerr   )rƒ   r   r   Ú
test_read1Ü  s    zExtendedReadTest.test_read1c             C   s@   | j }g }x| ¡ }|sP | |¡ qW |  d |¡| j¡ d S )Nr   )rƒ   r)  rL   rW   rŒ   rR  )r   rƒ   rS  r   r   r   r   Útest_read1_unboundedå  s    z%ExtendedReadTest.test_read1_unboundedc             C   sR   | j }g }x.| d¡}|sP |  t|ƒd¡ | |¡ qW |  d |¡| j¡ d S )Nr+  r   )rƒ   r)  rZ  rG   rL   rW   rŒ   rR  )r   rƒ   rS  r   r   r   r   Útest_read1_boundedï  s    
z#ExtendedReadTest.test_read1_boundedc             C   s   |   | j d¡d¡ d S )Nr   r   )rW   rƒ   r)  )r   r   r   r   Útest_read1_0ú  s    zExtendedReadTest.test_read1_0c             C   s    | j  d¡}|  dt|ƒ¡ d S )Nr   )rƒ   rO  rZ  rG   )r   rÖ   r   r   r   Útest_peek_0ý  s    zExtendedReadTest.test_peek_0)r%   r&   r'   r6   rŸ   Úfindr
   rR  Zlines_chunkedrL  rU  rW  rV  r]  r^  r_  r`  ra  r   r   r   r   rH  …  s   		
rH  c               @   s   e Zd ZdZdZdS )ÚExtendedReadTestChunkedz:
    Test peek(), read1(), readline() in chunked mode
    zŠHTTP/1.1 200 OK
Transfer-Encoding: chunked

a
hello worl
3
d!

9
and now 

23
for something completely different

3
foo
0

N)r%   r&   r'   r6   rŸ   r   r   r   r   rc    s   rc  c               @   s    e Zd ZdZdd„ Zdd„ ZdS )r\  zT
    a simple readline class that uses an arbitrary read function and buffering
    c             C   s   || _ d| _d S )Nr   )ÚreadfuncÚ	remainder)r   rd  r   r   r   r     s    zReadliner.__init__c             C   s²   g }d}| j }y„xP| d¡}|dkr&P |t|ƒ |krB|| d }| |¡ |  ¡ }|sd}P qW |d7 }| |d |… ¡ ||d … | _ d |¡S    d |¡| _ ‚ Y nX d S )Nr   rX  r0   r   r   )re  rb  rG   rL   rd  rŒ   )r   Úlimitr   Údatalenr1   r¶   r   r   r   r4     s,    


zReadliner.readlineN)r%   r&   r'   r6   r   r4   r   r   r   r   r\    s   r\  c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚOfflineTestc             C   sj   dh}ddh}xHt tƒD ]<}| d¡s||kr0qtt|ƒ}t|dd ƒdkr| |¡ qW |  tj|¡ d S )NÚ	responsesÚHTTPMessageÚparse_headersr¨   r&   zhttp.client)Údirr   rz   ÚgetattrÚaddÚassertCountEqualÚ__all__)r   r{   Ú	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)rW   r   ri  Ú	NOT_FOUND)r   r   r   r   Útest_responsesH  s    zOfflineTest.test_responsesc          6   C   sª   ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6g6}x4|D ],}| j |d7 |  tt|ƒ¡ W d Q R X qvW d S )8NÚCONTINUEÚSWITCHING_PROTOCOLSÚ
PROCESSINGr  ÚCREATEDÚACCEPTEDÚNON_AUTHORITATIVE_INFORMATIONÚ
NO_CONTENTÚRESET_CONTENTÚPARTIAL_CONTENTÚMULTI_STATUSÚIM_USEDÚMULTIPLE_CHOICESÚMOVED_PERMANENTLYÚFOUNDÚ	SEE_OTHERÚNOT_MODIFIEDÚ	USE_PROXYÚTEMPORARY_REDIRECTÚBAD_REQUESTÚUNAUTHORIZEDÚPAYMENT_REQUIREDÚ	FORBIDDENrs  ÚMETHOD_NOT_ALLOWEDÚNOT_ACCEPTABLEÚPROXY_AUTHENTICATION_REQUIREDÚREQUEST_TIMEOUTÚCONFLICTÚGONEÚLENGTH_REQUIREDÚPRECONDITION_FAILEDÚREQUEST_ENTITY_TOO_LARGEÚREQUEST_URI_TOO_LONGÚUNSUPPORTED_MEDIA_TYPEÚREQUESTED_RANGE_NOT_SATISFIABLEÚEXPECTATION_FAILEDÚMISDIRECTED_REQUESTÚUNPROCESSABLE_ENTITYÚLOCKEDÚFAILED_DEPENDENCYÚUPGRADE_REQUIREDÚPRECONDITION_REQUIREDÚTOO_MANY_REQUESTSÚREQUEST_HEADER_FIELDS_TOO_LARGEÚINTERNAL_SERVER_ERRORÚNOT_IMPLEMENTEDÚBAD_GATEWAYÚSERVICE_UNAVAILABLEÚGATEWAY_TIMEOUTÚHTTP_VERSION_NOT_SUPPORTEDÚINSUFFICIENT_STORAGEÚNOT_EXTENDEDÚNETWORK_AUTHENTICATION_REQUIRED)Zconstant)r“   ry   Úhasattrr   )r   r{   Úconstr   r   r   Útest_client_constantsK  sr    
z!OfflineTest.test_client_constantsN)r%   r&   r'   rr  rt  r«  r   r   r   r   rh  9  s   rh  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 )N)r8  r9  r:  r4  r   Ú	bind_portr   Úfind_unused_portÚsource_portr?  rY   )r   r   r   r   rL  ‹  s
    

zSourceAddressTest.setUpc             C   s*   | j r| j  ¡  d | _ | j ¡  d | _d S )N)rY   r   r4  )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 )Nr`   )Úsource_addressr   )
r   rS   r>  r   r¯  rY   r?   rW   rT   rD  )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 )Nr`   )r±  )r   r³  r>  r   r¯  rY   )r   r   r   r   Ú testHTTPSConnectionSourceAddressŸ  s    
z2SourceAddressTest.testHTTPSConnectionSourceAddressN)r%   r&   r'   rL  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 )N)	r8  r9  r:  r4  r   r­  r·  ÚPORTr?  )r   r   r   r   rL  ¬  s    zTimeoutTest.setUpc             C   s   | j  ¡  d | _ d S )N)r4  r   )r   r   r   r   r°  ±  s    
zTimeoutTest.tearDownc          	   C   sð   |   t ¡ ¡ t d¡ zt ttj¡}| 	¡  W d t d ¡ X |  
|j ¡ d¡ | ¡  |   t ¡ ¡ t d¡ ztjttjd d}| 	¡  W d t d ¡ X |  
|j ¡ d ¡ | ¡  tjttjdd}| 	¡  |  
|j ¡ d¡ | ¡  d S )Né   )Útimeout)ÚassertIsNoner8  ÚgetdefaulttimeoutÚsetdefaulttimeoutr   rS   r>  r·  r¸  r?   rW   rT   Ú
gettimeoutr   )r   ZhttpConnr   r   r   ÚtestTimeoutAttributeµ  s*    


z TimeoutTest.testTimeoutAttribute)r%   r&   r'   r¸  rL  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}xÌ|D ]Ä\}}}| j ||d¦ d ||¡}t|ƒ}|  |j¡ | dd¡ | ¡ "}|  |jd k| ¡ | ¡  W d Q R X |  |jd k| ¡ |  |j	d¡ | dd¡ |  |j	|r¾dnd¡ W d Q R X q
W d S )	N))z1.0r`   F)z1.0zConnection: keep-alive
T)z1.1r`   T)z1.1zConnection: close
F)z1.0zConnection: keep-ALIVE
T)z1.1zConnection: cloSE
F)ÚversionrX   z4HTTP/{} 200 OK
{}Content-Length: 12

Dummy body
rd   z/open-connectionr   z/subsequent-requestrš   )
r“   rl   r7   r»  rT   rV   r  rW   r1   r8   )r   ÚtestsrÁ  rX   Zreuser‹   rY   r  r   r   r   Útest_reuse_reconnectÙ  s    
z$PersistenceTest.test_reuse_reconnectc          
   C   s”   dd„ }t jtjf|tff}xr|D ]j\}}| j|dP td|ƒ}| dd¡ |  ||j	¡ |  
|j¡ | dd¡ |  |jd¡ W d Q R X q"W d S )	Nc                s&   t  | ¡‰ ‡ fdd„}|ˆ _t  ˆ ¡S )z3Return BufferedReader that raises ECONNRESET at EOFc                s    t j ˆ | ¡}|dkrtƒ ‚|S )Nr   )r(   r)   rË   ÚConnectionResetError)Úbufferr¼   )Ústreamr   r   rË   ü  s    zNPersistenceTest.test_disconnected.<locals>.make_reset_reader.<locals>.readinto)r(   r)   rË   rJ  )r   rË   r   )rÆ  r   Úmake_reset_readerù  s    
z<PersistenceTest.test_disconnected.<locals>.make_reset_reader)Ú	exceptionr   rd   z/eof-responsez
/reconnectrš   )r(   r)   r   ÚRemoteDisconnectedrÄ  r“   r7   rV   rÂ   r  r»  rT   rW   r8   )r   rÇ  rÂ  Zstream_factoryrÈ  rY   r   r   r   Útest_disconnected÷  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

rd   rR   ÚExpectz100-continue)r[   z
/reconnectrš   )
r7   rV   rÂ   r   rÉ  r  r»  rT   rW   r8   )r   rY   r   r   r   Útest_100_close  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S )Ú	HTTPSTestc             C   s   t tdƒs|  d¡ d S )Nr³  zssl support required)r©  r   ÚskipTest)r   r   r   r   rL  !  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 )Nr¹  )rº  )r   r³  r>  r·  r¸  rW   rº  )r   rÕ   r   r   r   Útest_attributes)  s    zHTTPSTest.test_attributesc          
   C   sl   dd l }t d¡ t d¡F t dd¡}|  |j¡}| dd¡ W d Q R X |  	|j
jd¡ W d Q R X d S )Nr   Únetworkzself-signed.pythontest.neti»  rd   rR   ÚCERTIFICATE_VERIFY_FAILED)Ússlr   ÚrequiresÚtransient_internetr   r³  rÂ   ÚSSLErrorrV   rW   rÈ  r  )r   rÕ  rÕ   Úexc_infor   r   r   Útest_networked.  s    
zHTTPSTest.test_networkedc          	   C   sz   dd l }t d¡ t d¡T | ¡ }tjdd|d}| dd¡ | ¡ }| 	¡  |  
d| d	¡¡ | 	¡  W d Q R X d S )
Nr   rÓ  zself-signed.pythontest.neti»  )Úcontextrd   rR   ÚnginxÚserver)rÕ  r   rÖ  r×  Z_create_unverified_contextr   r³  rV   r  r   rw   r‚   )r   rÕ  rÛ  rÕ   rƒ   r   r   r   Útest_networked_noverification8  s    
z'HTTPSTest.test_networked_noverificationc          	   C   sj   t  d¡ t  d¡L t dd¡}| dd¡ | ¡ }| d¡}| ¡  | ¡  |  	d|¡ W d Q R X d S )NrÓ  zwww.python.orgi»  rd   rR   zcontent-typez	text/html)
r   rÖ  r×  r   r³  rV   r  r‚   r   rw   )r   rÕ   rƒ   Úcontent_typer   r   r   Ú&test_networked_trusted_by_default_certF  s    

z0HTTPSTest.test_networked_trusted_by_default_certc          	   C   sª   dd l }t d¡ t d¡„ | |j¡}|  |j|j¡ |  |j	d¡ | 
t¡ tjdd|d}| dd¡ | ¡ }| d	¡}| ¡  | ¡  |  d
|¡ W d Q R X d S )Nr   rÓ  zself-signed.pythontest.netTi»  )rÛ  rd   rR   rÝ  rÜ  )rÕ  r   rÖ  r×  Ú
SSLContextÚPROTOCOL_TLS_CLIENTrW   Úverify_modeÚCERT_REQUIREDÚcheck_hostnameÚload_verify_locationsÚ CERT_selfsigned_pythontestdotnetr   r³  rV   r  r‚   r   rw   )r   rÕ  rÛ  rÕ   rƒ   Zserver_stringr   r   r   Útest_networked_good_certS  s    


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 Q R X |  |jjd¡ W d Q R X d S )	Nr   rÓ  zself-signed.pythontest.neti»  )rÛ  rd   rR   rÔ  )rÕ  r   rÖ  r×  rá  râ  ræ  ÚCERT_localhostr   r³  rÂ   rØ  rV   rW   rÈ  r  )r   rÕ  rÛ  rÕ   rÙ  r   r   r   Útest_networked_bad_certd  s    

z!HTTPSTest.test_networked_bad_certc          	   C   sX   dd l }|  t¡}t d|j¡}|  |j¡}| dd¡ W d Q R X |  	|j
jd¡ d S )Nr   Ú	localhostrd   rR   rÔ  )rÕ  rÑ  ré  r   r³  r   rÂ   rØ  rV   rW   rÈ  r  )r   rÕ  rÝ  rÕ   rÙ  r   r   r   Útest_local_unknown_certp  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Û  rd   z/nonexistenti”  )rÕ  rÑ  ré  rá  râ  ræ  r   r³  r   r<  r   rV   r  rW   r  )r   rÕ  rÝ  rÛ  rÕ   rƒ   r   r   r   Útest_local_good_hostnamey  s    

z"HTTPSTest.test_local_good_hostnamec          	   C   s¶  dd l }|  t¡}| |j¡}| t¡ tjd|j|d}|  	|j
¡ | dd¡ W d Q R X t dtf¡ tjd|j|dd}W d Q R X |  	|j
¡ | dd¡ W d Q R X d	|_t dtf¡ tjd|j|d	d}W d Q R X | 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 Q R X |  	|j
¡ | dd¡ W d Q R X d S )Nr   rë  )rÛ  rd   rR   r`   T)rÛ  rå  Fz/nonexistenti”  )rÕ  rÑ  ÚCERT_fakehostnamerá  râ  ræ  r   r³  r   rÂ   ÚCertificateErrorrV   r   Úcheck_warningsÚDeprecationWarningrå  r  r   rW   r  )r   rÕ  rÝ  rÛ  rÕ   rƒ   r   r   r   Útest_local_bad_hostname†  sB    




z!HTTPSTest.test_local_bad_hostnamer³  z)http.client.HTTPSConnection not availablec             C   s^   xdD ]}|   tjtj|¡ qW x8dD ]0\}}}t |¡}|  ||j¡ |  ||j¡ q&W d S )N)zwww.python.org:abczuser:password@www.python.org))z[fe80::207:e9ff:fe9b]:8000zfe80::207:e9ff:fe9bi@  )zwww.python.org:443zwww.python.orgi»  )zwww.python.org:zwww.python.orgi»  )zwww.python.orgzwww.python.orgi»  )z[fe80::207:e9ff:fe9b]zfe80::207:e9ff:fe9bi»  )z[fe80::207:e9ff:fe9b]:zfe80::207:e9ff:fe9bi»  )rÂ   r   rÓ   r³  rW   r   r   )r   rÔ   rÕ   rÖ   r×   r   r   r   rØ   °  s    

zHTTPSTest.test_host_portN)r%   r&   r'   rL  rÑ  rÒ  rÚ  rÞ  r   Úsystem_must_validate_certrà  rè  rê  rì  rí  rò  rµ  r¶  r©  r   rØ   r   r   r   r   rÍ    s   
	*rÍ  c               @   sX   e Z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 )ÚRequestBodyTestz3Test cases where a request includes a message body.c             C   s,   t  d¡| _tdƒ | j_| _| j| j_d S )Nzexample.comr`   )r   rS   rY   r   rT   )r   r   r   r   rL  È  s    zRequestBodyTest.setUpc             C   s(   t  | jj¡}| ¡  t |¡}||fS )N)r(   r)   rT   r   r4   r   rk  )r   ÚfÚmessager   r   r   Úget_headers_and_fpÍ  s    
z"RequestBodyTest.get_headers_and_fpc          
   C   s°   ddgdfdf}xš|D ]’\}}|   |¡z t d¡| _tdƒ | j_| _| j dd|¡ |  ¡ \}}|  d	|¡ |  d
|¡ |  	| 
d¡d¡ |  	|| ¡ ¡ W d Q R X qW d S )Ns   foos   bars   3
foo
3
bar
0

))s   foos   bars   3
foo
3
bar
0

zexample.comr`   ra   z/urlzContent-TypezContent-LengthzTransfer-Encodingrª   )r“   r   rS   rY   r   rT   rV   r÷  r®   rW   Úgetr1   )r   r–   rZ   r{   r‹   rõ  r   r   r   Útest_list_bodyÓ  s    
zRequestBodyTest.test_list_bodyc             C   sL   | j  dddddi¡ |  ¡ \}}|  d| d¡¡ |  dt| ¡ ƒ¡ d S )Nra   z/urlrZ   zContent-LengthÚ42zcontent-lengthrY  )rY   rV   r÷  rW   rø  rG   r1   )r   rö  rõ  r   r   r   Útest_manual_content_lengthç  s
    
z*RequestBodyTest.test_manual_content_lengthc             C   s`   | j  ddd¡ |  ¡ \}}|  d| ¡ ¡ |  | ¡ ¡ |  d| d¡¡ |  d| ¡ ¡ d S )Nra   z/urlrZ   z
text/plainÚ4zcontent-lengths   body)	rY   rV   r÷  rW   Úget_content_typer»  Úget_charsetrø  r1   )r   rö  rõ  r   r   r   Útest_ascii_bodyð  s    zRequestBodyTest.test_ascii_bodyc             C   s`   | j  ddd¡ |  ¡ \}}|  d| ¡ ¡ |  | ¡ ¡ |  d| d¡¡ |  d| ¡ ¡ d S )Nra   z/urlu   bodyÃz
text/plainÚ5zcontent-lengths   bodyÁ)	rY   rV   r÷  rW   rý  r»  rþ  rø  r1   )r   rö  rõ  r   r   r   Útest_latin1_bodyø  s    z RequestBodyTest.test_latin1_bodyc             C   s`   | j  ddd¡ |  ¡ \}}|  d| ¡ ¡ |  | ¡ ¡ |  d| d¡¡ |  d| ¡ ¡ d S )Nra   z/urls   bodyÁz
text/plainr   zcontent-length)	rY   rV   r÷  rW   rý  r»  rþ  rø  r1   )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 Q R X ttjƒr}| j dd|¡ |  ¡ \}}|  	d| 
¡ ¡ |  | ¡ ¡ |  | d¡¡ |  	d| d¡¡ |  	d	| ¡ ¡ W d Q R X d S )
NÚwrZ   ra   z/urlz
text/plainzcontent-lengthrª   ztransfer-encodings   4
body
0

)r<  r   ÚunlinkÚTESTFNræ   ÚwriterY   rV   r÷  rW   rý  r»  rþ  rø  r1   )r   rõ  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 Q R X ttjdƒn}| j dd|¡ |  ¡ \}}|  	d| 
¡ ¡ |  | ¡ ¡ |  	d| d¡¡ |  d	|¡ |  	d
| ¡ ¡ W d Q R X d S )NÚwbs   bodyÁr   ra   z/urlz
text/plainrª   zTransfer-EncodingzContent-Lengths   5
bodyÁ
0

)r<  r   r  r  ræ   r  rY   rV   r÷  rW   rý  r»  rþ  rø  r®   r1   )r   rõ  rö  r   r   r   Útest_binary_file_body  s    z%RequestBodyTest.test_binary_file_bodyN)r%   r&   r'   r6   rL  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   rZ   rT   r   r   r   rL  '  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‚   rW   )r   rX   r   r   r   Útest_getting_header.  s    z$HTTPResponseTest.test_getting_headerc             C   s   | j  dd¡}|  |d¡ d S )NzNo-Such-Headerzdefault-value)rƒ   r‚   rW   )r   rX   r   r   r   Ú3test_getting_nonexistent_header_with_string_default5  s    zDHTTPResponseTest.test_getting_nonexistent_header_with_string_defaultc             C   s<   | j  dddg¡}|  |d¡ | j  dd¡}|  |d¡ d S )NzNo-Such-HeaderÚdefaultÚvalueszdefault, values)r  r  )rƒ   r‚   rW   )r   rX   r   r   r   Ú5test_getting_nonexistent_header_with_iterable_default9  s    zFHTTPResponseTest.test_getting_nonexistent_header_with_iterable_defaultc             C   s   | j  d¡}|  |d ¡ d S )NzNo-Such-Header)rƒ   r‚   rW   )r   rX   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 )NzNo-Such-Headerrp   )r  )rƒ   r‚   rW   )r   rX   r   r   r   Útest_getting_header_defaultintD  s    z/HTTPResponseTest.test_getting_header_defaultintN)	r%   r&   r'   rL  r  r  r  r  r  r   r   r   r   r
  %  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 )Ú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   rS   rY   r<   )r   Úresponse_textr   r   r   rL  I  s    zTunnelTests.setUpc             C   s   | j  ¡  d S )N)rY   r   )r   r   r   r   r°  S  s    zTunnelTests.tearDownc                s   d‡ fdd„	}|S )Nc                s   t ˆ | d | d dS )Nr   r   )r   r   )r   )r1  rº  r±  )r  r   r   r;   W  s    z9TunnelTests._create_connection.<locals>.create_connection)NNr   )r   r  r;   r   )r  r   r<   V  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 )	Nzdestination.comi¸"  z
User-Agentz!Mozilla/5.0 (compatible, MSIE 11))r   r[   rg   rR   r`   )rY   Ú
set_tunnelrV   rW   rT   r   r   r   Ú	HTTP_PORTÚ_tunnel_hostÚ_tunnel_portÚ_tunnel_headers)r   Ztunnel_hostZtunnel_portÚ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 )Nzdestination.com)rY   r?   rÂ   ÚRuntimeErrorr  )r   r   r   r   Ú&test_disallow_set_tunnel_after_connecth  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 )	Nzdestination.comrg   rR   r`   s   CONNECT destination.coms   Host: destination.com:Nones   Host: destination.coms   Host: proxy.com)rY   r  rV   rW   rT   r   r   r   r  rw   r   r®   )r   r   r   r   Útest_connect_with_tunneln  s    z$TunnelTests.test_connect_with_tunnelc             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 )Nzdestination.comra   rR   r`   s   CONNECT destination.coms   Host: destination.com)rY   r  rV   rW   rT   r   r   r   r  rw   r   )r   r   r   r   Útest_connect_put_request{  s    z$TunnelTests.test_connect_put_requestc          	   C   sz   d}d  |¡}| j d¡ |  |¡| j_| j d¡ t ¡ }| j ddd¡ W d Q R X | ¡  	¡ }|  
d  |¡|¡ d S )	Nz
X-Dummy: 1zHTTP/1.0 200 OK
{}

r   zdestination.comra   rR   r`   z
header: {})rl   rY   Úset_debuglevelr<   r  r   r›   rV   rœ   r   rw   )r   Zexpected_headerr  rž   rŸ   r   r   r   Útest_tunnel_debuglogƒ  s    

z TunnelTests.test_tunnel_debuglogN)r%   r&   r'   rL  r°  r<   r  r  r  r  r   r   r   r   r   r  H  s   
r  Ú__main__rš   )Ú	verbosity)3r-   Úhttpr   r(   rj   Úosrê   r8  r@  rµ  ÚTestCaserû   r   ÚpathÚdirnamerç   ÚhererŒ   ré  rî  rç  r   rÿ   Zchunk_extensionr  r  r»   r  r>  r   r*   r)   r/   rS   r7   rC   r¡   r¾   rH  rc  r\  rh  r¬  r·  rÀ  rÍ  rô  r
  r  r%   Úmainr   r   r   r   Ú<module>   sd   ! l      |"Q.H '`#I
