o
    HXîh< ã                   @   sP  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 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/ƒZ0G d&d'„ d'ƒZ1G d(d)„ d)eƒZ2G d*d+„ d+eƒZ3G d,d-„ d-eƒZ4G d.d/„ d/eƒZ5G d0d1„ d1eƒZ6G d2d3„ d3eƒZ7G d4d5„ d5eƒZ8G d6d7„ d7eƒZ9e:d8kr&ej;d9d: dS dS );é    N)ÚclientÚ
HTTPStatus)Úmock)Úsupport)Ú	os_helper)Úsocket_helper)Úwarnings_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   ú;/opt/python-3.10.19/usr/lib/python3.10/test/test_httplib.pyÚ__init__5   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   ÚmakefileD   s
   
zFakeSocket.makefilec                 C   s
   d| _ d S )NT)r   ©r   r   r   r   r"   L   ó   
zFakeSocket.file_closec                 C   ó   d S ©Nr   r'   r   r   r   r#   O   ó   zFakeSocket.closec                 C   r)   r*   r   )r   ÚlevelZoptnameÚvaluer   r   r   Ú
setsockoptR   r+   zFakeSocket.setsockoptr*   )Ú__name__Ú
__module__Ú__qualname__ÚioÚBytesIOr   r   r&   r"   r#   r.   r   r   r   r   r   4   s    
r   c                   @   ó$   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   r6   r   r   r   r   W   s   
zEPipeSocket.__init__c                 C   s(   | j |v rttjdƒ‚|  j|7  _d S )NZgotcha)r6   ÚOSErrorÚerrnoÚEPIPEr   r   r   r   r   r   \   s   
zEPipeSocket.sendallc                 C   r)   r*   r   r'   r   r   r   r#   a   r+   zEPipeSocket.closeN)r/   r0   r1   r   r   r#   r   r   r   r   r5   U   s    r5   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   ó"   t j | |¡}|dkrtdƒ‚|S ©Nr   zcaller tried to read past EOF)r2   r3   ÚreadÚAssertionError)r   Únr   r   r   r   r>   j   ó   zNoEOFBytesIO.readNc                 C   r<   r=   )r2   r3   Úreadliner?   )r   Úlengthr   r   r   r   rB   p   rA   zNoEOFBytesIO.readline©r;   r*   )r/   r0   r1   Ú__doc__r>   rB   r   r   r   r   r:   d   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   úexample.com)ÚconnectionsÚsuperr   Úfake_socket_argsÚcreate_connectionÚ_create_connection)r   Úargs©Ú	__class__r   r   r   y   s   z!FakeSocketHTTPConnection.__init__c                    s   |  j d7  _ tƒ  ¡ S )z.Count the number of times connect() is invokedr   )rH   rI   Úconnectr'   rN   r   r   rP      s   
z FakeSocketHTTPConnection.connectc                 O   s
   t | jŽ S r*   )r   rJ   ©r   ÚposÚkwr   r   r   rK   „   r(   z*FakeSocketHTTPConnection.create_connection)r/   r0   r1   rE   r   rP   rK   Ú__classcell__r   r   rN   r   rF   v   s
    rF   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 ]7}dD ]2}t d¡}tdƒ|_|ƒ |_d}i }|r,tt|ƒƒ||< | dd	||¡ |  	|jj
| ¡  d
¡ qq
d S )Nc                   @   ó   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      r(   zDHeaderTests.test_auto_headers.<locals>.HeaderCountingBuffer.__init__c                 S   sX   |  d¡}t|ƒdkr$|d  d¡ ¡ }| j |d¡ | j|  d7  < t | |¡ d S )Nó   :r   r   r   )ÚsplitÚlenÚdecodeÚlowerrW   Ú
setdefaultÚlistÚappend)r   ÚitemÚkvZlcKeyr   r   r   r_      s   
zBHeaderTests.test_auto_headers.<locals>.HeaderCountingBuffer.appendN©r/   r0   r1   r   r_   r   r   r   r   ÚHeaderCountingBufferŒ   s    rc   )TF)úContent-lengthZHostzAccept-encodingrG   ZblahblahblahZspamspamspamÚPOSTú/r   )r^   r   ÚHTTPConnectionr   ÚsockÚ_bufferr   rZ   ÚrequestÚassertEqualrW   r\   )r   rc   Zexplicit_headerÚheaderÚconnÚbodyÚheadersr   r   r   Útest_auto_headersˆ   s   

öÿzHeaderTests.test_auto_headersc                 C   sd  G dd„ dt ƒ}d}d}t ||¡D ]%\}}t d¡}td ƒ|_|ƒ |_| |d|¡ |  	|jj
dd |¡¡ qd	}|D ]#}t d¡}td ƒ|_|ƒ |_| |dd ¡ |  	|jj
d d
 |¡¡ q<|D ]#}t d¡}td ƒ|_|ƒ |_| |dd¡ |  	|jj
dd |¡¡ qbt ||¡D ]#}t d¡}td ƒ|_|ƒ |_| |dd¡ |  	|jj
dd |¡¡ qŒd S )Nc                   @   rV   )z?HeaderTests.test_content_length_0.<locals>.ContentLengthCheckerc                 S   s   t  | ¡ d | _d S r*   )r^   r   Úcontent_lengthr'   r   r   r   r   ¨   ó   

zHHeaderTests.test_content_length_0.<locals>.ContentLengthChecker.__init__c                 S   sF   |  dd¡}t|ƒdkr|d  ¡ dkr|d  ¡ | _t | |¡ d S )NrX   r   r   s   content-length)rY   rZ   r\   Ústriprq   r^   r_   )r   r`   ra   r   r   r   r_   «   s   zFHeaderTests.test_content_length_0.<locals>.ContentLengthChecker.appendNrb   r   r   r   r   ÚContentLengthChecker§   s    rt   )NÚ )ÚPUTre   ZPATCHrG   rf   ó   0z%Header Content-Length incorrect on {})ÚGETÚCONNECTZDELETEÚHEADZOPTIONSZTRACEz.Header Content-Length set for empty body on {}ru   ú ó   1)r^   Ú	itertoolsÚproductr   rg   r   rh   ri   rj   rk   rq   ÚformatÚchain)r   rt   ZbodiesZmethods_with_bodyÚmethodrn   rm   Zmethods_without_bodyr   r   r   Útest_content_length_0¥   sR   

þ

þ

þ

þû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 ),NrG   rx   rf   rd   é*   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   rg   r   rh   Ú
putrequestÚ	putheaderÚassertInri   ©r   rm   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::]:81ru   rx   ú/foosE   GET /foo HTTP/1.1
Host: [2001:102A::]
Accept-Encoding: identity

z[2001:102A::])r   rg   r   rh   rj   Ú
assertTruer   Ú
startswith©r   Úexpectedrm   rh   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Úbeginrk   Ú	getheader©r   rn   rh   Ú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 ]}|  | 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-   ru   ZVCHARzobs-textzobs-foldr   z folded with spacezfolded with tab)ÚbytesÚranger   r   r‘   r’   rk   r“   ÚmsgÚjoinÚmapÚchrZassertIsNotNoner‡   r‹   rŒ   Úendswith)r   rn   rh   r•   ZvcharZfoldedr   r   r   Útest_parse_all_octets&  s6   þþýýÿ
ýz!HeaderTests.test_parse_all_octetsc              
   C   sœ   t  d¡}tdƒ|_| dd¡ d}|D ]7\}}|  ||f¡$ |  td¡ | ||¡ W d   ƒ n1 s7w   Y  W d   ƒ n1 sFw   Y  qd S )NrG   ru   rx   rf   ))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   rg   r   rh   r…   ÚsubTestÚassertRaisesRegexÚ
ValueErrorr†   )r   rm   ÚcasesÚnamer-   r   r   r   Útest_invalid_headersD  s   

ÿ€ÿ€ÿz HeaderTests.test_invalid_headersc                 C   sš   d}t |ƒ}tj|dd}t ¡ }| ¡  W d   ƒ n1 s w   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Ú
splitlinesrk   )r   rn   rh   r•   ÚoutputÚlinesr   r   r   Útest_headers_debuglevelb  s   ÿ

ÿz#HeaderTests.test_headers_debuglevelN)r/   r0   r1   rp   r‚   r‰   r   r–   r£   r«   r³   r   r   r   r   rU   ‡   s    B"
rU   c                   @   ó   e Zd Zdd„ ZdS )ÚHttpMethodTestsc              	   C   s`   d}|D ])}|   td¡ t d¡}td ƒ|_|j|dd W d   ƒ n1 s(w   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 charactersrG   rf   )r   Úurl)r§   r¨   r   rg   r   rh   rj   )r   Úmethodsr   rm   r   r   r   Útest_invalid_method_namesu  s   ÿ

ü€ÿz)HttpMethodTests.test_invalid_method_namesN)r/   r0   r1   r¸   r   r   r   r   rµ   t  ó    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 )NrG   r   re   rf   T)Úencode_chunked)r   rg   r   rh   r…   Z
endheadersÚ
_make_bodyÚ_parse_requestr   Ú_parse_chunkedrk   Úexpected_body)r   rm   Ú_rn   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 )NrG   r   re   rf   úTransfer-EncodingÚchunkedúcontent-lengthc                 S   ó   g | ]}|  ¡ ‘qS r   ©r\   ©Ú.0Úkr   r   r   Ú
<listcomp>¡  ó    z>TransferEncodingTest.test_explicit_headers.<locals>.<listcomp>úlatin-1c                 S   rÅ   r   rÆ   rÇ   r   r   r   rÊ   ­  rË   zgzip, chunkedT)ro   r»   rn   c                 S   rÅ   r   rÆ   rÇ   r   r   r   rÊ   ¹  rË   )r   rg   r   rh   rj   r¼   r½   r   ÚassertNotInÚkeysrk   r¿   r[   r¾   ©r   rm   rÀ   ro   rn   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)FTrG   r   re   rf   )Úempty_linesrÂ   rÃ   rÄ   c                 S   rÅ   r   rÆ   rÇ   r   r   r   rÊ   Ë  rË   z5TransferEncodingTest.test_request.<locals>.<listcomp>)r   rg   r   rh   rj   r¼   r½   r   r¾   rk   r¿   rÍ   )r   rÑ   rm   rÀ   ro   rn   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 )NrG   r   re   rf   r   rÂ   rÃ   rÄ   c                 S   rÅ   r   rÆ   rÇ   r   r   r   rÊ   Ô  rË   z8TransferEncodingTest.test_empty_body.<locals>.<listcomp>s   0

)	r   rg   r   rh   rj   r½   r   rk   rÍ   rÏ   r   r   r   Útest_empty_bodyÍ  s   

z$TransferEncodingTest.test_empty_bodyFc                 c   sX    | j  d¡}t|ƒD ]\}}|r|d rdV  |t|ƒd k r&|d V  q|V  qd S )Nó    r¬   r   r   )r¿   rY   Ú	enumeraterZ   )r   rÑ   r²   ÚidxÚliner   r   r   r¼   ×  s   €ùzTransferEncodingTest._make_bodyc                 C   s¨   |  d¡}|d }i }d}|t|ƒk rFt|| ƒdkrF||   d¡\}}| d¡ ¡ }| d¡ ¡ ||< |d7 }|t|ƒk rFt|| ƒdks||d ||d d … ¡fS )Nó   
r   r   rX   rÌ   )rY   rZ   r[   rs   rŸ   )r   r   r²   rj   ro   r@   Úkeyr   r   r   r   r½   â  s   
üz#TransferEncodingTest._parse_requestc                 C   s„   g }i }d}|  d¡}	 |||d … \}}t|dƒ}|dkr$|d7 }n|  |t|ƒ¡ | |¡ |d7 }|t|ƒkr<nqd |¡S )Nr   rØ   Tr¬   é   r   r   )rY   Úintrk   rZ   r_   rŸ   )r   r   rn   Útrailersr@   r²   ÚsizeÚchunkr   r   r   r¾   ï  s"   


ð
z#TransferEncodingTest._parse_chunkedN)F)r/   r0   r1   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`„ Z2dadb„ Z3dcdd„ Z4deS )fÚ	BasicTestc                 C   s"   |   h d£tttdƒƒƒk¡ d S )N>   rª   ÚdescriptionÚphraser-   é”  )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   ó   TextzHTTP/1.1 400.100 Not Ok

Text)r   r   r‘   r’   rk   r>   Ú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 )Nru   zBadStatusLine("''"))r   rì   rk   Ú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 ©Nú*HTTP/1.1 200 Ok
Content-Length: 4

Textr¬   ó   Teó   xt©r   r   r‘   r’   rk   r>   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’   rk   rB   rè   ré   r>   r‹   rê   r#   r”   r   r   r   Útest_mixed_reads7  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Úreadintork   rœ   rè   ré   r‹   rê   r#   ©r   rn   rh   r•   Úbr@   r   r   r   Útest_partial_readintosF  s    


z BasicTest.test_partial_readintosc                 C   sb   d}t |ƒ}t |¡}| ¡  |  | d¡d¡ |  | ¡ ¡ |  |j	¡ | 
¡  |  |j	¡ d S )Nrò   é
   rç   ©r   r   r‘   r’   rk   r>   r‹   ré   rè   rê   r#   r”   r   r   r   Útest_partial_reads_past_endZ  s   
z%BasicTest.test_partial_reads_past_endc                 C   s†   d}t |ƒ}t |¡}| ¡  tdƒ}| |¡}|  |d¡ |  t|ƒd d… d¡ |  | 	¡ ¡ |  
|j¡ | ¡  |  |j¡ d S )Nrò   rþ   é   rç   )r   r   r‘   r’   rù   rú   rk   rœ   r‹   ré   rè   rê   r#   rû   r   r   r   Útest_partial_readintos_past_endf  s   

z)BasicTest.test_partial_readintos_past_endc                 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_lengthu  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ú   rk   rœ   rè   ré   r‹   rû   r   r   r   Ú(test_partial_readintos_no_content_length…  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’   rk   r>   rè   ré   r‹   r”   r   r   r   Ú"test_partial_reads_incomplete_body˜  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   óV   dD ]}|   tjtj|¡ qdD ]\}}}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   Ú
InvalidURLrg   rk   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“   rk   )r   r   ZhdrÚsr   Zcookiesr   r   r   Útest_response_headersÌ  s   

zBasicTest.test_response_headersc                 C   s:   t dtƒ}tj|dd}| ¡  | ¡ r|  d¡ d S d S )Nú*HTTP/1.1 200 OK
Content-Length: 14432

rz   ©r   ú)Did not expect response from HEAD request)r   r:   r   r‘   r’   r>   Úfail©r   rh   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  rz   r  é   r   r  ó        )
r   r:   r   r‘   r’   rù   rú   r  rk   rœ   )r   rh   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   ro   r   r  r   r   r   r   Útest_too_many_headersú  s   
ÿÿ
ÿzBasicTest.test_too_many_headersc              	   C   s„   d}t tdƒ1}t d¡}t|ƒ}||_| dd|¡ |  |j 	|¡d|jd t
|ƒ… |f ¡ W d   ƒ d S 1 s;w   Y  d S )Ns_   GET /foo HTTP/1.1
Host: example.com
Accept-Encoding: identity
Transfer-Encoding: chunked

r    rG   rx   rŠ   z%r != %r)ÚopenÚ__file__r   rg   r   rh   rj   r‹   r   rŒ   rZ   ©r   rŽ   rn   rm   rh   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 testrG   r   rü   )
r   rg   r   rh   Úsendrk   r   Úarrayr2   r3   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      ó   €
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   r;   c                 S   s
   t | jƒS r*   )ÚnextÚd)r   Ú	blocksizer   r   r   r>   (  r(   z<BasicTest.test_send_updating_file.<locals>.UpdatingFile.readNrD   )r/   r0   r1   r$   r/  r>   r   ©r   r   r   ÚUpdatingFile%  s    r2  s   datarG   ru   )	r2   Ú
TextIOBaser   rg   r   rh   r*  rk   r   )r   r2  rŽ   rm   rh   r   r1  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   rn   9  r-  z&BasicTest.test_send_iter.<locals>.bodyrG   ru   rx   rŠ   r›   Z11)r   rg   r   rh   rj   rk   r   r(  r   r   r   Útest_send_iter4  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.é   rG   ©r0  Nó   aó   brv   rf   r›   Ú9r­   ó   

r   )r   rg   r   rh   rj   r2   r3   rk   r   r   rY   )r   r0  rm   rh   rŽ   rn   r   r   r   Útest_blocksize_requestD  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.r6  rG   r7  Nr8  r9  r¬   )
r   rg   r   rh   r*  r2   r3   rk   r   r   )r   r0  rm   rh   rŽ   r   r   r   Útest_blocksize_sendP  s   zBasicTest.test_blocksize_sendc                 C   sR   t  d¡}tdƒ|_|  t¡ | dd|¡ W d   ƒ d S 1 s"w   Y  d S )NrG   ru   re   Útest)r   rg   r   rh   rë   Ú	TypeErrorrj   rˆ   r   r   r   Útest_send_type_error[  s
   

"ÿzBasicTest.test_send_type_errorc                 C   sb  t }ttt t ƒ}tj|dd}| ¡  |  | 	¡ |¡ | 
¡  tddƒD ]+}ttt t ƒ}tj|dd}| ¡  |  | 	|¡| 	|¡ | 	¡  |¡ | 
¡  q&dD ]Z}tt| ƒ}tj|dd}| ¡  zBz| 	¡  W n0 tjyž } z#|  |j|¡ dt|ƒ }|  t|ƒ|¡ |  t|ƒ|¡ W Y d }~n
d }~ww |  d¡ W | 
¡  qT| 
¡  w d S )Nrx   r  r   é   ©ru   zfoo
úIncompleteRead(%d bytes read)úIncompleteRead expected)Úchunked_expectedr   Úchunked_startÚ
last_chunkÚchunked_endr   r‘   r’   rk   r>   r#   r   ÚIncompleteReadÚpartialrZ   rî   r   r  )r   rŽ   rh   r•   r@   Úxr"  Úexpected_messager   r   r   Útest_chunkedb  s:   $
€ü
€òzBasicTest.test_chunkedc                 C   sÔ  t }t|ƒ}tdƒ}ttt t ƒ}tj|dd}| 	¡  | 
|¡}|  |d |… |¡ |  ||¡ | ¡  tddƒD ]N}ttt t ƒ}tj|dd}| 	¡  t|ƒ}| 
|d|… ¡}|| 
|||| … ¡7 }|| 
||d … ¡7 }|  |d |… |¡ |  ||¡ | ¡  q;dD ][}	tt|	 ƒ}tj|dd}| 	¡  zCz| 
|¡}W n0 tjy× } z#|  |j|¡ dt|ƒ }
|  t|ƒ|
¡ |  t|ƒ|
¡ W Y d }~n
d }~ww |  d	¡ W | ¡  qŒ| ¡  w d S )
Nr™   rx   r  r   rA  r   rB  rC  rD  )rE  rZ   rù   r   rF  rG  rH  r   r‘   r’   rú   rk   r#   r   Ú
memoryviewrI  rJ  rî   r   r  )r   rŽ   Z	nexpectedrü   rh   r•   r@   Úmr"  rK  rL  r   r   r   Útest_readinto_chunked‚  sL   

€ü
€ò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
rz   r  r   éÈ   ÚOK)r   rG  rH  r   r‘   r’   rk   r>   ÚstatusÚreasonr‹   ré   rè   rê   r#   )r   rF  rh   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 )	NrQ  rz   r  r  r   r   rR  rS  )r   rG  rH  r   r‘   r’   rù   rú   rk   rœ   rT  rU  r‹   ré   rè   rê   r#   )r   rF  rh   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
rx   r  ó   Hello
)r   r   r‘   r’   rk   r>   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 n2 tjyG } z%|  |jd¡ |  t|ƒd¡ |  t	|ƒd¡ |  
| ¡ ¡ W Y d }~d S d }~ww |  d¡ d S )Nz.HTTP/1.1 200 OK
Content-Length: 10

Hello
rx   r  rX  z-IncompleteRead(7 bytes read, 3 more expected)rD  )r   r   r‘   r’   r>   rI  rk   rJ  rî   r   r‹   ré   r  )r   rh   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-LengthrG   c                      s   ˆ   ddd¡S )Nrv   ú/urlrn   )rj   r   ©rm   r   r   Ú<lambda>ù  s    z&BasicTest.test_epipe.<locals>.<lambda>i‘  zBasic realm="example"zwww-authenticate)
r5   r   rg   rh   rë   r7   Úgetresponserk   rT  r“   r  r   r\  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   rn   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   ra  z

)r   r‘   r   rë   rb  r’   rc  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 w   Y  |  dt|jƒ¡ |  dt|jƒ¡ d S )NzHTTP/1.1 100 OK
r
i €  zgot more than ro   )	r   r‘   r   rë   r$  r’   r‡   r   Ú	exception)r   rn   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	   ra  za
hello world
0

)r   r‘   r   r’   rë   rb  r>   rc  r   r   r   Útest_overflowing_chunked_line  s   þþÿz'BasicTest.test_overflowing_chunked_linec                 C   s`   d}t |ƒ}t |¡}| ¡  |  | ¡ d¡ |  | ¡ ¡ |  |j	¡ | 
¡  |  |j	¡ d S )Nr`  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 )NrG   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   rQ   ©Úresponser   r   r   9  s   z4BasicTest.test_error_leak.<locals>.Response.__init__N)r/   r0   r1   r   r   rk  r   r   ÚResponse8  s    rm  zInvalid status linerx   rf   )r   rg   r‘   Zresponse_classr   rh   rj   rë   rì   r^  r‹   rê   r   )r   rm   rm  r   rk  r   Útest_error_leak4  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   abcrx   r  )rE  r   rF  Úlast_chunk_extendedrH  r   r‘   r’   rk   r>   r#   )r   ÚextrarŽ   rh   r•   r   r   r   Útest_chunked_extensionD  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 streamrx   r  N)
rE  r   rF  rG  r   r‘   r’   rk   r>   r#   ©r   rŽ   rh   r•   r   r   r   Útest_chunked_missing_endN  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 ignoredrx   r  r   N)rE  r   rF  rG  rÜ   rH  r   r‘   r’   rk   r>   r!   r#   rr  r   r   r   Útest_chunked_trailersW  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Ú	extradatarx   r  r   N)rE  r   rF  rG  rÜ   rH  r   r‘   r’   rk   r>   r!   r   r#   )r   rŽ   ru  rh   r•   r   r   r   Útest_chunked_syncb  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 streamó	   extradataó
   Hello123
ó'   HTTP/1.1 200 OK
Content-Length: 10

rx   r  N)r   r   r‘   r’   rk   r>   r!   r#   ©r   ru  rŽ   rh   r•   r   r   r   Útest_content_length_syncn  s   z"BasicTest.test_content_length_syncc                 C   s`   d}d}t d| | ƒ}tj|dd}| ¡  |  | d¡|g¡ |  |j ¡ |¡ | ¡  d S ©Nrw  rx  ry  rx   r  iÐ  )	r   r   r‘   r’   rk   Ú	readlinesr!   r>   r#   rz  r   r   r   Útest_readlines_content_lengthz  s   z'BasicTest.test_readlines_content_lengthc                 C   s^   d}d}t d| | ƒ}tj|dd}| ¡  |  | d¡|¡ |  |j ¡ |¡ | ¡  d S r|  )	r   r   r‘   r’   rk   Úread1r!   r>   r#   rz  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 )Nrw  rx  ry  rx   r  rþ   r   )	r   r   r‘   r’   rk   rB   r!   r>   r#   rz  r   r   r   Ú"test_readline_bound_content_length  s   z,BasicTest.test_readline_bound_content_lengthc                 C   sv   d}d}t d|d  | ƒ}tj|dd}| ¡  |  | d¡|d ¡ |  | ¡ |¡ |  |j ¡ |¡ | ¡  d S )	Nrw  rx  s'   HTTP/1.1 200 OK
Content-Length: 30

r­   rx   r  é   r¬   )	r   r   r‘   r’   rk   r  r>   r!   r#   rz  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¡ | ¡ }z+|  |jt
j¡ t j | ¡ d}z| d	¡ W | ¡  n| ¡  w W | ¡  | ¡  n	| ¡  | ¡  w | ¡  |  ˆ d	¡ d S )
Nr   c               	      sš   ˆ  ¡ \} }| ; |  d¡}	 | ¡ }| d¡snq|  d¡ | ¡ ‰ W d   ƒ n1 s.w   Y  W d   ƒ d S W d   ƒ d S 1 sFw   Y  d S )Nr    TrØ   s'   HTTP/1.1 200 Connection established

)Úacceptr&   rB   Úrstripr   r>   )rm   ÚaddressÚreaderr×   ©ÚresultÚservr   r   Ú
run_server®  s   
ý

Pøz2BasicTest.test_response_fileno.<locals>.run_server)Útargetr   ry   z
dummy:1234)Úfilenos   proxied data
)ÚsocketÚcreate_serverÚHOSTÚ
addCleanupr#   Ú	threadingÚThreadÚstartrŸ   Úfloatr   rg   Úgetsocknamerj   r^  rk   rT  rS  r  r   Údetach)r   r‹  Úthreadrm   rl  r  r   rˆ  r   Útest_response_fileno¨  s,   
ÿ
zBasicTest.test_response_filenoc                 C   ó4   G dd„ dt jƒ}|dƒ}tdƒ|_| dd¡ dS )zv
        It should be possible to override the default validation
        behavior in putrequest (bpo-38216).
        c                   @   r´   )zRBasicTest.test_putrequest_override_domain_validation.<locals>.UnsafeHTTPConnectionc                 S   r)   r*   r   ©r   r¶   r   r   r   Ú_validate_pathÓ  r+   zaBasicTest.test_putrequest_override_domain_validation.<locals>.UnsafeHTTPConnection._validate_pathN)r/   r0   r1   rœ  r   r   r   r   ÚUnsafeHTTPConnectionÒ  r¹   r  rG   ru   rx   z/ N©r   rg   r   rh   r…   ©r   r  rm   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                   @   r´   )zPBasicTest.test_putrequest_override_host_validation.<locals>.UnsafeHTTPConnectionc                 S   r)   r*   r   r›  r   r   r   Ú_validate_hostÜ  r+   z_BasicTest.test_putrequest_override_host_validation.<locals>.UnsafeHTTPConnection._validate_hostN)r/   r0   r1   r¡  r   r   r   r   r  Û  r¹   r  zexample.com
ru   rx   rf   r   )Z	skip_hostrž  rŸ  r   r   r   Ú(test_putrequest_override_host_validationÚ  s   
z2BasicTest.test_putrequest_override_host_validationc                 C   rš  )z›
        It should be possible to override the default encoding
        to transmit bytes in another encoding even if invalid
        (bpo-36274).
        c                   @   r´   )zIBasicTest.test_putrequest_override_encoding.<locals>.UnsafeHTTPConnectionc                 S   s
   |  d¡S )Núutf-8)r   )r   Zstr_urlr   r   r   Ú_encode_requestì  r(   zYBasicTest.test_putrequest_override_encoding.<locals>.UnsafeHTTPConnection._encode_requestN)r/   r0   r1   r¤  r   r   r   r   r  ë  r¹   r  rG   ru   rx   u   /â˜ƒNrž  rŸ  r   r   r   Ú!test_putrequest_override_encodingå  s   
z+BasicTest.test_putrequest_override_encodingN)5r/   r0   r1   rå   rí   rð   rö   r÷   rý   r   r  r  r  r  r  r  r  r  r!  r%  r)  r,  r4  r5  r<  r=  r@  rM  rP  rV  rW  rY  rZ  r_  rd  re  rh  ri  rj  rn  rq  rs  rt  rv  r{  r~  r€  r  rƒ  r™  r   r¢  r¥  r   r   r   r   rß   
  sf    	 +
	%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
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 )Nrx   r  )	r   r²   r   r‘   r’   r2   ÚBufferedReaderÚfpr•   r  r   r   r   ÚsetUp  s
   

zExtendedReadTest.setUpc                    sÌ   | j }|jj‰ d‡ fdd„	}||j_g }	 | d¡}|rH|  t|ƒd¡ | ¡ }|  t|ƒt|ƒ¡ |  | |¡¡ | t|ƒ¡}|  	||¡ n	| ¡ }|  
|¡ | |¡ |sYnq|  	d |¡| j¡ d S )	Nr;   c                    s(   ˆ | ƒ}| dkr|d | … S |d d… S )Nr   rþ   r   )r@   r  ©Zoldpeekr   r   Úmypeek  s   z*ExtendedReadTest.test_peek.<locals>.mypeekTr­   r   r   rD   )r•   r©  ÚpeekÚassertGreaterrZ   ZassertGreaterEqualr‹   rŒ   r>   rk   rè   r_   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_readlinerB   r¯  )r   r•   r   r   r   Útest_readline:  s   zExtendedReadTest.test_readlinec                 C   s^   g }	 |dƒ}|r|dkrt |ƒdk r|  | d¡¡ | |¡ |s#nq|  d |¡|¡ d S )NTr  ó   fooó   
r   )rZ   r‹   r¢   r_   rk   rŸ   )r   rB   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 )Nr  )r  ÚassertLessEqualrZ   )Úres©r•   r   r   r   r   M  s   
z&ExtendedReadTest.test_read1.<locals>.r)r•   Ú	Readlinerr²  rB   r¯  )r   r   Z	readlinerr   r¸  r   Ú
test_read1K  s   zExtendedReadTest.test_read1c                 C   s>   | j }g }	 | ¡ }|sn| |¡ q|  d |¡| j¡ d S )NTr   )r•   r  r_   rk   rŸ   r¯  ©r   r•   r°  r   r   r   r   Útest_read1_unboundedT  s   
üz%ExtendedReadTest.test_read1_unboundedc                 C   sP   | j }g }	 | d¡}|sn|  t|ƒd¡ | |¡ q|  d |¡| j¡ d S )NTrþ   r   )r•   r  r¶  rZ   r_   rk   rŸ   r¯  r»  r   r   r   Útest_read1_bounded^  s   

ûz#ExtendedReadTest.test_read1_boundedc                 C   s   |   | j d¡d¡ d S )Nr   r   )rk   r•   r  r'   r   r   r   Útest_read1_0i  ó   zExtendedReadTest.test_read1_0c                 C   s    | j  d¡}|  dt|ƒ¡ d S ©Nr   )r•   r­  r¶  rZ   )r   r  r   r   r   Útest_peek_0l  s   zExtendedReadTest.test_peek_0)r/   r0   r1   rE   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ZdS )ÚExtendedReadTestChunkedz:
    Test peek(), read1(), readline() in chunked mode
    r§  N)r/   r0   r1   rE   r²   r   r   r   r   rÃ  q  s    ÿrÃ  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   rÄ  r   r   r   r   ‹  s   
zReadliner.__init__c                 C   s¨   g }d}| j }zB	 | d¡}|dkrn|t|ƒ |kr!|| d }| |¡ |  ¡ }|s/d}nq	|d7 }| |d |… ¡ ||d … | _ d |¡W S    d |¡| _ ‚ )Nr   Trµ  r;   r   r   )rÅ  rÂ  rZ   r_   rÄ  rŸ   )r   Úlimitr   Zdatalenr>   rÖ   r   r   r   rB     s.   

õzReadliner.readlineN)r/   r0   r1   rE   r   rB   r   r   r   r   r¹  ‡  s    r¹  c                   @   r4   )Ú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À   r0   zhttp.client)rä   r   rŒ   ÚgetattrÚaddZassertCountEqualÚ__all__)r   rŽ   Zdenylistrª   Zmodule_objectr   r   r   Útest_allª  s   

€zOfflineTest.test_allc                 C   s   |   tjtj d¡ d S )Nz	Not Found)rk   r   rÈ  Ú	NOT_FOUNDr'   r   r   r   Útest_responses¸  r¿  zOfflineTest.test_responsesc              	   C   sR   g d¢}|D ] }| j |d |  tt|ƒ¡ W d   ƒ n1 s!w   Y  qd S )N):ZCONTINUEZSWITCHING_PROTOCOLSZ
PROCESSINGrS  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/   r0   r1   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*   )rŽ  ÚAF_INETÚSOCK_STREAMrŠ  r   Ú	bind_portr   Zfind_unused_portÚsource_portÚlistenrm   r'   r   r   r   rª  ÿ  s
   


zSourceAddressTest.setUpc                 C   s*   | j r| j  ¡  d | _ | j ¡  d | _d S r*   )rm   r#   rŠ  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 )Nru   ©Úsource_addressr   )
r   rg   r  r   r×  rm   rP   rk   rh   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 )Nru   rÚ  )r   rÝ  r  r   r×  rm   r'   r   r   r   Ú testHTTPSConnectionSourceAddress  s   
ÿz2SourceAddressTest.testHTTPSConnectionSourceAddressN)r/   r0   r1   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*   )	rŽ  rÔ  rÕ  rŠ  r   rÖ  rá  ÚPORTrØ  r'   r   r   r   rª     s   zTimeoutTest.setUpc                 C   s   | j  ¡  d | _ d S r*   )rŠ  r#   r'   r   r   r   rÙ  %  rr   zTimeoutTest.tearDownc              	   C   s  |   t ¡ ¡ t d¡ zt ttj¡}| 	¡  W t d ¡ nt d ¡ w |  
|j ¡ d¡ | ¡  |   t ¡ ¡ t d¡ ztjttjd d}| 	¡  W t d ¡ nt d ¡ w |  
|j ¡ d ¡ | ¡  tjttjdd}| 	¡  |  
|j ¡ d¡ | ¡  d S ©Né   )Útimeout)ÚassertIsNonerŽ  ÚgetdefaulttimeoutÚsetdefaulttimeoutr   rg   r  rá  râ  rP   rk   rh   Ú
gettimeoutr#   )r   ZhttpConnr   r   r   ÚtestTimeoutAttribute)  s,   



ÿ
z TimeoutTest.testTimeoutAttribute)r/   r0   r1   râ  rª  rÙ  rê  r   r   r   r   rá    s
    rá  c                   @   r4   )ÚPersistenceTestc              
   C   sú   d}|D ]v\}}}| j ||db d ||¡}t|ƒ}|  |j¡ | dd¡ | ¡ }|  |jd u | ¡ | ¡  W d   ƒ n1 sDw   Y  |  |jd u | ¡ |  |j	d¡ | dd¡ |  |j	|rhdnd¡ W d   ƒ n1 suw   Y  qd S )	N))ú1.0ru   F)rì  zConnection: keep-alive
T)ú1.1ru   T)rí  zConnection: close
F)rì  zConnection: keep-ALIVE
T)rí  zConnection: cloSE
F)Úversionrl   z4HTTP/{} 200 OK
{}Content-Length: 12

Dummy body
rx   z/open-connectionr   z/subsequent-requestr¬   )
r¦   r   rF   ræ  rh   rj   r^  rk   r>   rH   )r   Útestsrî  rl   Zreuserž   rm   rl  r   r   r   Útest_reuse_reconnectM  s(   ú

þï€ÿz$PersistenceTest.test_reuse_reconnectc              	   C   s¤   dd„ }t jtjf|tff}|D ]?\}}| j|d- td|ƒ}| dd¡ |  ||j	¡ |  
|j¡ | dd¡ |  |jd¡ W d   ƒ n1 sJw   Y  q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 rÀ  )r2   r3   rú   ÚConnectionResetError)ÚbufferrÝ   ©Ústreamr   r   rú   p  s   zNPersistenceTest.test_disconnected.<locals>.make_reset_reader.<locals>.readinto)r2   r3   rú   r¨  )r   rú   r   ró  r   Úmake_reset_readerm  s   

z<PersistenceTest.test_disconnected.<locals>.make_reset_reader)rf  r   rx   z/eof-responseú
/reconnectr¬   )r2   r3   r   ÚRemoteDisconnectedrñ  r¦   rF   rj   rë   r^  ræ  rh   rk   rH   )r   rõ  rï  Zstream_factoryrf  rm   r   r   r   Útest_disconnectedk  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

rx   rf   ZExpectz100-continue)ro   rö  r¬   )
rF   rj   rë   r   r÷  r^  ræ  rh   rk   rH   rˆ   r   r   r   Útest_100_close†  s   ÿzPersistenceTest.test_100_closeN)r/   r0   r1   rð  rø  rù  r   r   r   r   rë  K  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 d S )NrÝ  zssl support required)rÐ  r   ÚskipTestr'   r   r   r   rª  •  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Ý  r  rá  râ  rk   rå  )r   r  r   r   r   Útest_attributes  s   zHTTPSTest.test_attributesc              	   C   s–   dd l }t d¡ t d¡3 t dd¡}|  |j¡}| 	dd¡ W d   ƒ n1 s,w   Y  |  
|jjd¡ W d   ƒ d S 1 sDw   Y  d S )Nr   Únetworkúself-signed.pythontest.neté»  rx   rf   ÚCERTIFICATE_VERIFY_FAILED)Ússlr   Úrequiresr   Útransient_internetr   rÝ  rë   ÚSSLErrorrj   rk   rf  rU  )r   r  r  Úexc_infor   r   r   Útest_networked¢  s   
ÿ"üzHTTPSTest.test_networkedc                 C   s   dd l }t d¡ t d¡0 | ¡ }tjdd|d}| dd¡ | 	¡ }| 
¡  |  d| d	¡¡ | 
¡  W d   ƒ d S 1 sAw   Y  d S )
Nr   r   r  r  ©Úcontextrx   rf   ÚnginxÚserver)r  r   r  r   r  Z_create_unverified_contextr   rÝ  rj   r^  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¡, t dd¡}| dd¡ | ¡ }| d¡}| 	¡  | 	¡  |  
d|¡ W d   ƒ d S 1 s9w   Y  d S )Nr   r  r  rx   rf   zcontent-typez	text/html)r   r  r   r  r   rÝ  rj   r^  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 |¡o | |j¡}|  |j|j	¡ |  |j
d¡ | t¡ ztj|d|d}| dd¡ | ¡ }W n$ |jyc } zt|ƒ}t d	|¡r^t d
|› d|› d¡‚‚ d }~ww | d¡}| ¡  | ¡  |  d|¡ W d   ƒ d S 1 s‚w   Y  d S )Nr   r   r  Tr  r
  rx   rf   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_CLIENTrk   Zverify_modeZCERT_REQUIREDÚcheck_hostnameÚload_verify_locationsÚ CERT_selfsigned_pythontestdotnetr   rÝ  rj   r^  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Ç  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   ƒ n1 s9w   Y  |  |jjd¡ W d   ƒ d S 1 sQw   Y  d S )	Nr   r   r  r  r
  rx   rf   r  )r  r   r  r   r  r  r  r  ÚCERT_localhostr   rÝ  rë   r  rj   rk   rf  rU  )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 s'w   Y  |  	|j
jd¡ d S )Nr   Ú	localhostrx   rf   r  )r  rþ  r  r   rÝ  r   rë   r  rj   rk   rf  rU  )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
  rx   ú/nonexistentrâ   )r  rþ  r  r  r  r  r   rÝ  r   r‘  r#   rj   r^  rk   rT  ©r   r  r  r  r  r•   r   r   r   Útest_local_good_hostnameý  s   

z"HTTPSTest.test_local_good_hostnamec                 C   s2  dd l }|  t¡}| |j¡}| t¡ tjd|j|d}|  	|j
¡ | dd¡ W d   ƒ n1 s4w   Y  t dtf¡ tjd|j|dd}W d   ƒ n1 sUw   Y  |  	|j
¡ | dd¡ W d   ƒ n1 sqw   Y  d	|_t dtf¡ tjd|j|d	d}W d   ƒ n1 s•w   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ôw   Y  |  	|j
¡ | dd¡ W d   ƒ d S 1 sw   Y  d S )Nr   r  r
  rx   rf   ru   T)r  r  Fr  râ   )r  rþ  ÚCERT_fakehostnamer  r  r  r   rÝ  r   rë   ZCertificateErrorrj   r   Zcheck_warningsÚDeprecationWarningr  r^  r#   rk   rT  r  r   r   r   Útest_local_bad_hostname
  sT   

ÿ
ÿÿÿ
ÿÿ
ÿÿ$ÿz!HTTPSTest.test_local_bad_hostnamerÝ  z)http.client.HTTPSConnection not availablec                 C   r  )Nr	  )r
  )zwww.python.org:443r  r  )r  r  r  )r  r  r  )r  r  r  )r  r  r  )rë   r   r  rÝ  rk   r   r   r  r   r   r   r  4  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 ¡  t ddt¡ tjdd|td}W d   ƒ n1 sZw   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_phaH  s&   

ÿ
ÿýzHTTPSTest.test_tls13_phaN)r/   r0   r1   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ú  “  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 )NrG   ru   )r   rg   rm   r   rh   r'   r   r   r   rª  a  s   zRequestBodyTest.setUpc                 C   s(   t  | jj¡}| ¡  t |¡}||fS r*   )r2   r3   rh   r   rB   r   rÉ  ©r   ÚfÚmessager   r   r   Úget_headers_and_fpf  s   
z"RequestBodyTest.get_headers_and_fpc              	   C   sÀ   ddgdfdf}|D ]S\}}|   |¡B t d¡| _tdƒ | j_| _| j dd|¡ |  ¡ \}}|  d	|¡ |  d
|¡ |  	| 
d¡d¡ |  	|| ¡ ¡ W d   ƒ n1 sXw   Y  q
d S )Nr´  ó   baró   3
foo
3
bar
0

))r´  r,  r-  rG   ru   rv   r[  zContent-Typer›   rÂ   rÃ   )r¦   r   rg   rm   r   rh   rj   r+  rÍ   rk   Úgetr>   )r   r©   rn   rŽ   rž   r)  r   r   r   Útest_list_bodyl  s    
þ÷€ÿzRequestBodyTest.test_list_bodyc                 C   sL   | j  dddddi¡ |  ¡ \}}|  d| d¡¡ |  dt| ¡ ƒ¡ d S )Nrv   r[  rn   r›   Z42rÄ   r  )rm   rj   r+  rk   r.  rZ   r>   ©r   r*  r)  r   r   r   Útest_manual_content_length€  s   ÿz*RequestBodyTest.test_manual_content_lengthc                 C   ó`   | j  ddd¡ |  ¡ \}}|  d| ¡ ¡ |  | ¡ ¡ |  d| d¡¡ |  d| ¡ ¡ d S )Nrv   r[  rn   ú
text/plainÚ4rÄ   s   body©	rm   rj   r+  rk   Úget_content_typeræ  Úget_charsetr.  r>   r0  r   r   r   Útest_ascii_body‰  ó   zRequestBodyTest.test_ascii_bodyc                 C   r2  )Nrv   r[  u   bodyÃr3  Ú5rÄ   ó   bodyÁr5  r0  r   r   r   Útest_latin1_body‘  r9  z RequestBodyTest.test_latin1_bodyc                 C   s`   | j  ddd¡ |  ¡ \}}|  d| ¡ ¡ |  | ¡ ¡ |  d| d¡¡ |  d| ¡ ¡ d S )Nrv   r[  r;  r3  r:  rÄ   r5  r0  r   r   r   Útest_bytes_body™  r9  zRequestBodyTest.test_bytes_bodyc                 C   sê   |   tjtj¡ ttjddd}| d¡ W d   ƒ n1 s w   Y  ttjdd?}| j dd|¡ |  ¡ \}}|  	d| 
¡ ¡ |  | ¡ ¡ |  | d¡¡ |  	d	| d
¡¡ |  	d| ¡ ¡ W d   ƒ d S 1 snw   Y  d S )NÚwr£  )Úencodingrn   rv   r[  r3  rÄ   rÃ   ztransfer-encodings   4
body
0

)r‘  r   ÚunlinkÚTESTFNr&  Úwriterm   rj   r+  rk   r6  ræ  r7  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   ƒ n1 sw   Y  ttjdƒ=}| j dd|¡ |  ¡ \}}|  	d| 
¡ ¡ |  | ¡ ¡ |  	d| d¡¡ |  d	|¡ |  	d
| ¡ ¡ W d   ƒ d S 1 siw   Y  d S )NÚwbr;  r    rv   r[  r3  rÃ   rÂ   r›   s   5
bodyÁ
0

)r‘  r   r@  rA  r&  rB  rm   rj   r+  rk   r6  ræ  r7  r.  rÍ   r>   r(  r   r   r   Útest_binary_file_body°  s   ÿ"ùz%RequestBodyTest.test_binary_file_bodyN)r/   r0   r1   rE   rª  r+  r/  r1  r8  r<  r=  rC  rE  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   rn   rh   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“   rk   ©r   rl   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-valuerG  rH  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 )NrJ  ÚdefaultÚvalueszdefault, values)rL  rM  rG  rH  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 )NrJ  rG  rH  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 )NrJ  rƒ   )rL  rG  rH  r   r   r   Útest_getting_header_defaultintÝ  s   z/HTTPResponseTest.test_getting_header_defaultintN)	r/   r0   r1   rª  rI  rK  rN  rO  rP  r   r   r   r   rF  ¾  s    rF  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   rg   rm   rL   )r   Úresponse_textr   r   r   rª  â  s
   ÿzTunnelTests.setUpc                 C   s   | j  ¡  d S r*   )rm   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   )r†  rå  rÛ  ©rR  r   r   rK   ð  s   z9TunnelTests._create_connection.<locals>.create_connection)NNr   )r   rR  rK   r   rS  r   rL   ï  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   ro   rz   rf   ru   )rm   Ú
set_tunnelrj   rk   rh   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 )NrT  )rm   rP   rë   ÚRuntimeErrorrU  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 )	NrT  rz   rf   ru   ó   CONNECT destination.coms   Host: destination.com:Noneó   Host: destination.coms   Host: proxy.com)rm   rU  rj   rk   rh   r   r   r   rV  r‡   r   rÍ   r'   r   r   r   Útest_connect_with_tunnel  s   z$TunnelTests.test_connect_with_tunnelc                 C   s¶   t j | jd¡}| j d¡ | j ¡  | j dd¡ W d  ƒ n1 s%w   Y  | ¡  | jt	|j
ƒdd|j
› d |j
d	 d d	 }|  d
|¡ | j| d¡d|›d dS )z8Regresstion test for https://bugs.python.org/issue43332.r*  rT  rx   rf   Nr   z!unexpected number of send calls: )rž   r   rZ  r;  zunexpected proxy data sent )r   ZpatchÚobjectrm   rU  rP   rj   Zassert_calledr®  rZ   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 )NrT  rv   rf   ru   rZ  r[  )rm   rU  rj   rk   rh   r   r   r   rV  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 s1w   Y  | ¡  	¡ }|  
d  |¡|¡ d S )	Nz
X-Dummy: 1zHTTP/1.0 200 OK
{}

r   rT  rv   rf   ru   z
header: {})r   rm   Zset_debuglevelrL   rU  r   r®   rj   r¯   r°   r‡   )r   Zexpected_headerrR  r±   r²   r   r   r   Útest_tunnel_debuglog-  s   

ÿz TunnelTests.test_tunnel_debuglogN)r/   r0   r1   rª  rÙ  rL   rW  rY  r\  r^  r_  r`  r   r   r   r   rQ  á  s    
rQ  Ú__main__r¬   )Ú	verbosity)<r8   Úhttpr   r   r2   r}   Úosr+  r  rŽ  r’  r#  rß  r   ZTestCaser>  r   Ztest.supportr   r   r   ÚpathÚdirnamer'  ÚhererŸ   r  r  r  rF  rE  Zchunk_extensionrG  ro  rÜ   rH  r  r   r5   r3   r:   rg   rF   rU   rµ   rº   rß   r¦  rÃ  r¹  rÇ  rÓ  rá  rë  rú  r'  rF  rQ  r/   Úmainr   r   r   r   Ú<module>   sx    ÿ! n      o}"U.H L`#
Zÿ