a ze8@s4ddlZddlmZmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl m Z e jZddlmZddlmZejeZejedZejedZejedZd Zd Zd Zd Zd edZdZ dZ!ej"Z"GdddZ#Gddde#Z$Gdddej%Z&Gdddej'Z(GdddeZ)GdddeZ*GdddeZ+GdddeZ,Gd d!d!eZ-Gd"d#d#e-Z.Gd$d%d%Z/Gd&d'd'eZ0Gd(d)d)eZ1Gd*d+d+eZ2Gd,d-d-eZ3Gd.d/d/eZ4Gd0d1d1eZ5Gd2d3d3eZ6Gd4d5d5eZ7e8d6kr0e j9d7d8dS)9N)client HTTPStatus)mock)support) socket_helperz keycert.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 0 zX-Dummy: foo X-Dumm2: bar c@sHeZdZejddfddZddZdddZdd Zd d Z d d Z dS) FakeSocketNcCsBt|tr|d}||_||_d|_d|_d|_||_||_ dS)NasciirF) isinstancestrencodetext fileclassdata sendall_calls file_closedhostport)selfrrrrrE/opt/bitninja-python-dojo/embedded/lib/python3.9/test/test_httplib.py__init__2s  zFakeSocket.__init__cCs |jd7_|j|7_dS)N)rrrrrrrsendall=szFakeSocket.sendallcCs6|dkr|dkrt||j|_|j|j_|jS)Nrrb)rZUnimplementedFileModerrfile file_closeclose)rmodebufsizerrrmakefileAs  zFakeSocket.makefilecCs d|_dS)NT)rrrrrr IszFakeSocket.file_closecCsdSNrr%rrrr!LszFakeSocket.closecCsdSr&r)rlevelZoptnamevaluerrr setsockoptOszFakeSocket.setsockopt)N) __name__ __module__ __qualname__ioBytesIOrrr$r r!r)rrrrr 1s   r c@s$eZdZddZddZddZdS) EPipeSocketcCst||||_dSr&)r r pipe_trigger)rrr0rrrrTs zEPipeSocket.__init__cCs(|j|vrttjd|j|7_dS)NZgotcha)r0OSErrorerrnoEPIPErrrrrrYs  zEPipeSocket.sendallcCsdSr&rr%rrrr!^szEPipeSocket.closeN)r*r+r,rrr!rrrrr/Rsr/c@s$eZdZdZdddZd ddZdS) NoEOFBytesIOzLike 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. cCs"tj||}|dkrtd|SNr zcaller tried to read past EOF)r-r.readAssertionError)rnrrrrr7gszNoEOFBytesIO.readNcCs"tj||}|dkrtd|Sr6)r-r.readliner8)rlengthrrrrr:mszNoEOFBytesIO.readline)r5)N)r*r+r,__doc__r7r:rrrrr4as r4cs4eZdZdZfddZfddZddZZS)FakeSocketHTTPConnectionz@HTTPConnection subclass using FakeSocket; counts connect() callscs$d|_td||_|j|_dS)Nr example.com) connectionssuperrfake_socket_argscreate_connection_create_connection)rargs __class__rrrvs z!FakeSocketHTTPConnection.__init__cs|jd7_tS)z.Count the number of times connect() is invokedr)r?r@connectr%rErrrG|sz FakeSocketHTTPConnection.connectcOs t|jSr&)r rArposkwrrrrBsz*FakeSocketHTTPConnection.create_connection)r*r+r,r<rrGrB __classcell__rrrErr=ss  r=c@sLeZdZddZddZddZddZd d Zd d Zd dZ ddZ dS) HeaderTestscCsGdddt}dD]n}dD]d}td}td|_||_d}i}|rXtt|||<|dd ||| |jj | d qqdS) Nc@seZdZddZddZdS)z;HeaderTests.test_auto_headers..HeaderCountingBuffercSs i|_dSr&)countr%rrrrszDHeaderTests.test_auto_headers..HeaderCountingBuffer.__init__cSsX|d}t|dkrH|dd}|j|d|j|d7<t||dS)N:rrr )splitlendecodelowerrM setdefaultlistappend)ritemkvZlcKeyrrrrUs   zBHeaderTests.test_auto_headers..HeaderCountingBuffer.appendNr*r+r,rrUrrrrHeaderCountingBuffersrY)TF)Content-lengthZHostzAccept-encodingr>Z blahblahblahZ spamspamspamPOST/r) rTrHTTPConnectionr sock_bufferr rPrequest assertEqualrMrR)rrYZexplicit_headerheaderconnbodyheadersrrrtest_auto_headerss   zHeaderTests.test_auto_headerscCsfGdddt}d}d}t||D]J\}}td}td|_||_||d|| |jj dd |q$d }|D]F}td}td|_||_||dd| |jj dd |qx|D]F}td}td|_||_||dd | |jj dd |qt ||D]H}td}td|_||_||dd | |jj d d |qdS)Nc@seZdZddZddZdS)z?HeaderTests.test_content_length_0..ContentLengthCheckercSst|d|_dSr&)rTrcontent_lengthr%rrrrs zHHeaderTests.test_content_length_0..ContentLengthChecker.__init__cSsF|dd}t|dkr6|ddkr6|d|_t||dS)NrNrrscontent-length)rOrPrRstriprgrTrU)rrVrWrrrrUs zFHeaderTests.test_content_length_0..ContentLengthChecker.appendNrXrrrrContentLengthCheckersri)N)PUTr[ZPATCHr>r\0z%Header Content-Length incorrect on {})GETCONNECTZDELETEHEADZOPTIONSZTRACEz.Header Content-Length set for empty body on {}rj 1) rT itertoolsproductrr]r r^r_r`rargformatchain)rriZbodiesZmethods_with_bodymethodrdrcZmethods_without_bodyrrrtest_content_length_0sP         z!HeaderTests.test_content_length_0cCstd}td|_|dd|dd|d|j|dd|d |j|d d |d |j|d d|d|j|ddd|d|j|dd|d|j|dd|d|j|dd|d|j|dd|d|j|d d!|d"|j|d#d$|d%|j|d&d$|d'|j|d(d$|d)|j|d*d$|d+|jdS),Nr>rmr\rZ*sContent-length: 42ZFooz bar s Foo: bar ZBarz baz s Bar: baz Z AuthorizationzBearer mytokensAuthorization: Bearer mytokenZ IterHeaderZIterAZIterBsIterHeader: IterA IterBZ LatinHeadersLatinHeader: Z Utf8HeadersÀsUtf8Header: Àz C1-Controls nextlinesC1-Control: nextlinezEmbedded-Fold-Spacez is alloweds!Embedded-Fold-Space: is allowedzEmbedded-Fold-Tabz is allowedsEmbedded-Fold-Tab: is allowedz Key Spacer(sKey Space: valuez KeySpace sKeySpace : valuesNonbreakSpacesNonbreakSpace: valuesNonbreakSpacesNonbreakSpace: value)rr]r r^ putrequest putheaderassertInr_rrcrrrtest_putheaders>                zHeaderTests.test_putheadercCsxd}td}td}||_|dd||j|d}td}td}||_|dd||j|dS)NsCGET /foo HTTP/1.1 Host: [2001::]:81 Accept-Encoding: identity z [2001::]:81rjrm/foosEGET /foo HTTP/1.1 Host: [2001:102A::] Accept-Encoding: identity z [2001:102A::])rr]r r^r` assertTruer startswithrexpectedrcr^rrrtest_ipv6host_headers    z HeaderTests.test_ipv6host_headercCsFd}t|}t|}|||dd||dddS)Nz4HTTP/1.1 200 OK First: val : nval Second: val ZFirstvalZSecond)r r HTTPResponsebeginra getheaderrrdr^resprrr!test_malformed_headers_coped_withs  z-HeaderTests.test_malformed_headers_coped_withcCs,dttdddttddd}t|}t|}|||dd ||jdd ||d d ||jd d d t t tdd}||d |||jd || |d| d|j|d|jdfD]0}||d| d|||dqdS)Ns0HTTP/1.1 200 OK !#$%&'*+-.^_`|~: value VCHAR: !s obs-text: sM obs-fold: text folded with space folded with tab Content-Length: 0 Content-Lengthrz!#$%&'*+-.^_`|~r(rjZVCHARzobs-textzobs-foldrz folded with spacezfolded with tab)bytesranger rrrrarmsgjoinmapchrZassertIsNotNoner|rrendswith)rrdr^rZvcharZfoldedrrrtest_parse_all_octets#s4     z!HeaderTests.test_parse_all_octetsc Cstd}td|_|ddd}|D]n\}}|||fH|td|||Wdn1sn0YWdq(1s0Yq(dS)Nr>rjrmr\))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) ValidNamesInvalid Value)rs Invalid Value)rs Invalid Value)rsInvalidValue )rs InvalidValue )rs InvalidValue zInvalid header) rr]r r^rzsubTestassertRaisesRegex ValueErrorr{)rrccasesnamer(rrrtest_invalid_headersAs    z HeaderTests.test_invalid_headerscCsd}t|}tj|dd}t}|Wdn1s@0Y|}||dd||dd||dd||d d dS) Ns9HTTP/1.1 200 OK First: val Second: val1 Second: val2 r)Z debuglevelrzreply: 'HTTP/1.1 200 OK\r\n'zheader: First: valzheader: Second: val1zheader: Second: val2) r rrrcaptured_stdoutrgetvalue splitlinesra)rrdr^routputlinesrrrtest_headers_debuglevel_s & z#HeaderTests.test_headers_debuglevelN) r*r+r,rfrwr~rrrrrrrrrrLsB" rLc@seZdZddZdS)HttpMethodTestsc Cs`d}|D]R}|td2td}td|_|j|ddWdq1sP0YqdS)N) zGET zPOST zPUT z POST Valuez POST HOST:abczGET rHost:abc zPOST Remainder: z GET HOST: z PUTz'method can't contain control charactersr>r\)rvurl)rrrr]r r^r`)rmethodsrvrcrrrtest_invalid_method_namesrs   z)HttpMethodTests.test_invalid_method_namesN)r*r+r,rrrrrrqsrc@sJeZdZdZddZddZddZdd Zdd d Zd dZ ddZ dS)TransferEncodingTestsIt's just a flesh woundcCsbtd}td|_|dd|j|dd||jj\}}}| |}| ||j dS)Nr>r r[r\T)encode_chunked) rr]r r^rzZ endheaders _make_body_parse_requestr_parse_chunkedra expected_body)rrc_rdrrrtest_endheaders_chunkeds    z,TransferEncodingTest.test_endheaders_chunkedcCsvtd}td|_|dd|ddi||jj\}}}|ddd | D| |dd| ||j td}td|_|dd|j d ddi||jj\}}}|dd d | D| |dd| ||j td}td|_|jdddd id |d||jj\}}}|ddd |D| |dd | | ||j dS)Nr>r r[r\Transfer-Encodingchunkedcontent-lengthcSsg|] }|qSrrR.0krrr r z>TransferEncodingTest.test_explicit_headers..latin-1cSsg|] }|qSrrrrrrrr z gzip, chunkedT)rerrdcSsg|] }|qSrrrrrrrr )rr]r r^r`rrr assertNotInkeysrarrQrrrcrrerdrrrtest_explicit_headerss<      z*TransferEncodingTest.test_explicit_headerscCsdD]}td}td|_|dd|j|d||jj\}}}||}| ||j | |dd| d d d |DqdS) N)FTr>r r[r\) empty_linesrrrcSsg|] }|qSrrrrrrrr z5TransferEncodingTest.test_request..) rr]r r^r`rrrrrarr)rrrcrrerdrrr test_requests   z!TransferEncodingTest.test_requestcCsltd}td|_|ddd||jj\}}}||dd|dd d |D||d dS) Nr>r r[r\rrrrcSsg|] }|qSrrrrrrrr z8TransferEncodingTest.test_empty_body..s0 ) rr]r r^r`rrrarrrrrtest_empty_bodys  z$TransferEncodingTest.test_empty_bodyFccsV|jd}t|D]<\}}|r.|dr.dV|t|dkrJ|dVq|VqdS)N rr r)rrO enumeraterP)rrridxlinerrrrs   zTransferEncodingTest._make_bodycCs|d}|d}i}d}|t|krrt||dkrr||d\}}|d}|d||<|d7}q||d||ddfS)N rrrNr)rOrPrQrhr)rrrr`rer9keyrrrrrs  z#TransferEncodingTest._parse_requestcCsg}i}d}|d}|||d\}}t|d}|dkrF|d7}qx||t||||d7}|t|krqxqd|S)Nrrrrr )rOintrarPrUr)rrrdtrailersr9rsizechunkrrrrs    z#TransferEncodingTest._parse_chunkedN)F) r*r+r,rrrrrrrrrrrrrs &  rc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!d?d@Z"dAdBZ#dCdDZ$dEdFZ%dGdHZ&dIdJZ'dKdLZ(dMdNZ)dOdPZ*dQdRZ+dSdTZ,dUdVZ-dWdXZ.dYdZZ/d[d\Z0d]d^Z1d_d`Z2daS)b BasicTestcCs"|hdtttdkdS)N> descriptionr(rphrase)rsetdirrr%rrr&test_dir_with_added_behavior_on_statussz0BasicTest.test_dir_with_added_behavior_on_statuscCsd}t|}t|}|||dd||||j||d| |||j| | |jd}t|}t|}| tj |jdS)NHTTP/1.1 200 Ok Textrr sTextzHTTP/1.1 400.100 Not Ok Text) r rrrrar7 assertFalseisclosedclosedrr! assertRaises BadStatusLinerrrrtest_status_lines s      zBasicTest.test_status_linescCstd}|t|ddS)NrjzBadStatusLine("''"))rrrarepr)rexcrrrtest_bad_status_repr!s zBasicTest.test_bad_status_reprcCsd}t|}t|}|||dd||||dd||||j | ||j dSNz*HTTP/1.1 200 Ok Content-Length: 4 TextrText r rrrrar7rrrrr!rrrrtest_partial_reads%s  zBasicTest.test_partial_readscCs~d}t|}t|}|||d||||d| |||j | | |j dS)Nz4HTTP/1.1 200 Ok Content-Length: 13 Text AnothersText sAnother) r rrrrar:rrr7rrr!rrrrtest_mixed_reads4s  zBasicTest.test_mixed_readscCsd}t|}t|}|td}||}||d|t|d|| ||}||d|t|d| | ||j | | |j dSr r rrr bytearrayreadintorarrrrrr!rrdr^rbr9rrrtest_partial_readintosCs       z BasicTest.test_partial_readintoscCsd}t|}t|}|||dd||||dd||dd||||j | ||j dS)Nrrrrrr rrrrr$test_partial_reads_no_content_lengthWs  z.BasicTest.test_partial_reads_no_content_lengthcCsd}t|}t|}|td}||}||d|t|d|| ||}||d|t|d||}||d| | dS)Nrrrrr) r rrrrrrarrrrrrrr(test_partial_readintos_no_content_lengthgs       z2BasicTest.test_partial_readintos_no_content_lengthcCstd}t|}t|}|||dd||||dd||dd||dS)N+HTTP/1.1 200 Ok Content-Length: 10 Textrrrrr ) r rrrrar7rrrrrrr"test_partial_reads_incomplete_bodyzs z,BasicTest.test_partial_reads_incomplete_bodycCsd}t|}t|}|td}||}||d|t|d|| ||}||d|t|d||}||d| | ||j | | |j dS)Nrrrrrrrrrr&test_partial_readintos_incomplete_bodys$        z0BasicTest.test_partial_readintos_incomplete_bodycCsVdD]}|tjtj|qdD]0\}}}t|}|||j|||jq dS)Nzwww.python.org:abczuser:password@www.python.org)z[fe80::207:e9ff:fe9b]:8000fe80::207:e9ff:fe9bi@)zwww.python.org:80www.python.orgP)www.python.org:rr)rrr)[fe80::207:e9ff:fe9b]rr)[fe80::207:e9ff:fe9b]:rr)rr InvalidURLr]rarrrZhphpcrrrtest_host_ports  zBasicTest.test_host_portcCs<d}d}t|}t|}||d}|||dS)NzHTTP/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 rrrrra)rrZhdrsrZcookiesrrrtest_response_headerss  zBasicTest.test_response_headerscCs6tdt}tj|dd}||r2|ddS)N*HTTP/1.1 200 OK Content-Length: 14432 rorv)Did not expect response from HEAD request)r r4rrrr7failrr^rrrrtest_read_headszBasicTest.test_read_headcCsTtdt}tj|dd}|td}||dkr@|d|t |ddS)Nrrorrr) r r4rrrrrrrar)rr^rrrrrtest_readinto_heads zBasicTest.test_readinto_headcCsRdddttjdDd}d|}t|}t|}|tjd|jdS)Nrcss|]}d|VqdS)z Header%d: fooNr)rirrr sz2BasicTest.test_too_many_headers..rzHTTP/1.1 200 OK zgot more than \d+ headers) rrrZ _MAXHEADERSr rr HTTPExceptionr)rrerrrrrrtest_too_many_headerss   zBasicTest.test_too_many_headersc Csd}ttd`}td}t|}||_|dd|||j |d|jdt ||fWdn1st0YdS)Ns_GET /foo HTTP/1.1 Host: example.com Accept-Encoding: identity Transfer-Encoding: chunked rr>rmrz%r != %r) open__file__rr]r r^r`rrrrPrrrdrcr^rrrtest_send_files  zBasicTest.test_send_filecCsd}td}td}||_|||||jd|_|td||||jd|_|t ||||jdS)Ns"this is a test this is only a testr>r r) rr]r r^sendrararrayr-r.rrrr test_sends  zBasicTest.test_sendcsXddGfdddtj}d}td}td}||_||||j|dS)NcssdVdVdVdS)NrZdata_tworrrrrrsz/BasicTest.test_send_updating_file..datacs eZdZdZZdddZdS)z7BasicTest.test_send_updating_file..UpdatingFilerr5cSs t|jSr&)nextd)r blocksizerrrr7 sz.UpdatingFile.readN)r5)r*r+r,r"rr7rrrr UpdatingFilesrsdatar>rj) r- TextIOBaserr]r r^rrar)rrrrcr^rrrtest_send_updating_files  z!BasicTest.test_send_updating_filecCsLd}dd}td}td}||_|dd|dd i||j|dS) NsbGET /foo HTTP/1.1 Host: example.com Accept-Encoding: identity Content-Length: 11 onetwothreecssdVdVdVdS)Nsonestwosthreerrrrrrdsz&BasicTest.test_send_iter..bodyr>rjrmrrZ11)rr]r r^r`rarrrrrtest_send_iters zBasicTest.test_send_itercCsvd}tjd|d}td}||_d|d}|ddt|d d i||jd |j d d d }|||dS)z8Check that request() respects the configured block size.r>rNabrkr\r9r r) rr]r r^r`r-r.rarrrO)rrrcr^rrdrrrtest_blocksize_request&s z BasicTest.test_blocksize_requestcCs\d}tjd|d}td}||_d|d}|t|||jd||j |dS)z5Check that send() respects the configured block size.rr>rNr r!r) rr]r r^rr-r.rarr)rrrcr^rrrrtest_blocksize_send2s zBasicTest.test_blocksize_sendcCsPtd}td|_|t|dd|Wdn1sB0YdS)Nr>rjr[test)rr]r r^r TypeErrorr`r}rrrtest_send_type_error=s   zBasicTest.test_send_type_errorc Csft}tttt}tj|dd}||| || t ddD]V}tttt}tj|dd}||| || || || qLdD]}tt|}tj|dd}|zz | Wnbtj y>}zF||j |dt|}|t|||t||WYd}~nd}~00|dW| q| 0qdS)Nrmrr rjzfoo IncompleteRead(%d bytes read)IncompleteRead expected)chunked_expectedr chunked_start last_chunk chunked_endrrrrar7r!rIncompleteReadpartialrPrr r)rrr^rr9xr expected_messagerrr test_chunkedDs2$    & zBasicTest.test_chunkedc Cst}t|}td}tttt}tj|dd}| | |}| |d||| ||| t ddD]}tttt}tj|dd}| t|}| |d|}|| ||||7}|| ||d7}| |d||| ||| qvdD]} tt| }tj|dd}| zz| |}Wnbtjy}zF| |j|dt|} | t|| | t|| WYd}~nd}~00|d W| n | 0qdS) Nrrmrrr)rr*r+r,)r-rPrr r.r/r0rrrrrar!r memoryviewr1r2rr r) rrZ nexpectedrr^rr9mr r3r4rrrtest_readinto_chunkeddsD      & zBasicTest.test_readinto_chunkedcCsd}t|tt}tj|dd}|||d||jd||j d| | | |j || |j dS)NEHTTP/1.1 200 OK Transfer-Encoding: chunked a hello world 1 d rorr OK)r r/r0rrrrar7statusreasonrrrrr!)rr.r^rrrrtest_chunked_heads zBasicTest.test_chunked_headcCsd}t|tt}tj|dd}|td}||}||d|t |d||j d||j d| | ||j|| |jdS) Nr9rorrrr r:r;)r r/r0rrrrrrarr<r=rrrrr!)rr.r^rrr9rrrtest_readinto_chunked_heads   z$BasicTest.test_readinto_chunked_headcCs@td}tj|dd}|||d||dS)Nz.HTTP/1.1 200 OK Content-Length: -1 Hello rmrHello )r rrrrar7rrrrrrtest_negative_content_lengthsz&BasicTest.test_negative_content_lengthc Cstd}tj|dd}|z |Wnbtjy}zH||jd|t|d|t |d| | WYd}~nd}~00| ddS)Nz.HTTP/1.1 200 OK Content-Length: 10 Hello rmrr@z-IncompleteRead(7 bytes read, 3 more expected)r,) r rrrr7r1rar2rr rrr)rr^rr rrrtest_incomplete_reads   $zBasicTest.test_incomplete_readcsZtdd}td|_|tfdd}|d|j|d| ddS) NzgHTTP/1.0 401 Authorization Required Content-type: text/html WWW-Authenticate: Basic realm="example" sContent-Lengthr>csdddS)Nrk/urlrd)r`rrcrrr z&BasicTest.test_epipe..izBasic realm="example"zwww-authenticate) r/rr]r^rr1 getresponserar<rrrrDr test_epipes  zBasicTest.test_epipecCs8dddd}tt|}|tjtjf|jdS)NHTTP/1.1 200 Okrr)rrr r LineTooLongrrrrdrrrrtest_overflowing_status_linesz&BasicTest.test_overflowing_status_linecCs2dddd}tt|}|tj|jdS)NzHTTP/1.1 200 OK X-Foo: barrrIz )rrr rrJrrKrrrtest_overflowing_header_linesz&BasicTest.test_overflowing_header_linecCsrdd}tt|}|tj}|Wdn1s@0Y|dt|j|dt|jdS)NzHTTP/1.1 100 OK r izgot more than re) rrr rr rr|r exception)rrdrcmrrr'test_overflowing_header_limit_after_100s&z1BasicTest.test_overflowing_header_limit_after_100cCs:dddd}tt|}||tj|jdS)Nz/HTTP/1.1 200 OK Transfer-Encoding: chunked rrIza hello world 0 )rrr rrrJr7rKrrrtest_overflowing_chunked_linesz'BasicTest.test_overflowing_chunked_linecCs`d}t|}t|}|||d||||j | ||j dS)NrHr ) r rrrrar7rrrrr!rrrrtest_early_eof s  zBasicTest.test_early_eofcsntd}dGfdddtj}||_td|_|dd|tj|j | j | |jj dS)Nr>cseZdZfddZdS)z+BasicTest.test_error_leak..Responsecs"|tjj|g|Ri|dSr&)rrrrHresponserrrsz4BasicTest.test_error_leak..Response.__init__N)r*r+r,rrrSrrResponsesrUzInvalid status linermr\) rr]rZresponse_classr r^r`rrrFrrr)rrcrUrrSrtest_error_leaks    zBasicTest.test_error_leakcCsRd}td}tt|tt}tj|dd}||| || dS)Nz3;foo=bar abc sabcrmr) r-r r.last_chunk_extendedr0rrrrar7r!)rextrarr^rrrrtest_chunked_extension&sz BasicTest.test_chunked_extensioncCsBt}ttt}tj|dd}||||| dS)z9some servers may serve up a short chunked encoding streamrmrN) r-r r.r/rrrrar7r!rrr^rrrrtest_chunked_missing_end0s  z"BasicTest.test_chunked_missing_endcCs\t}ttttt}tj|dd}|| | || |j d| dS)z&See that trailers are read and ignoredrmrr N) r-r r.r/rr0rrrrar7rr!rZrrrtest_chunked_trailers9szBasicTest.test_chunked_trailerscCsjt}d}ttttt|}tj|dd}|| | || |j | d| dS)zDCheck that we don't read past the end of the chunked-encoding stream extradatarmrr N)r-r r.r/rr0rrrrar7rrr!)rrr]r^rrrrtest_chunked_syncDszBasicTest.test_chunked_synccCs\d}d}td||}tj|dd}||||||j||dS)zBCheck that we don't read past the end of the Content-Length stream extradata Hello123 'HTTP/1.1 200 OK Content-Length: 10 rmrN)r rrrrar7rr!rr]rr^rrrrtest_content_length_syncPsz"BasicTest.test_content_length_synccCs`d}d}td||}tj|dd}|||d|g||j||dSNr_r`rarmri) r rrrra readlinesrr7r!rbrrrtest_readlines_content_length\sz'BasicTest.test_readlines_content_lengthcCs^d}d}td||}tj|dd}|||d|||j||dSrd) r rrrraread1rr7r!rbrrrtest_read1_content_lengthgsz#BasicTest.test_read1_content_lengthcCspd}d}td||}tj|dd}|||d|||dd||j||dS)Nr_r`rarmr r ) r rrrrar:rr7r!rbrrr"test_readline_bound_content_lengthrsz,BasicTest.test_readline_bound_content_lengthcCsvd}d}td|d|}tj|dd}|||d|d|||||j||dS) Nr_r`s'HTTP/1.1 200 OK Content-Length: 30 rrmrr) r rrrrargr7rr!rbrrrtest_read1_bound_content_length~sz)BasicTest.test_read1_bound_content_lengthcsttdf|jdfdd}tj|d}|||jt dt j  }| dd|}zV||jt jtj|d}z|d W|n |0W||n||0||d dS) Nrc s\}}|b|d8}|}|dsq4q|d|Wdn1sZ0YWdn1sx0YdS)Nrrs'HTTP/1.1 200 Connection established )acceptr$r:rstriprr7)rcaddressreaderrresultservrr run_servers   z2BasicTest.test_response_fileno..run_server)targetrrnz dummy:1234)filenos proxied data )socket create_serverHOST addCleanupr! threadingThreadstartrfloatrr] getsocknamer`rFrar<r;rvrdetach)rrtthreadrcrTrrrqrtest_response_filenos,      zBasicTest.test_response_filenocCs4Gdddtj}|d}td|_|dddS)zv It should be possible to override the default validation behavior in putrequest (bpo-38216). c@seZdZddZdS)zRBasicTest.test_putrequest_override_domain_validation..UnsafeHTTPConnectioncSsdSr&rrrrrr_validate_pathszaBasicTest.test_putrequest_override_domain_validation..UnsafeHTTPConnection._validate_pathN)r*r+r,rrrrrUnsafeHTTPConnectionsrr>rjrmz/Nrr]r r^rzrrrcrrr*test_putrequest_override_domain_validations z4BasicTest.test_putrequest_override_domain_validationcCs8Gdddtj}|d}td|_|jdddddS) Nc@seZdZddZdS)zPBasicTest.test_putrequest_override_host_validation..UnsafeHTTPConnectioncSsdSr&rrrrr_validate_hostsz_BasicTest.test_putrequest_override_host_validation..UnsafeHTTPConnection._validate_hostN)r*r+r,rrrrrrsrz example.com rjrmr\r)Z skip_hostrrrrr(test_putrequest_override_host_validations z2BasicTest.test_putrequest_override_host_validationcCs4Gdddtj}|d}td|_|dddS)z It should be possible to override the default encoding to transmit bytes in another encoding even if invalid (bpo-36274). c@seZdZddZdS)zIBasicTest.test_putrequest_override_encoding..UnsafeHTTPConnectioncSs |dS)Nzutf-8)r)rZstr_urlrrr_encode_requestszYBasicTest.test_putrequest_override_encoding..UnsafeHTTPConnection._encode_requestN)r*r+r,rrrrrrsrr>rjrmu/☃Nrrrrr!test_putrequest_override_encodings z+BasicTest.test_putrequest_override_encodingN)3r*r+r,rrrrrrrrrrrrrr rrrrrr$r%r(r5r8r>r?rArBrGrLrMrPrQrRrVrYr[r\r^rcrfrhrjrlrrrrrrrrrs`      +            %  rc@sxeZdZdZdZeedddZdZddZ d d Z d d Z d dZ ddZ ddZddZddZddZdS)ExtendedReadTestz* Test peek(), read1(), readline() zOHTTP/1.1 200 OK hello world! and now for something completely different fooZhelloNr HTTP/1.1 200 OK Transfer-Encoding: chunked a hello worl 3 d! 9 and now 23 for something completely different 3 foo 0 cCs8t|j}tj|dd}|t|j|_||_dS)Nrmr) r rrrrr-BufferedReaderfprrrrrsetUps  zExtendedReadTest.setUpcs|j}|jjdfdd }||j_g}|d}|r|t|d|}|t|t|||||t|}| ||n|}| || ||s(qq(| d ||j dS)Nr5cs(|}|dkr|d|S|ddS)Nrrir)r9rZoldpeekrrmypeeks z*ExtendedReadTest.test_peek..mypeekrrr )r5)rrpeek assertGreaterrPZassertGreaterEqualrrr7rarrUrlines_expected)rrrallrZp2rrrr test_peeks&   zExtendedReadTest.test_peekcCs|j}||jj|jdSr&)r_verify_readliner:r)rrrrr test_readlineszExtendedReadTest.test_readlinecCs\g}|d}|r4|dkr4t|dkr4||d|||sqFq|d||dS)Nrfoo r )rPrrrUrar)rr:rrrrrrr s   z!ExtendedReadTest._verify_readlinecs0jfdd}t|}|jjdS)Ncsd}t|d|S)N)rgassertLessEqualrP)resrrrrr/s z&ExtendedReadTest.test_read1..r)r Readlinerrr:r)rrZ readlinerrrr test_read1-szExtendedReadTest.test_read1cCs<|j}g}|}|sq$||q |d||jdSNr )rrgrUrarrrrrrrrrtest_read1_unbounded6s z%ExtendedReadTest.test_read1_unboundedcCsN|j}g}|d}|sq6|t|d||q |d||jdS)Nrir )rrgrrPrUrarrrrrrtest_read1_bounded@s  z#ExtendedReadTest.test_read1_boundedcCs||jdddS)Nrr )rarrgr%rrr test_read1_0KszExtendedReadTest.test_read1_0cCs |jd}|dt|dSNr)rrrrP)rrrrr test_peek_0Ns zExtendedReadTest.test_peek_0)r*r+r,r<rfindrrZ lines_chunkedrrrrrrrrrrrrrrs     rc@seZdZdZdZdS)ExtendedReadTestChunkedz: Test peek(), read1(), readline() in chunked mode rN)r*r+r,r<rrrrrrSsrc@s eZdZdZddZddZdS)rzT a simple readline class that uses an arbitrary read function and buffering cCs||_d|_dSr)readfunc remainder)rrrrrrmszReadliner.__init__cCsg}d}|j}z|d}|dkr$q^|t||kr@||d}|||}|sd}q^q|d7}||d|||d|_d|WSd||_Yn0dS)Nrrr5rr )rrrPrUrr)rlimitrZdatalenr7rrrrr:qs*     zReadliner.readlineN)r*r+r,r<rr:rrrrrisrc@s$eZdZddZddZddZdS) OfflineTestcCsfdh}ddh}ttD]<}|ds||vr.qtt|}t|dddkr||q|tj|dS)N responsesZ HTTPMessage parse_headersrr+z http.client)rrrgetattraddZassertCountEqual__all__)rrZ blacklistrZ module_objectrrrtest_alls   zOfflineTest.test_allcCs|tjtjddS)Nz Not Found)rarr NOT_FOUNDr%rrrtest_responsesszOfflineTest.test_responsesc CsRgd}|D]@}|j|d |tt|Wdq 1sB0Yq dS)N):ZCONTINUEZSWITCHING_PROTOCOLSZ PROCESSINGr;ZCREATEDZACCEPTEDZNON_AUTHORITATIVE_INFORMATIONZ NO_CONTENTZ RESET_CONTENTZPARTIAL_CONTENTZ MULTI_STATUSZIM_USEDZMULTIPLE_CHOICESZMOVED_PERMANENTLYZFOUNDZ SEE_OTHERZ NOT_MODIFIEDZ USE_PROXYZTEMPORARY_REDIRECTZ BAD_REQUESTZ UNAUTHORIZEDZPAYMENT_REQUIREDZ FORBIDDENrZMETHOD_NOT_ALLOWEDZNOT_ACCEPTABLEZPROXY_AUTHENTICATION_REQUIREDZREQUEST_TIMEOUTZCONFLICTZGONEZLENGTH_REQUIREDZPRECONDITION_FAILEDZREQUEST_ENTITY_TOO_LARGEZREQUEST_URI_TOO_LONGZUNSUPPORTED_MEDIA_TYPEZREQUESTED_RANGE_NOT_SATISFIABLEZEXPECTATION_FAILEDZ IM_A_TEAPOTZMISDIRECTED_REQUESTZUNPROCESSABLE_ENTITYZLOCKEDZFAILED_DEPENDENCYZUPGRADE_REQUIREDZPRECONDITION_REQUIREDZTOO_MANY_REQUESTSZREQUEST_HEADER_FIELDS_TOO_LARGEZUNAVAILABLE_FOR_LEGAL_REASONSZINTERNAL_SERVER_ERRORZNOT_IMPLEMENTEDZ BAD_GATEWAYZSERVICE_UNAVAILABLEZGATEWAY_TIMEOUTZHTTP_VERSION_NOT_SUPPORTEDZINSUFFICIENT_STORAGEZ NOT_EXTENDEDZNETWORK_AUTHENTICATION_REQUIREDZ EARLY_HINTSZ TOO_EARLY)Zconstant)rrhasattrr)rrconstrrrtest_client_constantss<z!OfflineTest.test_client_constantsN)r*r+r,rrrrrrrrsrc@s@eZdZddZddZddZeee d dd d Z d S) SourceAddressTestcCs>ttjtj|_t|j|_t|_|j d|_ dSr&) rwAF_INET SOCK_STREAMrsr bind_portrZfind_unused_port source_portlistenrcr%rrrrs   zSourceAddressTest.setUpcCs*|jr|jd|_|jd|_dSr&)rcr!rsr%rrrtearDowns   zSourceAddressTest.tearDowncCsBtjt|jd|jfd|_|j||jj d|jdS)Nrjsource_addressr) rr]ryrrrcrGrar^rr%rrrtestHTTPConnectionSourceAddresss   z1SourceAddressTest.testHTTPConnectionSourceAddressHTTPSConnectionz'http.client.HTTPSConnection not definedcCstjt|jd|jfd|_dS)Nrjr)rrryrrrcr%rrr testHTTPSConnectionSourceAddresss z2SourceAddressTest.testHTTPSConnectionSourceAddressN) r*r+r,rrrunittestskipIfrrrrrrrrsrc@s(eZdZdZddZddZddZdS) TimeoutTestNcCs.ttjtj|_t|jt_|jdSr&) rwrrrsrrrPORTrr%rrrrszTimeoutTest.setUpcCs|jd|_dSr&)rsr!r%rrrrs zTimeoutTest.tearDownc Cs|ttdz$tttj}| Wtdn td0| |j d| |ttdz(tjttjdd}| Wtdn td0| |j d| tjttjdd}| | |j d| dSN)timeout) assertIsNonerwgetdefaulttimeoutsetdefaulttimeoutrr]ryrrrGrar^ gettimeoutr!)rZhttpConnrrrtestTimeoutAttribute s,     z TimeoutTest.testTimeoutAttribute)r*r+r,rrrrrrrrrsrc@s$eZdZddZddZddZdS)PersistenceTestc Csd}|D]\}}}|j||dd||}t|}||j|dd|,}||jdu| |Wdn1s0Y||jdu| ||j d|dd||j |rdndWdq1s0YqdS) N))1.0rjF)rzConnection: keep-alive T)1.1rjT)rzConnection: close F)rzConnection: keep-ALIVE T)rzConnection: cloSE F)versionrbz4HTTP/{} 200 OK {}Content-Length: 12 Dummy body rmz/open-connectionrz/subsequent-requestr) rrtr=rr^r`rFrar7r?)rtestsrrbZreuserrcrTrrrtest_reuse_reconnect/s"   & z$PersistenceTest.test_reuse_reconnectc Csdd}tjtjf|tff}|D]~\}}|j|dZtd|}|dd|||j | |j |dd| |j dWdq 1s0Yq dS) Ncs&t|fdd}|_tS)z3Return BufferedReader that raises ECONNRESET at EOFcs tj|}|dkrt|Sr)r-r.rConnectionResetError)bufferrstreamrrrRszNPersistenceTest.test_disconnected..make_reset_reader..readinto)r-r.rr)rrrrrmake_reset_readerOs  z.make_reset_reader)rNr rmz /eof-response /reconnectr)r-r.rRemoteDisconnectedrrr=r`rrFrr^rar?)rrrZstream_factoryrNrcrrrtest_disconnectedMs      z!PersistenceTest.test_disconnectedcCsVtd}|jddddid|tj|j||j|dd||j ddS) NsHTTP/1.1 100 Continue rmr\ZExpectz 100-continue)rerr) r=r`rrrrFrr^rar?r}rrrtest_100_closehs  zPersistenceTest.test_100_closeN)r*r+r,rrrrrrrr-src@seZdZddZddZddZddZd d Zej d d Z d dZ ddZ ddZ ddZddZeeed dddZddZdS) HTTPSTestcCsttds|ddS)Nrzssl support required)rrskipTestr%rrrrws zHTTPSTest.setUpcCsddlm}|||dS)Nr)make_https_server)certfile)Ztest.ssl_serversr)rrrrrr make_server{s zHTTPSTest.make_servercCs$tjttjdd}||jddSr)rrryrrrar)rrrrrtest_attributesszHTTPSTest.test_attributesc Csddl}tdtddtdd}||j}| ddWdn1sX0Y| |j j dWdn1s0YdS)Nrnetworkself-signed.pythontest.netrmr\CERTIFICATE_VERIFY_FAILED) sslrrequiresrtransient_internetrrrSSLErrorr`rarNr=)rrrexc_inforrrtest_networkeds   *zHTTPSTest.test_networkedcCsddl}tdtd^|}tjdd|d}|dd| }| | d| d | Wdn1s0YdS) Nrrrrcontextrmr\nginxserver) rrrrrZ_create_unverified_contextrrr`rFr!r|r)rrrrrrrrtest_networked_noverifications   z'HTTPSTest.test_networked_noverificationcCs~tdtdVtdd}|dd|}|d}| | | d|Wdn1sp0YdS)Nrrrrmr\z content-typez text/html) rrrrrrr`rFrr!r|)rrrZ content_typerrr&test_networked_trusted_by_default_certs     z0HTTPSTest.test_networked_trusted_by_default_certc Csddl}tdd}t|||j}||j|j ||j d| t z(t j|d|d}|dd|}WnT|jy}z:t|}td |rtd |d |d WYd}~n d}~00|d }|||d|Wdn1s0YdS)NrrrTrrrmr\z(?i)key.too.weakzGot z trying to connect to z). See https://bugs.python.org/issue36816.rr)rrrrr SSLContextPROTOCOL_TLS_CLIENTraZ verify_modeZ CERT_REQUIREDcheck_hostnameload_verify_locations CERT_selfsigned_pythontestdotnetrrr`rFrr researchrZSkipTestrr!r|) rrZselfsigned_pythontestdotnetrrrZssl_errZ ssl_err_strZ server_stringrrrtest_networked_good_certs6        z"HTTPSTest.test_networked_good_certc Csddl}tdtd~||j}|tt j dd|d}| |j }| ddWdn1sr0Y||jjdWdn1s0YdS) Nrrrrrrmr\r)rrrrrrrrCERT_localhostrrrrr`rarNr=)rrrrrrrrtest_networked_bad_certs    *z!HTTPSTest.test_networked_bad_certcCslddl}|t}td|j}||j}|ddWdn1sN0Y| |j j ddS)Nr localhostrmr\r) rrrrrrrrr`rarNr=)rrrrrrrrtest_local_unknown_certs  *z!HTTPSTest.test_local_unknown_certcCsxddl}|t}||j}|ttjd|j|d}| |j | dd| }| |j | |jddS)Nrrrrm /nonexistentr)rrrrrrrrrrzr!r`rFrar<rrrrrrrrrtest_local_good_hostnames      z"HTTPSTest.test_local_good_hostnamecCs4ddl}|t}||j}|ttjd|j|d}| |j | ddWdn1sh0Yt dtf$tjd|j|dd}Wdn1s0Y| |j | ddWdn1s0Yd |_t dtf$tjd|j|d d}Wdn1s,0Y| dd |}||||jd d |_tjd|j|d}| dd |}||jd ||t dtf$tjd|j|dd}Wdn1s0Y| |j | ddWdn1s&0YdS) Nrrrrmr\rjT)rrFrr)rrCERT_fakehostnamerrrrrrrZCertificateErrorr`rZcheck_warningsDeprecationWarningrrFr!rar<rrrrtest_local_bad_hostnamesH   * $* &   &z!HTTPSTest.test_local_bad_hostnamerz)http.client.HTTPSConnection not availablecCsVdD]}|tjtj|qdD]0\}}}t|}|||j|||jq dS)Nr)r)zwww.python.org:443rr)rrr)rrr)rrr)rrr)rrrrrarrrrrrrs  zHTTPSTest.test_host_portcCsddl}|js|dtdd}||jj||j }| |jtjdd|d}| |j|| |jjt 0t ddttjdd|td}Wdn1s0Y||jjdS) NrzTLS 1.3 support requiredrrrignorez5key_file, cert_file and check_hostname are deprecated)rZ cert_file)rZ HAS_TLSv1_3rrrrZ_contextZpost_handshake_authrrrZassertIswarningscatch_warningsfilterwarningsrr)rrrrrrrtest_tls13_pha*s$      $zHTTPSTest.test_tls13_phaN)r*r+r,rrrrrrZsystem_must_validate_certrrrrrr rrrrrrrrrrrus"  !   * rc@sXeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ dS)RequestBodyTestz3Test cases where a request includes a message body.cCs,td|_td|j_|_|j|j_dS)Nr>rj)rr]rcr r^r%rrrrCs zRequestBodyTest.setUpcCs(t|jj}|t|}||fSr&)r-r.r^rr:rrrfmessagerrrget_headers_and_fpHs z"RequestBodyTest.get_headers_and_fpc Csddgdfdf}|D]\}}||td|_td|j_|_|jdd||\}}|d ||d || | d d | || Wdq1s0YqdS) Nrbar3 foo 3 bar 0 ))rrrr>rjrkrCz Content-Typerrr) rrr]rcr r^r`rrragetr7)rrrdrrrrrrtest_list_bodyNs       zRequestBodyTest.test_list_bodycCsL|jdddddi|\}}|d|d|dt|dS)NrkrCrdrZ42rr)rcr`rrarrPr7rrrrrrtest_manual_content_lengthbs   z*RequestBodyTest.test_manual_content_lengthcCs`|jddd|\}}|d||||d|d|d|dS)NrkrCrd text/plain4rsbody rcr`rraget_content_typer get_charsetrr7rrrrtest_ascii_bodyks  zRequestBodyTest.test_ascii_bodycCs`|jddd|\}}|d||||d|d|d|dS)NrkrCubodyÁr5rbodyrrrrrtest_latin1_bodyss  z RequestBodyTest.test_latin1_bodycCs`|jddd|\}}|d||||d|d|d|dS)NrkrCr!rr rrrrrrtest_bytes_body{s  zRequestBodyTest.test_bytes_bodycCs|tjtjttjd}|dWdn1s<0Yttj|}|jdd||\}}| d| | | | | d| d| d| d |Wdn1s0YdS) NwrdrkrCrrrztransfer-encodings4 body 0 )rzrunlinkTESTFNrwritercr`rrarrrrr7rrrrtest_text_file_bodys(  z#RequestBodyTest.test_text_file_bodycCs|tjtjttjd}|dWdn1s<0Yttjdx}|jdd||\}}| d| | | | d| d|d || d |Wdn1s0YdS) Nwbr!rrkrCrrrrs5 body 0 )rzrr%r&rr'rcr`rrarrrrrr7rrrrtest_binary_file_bodys(  z%RequestBodyTest.test_binary_file_bodyN) r*r+r,r<rrrrrr"r#r(r*rrrrr@s rc@s<eZdZddZddZddZddZd d Zd d Zd S)HTTPResponseTestcCs&d}t|}t||_|jdS)NzXHTTP/1.1 200 Ok My-Header: first-value My-Header: second-value Text)r rrrr)rrdr^rrrrs zHTTPResponseTest.setUpcCs6|jd}||d|jdd}||ddS)Nz My-Headerzfirst-value, second-valuez some defaultrrrarrbrrrtest_getting_headers  z$HTTPResponseTest.test_getting_headercCs|jdd}||ddS)NNo-Such-Headerz default-valuer,r-rrr3test_getting_nonexistent_header_with_string_defaultszDHTTPResponseTest.test_getting_nonexistent_header_with_string_defaultcCs<|jdddg}||d|jdd}||ddS)Nr/defaultvalueszdefault, values)r1r2r,r-rrr5test_getting_nonexistent_header_with_iterable_defaults zFHTTPResponseTest.test_getting_nonexistent_header_with_iterable_defaultcCs|jd}||ddS)Nr/r,r-rrr/test_getting_nonexistent_header_without_defaults z@HTTPResponseTest.test_getting_nonexistent_header_without_defaultcCs |jjddd}||ddS)Nr/rx)r1r,r-rrrtest_getting_header_defaultintsz/HTTPResponseTest.test_getting_header_defaultintN) r*r+r,rr.r0r3r4r5rrrrr+s r+c@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS) TunnelTestscCs*d}d|_t|j|_|||j_dS)Nz:HTTP/1.0 200 OK HTTP/1.1 200 OK Content-Length: 42 z proxy.com)rrr]rcrC)r response_textrrrrs zTunnelTests.setUpcCs|jdSr&)rcr!r%rrrrszTunnelTests.tearDowncsdfdd }|S)Ncst|d|ddS)Nrr)rr)r )rorrr7rrrBsz9TunnelTests._create_connection..create_connection)NNr)rr7rBrr8rrCszTunnelTests._create_connectioncCsd}d}ddi}|jj|||d|jddd||jjj|j||jjjtj||jj |||jj |||jj |dS) Ndestination.comi"z User-Agentz!Mozilla/5.0 (compatible, MSIE 11))rreror\rj) rc set_tunnelr`rar^rrr HTTP_PORTZ _tunnel_hostZ _tunnel_portZ_tunnel_headers)rZ tunnel_hostZ tunnel_portZtunnel_headersrrr!test_set_tunnel_host_port_headerss z-TunnelTests.test_set_tunnel_host_port_headerscCs |j|t|jjddS)Nr9)rcrGr RuntimeErrorr:r%rrr&test_disallow_set_tunnel_after_connects  z2TunnelTests.test_disallow_set_tunnel_after_connectcCs|jd|jddd||jjj|j||jjjtj| d|jjj | d|jjj | d|jjj | d|jjj dS) Nr9ror\rjCONNECT destination.comsHost: destination.com:NoneHost: destination.comsHost: proxy.com) rcr:r`rar^rrrr;r|rrr%rrrtest_connect_with_tunnels z$TunnelTests.test_connect_with_tunnelcCstj|jd4}|jd|j|jddWdn1sJ0Y||jt |j dd|j d|j d dd }| d ||j | d d |ddS) z8Regresstion test for https://bugs.python.org/issue43332.rr9rmr\Nrz!unexpected number of send calls: )rrr?r#zunexpected proxy data sent )rZpatchobjectrcr:rGr`Z assert_calledrrPZ mock_callsr|rr)rZ mock_sendZproxy_setup_data_sentrrr0test_tunnel_connect_single_send_connection_setups  ,   zrArCrDrErrrrr6s   r6__main__r) verbosity):r2httprrr-rrosrrrwr{r rrZTestCaser&rZ test.supportrpathdirnamerhererrrrr.r-Zchunk_extensionr/rWrr0ryr r/r.r4r]r=rLrrrrrrrrrrrrr+r6r*mainrrrrsp      !nT}"U.HL`#Z