Your IP : 216.73.216.213


Current Path : /opt/alt/python35/lib64/python3.5/test/__pycache__/
Upload File :
Current File : //opt/alt/python35/lib64/python3.5/test/__pycache__/test_httplib.cpython-35.opt-1.pyc



��Yf��@s�ddlZddlmZddlZddlZddlZddlZddlZddlZej	Z	ddl
mZejj
e�Zejjed�Zejjed�Zejjed�ZdZdZd	Zd
ZdedZd
ZdZejZGdd�d�ZGdd�de�ZGdd�dej�ZGdd�dej �Z!Gdd�de	�Z"Gdd�de	�Z#Gdd�de	�Z$Gdd�de$�Z%Gdd�d�Z&Gd d!�d!e	�Z'Gd"d#�d#e	�Z(Gd$d%�d%e	�Z)Gd&d'�d'e	�Z*Gd(d)�d)e	�Z+Gd*d+�d+e	�Z,Gd,d-�d-e	�Z-Gd.d/�d/e	�Z.ej/dd0d1��Z0e1d2kr�e0�dS)3�N)�client)�supportzkeycert.pemzkeycert2.pemzselfsigned_pythontestdotnet.pemz{HTTP/1.1 200 OK
Transfer-Encoding: chunked

a
hello worl
3
d! 
8
and now 
22
for something completely different
s7hello world! and now for something completely differentz;foo=barz0
�0z
zX-Dummy: foo
X-Dumm2: bar
c@sgeZdZejdddd�Zdd�Zddd�Zdd	�Zd
d�Z	dd
�Z
dS)�
FakeSocketNcCsat|t�r|jd�}||_||_d|_d|_d|_||_||_	dS)N�ascii�rF)
�
isinstance�str�encode�text�	fileclass�data�
sendall_calls�file_closed�host�port)�selfrrrr�r�6/opt/alt/python35/lib64/python3.5/test/test_httplib.py�__init__-s						zFakeSocket.__init__cCs"|jd7_|j|7_dS)N�)rr
)rr
rrr�sendall8szFakeSocket.sendallcCsO|dkr$|dkr$tj��|j|j�|_|j|j_|jS)N�r�rb)rZUnimplementedFileModerr�file�
file_close�close)r�mode�bufsizerrr�makefile<s
zFakeSocket.makefilecCs
d|_dS)NT)r)rrrrrDszFakeSocket.file_closecCsdS)Nr)rrrrrGszFakeSocket.closecCsdS)Nr)r�levelZoptname�valuerrr�
setsockoptJszFakeSocket.setsockopt)�__name__�
__module__�__qualname__�io�BytesIOrrrrrr"rrrrr,src@s4eZdZdd�Zdd�Zdd�ZdS)�EPipeSocketcCstj||�||_dS)N)rr�pipe_trigger)rrr)rrrrOszEPipeSocket.__init__cCs4|j|kr!ttjd��|j|7_dS)NZgotcha)r)�OSError�errnoZEPIPEr
)rr
rrrrTszEPipeSocket.sendallcCsdS)Nr)rrrrrYszEPipeSocket.closeN)r#r$r%rrrrrrrr(Msr(c@s4eZdZdZddd�Zddd�ZdS)	�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.
    rcCs1tjj||�}|dkr-td��|S)Nrzcaller tried to read past EOF)r&r'�read�AssertionError)r�nr
rrrr-bszNoEOFBytesIO.readNcCs1tjj||�}|dkr-td��|S)Nrzcaller tried to read past EOF)r&r'�readliner.)rZlengthr
rrrr0hszNoEOFBytesIO.readline���)r#r$r%�__doc__r-r0rrrrr,\sr,csFeZdZdZ�fdd�Z�fdd�Zdd�Z�S)�FakeSocketHTTPConnectionz@HTTPConnection subclass using FakeSocket; counts connect() callscs2d|_t�jd�||_|j|_dS)Nrzexample.com)�connections�superr�fake_socket_args�create_connection�_create_connection)r�args)�	__class__rrrqs		z!FakeSocketHTTPConnection.__init__cs|jd7_t�j�S)z.Count the number of times connect() is invokedr)r4r5�connect)r)r:rrr;wsz FakeSocketHTTPConnection.connectcOs
t|j�S)N)rr6)r�pos�kwrrrr7|sz*FakeSocketHTTPConnection.create_connection)r#r$r%r2rr;r7rr)r:rr3nsr3c@sdeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)�HeaderTestscCs�Gdd�dt�}x�dD]�}x�dD]�}tjd�}td	�|_|�|_d
}i}|r�tt|��||<|jdd||�|j	|jj
|j�d
�q*WqWdS)Nc@s(eZdZdd�Zdd�ZdS)z;HeaderTests.test_auto_headers.<locals>.HeaderCountingBuffercSs
i|_dS)N)�count)rrrrr�szDHeaderTests.test_auto_headers.<locals>.HeaderCountingBuffer.__init__cSsr|jd�}t|�dkr^|djd�j�}|jj|d�|j|d7<tj||�dS)N�:rrr)�split�len�decode�lowerr?�
setdefault�list�append)r�item�kvZlcKeyrrrrG�szBHeaderTests.test_auto_headers.<locals>.HeaderCountingBuffer.appendN)r#r$r%rrGrrrr�HeaderCountingBuffer�srJTF�Content-length�Host�Accept-encodingzexample.comZblahblahblahZspamspamspam�POST�/r)TF)rKrLrM)rFr�HTTPConnectionr�sock�_bufferr	rB�request�assertEqualr?rD)rrJZexplicit_header�header�conn�body�headersrrr�test_auto_headers�s

zHeaderTests.test_auto_headerscCs
Gdd�dt�}d}d}xtj||�D]k\}}tjd�}td�|_|�|_|j|d|�|j	|jj
d	d
j|��q5Wd}xm|D]e}tjd�}td�|_|�|_|j|dd�|j	|jj
ddj|��q�Wxm|D]e}tjd�}td�|_|�|_|j|dd�|j	|jj
d	d
j|��q!Wxytj||�D]e}tjd�}td�|_|�|_|j|dd�|j	|jj
dd
j|��q�WdS)Nc@s(eZdZdd�Zdd�ZdS)z?HeaderTests.test_content_length_0.<locals>.ContentLengthCheckercSstj|�d|_dS)N)rFr�content_length)rrrrr�s
zHHeaderTests.test_content_length_0.<locals>.ContentLengthChecker.__init__cSsa|jdd�}t|�dkrM|dj�dkrM|dj�|_tj||�dS)Nr@rrscontent-length)rArBrD�striprZrFrG)rrHrIrrrrG�s(zFHeaderTests.test_content_length_0.<locals>.ContentLengthChecker.appendN)r#r$r%rrGrrrr�ContentLengthChecker�sr\��PUTrN�PATCHzexample.comrO�0z%Header Content-Length incorrect on {}�GET�CONNECT�DELETE�HEAD�OPTIONS�TRACEz.Header Content-Length set for empty body on {}� �1)Nr])r^rNr_)rarbrcrdrerf)
rF�	itertools�productrrPrrQrRrSrTrZ�format�chain)rr\ZbodiesZmethods_with_body�methodrWrVZmethods_without_bodyrrr�test_content_length_0�sH

z!HeaderTests.test_content_length_0cCstjd�}td�|_|jdd�|jdd�|jd|j�|jdd�|jd	|j�|jd
d�|jd|j�|jd
d�|jd|j�|jddd�|jd|j�|jdd�|jd|j�|jdd�|jd|j�|jdd�|jd|j�|jdd�|jd|j�|jd d!�|jd"|j�|jd#d$�|jd%|j�|jd&d$�|jd'|j�|jd(d$�|jd)|j�|jd*d$�|jd+|j�dS),Nzexample.comrarOzContent-length�*sContent-length: 42ZFooz bar s
Foo:  bar ZBarz	baz	s
Bar: 	baz	Z
AuthorizationzBearer mytokensAuthorization: Bearer mytokenZ
IterHeaderZIterAZIterBsIterHeader: IterA
	IterBZLatinHeaders�sLatinHeader: �Z
Utf8HeadersÀsUtf8Header: Àz
C1-Controls	next�linesC1-Control: next�linezEmbedded-Fold-Spacezis
 alloweds!Embedded-Fold-Space: is
 allowedzEmbedded-Fold-Tabzis
	allowedsEmbedded-Fold-Tab: is
	allowedz	Key Spacer!sKey Space: valuez	KeySpace sKeySpace : valuesNonbreak�SpacesNonbreak�Space: values�NonbreakSpaces�NonbreakSpace: value)rrPrrQ�
putrequest�	putheader�assertInrR)rrVrrr�test_putheader�s>zHeaderTests.test_putheadercCs�d}tjd�}td�}||_|jdd�|j|jj|��d}tjd�}td�}||_|jdd�|j|jj|��dS)NsCGET /foo HTTP/1.1
Host: [2001::]:81
Accept-Encoding: identity

z[2001::]:81r]raz/foosEGET /foo HTTP/1.1
Host: [2001:102A::]
Accept-Encoding: identity

z
[2001:102A::])rrPrrQrS�
assertTruer
�
startswith)r�expectedrVrQrrr�test_ipv6host_headers		z HeaderTests.test_ipv6host_headercCsad}t|�}tj|�}|j�|j|jd�d�|j|jd�d�dS)Nz4HTTP/1.1 200 OK
First: val
: nval
Second: val

ZFirst�valZSecond)rr�HTTPResponse�beginrT�	getheader)rrWrQ�resprrr�!test_malformed_headers_coped_withs
z-HeaderTests.test_malformed_headers_coped_withcCs�dttdd��dttdd��d}t|�}tj|�}|j�|j|jd	�d
�|j|jd	d
�|j|jd�d�|j|jdd�d
j	t
ttdd���}|j|jd�|�|j|jd|�|j|jd��|j
d|j�x`|jd�|jdfD]B}|j|jd��|j
d|�|j|jd��qPWdS)Ns0HTTP/1.1 200 OK
!#$%&'*+-.^_`|~: value
VCHAR: �!�~rs
obs-text: ��sM
obs-fold: text
 folded with space
	folded with tab
Content-Length: 0

zContent-Lengthrz!#$%&'*+-.^_`|~r!r]ZVCHARzobs-textzobs-foldrz folded with spacezfolded with tab��r�)�bytes�rangerrryrzrTr{�msg�join�map�chrZassertIsNotNonerrrtru�endswith)rrWrQr|ZvcharZfoldedrrr�test_parse_all_octetss"4
!#z!HeaderTests.test_parse_all_octetscCs�tjd�}td�|_|jdd�d(}x[|D]S\}}|j||f��/|jtd��|j||�WdQRXWdQRXq;WdS))Nzexample.comr]rarO�
Invalid
Name�
ValidValue�Invalid
Name�Invalid
Name�

InvalidName�
InvalidName�
InvalidName� InvalidName�	InvalidName�Invalid:Name�:InvalidName�	ValidName�Invalid
Value�
Invalid
Value�
Invalid
Value�InvalidValue
�
InvalidValue
�
InvalidValue
zInvalid header�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�r�r�r�)	rrPrrQrp�subTest�assertRaisesRegex�
ValueErrorrq)rrVZcases�namer!rrr�test_invalid_headers<s.z HeaderTests.test_invalid_headersN)
r#r$r%rYrnrsrwr}r�r�rrrrr>sB"
r>c@seZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;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�	BasicTestcCs�d}t|�}tj|�}|j�|j|jd�d�|j|j��|j|j�|j|j�d�|j	|j��|j|j�|j
�|j	|j�d}t|�}tj|�}|jtj|j�dS)NzHTTP/1.1 200 Ok

TextrrsTextzHTTP/1.1 400.100 Not Ok

Text)
rrryrzrTr-�assertFalse�isclosed�closedrtr�assertRaises�
BadStatusLine)rrWrQr|rrr�test_status_lines\s 

zBasicTest.test_status_linescCs)tjd�}|jt|�d�dS)Nr]zBadStatusLine("''",))rr�rT�repr)r�excrrr�test_bad_status_reprqszBasicTest.test_bad_status_reprcCs�d}t|�}tj|�}|j�|j|jd�d�|j|j��|j|jd�d�|j|j��|j|j	�|j
�|j|j	�dS)Nz*HTTP/1.1 200 Ok
Content-Length: 4

Text�sTesxt)rrryrzrTr-r�r�rtr�r)rrWrQr|rrr�test_partial_readsus

zBasicTest.test_partial_readscCs�d}t|�}tj|�}|j�|j|j�d�|j|j��|j|j�d�|j	|j��|j|j
�|j�|j	|j
�dS)Nz4HTTP/1.1 200 Ok
Content-Length: 13

Text
AnothersText
sAnother)rrryrzrTr0r�r�r-rtr�r)rrWrQr|rrr�test_mixed_reads�s

zBasicTest.test_mixed_readscCs�d}t|�}tj|�}|j�td�}|j|�}|j|d�|jt|�d�|j|j	��|j|�}|j|d�|jt|�d�|j
|j	��|j|j�|j�|j
|j�dS)Nz*HTTP/1.1 200 Ok
Content-Length: 4

Textr�sTesxt)
rrryrz�	bytearray�readintorTr�r�r�rtr�r)rrWrQr|�br/rrr�test_partial_readintos�s 

z BasicTest.test_partial_readintoscCs�d}t|�}tj|�}|j�|j|jd�d�|j|j��|j|jd�d�|j|jd�d�|j|j��|j|j	�|j
�|j|j	�dS)NzHTTP/1.1 200 Ok

Textr�sTesxtrr)rrryrzrTr-r�r�rtr�r)rrWrQr|rrr�$test_partial_reads_no_content_length�s

z.BasicTest.test_partial_reads_no_content_lengthcCs�d}t|�}tj|�}|j�td�}|j|�}|j|d�|jt|�d�|j|j	��|j|�}|j|d�|jt|�d�|j|�}|j|d�|j
|j	��dS)NzHTTP/1.1 200 Ok

Textr�sTesxtr)rrryrzr�r�rTr�r�r�rt)rrWrQr|r�r/rrr�(test_partial_readintos_no_content_length�s
z2BasicTest.test_partial_readintos_no_content_lengthcCs�d}t|�}tj|�}|j�|j|jd�d�|j|j��|j|jd�d�|j|jd�d�|j|j��dS)Nz+HTTP/1.1 200 Ok
Content-Length: 10

Textr�sTesxtrr)	rrryrzrTr-r�r�rt)rrWrQr|rrr�"test_partial_reads_incomplete_body�s
z,BasicTest.test_partial_reads_incomplete_bodycCsd}t|�}tj|�}|j�td�}|j|�}|j|d�|jt|�d�|j|j	��|j|�}|j|d�|jt|�d�|j|�}|j|d�|j
|j	��|j|j�|j�|j
|j�dS)Nz+HTTP/1.1 200 Ok
Content-Length: 10

Textr�sTesxtr)
rrryrzr�r�rTr�r�r�rtr�r)rrWrQr|r�r/rrr�&test_partial_readintos_incomplete_body�s$

z0BasicTest.test_partial_readintos_incomplete_bodycCs}x'dD]}|jtjtj|�qWxLdD]D\}}}tj|�}|j||j�|j||j�q1WdS)N�www.python.org:abc�user:password@www.python.org�[fe80::207:e9ff:fe9b]:8000�fe80::207:e9ff:fe9b�@�www.python.org:80�www.python.org�P�www.python.org:�[fe80::207:e9ff:fe9b]�[fe80::207:e9ff:fe9b]:)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�
InvalidURLrPrTrr)r�hp�h�p�crrr�test_host_port�s
zBasicTest.test_host_portcCsTd}d}t|�}tj|�}|j�|jd�}|j||�dS)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)rrryrzr{rT)rrZhdr�srZcookiesrrr�test_response_headers�s
zBasicTest.test_response_headerscCsKtdt�}tj|dd�}|j�|j�rG|jd�dS)Nz*HTTP/1.1 200 OK
Content-Length: 14432

rmrdz)Did not expect response from HEAD request)rr,rryrzr-�fail)rrQr|rrr�test_read_heads	
zBasicTest.test_read_headcCsvtdt�}tj|dd�}|j�td�}|j|�dkr\|jd�|jt	|�d�dS)	Nz*HTTP/1.1 200 OK
Content-Length: 14432

rmrd�rz)Did not expect response from HEAD requestss)
rr,rryrzr�r�r�rTr�)rrQr|r�rrr�test_readinto_heads	

zBasicTest.test_readinto_headcCsodjdd�ttjd�D��d}d|}t|�}tj|�}|jtjd|j�dS)Nz
css|]}d|VqdS)z
Header%d: fooNr)�.0�irrr�	<genexpr>-sz2BasicTest.test_too_many_headers.<locals>.<genexpr>rzHTTP/1.1 200 OK
zgot more than \d+ headers)	r�r�rZ_MAXHEADERSrryr�Z
HTTPExceptionrz)rrXrr�rrrr�test_too_many_headers,s
zBasicTest.test_too_many_headerscCs�d}ttd��w}tjd�}t|�}||_|jdd|�|j|jj	|�d|jdt
|��|f�WdQRXdS)NsPGET /foo HTTP/1.1
Host: example.com
Accept-Encoding: identity
Content-Length:rzexample.comraz/fooz%r != %r)�open�__file__rrPrrQrSrtr
rurB)rrvrWrVrQrrr�test_send_file5s	zBasicTest.test_send_filecCs�d}tjd�}td�}||_|j|�|j||j�d|_|jtjd|��|j||j�d|_|jtj	|��|j||j�dS)Ns"this is a test this is only a testzexample.comrr�)
rrPrrQ�sendrTr
�arrayr&r')rrvrVrQrrr�	test_sendAs	
		zBasicTest.test_sendcsvdd��G�fdd�d�}d}tjd�}td�}||_|j|��|j|j|�dS)NcssdVdVdVdS)Nr
Zdata_tworrrrrr
Psz/BasicTest.test_send_updating_file.<locals>.datacs.eZdZdZ��Zddd�ZdS)z7BasicTest.test_send_updating_file.<locals>.UpdatingFilerrcSs
|jj�S)N)�d�__next__)rZ	blocksizerrrr-Xsz<BasicTest.test_send_updating_file.<locals>.UpdatingFile.readNr1)r#r$r%rr�r-r)r
rr�UpdatingFileUs	r�sdatazexample.comr])rrPrrQr�rTr
)rr�rvrVrQr)r
r�test_send_updating_fileOs	z!BasicTest.test_send_updating_filecCsld}dd�}tjd�}td�}||_|jdd|�dd	i�|j|j|�dS)
NsbGET /foo HTTP/1.1
Host: example.com
Accept-Encoding: identity
Content-Length: 11

onetwothreecssdVdVdVdS)NsonestwosthreerrrrrrWisz&BasicTest.test_send_iter.<locals>.bodyzexample.comr]raz/foozContent-LengthZ11)rrPrrQrSrTr
)rrvrWrVrQrrr�test_send_iterds	zBasicTest.test_send_itercCsLtjd�}td�|_|jt��|jdd|�WdQRXdS)Nzexample.comr]rN�test)rrPrrQr��	TypeErrorrS)rrVrrr�test_send_type_errortszBasicTest.test_send_type_errorcCs�t}tttt�}tj|dd�}|j�|j|j	�|�|j
�x�tdd�D]s}tttt�}tj|dd�}|j�|j|j	|�|j	|�|j	�|�|j
�qiWx�d	D]�}tt|�}tj|dd�}|j�z�y|j	�Wnwtjk
r�}zT|j|j
|�dt|�}|jt|�|�|jt|�|�WYdd}~XnX|jd�Wd|j
�Xq�WdS)
Nrmrar�r]�foo
zIncompleteRead(%d bytes read)zIncompleteRead expected)r]r�)�chunked_expectedr�
chunked_start�
last_chunk�chunked_endrryrzrTr-rr��IncompleteRead�partialrBr�r	r�)rrvrQr|r/�xr��expected_messagerrr�test_chunked{s2


0

)zBasicTest.test_chunkedcCsht}t|�}td�}tttt�}tj|dd�}|j	�|j
|�}|j|d|�|�|j||�|j�x�t
dd�D]�}tttt�}tj|dd�}|j	�t|�}|j
|d|��}||j
||||��7}||j
||d��7}|j|d|�|�|j||�|j�q�Wx�dD]�}	tt|	�}tj|dd�}|j	�z�y|j
|�}Wnwtjk
rC}zT|j|j|�d	t|�}
|jt|�|
�|jt|�|
�WYdd}~XnX|jd
�Wd|j�XqWdS)Nr�rmrarr�rr]�foo
zIncompleteRead(%d bytes read)zIncompleteRead expected)r]r)r�rBr�rr�r�r�rryrzr�rTrr��
memoryviewr�r�r�r	r�)rrvZ	nexpectedr�rQr|r/�mr�r�rrrr�test_readinto_chunked�sD


!

)zBasicTest.test_readinto_chunkedcCs�d}t|tt�}tj|dd�}|j�|j|j�d�|j|jd�|j|j	d�|j
|j��|j|j
�|j�|j
|j
�dS)NzEHTTP/1.1 200 OK
Transfer-Encoding: chunked

a
hello world
1
d
rmrdr���OK)rr�r�rryrzrTr-�status�reasonrtr�r�r�r)rr�rQr|rrr�test_chunked_head�s

zBasicTest.test_chunked_headcCs�d}t|tt�}tj|dd�}|j�td�}|j|�}|j|d�|jt	|�d	�|j|j
d�|j|jd�|j|j
��|j|j�|j�|j|j�dS)
NzEHTTP/1.1 200 OK
Transfer-Encoding: chunked

a
hello world
1
d
rmrdr�rsrrs)rr�r�rryrzr�r�rTr�rr	rtr�r�r�r)rr�rQr|r�r/rrr�test_readinto_chunked_head�s

z$BasicTest.test_readinto_chunked_headcCsXtd�}tj|dd�}|j�|j|j�d�|j|j��dS)Nz.HTTP/1.1 200 OK
Content-Length: -1

Hello
rmrasHello
)rrryrzrTr-rtr�)rrQr|rrr�test_negative_content_length�s	
z&BasicTest.test_negative_content_lengthcCs�td�}tj|dd�}|j�y|j�Wnztjk
r�}zW|j|jd�|jt|�d�|jt	|�d�|j
|j��WYdd}~XnX|jd�dS)Nz.HTTP/1.1 200 OK
Content-Length: 10

Hello
rmrasHello
z-IncompleteRead(7 bytes read, 3 more expected)zIncompleteRead expected)
rrryrzr-r�rTr�r�r	rtr�r�)rrQr|r�rrr�test_incomplete_read�s
&zBasicTest.test_incomplete_readcstdd�}tjd��|�_|jt�fdd���j�}|jd|j�|jd|j	d��dS)	NzgHTTP/1.0 401 Authorization Required
Content-type: text/html
WWW-Authenticate: Basic realm="example"
sContent-Lengthzexample.comcs�jddd�S)Nr^z/urlrW)rSr)rVrr�<lambda>sz&BasicTest.test_epipe.<locals>.<lambda>i�zBasic realm="example"zwww-authenticate)
r(rrPrQr�r*�getresponserTrr{)rrQr|r)rVr�
test_epipe	s				zBasicTest.test_epipecCsJdddd}tjt|��}|jtjtjf|j�dS)NzHTTP/1.1 200 Ok�kiz
)rryrr��LineTooLongr�rz)rrWr|rrr�test_overflowing_status_linesz&BasicTest.test_overflowing_status_linecCsAdddd}tjt|��}|jtj|j�dS)NzHTTP/1.1 200 OK
X-Foo: barriz

)rryrr�rrz)rrWr|rrr�test_overflowing_header_linesz&BasicTest.test_overflowing_header_linecCsKdddd}tjt|��}|j�|jtj|j�dS)Nz/HTTP/1.1 200 OK
Transfer-Encoding: chunked

riza
hello world
0

)rryrrzr�rr-)rrWr|rrr�test_overflowing_chunked_line's
z'BasicTest.test_overflowing_chunked_linecCs�d}t|�}tj|�}|j�|j|j�d�|j|j��|j|j	�|j
�|j|j	�dS)NzHTTP/1.1 200 Okr)rrryrzrTr-rtr�r�r�r)rrWrQr|rrr�test_early_eof4s

zBasicTest.test_early_eofcs�tjd�}d�G�fdd�dtj�}||_td�|_|jdd�|jtj|j	�|j
�j�|j
|jj�dS)Nzexample.comcs"eZdZ�fdd�ZdS)z+BasicTest.test_error_leak.<locals>.Responsecs |�tjj|||�dS)N)rryr)rr<r=)�responserrrEsz4BasicTest.test_error_leak.<locals>.Response.__init__N)r#r$r%rr)rrr�ResponseDsrzInvalid status linerarO)
rrPryZresponse_classrrQrSr�r�rrtr�r)rrVrr)rr�test_error_leak@s	zBasicTest.test_error_leakcCskd}td}tt|tt�}tj|dd�}|j�|j|j	�|�|j
�dS)Nz3;foo=bar
zabc
sabcrmraz3;foo=bar
abc
)r�rr��last_chunk_extendedr�rryrzrTr-r)rZextrarvrQr|rrr�test_chunked_extensionPs

z BasicTest.test_chunked_extensioncCsYt}ttt�}tj|dd�}|j�|j|j�|�|j	�dS)z9some servers may serve up a short chunked encoding streamrmraN)
r�rr�r�rryrzrTr-r)rrvrQr|rrr�test_chunked_missing_endZs
z"BasicTest.test_chunked_missing_endcCszt}ttttt�}tj|dd�}|j�|j	|j
�|�|j	|jj
�d�|j�dS)z&See that trailers are read and ignoredrmrarN)
r�rr�r��trailersr�rryrzrTr-rr)rrvrQr|rrr�test_chunked_trailerscs
zBasicTest.test_chunked_trailerscCs�t}d}ttttt|�}tj|dd�}|j�|j	|j
�|�|j	|jj
�|jd��|j
�dS)zDCheck that we don't read past the end of the chunked-encoding stream�	extradatarmrarN)r�rr�r�rr�rryrzrTr-rr
r)rrvrrQr|rrr�test_chunked_syncns
"zBasicTest.test_chunked_synccCs|d}d}td||�}tj|dd�}|j�|j|j�|�|j|jj�|�|j�dS)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

rmraN)rrryrzrTr-rr)rrrvrQr|rrr�test_content_length_synczs
z"BasicTest.test_content_length_synccCs�d}d}td||�}tj|dd�}|j�|j|jd�|g�|j|jj�|�|j�dS)Ns	extradatas
Hello123
s'HTTP/1.1 200 OK
Content-Length: 10

rmrai�)	rrryrzrT�	readlinesrr-r)rrrvrQr|rrr�test_readlines_content_length�s
z'BasicTest.test_readlines_content_lengthcCsd}d}td||�}tj|dd�}|j�|j|jd�|�|j|jj�|�|j�dS)Ns	extradatas
Hello123
s'HTTP/1.1 200 OK
Content-Length: 10

rmrai�)	rrryrzrT�read1rr-r)rrrvrQr|rrr�test_read1_content_length�s
z#BasicTest.test_read1_content_lengthcCs�d}d}td||�}tj|dd�}|j�|j|jd�|�|j|jd�d�|j|jj�|�|j�dS)Ns	extradatas
Hello123
s'HTTP/1.1 200 OK
Content-Length: 10

rmra�
r)	rrryrzrTr0rr-r)rrrvrQr|rrr�"test_readline_bound_content_length�s
z,BasicTest.test_readline_bound_content_lengthcCs�d}d}td|d|�}tj|dd�}|j�|j|jd�|d�|j|j�|�|j|jj�|�|j�dS)	Ns	extradatas
Hello123
s'HTTP/1.1 200 OK
Content-Length: 30

�rmra�r�)	rrryrzrTr$r-rr)rrrvrQr|rrr�test_read1_bound_content_length�s
z)BasicTest.test_read1_bound_content_lengthcsItjd�}tjtjtjtj��|j�j��jt	df��j
�d���fdd�}|jd|�}|j�t
j�j��}|jdd�|j�}zQ|j|jt
j�tjd|j��}z|jd	�Wd|j�XWd|j�|j�|j�X|j�d	�dS)
N�	threadingrcsy�j�\}}|�Z|jd��C}x |j�}|jd�s.Pq.W|jd�|j��WdQRXWdQRXdS)Nrs
s'HTTP/1.1 200 Connection established

)Zacceptrr0�rstriprr-)rV�address�reader�line)�result�servrr�
run_server�s
z2BasicTest.test_response_fileno.<locals>.run_server�targetrbz
dummy:1234�filenos
proxied data
)r�
import_module�socket�AF_INET�SOCK_STREAMZIPPROTO_TCP�
addCleanuprZbind�HOST�listenZThread�startrrP�getsocknamerSrrTrrr4r�detachr�)rr+r2ZthreadrVrr�r)r0r1r�test_response_fileno�s.



zBasicTest.test_response_filenocCsHGdd�dtj�}|d�}td�|_|jdd�dS)zv
        It should be possible to override the default validation
        behavior in putrequest (bpo-38216).
        c@seZdZdd�ZdS)zKBasicTest.test_putrequest_override_validation.<locals>.UnsafeHTTPConnectioncSsdS)Nr)rZurlrrr�_validate_path�szZBasicTest.test_putrequest_override_validation.<locals>.UnsafeHTTPConnection._validate_pathN)r#r$r%r@rrrr�UnsafeHTTPConnection�srAzexample.comr]raz/N)rrPrrQrp)rrArVrrr�#test_putrequest_override_validation�sz-BasicTest.test_putrequest_override_validationcCsHGdd�dtj�}|d�}td�|_|jdd�dS)z�
        It should be possible to override the default encoding
        to transmit bytes in another encoding even if invalid
        (bpo-36274).
        c@seZdZdd�ZdS)zIBasicTest.test_putrequest_override_encoding.<locals>.UnsafeHTTPConnectioncSs
|jd�S)Nzutf-8)r
)rZstr_urlrrr�_encode_request�szYBasicTest.test_putrequest_override_encoding.<locals>.UnsafeHTTPConnection._encode_requestN)r#r$r%rCrrrrrA�srAzexample.comr]rau/☃N)rrPrrQrp)rrArVrrr�!test_putrequest_override_encoding�sz+BasicTest.test_putrequest_override_encodingN).r#r$r%r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr
rrr
rrrrrrrrrr r!r#r%r'r*r?rBrDrrrrr�[sV

	 +

	)
r�c@s�eZdZdZdZeejd�d�jd�ZdZdd�Z	d	d
�Z
dd�Zd
d�Zdd�Z
dd�Zdd�Zdd�Zdd�ZdS)�ExtendedReadTestz*
    Test peek(), read1(), readline()
    zOHTTP/1.1 200 OK

hello world!
and now 
for something completely different
fooZhelloNrz�HTTP/1.1 200 OK
Transfer-Encoding: chunked

a
hello worl
3
d!

9
and now 

23
for something completely different

3
foo
0

cCsPt|j�}tj|dd�}|j�tj|j�|_||_dS)Nrmra)	r�linesrryrzr&�BufferedReader�fpr|)rrQr|rrr�setUps

zExtendedReadTest.setUpcs!|j}|jj�d�fdd�}||j_g}x�|jd�}|r�|jt|�d�|j�}|jt|�t|��|j|j|��|jt|��}|j	||�n|j�}|j
|�|j|�|s?Pq?W|j	dj|�|j
�dS)Nrcs4�|�}|dkr&|d|�S|dd�S)Nrr&r)r/r�)�oldpeekrr�mypeek$sz*ExtendedReadTest.test_peek.<locals>.mypeekr(rrr1)r|rH�peekZ
assertGreaterrBZassertGreaterEqualrtrur-rTr�rGr��lines_expected)rr|rK�allr�Zp2�nextr)rJr�	test_peek s(	

zExtendedReadTest.test_peekcCs&|j}|j|jj|j�dS)N)r|�_verify_readliner0rM)rr|rrr�
test_readline?s	zExtendedReadTest.test_readlinecCs�g}x^|d�}|rO|dkrOt|�dkrO|j|jd��|j|�|s	Pq	W|jdj|�|�dS)Nr�sfoos
r)rBrtr�rGrTr�)rr0rvrNr/rrrrQCs
z!ExtendedReadTest._verify_readlinecsD�j���fdd�}t|�}�j|j�j�dS)Ncs)�jd�}�jt|�d�|S)N�)r$�assertLessEqualrB)�res)r|rrrrRsz&ExtendedReadTest.test_read1.<locals>.r)r|�	ReadlinerrQr0rM)rrZ	readlinerr)r|rr�
test_read1Ps	zExtendedReadTest.test_read1cCsV|j}g}x$|j�}|s%P|j|�qW|jdj|�|j�dS)Nr)r|r$rGrTr�rM)rr|rNr
rrr�test_read1_unboundedYs	z%ExtendedReadTest.test_read1_unboundedcCso|j}g}x=|jd�}|s(P|jt|�d�|j|�qW|jdj|�|j�dS)Nr&r)r|r$rTrBrGrTr�rM)rr|rNr
rrr�test_read1_boundedcs	z#ExtendedReadTest.test_read1_boundedcCs |j|jjd�d�dS)Nrr)rTr|r$)rrrr�test_read1_0nszExtendedReadTest.test_read1_0cCs,|jjd�}|jdt|��dS)Nr)r|rLrTrB)rr�rrr�test_peek_0qszExtendedReadTest.test_peek_0)r#r$r%r2rF�findr
rMZ
lines_chunkedrIrPrRrQrWrXrYrZr[rrrrrE�s"	
	
rEc@seZdZdZdZdS)�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%r2rFrrrrr]vsr]c@s.eZdZdZdd�Zdd�ZdS)rVzT
    a simple readline class that uses an arbitrary read function and buffering
    cCs||_d|_dS)Nr)�readfunc�	remainder)rr^rrrr�s	zReadliner.__init__c
Cs�g}d}|j}y�xj|jd�}|dkr7P|t|�|kr[||d}|j|�|j�}|sd}PqW|d7}|j|d|��||d�|_dj|�SWndj|�|_�YnXdS)Nrs
rrr1)r_r\rBrGr^r�)r�limitr
Zdatalenr-�idxrrrr0�s,	

zReadliner.readlineN)r#r$r%r2rr0rrrrrV�srVc@s4eZdZdd�Zdd�Zdd�ZdS)�OfflineTestcCs�dh}ddh}xftt�D]X}|jd�s"||krFq"tt|�}t|dd�dkr"|j|�q"W|jtj|�dS)N�	responsesZHTTPMessage�
parse_headers�_r$zhttp.client)�dirrru�getattr�addZassertCountEqual�__all__)rrvZ	blacklistr�Z
module_objectrrr�test_all�s	zOfflineTest.test_allcCs|jtjtjd�dS)Nz	Not Found)rTrrc�	NOT_FOUND)rrrr�test_responses�szOfflineTest.test_responsesc5Cs�ddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5g5}x>|D]6}|jd6|��|jtt|��WdQRXq�WdS)7NZCONTINUEZSWITCHING_PROTOCOLSZ
PROCESSINGrZCREATEDZACCEPTEDZNON_AUTHORITATIVE_INFORMATIONZ
NO_CONTENTZ
RESET_CONTENTZPARTIAL_CONTENTZMULTI_STATUSZIM_USEDZMULTIPLE_CHOICESZMOVED_PERMANENTLYZFOUNDZ	SEE_OTHERZNOT_MODIFIEDZ	USE_PROXYZTEMPORARY_REDIRECTZBAD_REQUESTZUNAUTHORIZEDZPAYMENT_REQUIREDZ	FORBIDDENrkZMETHOD_NOT_ALLOWEDZNOT_ACCEPTABLEZPROXY_AUTHENTICATION_REQUIREDZREQUEST_TIMEOUTZCONFLICTZGONEZLENGTH_REQUIREDZPRECONDITION_FAILEDZREQUEST_ENTITY_TOO_LARGEZREQUEST_URI_TOO_LONGZUNSUPPORTED_MEDIA_TYPEZREQUESTED_RANGE_NOT_SATISFIABLEZEXPECTATION_FAILEDZUNPROCESSABLE_ENTITYZLOCKEDZFAILED_DEPENDENCYZUPGRADE_REQUIREDZPRECONDITION_REQUIREDZTOO_MANY_REQUESTSZREQUEST_HEADER_FIELDS_TOO_LARGEZINTERNAL_SERVER_ERRORZNOT_IMPLEMENTEDZBAD_GATEWAYZSERVICE_UNAVAILABLEZGATEWAY_TIMEOUTZHTTP_VERSION_NOT_SUPPORTEDZINSUFFICIENT_STORAGEZNOT_EXTENDEDZNETWORK_AUTHENTICATION_REQUIREDZconstant)r�rt�hasattrr)rrvZconstrrr�test_client_constants�sp	
z!OfflineTest.test_client_constantsN)r#r$r%rjrlrnrrrrrb�srbc@s\eZdZdd�Zdd�Zdd�Zejee	d�d�d	d
��Z
dS)�SourceAddressTestcCsYtjtjtj�|_tj|j�|_tj�|_|jj	�d|_
dS)N)r6r7r8r1r�	bind_portrZfind_unused_port�source_portr;rV)rrrrrI�s

zSourceAddressTest.setUpcCs9|jr|jj�d|_|jj�d|_dS)N)rVrr1)rrrr�tearDowns
	
	
zSourceAddressTest.tearDowncCs[tjt|jdd|jf�|_|jj�|j|jjj	�d|j�dS)N�source_addressr]r)
rrPr:rrqrVr;rTrQr=)rrrr�testHTTPConnectionSourceAddress
s
z1SourceAddressTest.testHTTPConnectionSourceAddress�HTTPSConnectionz'http.client.HTTPSConnection not definedcCs+tjt|jdd|jf�|_dS)Nrsr])rrur:rrqrV)rrrr� testHTTPSConnectionSourceAddresssz2SourceAddressTest.testHTTPSConnectionSourceAddressN)r#r$r%rIrrrt�unittest�skipIfrmrrvrrrrro�s
roc@s:eZdZdZdd�Zdd�Zdd�ZdS)�TimeoutTestNcCsAtjtjtj�|_tj|j�t_|jj�dS)N)	r6r7r8r1rrpry�PORTr;)rrrrrI szTimeoutTest.setUpcCs|jj�d|_dS)N)r1r)rrrrrr%s
zTimeoutTest.tearDowncCs@|jtj��tjd�z#tjttj�}|j	�Wdtjd�X|j
|jj�d�|j
�|jtj��tjd�z)tjttjdd�}|j	�Wdtjd�X|j
|jj�d�|j
�tjttjdd�}|j	�|j
|jj�d�|j
�dS)N��timeout)�assertIsNoner6ZgetdefaulttimeoutZsetdefaulttimeoutrrPr:ryrzr;rTrQZ
gettimeoutr)rZhttpConnrrr�testTimeoutAttribute)s*


	

z TimeoutTest.testTimeoutAttribute)r#r$r%rzrIrrr~rrrrrysryc@s4eZdZdd�Zdd�Zdd�ZdS)�PersistenceTestcCsd}x|D]\}}}|jd
|d|���dj||�}t|�}|j|j�|jd
d�|j��+}|j|jdk|�|j�WdQRX|j|jdk|�|j|j	d�|jd
d�|j|j	|rdnd�WdQRXq
WdS)N�1.0r]F�Connection: keep-alive
T�1.1�Connection: close
�Connection: keep-ALIVE
�Connection: cloSE
�versionrUz4HTTP/{} 200 OK
{}Content-Length: 12

Dummy body
raz/open-connectionrz/subsequent-requestr��r�r]F�r�r�T�r�r]T�r�r�F�r�r�T�r�r�F)r�r�r�r�r�r�)
r�rkr3r}rQrSrrTr-r4)r�testsr�rUZreuser�rVrrrr�test_reuse_reconnectMs(z$PersistenceTest.test_reuse_reconnectcCs�dd�}tjtjf|tff}x�|D]�\}}|jd|��jtd|�}|jdd�|j||j	�|j
|j�|jdd�|j|j
d�WdQRXq1WdS)	Ncs7tj|���fdd�}|�_tj��S)z3Return BufferedReader that raises ECONNRESET at EOFcs.tjj�|�}|dkr*t��|S)Nr)r&r'r��ConnectionResetError)�buffer�size)�streamrrr�ps	zNPersistenceTest.test_disconnected.<locals>.make_reset_reader.<locals>.readinto)r&r'r�rG)rr�r)r�r�make_reset_readerms	z<PersistenceTest.test_disconnected.<locals>.make_reset_reader�	exceptionrraz
/eof-responsez
/reconnectr�)r&r'r�RemoteDisconnectedr�r�r3rSr�rr}rQrTr4)rr�r�Zstream_factoryr�rVrrr�test_disconnectedksz!PersistenceTest.test_disconnectedcCsutd�}|jdddddi�|jtj|j�|j|j�|jdd�|j|j	d�dS)	NsHTTP/1.1 100 Continue

rarOrXZExpectz100-continuez
/reconnectr�)
r3rSr�rr�rr}rQrTr4)rrVrrr�test_100_close�s	zPersistenceTest.test_100_closeN)r#r$r%r�r�r�rrrrrKsrc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zej	dd��Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zejeed�d�dd��ZdS)�	HTTPSTestcCs ttd�s|jd�dS)Nruzssl support required)rmrZskipTest)rrrrrI�szHTTPSTest.setUpcCs ddlm}||d|�S)Nr)�make_https_server�certfile)Ztest.ssl_serversr�)rr�r�rrr�make_server�szHTTPSTest.make_servercCs2tjttjdd�}|j|jd�dS)Nr|r{)rrur:ryrzrTr|)rr�rrr�test_attributes�szHTTPSTest.test_attributescCs�ddl}tjd�tjd��Ytjdd�}|j|j��}|jdd�WdQRX|j	|j
jd�WdQRXdS)Nr�networkzself-signed.pythontest.neti�rarO�CERTIFICATE_VERIFY_FAILED)�sslr�requires�transient_internetrrur��SSLErrorrSrTr�r	)rr�r��exc_inforrr�test_networked�s
zHTTPSTest.test_networkedcCs�ddl}tjd�tjd��r|j�}tjddd|�}|jdd�|j�}|j	�|j
d|jd	��|j	�WdQRXdS)
Nrr�zself-signed.pythontest.neti��contextrarO�nginx�server)r�rr�r�Z_create_unverified_contextrrurSrrrrr{)rr�r�r�r|rrr�test_networked_noverification�s
	
z'HTTPSTest.test_networked_noverificationc
Cs�tjd�tjd��ftjdd�}|jdd�|j�}|jd�}|j�|j�|j	d|�WdQRXdS)Nr�zwww.python.orgi�rarOzcontent-typez	text/html)
rr�r�rrurSrr{rrr)rr�r|Zcontent_typerrr�&test_networked_trusted_by_default_cert�s


z0HTTPSTest.test_networked_trusted_by_default_certcCs�ddl}tjd�tjd���|j|j�}|j|_|jt	�t
jddd|�}|jdd�|j
�}|jd�}|j�|j�|jd	|�WdQRXdS)
Nrr�zself-signed.pythontest.neti�r�rarOr�r�)r�rr�r��
SSLContext�PROTOCOL_TLSv1�
CERT_REQUIRED�verify_mode�load_verify_locations� CERT_selfsigned_pythontestdotnetrrurSrr{rrr)rr�r�r�r|Z
server_stringrrr�test_networked_good_cert�s



z"HTTPSTest.test_networked_good_certcCs�ddl}tjd�tjd���|j|j�}|j|_|jt	�t
jddd|�}|j|j
��}|jdd�WdQRX|j|jjd�WdQRXdS)	Nrr�zself-signed.pythontest.neti�r�rarOr�)r�rr�r�r�r�r�r�r��CERT_localhostrrur�r�rSrTr�r	)rr�r�r�r�rrr�test_networked_bad_cert�s

z!HTTPSTest.test_networked_bad_certc
Csvddl}|jt�}tjd|j�}|j|j��}|jdd�WdQRX|j	|j
jd�dS)Nr�	localhostrarOr�)r�r�r�rrurr�r�rSrTr�r	)rr�r�r�r�rrr�test_local_unknown_cert�sz!HTTPSTest.test_local_unknown_certcCs�ddl}|jt�}|j|j�}|j|_|jt�tj	d|j
d|�}|j|j�|j
dd�|j�}|j|j�|j|jd�dS)Nrr�r�raz/nonexistenti�)r�r�r�r�r�r�r�r�rrurr9rrSrrTr)rr�r�r�r�r|rrr�test_local_good_hostname�s
z"HTTPSTest.test_local_good_hostnamecCsddl}|jt�}|j|j�}|j|_d|_|jt�t	j
d|jd|�}|j|j
��|jdd�WdQRXt	j
d|jd|dd�}|j|j
��|jdd�WdQRXd|_t	j
d|jd|dd�}|jdd	�|j�}|j�|j�|j|jd
�d|_t	j
d|jd|�}|jdd	�|j�}|j|jd
�|j�|j�t	j
d|jd|dd�}|j|j
��|jdd�WdQRXdS)NrTr�r�rarO�check_hostnameFz/nonexistenti�)r�r��CERT_fakehostnamer�r�r�r�r�r�rrurr�ZCertificateErrorrSrrrTr)rr�r�r�r�r|rrr�test_local_bad_hostname�s@	
			

	

	z!HTTPSTest.test_local_bad_hostnameruz)http.client.HTTPSConnection not availablecCs}x'dD]}|jtjtj|�qWxLdD]D\}}}tj|�}|j||j�|j||j�q1WdS)N�www.python.org:abc�user:password@www.python.org�[fe80::207:e9ff:fe9b]:8000�fe80::207:e9ff:fe9b�@�www.python.org:443�www.python.org��www.python.org:�[fe80::207:e9ff:fe9b]�[fe80::207:e9ff:fe9b]:)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�rr�rurTrr)rr�r�r�r�rrrr�$s
zHTTPSTest.test_host_portN)r#r$r%rIr�r�r�r�rZsystem_must_validate_certr�r�r�r�r�r�rwrxrmrr�rrrrr��s


	)r�c@sveZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�ZdS)�RequestBodyTestz3Test cases where a request includes a message body.cCs>tjd�|_td�|j_|_|j|j_dS)Nzexample.comr])rrPrVrrQ)rrrrrI<szRequestBodyTest.setUpcCs8tj|jj�}|j�tj|�}||fS)N)r&r'rQr
r0rrd)r�f�messagerrr�get_headers_and_fpAs
z"RequestBodyTest.get_headers_and_fpcCsj|jjdddddi�|j�\}}|jd|jd��|jdt|j���dS)Nr^z/urlrWzContent-LengthZ42zcontent-lengthrS)rVrSr�rT�getrBr-)rr�r�rrr�test_manual_content_lengthGs

z*RequestBodyTest.test_manual_content_lengthcCs�|jjddd�|j�\}}|jd|j��|j|j��|jd|jd��|jd|j��dS)Nr^z/urlrWz
text/plain�4zcontent-lengthsbody)	rVrSr�rT�get_content_typer}�get_charsetr�r-)rr�r�rrr�test_ascii_bodyPszRequestBodyTest.test_ascii_bodycCs�|jjddd�|j�\}}|jd|j��|j|j��|jd|jd��|jd|j��dS)Nr^z/urlubodyÁz
text/plain�5zcontent-lengthsbody�)	rVrSr�rTr�r}r�r�r-)rr�r�rrr�test_latin1_bodyXsz RequestBodyTest.test_latin1_bodycCs�|jjddd�|j�\}}|jd|j��|j|j��|jd|jd��|jd|j��dS)Nr^z/urlsbody�z
text/plainr�zcontent-length)	rVrSr�rTr�r}r�r�r-)rr�r�rrr�test_bytes_body`szRequestBodyTest.test_bytes_bodycCs�|jtjtj�ttjd��}|jd�WdQRXttj���}|jjdd|�|j�\}}|j	d|j
��|j|j��|j	d|j
d��|j	d|j��WdQRXdS)	N�wrWr^z/urlz
text/plainr�zcontent-lengthsbody)r9r�unlink�TESTFNr��writerVrSr�rTr�r}r�r�r-)rr�r�rrr�test_file_bodyhszRequestBodyTest.test_file_bodycCs�|jtjtj�ttjd��}|jd�WdQRXttjd���}|jjdd|�|j�\}}|j	d|j
��|j|j��|j	d|j
d��|j	d|j��WdQRXdS)	N�wbsbody�rr^z/urlz
text/plainr�zcontent-length)r9rr�r�r�r�rVrSr�rTr�r}r�r�r-)rr�r�rrr�test_binary_file_bodytsz%RequestBodyTest.test_binary_file_bodyN)r#r$r%r2rIr�r�r�r�r�r�r�rrrrr�9s	r�c@sXeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�HTTPResponseTestcCs5d}t|�}tj|�|_|jj�dS)NzXHTTP/1.1 200 Ok
My-Header: first-value
My-Header:                 second-value

Text)rrryr|rz)rrWrQrrrrI�szHTTPResponseTest.setUpcCsK|jjd�}|j|d�|jjdd�}|j|d�dS)Nz	My-Headerzfirst-value, second-valuezsome default)r|r{rT)rrUrrr�test_getting_header�sz$HTTPResponseTest.test_getting_headercCs)|jjdd�}|j|d�dS)NzNo-Such-Headerz
default-value)r|r{rT)rrUrrr�3test_getting_nonexistent_header_with_string_default�szDHTTPResponseTest.test_getting_nonexistent_header_with_string_defaultcCsT|jjdddg�}|j|d�|jjdd�}|j|d�dS)NzNo-Such-Header�default�valueszdefault, values)r�r�)r|r{rT)rrUrrr�5test_getting_nonexistent_header_with_iterable_default�szFHTTPResponseTest.test_getting_nonexistent_header_with_iterable_defaultcCs&|jjd�}|j|d�dS)NzNo-Such-Header)r|r{rT)rrUrrr�/test_getting_nonexistent_header_without_default�sz@HTTPResponseTest.test_getting_nonexistent_header_without_defaultcCs,|jjddd�}|j|d�dS)NzNo-Such-Headerr�ro)r|r{rT)rrUrrr�test_getting_header_defaultint�sz/HTTPResponseTest.test_getting_header_defaultintN)	r#r$r%rIr�r�r�r�r�rrrrr��sr�c@speZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�TunnelTestscCs=d}d|_tj|j�|_|j|�|j_dS)Nz:HTTP/1.0 200 OK

HTTP/1.1 200 OK
Content-Length: 42

z	proxy.com)rrrPrVr8)r�
response_textrrrrI�s	zTunnelTests.setUpcCs|jj�dS)N)rVr)rrrrrr�szTunnelTests.tearDowncsdd�fdd�}|S)Ncst�d|dd|d�S)Nrrrr)r)r-r|rs)r�rrr7�sz9TunnelTests._create_connection.<locals>.create_connectionr)rr�r7r)r�rr8�szTunnelTests._create_connectioncCs�d}d}ddi}|jj|d|d|�|jjddd	�|j|jjj|j�|j|jjjtj�|j|jj	|�|j|jj
|�|j|jj|�dS)
Nzdestination.comi�"z
User-Agentz!Mozilla/5.0 (compatible, MSIE 11)rrXrdrOr])rV�
set_tunnelrSrTrQrrr�	HTTP_PORTZ_tunnel_hostZ_tunnel_portZ_tunnel_headers)rZtunnel_hostZtunnel_portZtunnel_headersrrr�!test_set_tunnel_host_port_headers�sz-TunnelTests.test_set_tunnel_host_port_headerscCs*|jj�|jt|jjd�dS)Nzdestination.com)rVr;r��RuntimeErrorr�)rrrr�&test_disallow_set_tunnel_after_connect�s
z2TunnelTests.test_disallow_set_tunnel_after_connectcCs�|jjd�|jjddd�|j|jjj|j�|j|jjjtj�|j	d|jjj
�|jd|jjj
�|j	d|jjj
�|jd|jjj
�dS)	Nzdestination.comrdrOr]sCONNECT destination.comsHost: destination.com:NonesHost: destination.comsHost: proxy.com)rVr�rSrTrQrrrr�rrr
ZassertNotIn)rrrr�test_connect_with_tunnel�sz$TunnelTests.test_connect_with_tunnelcCs�|jjd�|jjddd�|j|jjj|j�|j|jjjtj�|j	d|jjj
�|j	d|jjj
�dS)Nzdestination.comr^rOr]sCONNECT destination.comsHost: destination.com)rVr�rSrTrQrrrr�rrr
)rrrr�test_connect_put_request�sz$TunnelTests.test_connect_put_requestcCs�d}dj|�}|jjd�|j|�|j_|jjd�tj��}|jjddd�WdQRX|j�j	�}|j
dj|�|�dS)	Nz
X-Dummy: 1zHTTP/1.0 200 OK
{}

rzdestination.comr^rOr]z
header: {})rkrVZset_debuglevelr8r�rZcaptured_stdoutrS�getvalue�
splitlinesrr)rZexpected_headerr��outputrFrrr�test_tunnel_debuglog�sz TunnelTests.test_tunnel_debuglogN)r#r$r%rIrrr8r�r�r�r�r�rrrrr��s


r�c
Cs2tjtttttttt	t
ttt
�dS)N)rZrun_unittestr>rbr�ryrr�r�ror�rEr]r�)�verboserrr�	test_main�s
	r��__main__)2r+Zhttprr&ri�osr�r6rwZTestCaser�r�path�dirnamer��herer�r�r�r�r�r�Zchunk_extensionr�rrr�r:rr(r'r,rPr3r>r�rEr]rVrbroryrr�r�r�r�Zreap_threadsr�r#rrrr�<module>sX		!����}"P.H�H#I