a 5êdg8ã@s4ddlZddlmZmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl m Z e jZddlmZddlmZej e¡Zej ed¡Zej ed¡Zej ed¡Zd Zd Zd Zd Zd edZdZ dZ!ej"Z"Gdd„dƒZ#Gdd„de#ƒZ$Gdd„dej%ƒZ&Gdd„dej'ƒZ(Gdd„deƒZ)Gdd„deƒZ*Gdd„deƒZ+Gdd„deƒZ,Gd d!„d!eƒZ-Gd"d#„d#e-ƒZ.Gd$d%„d%ƒZ/Gd&d'„d'eƒZ0Gd(d)„d)eƒZ1Gd*d+„d+eƒZ2Gd,d-„d-eƒZ3Gd.d/„d/eƒZ4Gd0d1„d1eƒZ5Gd2d3„d3eƒZ6Gd4d5„d5eƒZ7e8d6kr0e j9d7d8dS)9éN)Ú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@sHeZdZejddfdd„Zdd„Zddd„Zdd „Zd d „Z d d „Z dS)Ú FakeSocketNcCsBt|tƒr| d¡}||_||_d|_d|_d|_||_||_ dS)NÚasciiórF) Ú isinstanceÚstrÚencodeÚtextÚ fileclassÚdataÚ sendall_callsÚ file_closedÚhostÚport)Úselfrrrr©rú-/usr/local/lib/python3.9/test/test_httplib.pyÚ__init__2s  zFakeSocket.__init__cCs |jd7_|j|7_dS)Né)rr©rrrrrÚsendall=szFakeSocket.sendallcCs6|dkr|dkrt ¡‚| |j¡|_|j|j_|jS)NÚrÚrb)rZUnimplementedFileModerrÚfileÚ file_closeÚclose)rÚmodeÚbufsizerrrÚmakefileAs  zFakeSocket.makefilecCs d|_dS)NT)r©rrrrr IszFakeSocket.file_closecCsdS©Nrr%rrrr!LszFakeSocket.closecCsdSr&r)rÚlevelZoptnameÚvaluerrrÚ setsockoptOszFakeSocket.setsockopt)N) Ú__name__Ú __module__Ú __qualname__ÚioÚBytesIOrrr$r r!r)rrrrr 1s   r c@s$eZdZdd„Zdd„Zdd„ZdS)Ú EPipeSocketcCst ||¡||_dSr&)r rÚ pipe_trigger)rrr0rrrrTs zEPipeSocket.__init__cCs(|j|vrttjdƒ‚|j|7_dS)NZgotcha)r0ÚOSErrorÚerrnoÚEPIPErrrrrrYs  zEPipeSocket.sendallcCsdSr&rr%rrrr!^szEPipeSocket.closeN)r*r+r,rrr!rrrrr/Rsr/c@s$eZdZdZddd„Zd dd„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. éÿÿÿÿcCs"tj ||¡}|dkrtdƒ‚|S©Nr zcaller tried to read past EOF)r-r.ÚreadÚAssertionError)rÚnrrrrr7gszNoEOFBytesIO.readNcCs"tj ||¡}|dkrtdƒ‚|Sr6)r-r.Úreadliner8)rÚlengthrrrrr:mszNoEOFBytesIO.readline)r5)N)r*r+r,Ú__doc__r7r:rrrrr4as r4cs4eZdZdZ‡fdd„Z‡fdd„Zdd„Z‡ZS)ÚFakeSocketHTTPConnectionz@HTTPConnection subclass using FakeSocket; counts connect() callscs$d|_tƒ d¡||_|j|_dS)Nrú example.com)Ú connectionsÚsuperrÚfake_socket_argsÚcreate_connectionÚ_create_connection)rÚargs©Ú __class__rrrvs z!FakeSocketHTTPConnection.__init__cs|jd7_tƒ ¡S)z.Count the number of times connect() is invokedr)r?r@Úconnectr%rErrrG|sz FakeSocketHTTPConnection.connectcOs t|jŽSr&)r rA©rÚposÚkwrrrrBsz*FakeSocketHTTPConnection.create_connection)r*r+r,r<rrGrBÚ __classcell__rrrErr=ss  r=c@sLeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dS)Ú HeaderTestscCsˆGdd„dtƒ}dD]n}dD]d}t d¡}tdƒ|_|ƒ|_d}i}|rXtt|ƒƒ||<| dd ||¡|  |jj |  ¡d ¡qqdS) Nc@seZdZdd„Zdd„ZdS)z;HeaderTests.test_auto_headers..HeaderCountingBuffercSs i|_dSr&)Úcountr%rrrrŠszDHeaderTests.test_auto_headers..HeaderCountingBuffer.__init__cSsX| d¡}t|ƒdkrH|d d¡ ¡}|j |d¡|j|d7<t ||¡dS)Nó:rrr )ÚsplitÚlenÚdecodeÚlowerrMÚ setdefaultÚlistÚappend)rÚitemÚkvZlcKeyrrrrUŒs   zBHeaderTests.test_auto_headers..HeaderCountingBuffer.appendN©r*r+r,rrUrrrrÚHeaderCountingBuffer‰srY)TF)úContent-lengthZHostzAccept-encodingr>Z blahblahblahZ spamspamspamÚPOSTú/r) rTrÚHTTPConnectionr ÚsockÚ_bufferr rPÚrequestÚ assertEqualrMrR)rrYZexplicit_headerÚheaderÚconnÚbodyÚheadersrrrÚtest_auto_headers…s   zHeaderTests.test_auto_headerscCsfGdd„dtƒ}d}d}t ||¡D]J\}}t d¡}tdƒ|_|ƒ|_| |d|¡|  |jj dd  |¡¡q$d }|D]F}t d¡}tdƒ|_|ƒ|_| |dd¡|  |jj dd   |¡¡qx|D]F}t d¡}tdƒ|_|ƒ|_| |dd ¡|  |jj dd  |¡¡qÄt  ||¡D]H}t d¡}tdƒ|_|ƒ|_| |dd ¡|  |jj d d  |¡¡qdS)Nc@seZdZdd„Zdd„ZdS)z?HeaderTests.test_content_length_0..ContentLengthCheckercSst |¡d|_dSr&)rTrÚcontent_lengthr%rrrr¥s zHHeaderTests.test_content_length_0..ContentLengthChecker.__init__cSsF| dd¡}t|ƒdkr6|d ¡dkr6|d ¡|_t ||¡dS)NrNrrscontent-length)rOrPrRÚstriprgrTrU)rrVrWrrrrU¨s zFHeaderTests.test_content_length_0..ContentLengthChecker.appendNrXrrrrÚContentLengthChecker¤sri)NÚ)ÚPUTr[ZPATCHr>r\ó0z%Header Content-Length incorrect on {})ÚGETÚCONNECTZDELETEÚHEADZOPTIONSZTRACEz.Header Content-Length set for empty body on {}rjú ó1) rTÚ itertoolsÚproductrr]r r^r_r`rargÚformatÚchain)rriZbodiesZmethods_with_bodyÚmethodrdrcZmethods_without_bodyrrrÚtest_content_length_0¢sP   þ  þ  þ  þz!HeaderTests.test_content_length_0cCs’t d¡}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+|j¡dS),Nr>rmr\rZé*sContent-length: 42ZFooz bar s Foo: bar ZBarz baz s Bar: baz Z AuthorizationzBearer mytokensAuthorization: Bearer mytokenZ IterHeaderZIterAZIterBsIterHeader: IterA IterBZ LatinHeaderóÿ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)rr]r r^Ú putrequestÚ putheaderÚassertInr_©rrcrrrÚtest_putheaderäs>                zHeaderTests.test_putheadercCsxd}t d¡}tdƒ}||_| dd¡| |j |¡¡d}t d¡}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Ú startswith©rÚexpectedrcr^rrrÚtest_ipv6host_headers    z HeaderTests.test_ipv6host_headercCsFd}t|ƒ}t |¡}| ¡| | d¡d¡| | d¡d¡dS)Nz4HTTP/1.1 200 OK First: val : nval Second: val ZFirstÚvalZSecond)r rÚ HTTPResponseÚbeginraÚ getheader©rrdr^ÚresprrrÚ!test_malformed_headers_coped_withs  z-HeaderTests.test_malformed_headers_coped_withcCs,dttddƒƒdttddƒƒd}t|ƒ}t |¡}| ¡| | d¡d ¡| |jdd ¡| | d ¡d ¡| |jd d ¡d   t t tddƒƒ¡}| | d ¡|¡| |jd |¡|  | d¡¡|  d|j¡| d¡|jdfD]0}| | d¡¡|  d|¡| | d¡¡qödS)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)ÚbytesÚranger rr†r‡rarˆÚmsgÚjoinÚmapÚchrZassertIsNotNoner|r€rÚendswith)rrdr^rŠZvcharZfoldedrrrÚtest_parse_all_octets#s4 þþ ýýÿ   z!HeaderTests.test_parse_all_octetsc Csœt d¡}tdƒ|_| dd¡d}|D]n\}}| ||f¡H| td¡| ||¡Wdƒn1sn0YWdƒq(1sŒ0Yq(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)ršs Invalid Value)ršs Invalid Value)ršsInvalidValue )ršs InvalidValue )ršs InvalidValue zInvalid header) rr]r r^rzÚsubTestÚassertRaisesRegexÚ ValueErrorr{)rrcÚcasesÚnamer(rrrÚtest_invalid_headersAs    z HeaderTests.test_invalid_headerscCsšd}t|ƒ}tj|dd}t ¡}| ¡Wdƒn1s@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: valézheader: Second: val1ézheader: Second: val2) r rr†rÚcaptured_stdoutr‡ÚgetvalueÚ splitlinesra)rrdr^rŠÚoutputÚlinesrrrÚtest_headers_debuglevel_sÿ & z#HeaderTests.test_headers_debuglevelN) r*r+r,rfrwr~r„r‹r˜r r¨rrrrrL„sB" rLc@seZdZdd„ZdS)ÚHttpMethodTestsc Cs`d}|D]R}| td¡2t d¡}tdƒ|_|j|ddWdƒq1sP0YqdS)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\)rvÚurl)rœrrr]r r^r`)rÚmethodsrvrcrrrÚtest_invalid_method_namesrs ÿ  z)HttpMethodTests.test_invalid_method_namesN)r*r+r,r¬rrrrr©qsr©c@sJeZdZdZdd„Zdd„Zdd„Zdd „Zdd d „Zd d„Z dd„Z dS)ÚTransferEncodingTestsIt's just a flesh woundcCsbt d¡}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Ú_rdrrrÚtest_endheaders_chunkedŠs    z,TransferEncodingTest.test_endheaders_chunkedcCsvt d¡}tdƒ|_| dd| ¡ddi¡| |jj¡\}}}| ddd „|  ¡Dƒ¡|  |dd¡|  ||j ¡t d¡}tdƒ|_| dd|j   d ¡ddi¡| |jj¡\}}}| dd d „|  ¡Dƒ¡|  |dd¡|  ||j ¡t d¡}tdƒ|_|jdddd id | ¡d| |jj¡\}}}| ddd „|Dƒ¡|  |dd ¡|  |  |¡|j ¡dS)Nr>r r[r\úTransfer-EncodingÚchunkedúcontent-lengthcSsg|] }| ¡‘qSr©rR©Ú.0ÚkrrrÚ žr z>TransferEncodingTest.test_explicit_headers..úlatin-1cSsg|] }| ¡‘qSrr¸r¹rrrr¼ªr z gzip, chunkedT)rer®rdcSsg|] }| ¡‘qSrr¸r¹rrrr¼¶r )rr]r r^r`r¯r°rÚ assertNotInÚkeysrar²rQr±©rrcr³rerdrrrÚtest_explicit_headers”s<  ÿ  þ  ýz*TransferEncodingTest.test_explicit_headerscCsŠdD]€}t d¡}tdƒ|_| dd|j|d¡| |jj¡\}}}| |¡}|  ||j ¡|  |dd¡|  d d d „|Dƒ¡qdS) N)FTr>r r[r\)Ú empty_linesrµr¶r·cSsg|] }| ¡‘qSrr¸r¹rrrr¼Èr z5TransferEncodingTest.test_request..) rr]r r^r`r¯r°rr±rar²r¾)rrÂrcr³rerdrrrÚ test_requestºs  ÿ z!TransferEncodingTest.test_requestcCslt d¡}tdƒ|_| ddd¡| |jj¡\}}}| |dd¡| dd d „|Dƒ¡| |d ¡dS) Nr>r r[r\rrµr¶r·cSsg|] }| ¡‘qSrr¸r¹rrrr¼Ñr z8TransferEncodingTest.test_empty_body..s0 ) rr]r r^r`r°rrar¾rÀrrrÚtest_empty_bodyÊs  z$TransferEncodingTest.test_empty_bodyFccsV|j d¡}t|ƒD]<\}}|r.|dr.dV|t|ƒdkrJ|dVq|VqdS)Nó r¡r r)r²rOÚ enumeraterP)rrÂr§ÚidxÚlinerrrr¯Ôs   zTransferEncodingTest._make_bodycCsŽ| d¡}|d}i}d}|t|ƒkrrt||ƒdkrr|| d¡\}}| d¡ ¡}| d¡ ¡||<|d7}q||d ||dd…¡fS)Nó rrrNr½)rOrPrQrhr”)rrr§r`rer9Úkeyr…rrrr°ßs  z#TransferEncodingTest._parse_requestcCs‚g}i}d}| d¡}|||d…\}}t|dƒ}|dkrF|d7}qx| |t|ƒ¡| |¡|d7}|t|ƒkrqxqd |¡S)NrrÉr¡érr )rOÚintrarPrUr”)rrrdÚtrailersr9r§ÚsizeÚchunkrrrr±ìs    z#TransferEncodingTest._parse_chunkedN)F) r*r+r,r²r´rÁrÃrÄr¯r°r±rrrrr­‡s &  r­c@sŒeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„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-dWdX„Z.dYdZ„Z/d[d\„Z0d]d^„Z1d_d`„Z2daS)bÚ BasicTestcCs"| hd£tttdƒƒƒk¡dS)N>rŸÚphraseÚ descriptionr(é”)r€ÚsetÚdirrr%rrrÚ&test_dir_with_added_behavior_on_statussz0BasicTest.test_dir_with_added_behavior_on_statuscCs²d}t|ƒ}t |¡}| ¡| | d¡d¡| | ¡¡| |j¡| | ¡d¡|  | ¡¡| |j¡|  ¡|  |j¡d}t|ƒ}t |¡}|  tj |j¡dS)NúHTTP/1.1 200 Ok Textrr sTextzHTTP/1.1 400.100 Not Ok Text) r rr†r‡rar7Ú assertFalseÚisclosedÚclosedr€r!Ú assertRaisesÚ BadStatusLiner‰rrrÚtest_status_lines s      zBasicTest.test_status_linescCst d¡}| t|ƒd¡dS)NrjzBadStatusLine("''"))rrÜraÚrepr)rÚexcrrrÚtest_bad_status_repr!s zBasicTest.test_bad_status_reprcCs‚d}t|ƒ}t |¡}| ¡| | d¡d¡| | ¡¡| | d¡d¡| | ¡¡| |j ¡|  ¡| |j ¡dS©Nz*HTTP/1.1 200 Ok Content-Length: 4 Textr¡óTeóxt© r rr†r‡rar7rØrÙr€rÚr!r‰rrrÚtest_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 rr†r‡rar:rØrÙr7r€rÚr!r‰rrrÚtest_mixed_reads4s  zBasicTest.test_mixed_readscCs²d}t|ƒ}t |¡}| ¡tdƒ}| |¡}| |d¡| t|ƒd¡| |  ¡¡| |¡}| |d¡| t|ƒd¡|  |  ¡¡| |j ¡|  ¡|  |j ¡dSrá© r rr†r‡Ú bytearrayÚreadintorar‘rØrÙr€rÚr!©rrdr^rŠÚbr9rrrÚtest_partial_readintosCs       z BasicTest.test_partial_readintoscCs”d}t|ƒ}t |¡}| ¡| | d¡d¡| | ¡¡| | d¡d¡| | d¡d¡| | ¡¡| |j ¡|  ¡| |j ¡dS)Nr×r¡rârãrr rär‰rrrÚ$test_partial_reads_no_content_lengthWs  z.BasicTest.test_partial_reads_no_content_lengthcCs¨d}t|ƒ}t |¡}| ¡tdƒ}| |¡}| |d¡| t|ƒd¡| |  ¡¡| |¡}| |d¡| t|ƒd¡| |¡}| |d¡|  |  ¡¡dS)Nr×r¡rârãr) r rr†r‡rèrérar‘rØrÙr€rêrrrÚ(test_partial_readintos_no_content_lengthgs       z2BasicTest.test_partial_readintos_no_content_lengthcCstd}t|ƒ}t |¡}| ¡| | d¡d¡| | ¡¡| | d¡d¡| | d¡d¡| | ¡¡dS)Nú+HTTP/1.1 200 Ok Content-Length: 10 Textr¡rârãrr ) r rr†r‡rar7rØrÙr€r‰rrrÚ"test_partial_reads_incomplete_bodyzs z,BasicTest.test_partial_reads_incomplete_bodycCsÈd}t|ƒ}t |¡}| ¡tdƒ}| |¡}| |d¡| t|ƒd¡| |  ¡¡| |¡}| |d¡| t|ƒd¡| |¡}| |d¡|  |  ¡¡| |j ¡|  ¡|  |j ¡dS)Nrïr¡rârãrrçrêrrrÚ&test_partial_readintos_incomplete_body‡s$        z0BasicTest.test_partial_readintos_incomplete_bodycCsVdD]}| tjtj|¡qdD]0\}}}t |¡}| ||j¡| ||j¡q dS)N©zwww.python.org:abczuser:password@www.python.org)©z[fe80::207:e9ff:fe9b]:8000úfe80::207:e9ff:fe9bi@)zwww.python.org:80úwww.python.orgéP)úwww.python.org:rõrö)rõrõrö)ú[fe80::207:e9ff:fe9b]rôrö)ú[fe80::207:e9ff:fe9b]:rôrö)rÛrÚ InvalidURLr]rarr©rZhpÚhÚpÚcrrrÚtest_host_ports  zBasicTest.test_host_portcCs<d}d}t|ƒ}t |¡}| ¡| d¡}| ||¡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)r rr†r‡rˆra)rrZhdrÚsrZcookiesrrrÚtest_response_headers®s  zBasicTest.test_response_headerscCs6tdtƒ}tj|dd}| ¡| ¡r2| d¡dS)Nú*HTTP/1.1 200 OK Content-Length: 14432 ro©rvú)Did not expect response from HEAD request)r r4rr†r‡r7Úfail©rr^rŠrrrÚtest_read_headÀsüzBasicTest.test_read_headcCsTtdtƒ}tj|dd}| ¡tdƒ}| |¡dkr@| d¡| t |ƒd¡dS)Nrrorérró) r r4rr†r‡rèrérrar‘)rr^rŠrërrrÚtest_readinto_headÍsü zBasicTest.test_readinto_headcCsRd dd„ttjdƒDƒ¡d}d|}t|ƒ}t |¡}| tjd|j¡dS)Nrcss|]}d|VqdS)z Header%d: fooNr)rºÚirrrÚ Ýsÿz2BasicTest.test_too_many_headers..rzHTTP/1.1 200 OK zgot more than \d+ headers) r”r’rZ _MAXHEADERSr r†rœÚ HTTPExceptionr‡)rrerrrrrrÚtest_too_many_headersÜs  ÿÿ ÿzBasicTest.test_too_many_headersc Cs‚d}ttdƒ`}t d¡}t|ƒ}||_| dd|¡| |j  |¡d|jdt |ƒ…|f¡Wdƒn1st0YdS)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`r€rrrP©rrƒrdrcr^rrrÚtest_send_fileås  ÿzBasicTest.test_send_filecCs‚d}t d¡}tdƒ}||_| |¡| ||j¡d|_| t d|¡¡| ||j¡d|_| t  |¡¡| ||j¡dS)Ns"this is a test this is only a testr>r rë) rr]r r^ÚsendrarÚarrayr-r.r‚rrrÚ test_sendós  zBasicTest.test_sendcsXdd„‰G‡fdd„dtjƒ}d}t d¡}tdƒ}||_| |ƒ¡| |j|¡dS)NcssdVdVdVdS)NrZdata_tworrrrrrsz/BasicTest.test_send_updating_file..datacs eZdZdZ”ƒZddd„ZdS)z7BasicTest.test_send_updating_file..UpdatingFilerr5cSs t|jƒSr&)ÚnextÚd)rÚ blocksizerrrr7 sz.UpdatingFile.readN)r5)r*r+r,r"rr7r©rrrÚ UpdatingFilesrsdatar>rj) r-Ú TextIOBaserr]r r^rrar)rrrƒrcr^rrrÚtest_send_updating_files  z!BasicTest.test_send_updating_filecCsLd}dd„}t d¡}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`rarrrrrÚtest_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>©rNóaóbrkr\rÚ9r¢ó r) rr]r r^r`r-r.rarrrO)rrrcr^rƒrdrrrÚtest_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^rƒrrrÚtest_blocksize_send2s zBasicTest.test_blocksize_sendcCsPt d¡}tdƒ|_| t¡| dd|¡Wdƒn1sB0YdS)Nr>rjr[Útest)rr]r r^rÛÚ TypeErrorr`r}rrrÚtest_send_type_error=s   zBasicTest.test_send_type_errorc Csft}ttttƒ}tj|dd}| ¡| |  ¡|¡|  ¡t ddƒD]V}ttttƒ}tj|dd}| ¡| |  |¡|  |¡|  ¡|¡|  ¡qLdD]¸}tt|ƒ}tj|dd}| ¡z†z |  ¡Wnbtj y>}zF| |j |¡dt|ƒ}| t|ƒ|¡| t|ƒ|¡WYd}~nd}~00| d¡W|  ¡q¨|  ¡0q¨dS)Nrmrré ©rjzfoo úIncompleteRead(%d bytes read)úIncompleteRead expected)Úchunked_expectedr Ú chunked_startÚ last_chunkÚ chunked_endrr†r‡rar7r!r’ÚIncompleteReadÚpartialrPrÞr r)rrƒr^rŠr9Úxr Úexpected_messagerrrÚ test_chunkedDs2$    & zBasicTest.test_chunkedc CsÚt}t|ƒ}tdƒ}ttttƒ}tj|dd}|  ¡|  |¡}|  |d|…|¡|  ||¡|  ¡t ddƒD]œ}ttttƒ}tj|dd}|  ¡t|ƒ}|  |d|…¡}||  ||||…¡7}||  ||d…¡7}|  |d|…|¡|  ||¡|  ¡qvdD]¼} tt| ƒ}tj|dd}|  ¡zˆz|  |¡}Wnbtjy°}zF|  |j|¡dt|ƒ} |  t|ƒ| ¡|  t|ƒ| ¡WYd}~nd}~00| d ¡W|  ¡n |  ¡0qdS) NrŽrmrrr)rr*r+r,)r-rPrèr r.r/r0rr†r‡rérar!r’Ú memoryviewr1r2rÞr r) rrƒZ nexpectedrër^rŠr9Úmr r3r4rrrÚtest_readinto_chunkeddsD      & zBasicTest.test_readinto_chunkedcCsˆd}t|ttƒ}tj|dd}| ¡| | ¡d¡| |jd¡| |j d¡|  |  ¡¡|  |j ¡| ¡|  |j ¡dS)NúEHTTP/1.1 200 OK Transfer-Encoding: chunked a hello world 1 d rorr éÈÚOK)r r/r0rr†r‡rar7ÚstatusÚreasonr€rÙrØrÚr!)rr.r^rŠrrrÚtest_chunked_headsÿ zBasicTest.test_chunked_headcCs¦d}t|ttƒ}tj|dd}| ¡tdƒ}| |¡}| |d¡| t |ƒd¡| |j d¡| |j d¡|  |  ¡¡| |j¡| ¡|  |j¡dS) Nr9rorrrr r:r;)r r/r0rr†r‡rèrérar‘r<r=r€rÙrØrÚr!)rr.r^rŠrër9rrrÚtest_readinto_chunked_head£sÿ   z$BasicTest.test_readinto_chunked_headcCs@tdƒ}tj|dd}| ¡| | ¡d¡| | ¡¡dS)Nz.HTTP/1.1 200 OK Content-Length: -1 Hello rmróHello )r rr†r‡rar7r€rÙrrrrÚtest_negative_content_lengthºsÿz&BasicTest.test_negative_content_lengthc Csœtdƒ}tj|dd}| ¡z | ¡WnbtjyŒ}zH| |jd¡| t|ƒd¡| t |ƒd¡|  |  ¡¡WYd}~nd}~00|  d¡dS)Nz.HTTP/1.1 200 OK Content-Length: 10 Hello rmrr@z-IncompleteRead(7 bytes read, 3 more expected)r,) r rr†r‡r7r1rar2rÞr r€rÙr)rr^rŠr rrrÚtest_incomplete_readÂs  ÿ ÿ$zBasicTest.test_incomplete_readcsZtddƒ}t d¡‰|ˆ_| t‡fdd„¡ˆ ¡}| d|j¡| d|  d¡¡dS) NzgHTTP/1.0 401 Authorization Required Content-type: text/html WWW-Authenticate: Basic realm="example" sContent-Lengthr>csˆ ddd¡S)Nrkú/urlrd)r`r©rcrrÚÛr z&BasicTest.test_epipe..i‘zBasic realm="example"zwww-authenticate) r/rr]r^rÛr1Ú getresponserar<rˆrrrDrÚ test_epipeÒsü  ÿÿzBasicTest.test_epipecCs8dddd}t t|ƒ¡}| tjtjf|j¡dS)NúHTTP/1.1 200 Okr»ér)rr†r rÛÚ LineTooLongrÜr‡©rrdrŠrrrÚtest_overflowing_status_lineãsz&BasicTest.test_overflowing_status_linecCs2dddd}t t|ƒ¡}| tj|j¡dS)NzHTTP/1.1 200 OK X-Foo: barrrIz )rr†r rÛrJr‡rKrrrÚtest_overflowing_header_lineèsÿÿÿz&BasicTest.test_overflowing_header_linecCsrdd}t t|ƒ¡}| tj¡}| ¡Wdƒn1s@0Y| dt|jƒ¡| dt|jƒ¡dS)NzHTTP/1.1 100 OK r i€zgot more than re) rr†r rÛr r‡r|r Ú exception)rrdrŠÚcmrrrÚ'test_overflowing_header_limit_after_100ðsÿÿ&z1BasicTest.test_overflowing_header_limit_after_100cCs:dddd}t t|ƒ¡}| ¡| tj|j¡dS)Nz/HTTP/1.1 200 OK Transfer-Encoding: chunked rrIza hello world 0 )rr†r r‡rÛrJr7rKrrrÚtest_overflowing_chunked_lineýsþþÿz'BasicTest.test_overflowing_chunked_linecCs`d}t|ƒ}t |¡}| ¡| | ¡d¡| | ¡¡| |j ¡|  ¡| |j ¡dS)NrHr ) r rr†r‡rar7r€rÙrØrÚr!r‰rrrÚtest_early_eof s  zBasicTest.test_early_eofcsnt d¡}d‰G‡fdd„dtjƒ}||_tdƒ|_| dd¡| tj|j ¡|  ˆj ¡|  |jj ¡dS)Nr>cseZdZ‡fdd„ZdS)z+BasicTest.test_error_leak..Responsecs"|‰tjj|g|¢Ri|¤ŽdSr&)rr†rrH©Úresponserrrsz4BasicTest.test_error_leak..Response.__init__N)r*r+r,rrrSrrÚResponsesrUzInvalid status linermr\) rr]r†Zresponse_classr r^r`rÛrÜrFr€rÚr)rrcrUrrSrÚtest_error_leaks    zBasicTest.test_error_leakcCsRd}td}tt|ttƒ}tj|dd}| ¡| |  ¡|¡|  ¡dS)Nz3;foo=bar abc sabcrmr) r-r r.Úlast_chunk_extendedr0rr†r‡rar7r!)rÚextrarƒr^rŠrrrÚtest_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/rr†r‡rar7r!©rrƒr^rŠrrrÚtest_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/rÍr0rr†r‡rar7rr!rZrrrÚtest_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/rÍr0rr†r‡rar7rrr!)rrƒr]r^rŠrrrÚtest_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 rr†r‡rar7rr!©rr]rƒr^rŠrrrÚtest_content_length_syncPsz"BasicTest.test_content_length_synccCs`d}d}td||ƒ}tj|dd}| ¡| | d¡|g¡| |j ¡|¡| ¡dS©Nr_r`rarmriÐ) r rr†r‡raÚ readlinesrr7r!rbrrrÚtest_readlines_content_length\sz'BasicTest.test_readlines_content_lengthcCs^d}d}td||ƒ}tj|dd}| ¡| | d¡|¡| |j ¡|¡| ¡dSrd) r rr†r‡raÚread1rr7r!rbrrrÚtest_read1_content_lengthgsz#BasicTest.test_read1_content_lengthcCspd}d}td||ƒ}tj|dd}| ¡| | d¡|¡| | d¡d¡| |j ¡|¡| ¡dS)Nr_r`rarmré r ) r rr†r‡rar: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 r¢rmrér¡) r rr†r‡rargr7rr!rbrrrÚtest_read1_bound_content_length~sz)BasicTest.test_read1_bound_content_lengthcsöt tdf¡‰| ˆj¡d‰‡‡fdd„}tj|d}| ¡| |jt dƒ¡t j ˆ  ¡Ž}|  dd¡| ¡}zV| |jt j¡tj| ¡d}z| d ¡W| ¡n | ¡0W| ¡| ¡n| ¡| ¡0| ¡| ˆd ¡dS) Nrc s†ˆ ¡\}}|b| d¡8}| ¡}| d¡sq4q| d¡| ¡‰Wdƒn1sZ0YWdƒn1sx0YdS)NrrÉs'HTTP/1.1 200 Connection established )Úacceptr$r:Úrstriprr7)rcÚaddressÚreaderrÈ©ÚresultÚservrrÚ run_servers   z2BasicTest.test_response_fileno..run_server)Útargetrrnz dummy:1234)Úfilenos proxied data )ÚsocketÚ create_serverÚHOSTÚ addCleanupr!Ú threadingÚThreadÚstartr”Úfloatrr]Ú getsocknamer`rFrar<r;rvrÚdetach)rrtÚthreadrcrTrrrqrÚtest_response_filenoŠs,     ÿ zBasicTest.test_response_filenocCs4Gdd„dtjƒ}|dƒ}tdƒ|_| dd¡dS)zv It should be possible to override the default validation behavior in putrequest (bpo-38216). c@seZdZdd„ZdS)zRBasicTest.test_putrequest_override_domain_validation..UnsafeHTTPConnectioncSsdSr&r©rrªrrrÚ_validate_pathµszaBasicTest.test_putrequest_override_domain_validation..UnsafeHTTPConnection._validate_pathN)r*r+r,r„rrrrÚUnsafeHTTPConnection´sr…r>rjrmz/N©rr]r r^rz©rr…rcrrrÚ*test_putrequest_override_domain_validation¯s z4BasicTest.test_putrequest_override_domain_validationcCs8Gdd„dtjƒ}|dƒ}tdƒ|_|jdddddS) Nc@seZdZdd„ZdS)zPBasicTest.test_putrequest_override_host_validation..UnsafeHTTPConnectioncSsdSr&rrƒrrrÚ_validate_host¾sz_BasicTest.test_putrequest_override_host_validation..UnsafeHTTPConnection._validate_hostN)r*r+r,r‰rrrrr…½sr…z example.com rjrmr\r)Z skip_hostr†r‡rrrÚ(test_putrequest_override_host_validation¼s z2BasicTest.test_putrequest_override_host_validationcCs4Gdd„dtjƒ}|dƒ}tdƒ|_| dd¡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..UnsafeHTTPConnectioncSs | d¡S)Nzutf-8)r)rZstr_urlrrrÚ_encode_requestÎszYBasicTest.test_putrequest_override_encoding..UnsafeHTTPConnection._encode_requestN)r*r+r,r‹rrrrr…Ísr…r>rjrmu/☃Nr†r‡rrrÚ!test_putrequest_override_encodingÇs z+BasicTest.test_putrequest_override_encodingN)3r*r+r,rÖrÝràrårærìrírîrðrñrÿrrr rrrrrr$r%r(r5r8r>r?rArBrGrLrMrPrQrRrVrYr[r\r^rcrfrhrjrlr‚rˆrŠrŒrrrrrÐs`      +            %  rÐc@sxeZdZdZdZee d¡d… d¡ZdZdd„Z d d „Z d d „Z d 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 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 r§rr†r‡r-ÚBufferedReaderÚfprŠrrrrÚsetUpôs  zExtendedReadTest.setUpcsÊ|j}|jj‰d‡fdd„ }||j_g}| d¡}|rŽ| t|ƒd¡| ¡}| t|ƒt|ƒ¡| | |¡¡| t|ƒ¡}|  ||¡n| ¡}|  |¡|  |¡|s(q²q(|  d  |¡|j ¡dS)Nr5cs(ˆ|ƒ}|dkr|d|…S|dd…S)Nrrir)r9rý©ZoldpeekrrÚmypeeks z*ExtendedReadTest.test_peek..mypeekr¢rr )r5)rŠrÚpeekÚ assertGreaterrPZassertGreaterEqualr€rr7rarØrUr”Úlines_expected)rrŠr“ÚallrýZp2rrr’rÚ test_peekýs&   zExtendedReadTest.test_peekcCs|j}| |jj|j¡dSr&)rŠÚ_verify_readliner:r–)rrŠrrrÚ test_readlineszExtendedReadTest.test_readlinecCs\g}|dƒ}|r4|dkr4t|ƒdkr4| | d¡¡| |¡|sqFq| d |¡|¡dS)Nrófooó r )rPr€r—rUrar”)rr:rƒr—rÈrrrr™ s   z!ExtendedReadTest._verify_readlinecs0ˆj‰‡‡fdd„}t|ƒ}ˆ |jˆj¡dS)Ncsˆ d¡}ˆ t|ƒd¡|S)Né)rgÚassertLessEqualrP)Úres©rŠrrrr/s z&ExtendedReadTest.test_read1..r)rŠÚ Readlinerr™r:r–)rrZ readlinerrr rÚ test_read1-szExtendedReadTest.test_read1cCs<|j}g}| ¡}|sq$| |¡q | d |¡|j¡dS©Nr )rŠrgrUrar”r–©rrŠr—rrrrÚtest_read1_unbounded6s z%ExtendedReadTest.test_read1_unboundedcCsN|j}g}| d¡}|sq6| t|ƒd¡| |¡q | d |¡|j¡dS)Nrir )rŠrgržrPrUrar”r–r¤rrrÚtest_read1_bounded@s  z#ExtendedReadTest.test_read1_boundedcCs| |j d¡d¡dS)Nrr )rarŠrgr%rrrÚ test_read1_0KszExtendedReadTest.test_read1_0cCs |j d¡}| dt|ƒ¡dS©Nr)rŠr”ržrP)rrýrrrÚ test_peek_0Ns zExtendedReadTest.test_peek_0)r*r+r,r<r§Úfindrr–Z lines_chunkedr‘r˜ršr™r¢r¥r¦r§r©rrrrrÖsÿÿ     rc@seZdZdZdZdS)ÚExtendedReadTestChunkedz: Test peek(), read1(), readline() in chunked mode rŽN)r*r+r,r<r§rrrrr«Ssÿr«c@s eZdZdZdd„Zdd„ZdS)r¡zT a simple readline class that uses an arbitrary read function and buffering cCs||_d|_dSr£)ÚreadfuncÚ remainder)rr¬rrrrmszReadliner.__init__cCs°g}d}|j}z‚| d¡}|dkr$q^|t|ƒ|kr@||d}| |¡| ¡}|sd}q^q|d7}| |d|…¡||d…|_d |¡WSd |¡|_‚Yn0dS)Nrrœr5rr )r­rªrPrUr¬r”)rÚlimitrZdatalenr7rÇrrrr:qs*     zReadliner.readlineN)r*r+r,r<rr:rrrrr¡isr¡c@s$eZdZdd„Zdd„Zdd„ZdS)Ú OfflineTestcCsfdh}ddh}ttƒD]<}| d¡s||vr.qtt|ƒ}t|ddƒdkr| |¡q| tj|¡dS)NÚ responsesZ HTTPMessageÚ parse_headersr³r+z http.client)rÕrrÚgetattrÚaddZassertCountEqualÚ__all__)rrƒZ blacklistrŸZ module_objectrrrÚtest_allŒs   zOfflineTest.test_allcCs| tjtjd¡dS)Nz Not Found)rarr°Ú NOT_FOUNDr%rrrÚtest_responsesšszOfflineTest.test_responsesc CsRgd¢}|D]@}|j|d | tt|ƒ¡Wdƒq 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 FORBIDDENr¶ZMETHOD_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)r›r€Úhasattrr)rrƒÚconstrrrÚtest_client_constantss<z!OfflineTest.test_client_constantsN)r*r+r,rµr·rºrrrrr¯‹sr¯c@s@eZdZdd„Zdd„Zdd„Ze ee dƒ d¡d d „ƒZ d S) ÚSourceAddressTestcCs>t tjtj¡|_t |j¡|_t ¡|_|j  ¡d|_ dSr&) rwÚAF_INETÚ SOCK_STREAMrsrÚ bind_portrZfind_unused_portÚ source_portÚlistenrcr%rrrr‘ás   zSourceAddressTest.setUpcCs*|jr|j ¡d|_|j ¡d|_dSr&)rcr!rsr%rrrÚtearDownès   zSourceAddressTest.tearDowncCsBtjt|jd|jfd|_|j ¡| |jj  ¡d|j¡dS)Nrj©Úsource_addressr) rr]ryrr¿rcrGrar^rr%rrrÚtestHTTPConnectionSourceAddressïs  ÿ z1SourceAddressTest.testHTTPConnectionSourceAddressÚHTTPSConnectionz'http.client.HTTPSConnection not definedcCstjt|jd|jfd|_dS)NrjrÂ)rrÅryrr¿rcr%rrrÚ testHTTPSConnectionSourceAddressõs ÿz2SourceAddressTest.testHTTPSConnectionSourceAddressN) r*r+r,r‘rÁrÄÚunittestÚskipIfr¸rrÆrrrrr»àsÿr»c@s(eZdZdZdd„Zdd„Zdd„ZdS)Ú TimeoutTestNcCs.t tjtj¡|_t |j¡t_|j ¡dSr&) rwr¼r½rsrr¾rÉÚPORTrÀr%rrrr‘szTimeoutTest.setUpcCs|j ¡d|_dSr&)rsr!r%rrrrÁs zTimeoutTest.tearDownc Cs| t ¡¡t d¡z$t ttj¡}|  ¡Wt d¡n t d¡0|  |j   ¡d¡|  ¡| t ¡¡t d¡z(tjttjdd}|  ¡Wt d¡n t d¡0|  |j   ¡d¡|  ¡tjttjdd}|  ¡|  |j   ¡d¡|  ¡dS©Né)Útimeout)Ú assertIsNonerwÚgetdefaulttimeoutÚsetdefaulttimeoutrr]ryrÉrÊrGrar^Ú gettimeoutr!)rZhttpConnrrrÚtestTimeoutAttribute s,    ÿ z TimeoutTest.testTimeoutAttribute)r*r+r,rÊr‘rÁrÒrrrrrÉÿsrÉc@s$eZdZdd„Zdd„Zdd„ZdS)ÚPersistenceTestc Csúd}|D]ì\}}}|j||dÄd ||¡}t|ƒ}| |j¡| dd¡| ¡,}| |jdu| ¡| ¡Wdƒn1sˆ0Y| |jdu| ¡| |j d¡| dd¡| |j |rÐdnd¡Wdƒq1sê0YqdS) N))ú1.0rjF)rÔzConnection: keep-alive T)ú1.1rjT)rÕzConnection: close F)rÔzConnection: keep-ALIVE T)rÕzConnection: cloSE F)Úversionrbz4HTTP/{} 200 OK {}Content-Length: 12 Dummy body rmz/open-connectionrz/subsequent-requestr¡) r›rtr=rÎr^r`rFrar7r?)rÚtestsrÖrbZreuser“rcrTrrrÚtest_reuse_reconnect/s"ÿú   & z$PersistenceTest.test_reuse_reconnectc Cs¤dd„}tjtjf|tff}|D]~\}}|j|dZtd|ƒ}| dd¡| ||j ¡|  |j ¡| dd¡|  |j d¡Wdƒq 1s”0Yq dS) Ncs&t |¡‰‡fdd„}|ˆ_t ˆ¡S)z3Return BufferedReader that raises ECONNRESET at EOFcs tj ˆ|¡}|dkrtƒ‚|Sr¨)r-r.réÚConnectionResetError)ÚbufferrΩÚstreamrrréRszNPersistenceTest.test_disconnected..make_reset_reader..readinto)r-r.rér)rrérrÛrÚmake_reset_readerOs  z.make_reset_reader)rNr rmz /eof-responseú /reconnectr¡)r-r.rÚRemoteDisconnectedrÙr›r=r`rÛrFrÎr^rar?)rrÝr×Zstream_factoryrNrcrrrÚtest_disconnectedMs þ     z!PersistenceTest.test_disconnectedcCsVtdƒ}|jddddid| tj|j¡| |j¡| dd¡| |j d¡dS) NsHTTP/1.1 100 Continue rmr\ZExpectz 100-continue)rerÞr¡) r=r`rÛrrßrFrÎr^rar?r}rrrÚtest_100_closehsÿ  zPersistenceTest.test_100_closeN)r*r+r,rØràrárrrrrÓ-srÓc@sŽeZdZdd„Zdd„Zdd„Zdd„Zd d „Zej d d „ƒZ d d„Z dd„Z dd„Z dd„Zdd„Ze eedƒ d¡dd„ƒZdd„ZdS)Ú HTTPSTestcCsttdƒs| d¡dS)NrÅzssl support required)r¸rÚskipTestr%rrrr‘ws zHTTPSTest.setUpcCsddlm}|||dS)Nr)Úmake_https_server)Úcertfile)Ztest.ssl_serversrä)rrårärrrÚ make_server{s zHTTPSTest.make_servercCs$tjttjdd}| |jd¡dSrË)rrÅryrÉrÊrarÍ)rrürrrÚtest_attributesszHTTPSTest.test_attributesc Cs”ddl}t d¡t d¡dt dd¡}| |j¡}|  dd¡Wdƒn1sX0Y|  |j j d¡Wdƒn1s†0YdS)NrÚnetworkúself-signed.pythontest.neté»rmr\ÚCERTIFICATE_VERIFY_FAILED) ÚsslrÚrequiresrÚtransient_internetrrÅrÛÚSSLErrorr`rarNr=)rrìrüÚexc_inforrrÚtest_networked„s   *zHTTPSTest.test_networkedcCsŽddl}t d¡t d¡^| ¡}tjdd|d}| dd¡|  ¡}|  ¡|  d|  d ¡¡|  ¡Wdƒn1s€0YdS) Nrrèrérê©Úcontextrmr\ÚnginxÚserver) rìrrírrîZ_create_unverified_contextrrÅr`rFr!r|rˆ)rrìrórürŠrrrÚtest_networked_noverificationŽs  ÿ z'HTTPSTest.test_networked_noverificationcCs~t d¡t d¡Vt dd¡}| dd¡| ¡}| d¡}|  ¡|  ¡|  d|¡Wdƒn1sp0YdS)Nrèrõrêrmr\z content-typez text/html) rrírrîrrÅr`rFrˆr!r|)rrürŠZ content_typerrrÚ&test_networked_trusted_by_default_certœs     z0HTTPSTest.test_networked_trusted_by_default_certc Csddl}t d¡d}t |¡è| |j¡}| |j|j ¡| |j d¡|  t ¡z(t j|d|d}| dd¡| ¡}WnT|jyÒ}z:t|ƒ}t d |¡r¼t d |›d |›d ¡‚‚WYd}~n d}~00| d ¡}| ¡| ¡| d|¡Wdƒn1s0YdS)NrrèréTrêròrmr\z(?i)key.too.weakzGot z trying to connect to z). See https://bugs.python.org/issue36816.rõrô)rìrrírrîÚ SSLContextÚPROTOCOL_TLS_CLIENTraZ verify_modeZ CERT_REQUIREDÚcheck_hostnameÚload_verify_locationsÚ CERT_selfsigned_pythontestdotnetrrÅr`rFrïr ÚreÚsearchrÇZSkipTestrˆr!r|) rrìZselfsigned_pythontestdotnetrórürŠZssl_errZ ssl_err_strZ server_stringrrrÚtest_networked_good_cert©s6    ÿ   ÿÿ z"HTTPSTest.test_networked_good_certc Cs®ddl}t d¡t d¡~| |j¡}| t¡t j dd|d}|  |j ¡}|  dd¡Wdƒn1sr0Y| |jjd¡Wdƒn1s 0YdS) Nrrèrérêròrmr\rë)rìrrírrîrørùrûÚCERT_localhostrrÅrÛrïr`rarNr=)rrìrórürðrrrÚtest_networked_bad_certÊs    *z!HTTPSTest.test_networked_bad_certcCslddl}| t¡}t d|j¡}| |j¡}| dd¡Wdƒn1sN0Y|  |j j d¡dS)NrÚ localhostrmr\rë) rìrærrrÅrrÛrïr`rarNr=)rrìrõrürðrrrÚtest_local_unknown_certÖs  *z!HTTPSTest.test_local_unknown_certcCsxddl}| t¡}| |j¡}| t¡tjd|j|d}|  |j ¡|  dd¡|  ¡}|  |j ¡|  |jd¡dS)Nrrròrmú /nonexistentrÓ)rìrærrørùrûrrÅrrzr!r`rFrar<©rrìrõrórürŠrrrÚtest_local_good_hostnameßs      z"HTTPSTest.test_local_good_hostnamecCs4ddl}| t¡}| |j¡}| t¡tjd|j|d}|  |j ¡|  dd¡Wdƒn1sh0Yt   dtf¡$tjd|j|dd}Wdƒn1sª0Y|  |j ¡|  dd¡Wdƒn1sâ0Yd |_t   dtf¡$tjd|j|d d}Wdƒn1s,0Y|  dd ¡| ¡}| ¡| ¡| |jd ¡d |_tjd|j|d}|  dd ¡| ¡}| |jd ¡| ¡| ¡t   dtf¡$tjd|j|dd}Wdƒn1sì0Y|  |j ¡|  dd¡Wdƒn1s&0YdS) Nrrròrmr\rjT)rórúFrrÓ)rìræÚCERT_fakehostnamerørùrûrrÅrrÛZCertificateErrorr`rZcheck_warningsÚDeprecationWarningrúrFr!rar<rrrrÚtest_local_bad_hostnameìsH   * ÿ$* ÿ&   ÿ&z!HTTPSTest.test_local_bad_hostnamerÅz)http.client.HTTPSConnection not availablecCsVdD]}| tjtj|¡qdD]0\}}}t |¡}| ||j¡| ||j¡q dS)Nrò)ró)zwww.python.org:443rõrê)r÷rõrê)rõrõrê)rørôrê)rùrôrê)rÛrrúrÅrarrrûrrrrÿs  zHTTPSTest.test_host_portcCsÐddl}|js| d¡t dd¡}| |jj¡| |j ¡}|  |j¡tjdd|d}|  |j|¡|  |jj¡t   ¡0t  ddt¡tjdd|td}Wdƒn1s´0Y| |jj¡dS) NrzTLS 1.3 support requiredrrêròÚignorez5key_file, cert_file and check_hostname are deprecated)róZ cert_file)rìZ HAS_TLSv1_3rãrrÅr€Z_contextZpost_handshake_authrørùrØZassertIsÚwarningsÚcatch_warningsÚfilterwarningsrr)rrìrürórrrÚtest_tls13_pha*s$     ÿ ÿ$zHTTPSTest.test_tls13_phaN)r*r+r,r‘rærçrñrörZsystem_must_validate_certr÷rÿrrrr rÇrÈr¸rrÿrrrrrrâus"  !   *ÿ râc@sXeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dS)ÚRequestBodyTestz3Test cases where a request includes a message body.cCs,t d¡|_tdƒ|j_|_|j|j_dS)Nr>rj)rr]rcr r^r%rrrr‘Cs zRequestBodyTest.setUpcCs(t |jj¡}| ¡t |¡}||fSr&)r-r.r^rr:rr±©rÚfÚmessagerrrÚget_headers_and_fpHs z"RequestBodyTest.get_headers_and_fpc CsÀddgdfdf}|D]¦\}}| |¡„t d¡|_tdƒ|j_|_|j dd|¡| ¡\}}| d |¡| d |¡|  |  d ¡d ¡|  ||  ¡¡Wdƒq1s°0YqdS) Nr›óbaró3 foo 3 bar 0 ))r›rrr>rjrkrCz Content-Typerrµr¶) r›rr]rcr r^r`rr¾raÚgetr7)rržrdrƒr“rrrrÚtest_list_bodyNs þ      zRequestBodyTest.test_list_bodycCsL|j dddddi¡| ¡\}}| d| d¡¡| dt| ¡ƒ¡dS)NrkrCrdrZ42r·r)rcr`rrarrPr7©rrrrrrÚtest_manual_content_lengthbs  ÿ z*RequestBodyTest.test_manual_content_lengthcCs`|j ddd¡| ¡\}}| d| ¡¡| | ¡¡| d| d¡¡| d| ¡¡dS)NrkrCrdú text/plainÚ4r·sbody© rcr`rraÚget_content_typerÎÚ get_charsetrr7rrrrÚtest_ascii_bodyks  zRequestBodyTest.test_ascii_bodycCs`|j ddd¡| ¡\}}| d| ¡¡| | ¡¡| d| d¡¡| d| ¡¡dS)NrkrCubodyÃrÚ5r·óbodyÁrrrrrÚtest_latin1_bodyss  z RequestBodyTest.test_latin1_bodycCs`|j ddd¡| ¡\}}| d| ¡¡| | ¡¡| d| d¡¡| d| ¡¡dS)NrkrCr!rr r·rrrrrÚtest_bytes_body{s  zRequestBodyTest.test_bytes_bodycCsà| tjtj¡ttjdƒ}| d¡Wdƒn1s<0Yttjƒ|}|j dd|¡| ¡\}}|  d|  ¡¡|  |  ¡¡|  |  d¡¡|  d|  d¡¡|  d | ¡¡Wdƒn1sÒ0YdS) NÚwrdrkrCrr·r¶ztransfer-encodings4 body 0 )rzrÚunlinkÚTESTFNrÚwritercr`rrarrÎrrr7rrrrÚtest_text_file_bodyƒs(  z#RequestBodyTest.test_text_file_bodycCsÞ| tjtj¡ttjdƒ}| d¡Wdƒn1s<0Yttjdƒx}|j dd|¡| ¡\}}|  d|  ¡¡|  |  ¡¡|  d|  d¡¡| d |¡|  d | ¡¡Wdƒn1sÐ0YdS) NÚwbr!rrkrCrr¶rµrs5 bodyÁ 0 )rzrr%r&rr'rcr`rrarrÎrrr¾r7rrrrÚtest_binary_file_body’s(  z%RequestBodyTest.test_binary_file_bodyN) r*r+r,r<r‘rrrrr"r#r(r*rrrrr@s rc@s<eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)ÚHTTPResponseTestcCs&d}t|ƒ}t |¡|_|j ¡dS)NzXHTTP/1.1 200 Ok My-Header: first-value My-Header: second-value Text)r rr†rŠr‡)rrdr^rrrr‘¢s zHTTPResponseTest.setUpcCs6|j d¡}| |d¡|j dd¡}| |d¡dS)Nz My-Headerzfirst-value, second-valuez some default©rŠrˆra©rrbrrrÚtest_getting_header©s  z$HTTPResponseTest.test_getting_headercCs|j dd¡}| |d¡dS)NúNo-Such-Headerz default-valuer,r-rrrÚ3test_getting_nonexistent_header_with_string_default°szDHTTPResponseTest.test_getting_nonexistent_header_with_string_defaultcCs<|j dddg¡}| |d¡|j dd¡}| |d¡dS)Nr/ÚdefaultÚvalueszdefault, values)r1r2r,r-rrrÚ5test_getting_nonexistent_header_with_iterable_default´s zFHTTPResponseTest.test_getting_nonexistent_header_with_iterable_defaultcCs|j d¡}| |d¡dS)Nr/r,r-rrrÚ/test_getting_nonexistent_header_without_default»s z@HTTPResponseTest.test_getting_nonexistent_header_without_defaultcCs |jjddd}| |d¡dS)Nr/rx)r1r,r-rrrÚtest_getting_header_defaultint¿sz/HTTPResponseTest.test_getting_header_defaultintN) r*r+r,r‘r.r0r3r4r5rrrrr+ s r+c@sTeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z 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_textrrrr‘Äs ÿzTunnelTests.setUpcCs|j ¡dSr&)rcr!r%rrrrÁÎszTunnelTests.tearDowncsd‡fdd„ }|S)Ncstˆ|d|ddS)Nrr)rr)r )rorÍrér7rrrBÒsz9TunnelTests._create_connection..create_connection)NNr)rr7rBrr8rrCÑszTunnelTests._create_connectioncCsŽd}d}ddi}|jj|||d|j ddd¡| |jjj|j¡| |jjjtj¡| |jj |¡| |jj |¡| |jj |¡dS) Núdestination.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_headersÖs ÿz-TunnelTests.test_set_tunnel_host_port_headerscCs |j ¡| t|jjd¡dS)Nr9)rcrGrÛÚ RuntimeErrorr:r%rrrÚ&test_disallow_set_tunnel_after_connectãs  ÿz2TunnelTests.test_disallow_set_tunnel_after_connectcCs|j d¡|j ddd¡| |jjj|j¡| |jjjtj¡|  d|jjj ¡|  d|jjj ¡|  d|jjj ¡|  d|jjj ¡dS) Nr9ror\rjóCONNECT destination.comsHost: destination.com:NoneóHost: destination.comsHost: proxy.com) rcr:r`rar^rrrr;r|rr¾r%rrrÚtest_connect_with_tunnelés z$TunnelTests.test_connect_with_tunnelcCs¶tj |jd¡4}|j d¡|j ¡|j dd¡Wdƒn1sJ0Y| ¡|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: )r“rr?r#zunexpected proxy data sent )rZpatchÚobjectrcr:rGr`Z assert_calledr•rPZ mock_callsr|r€r—)rZ mock_sendZproxy_setup_data_sentrrrÚ0test_tunnel_connect_single_send_connection_setupös  ,  þ þzrArCrDrErrrrr6Ãs   r6Ú__main__r¡)Ú verbosity):r2Úhttprrr-rrÚosrrýrwr{r rÇrZTestCaser&rZ test.supportrÚpathÚdirnamerÚherer”rrrür.r-Zchunk_extensionr/rWrÍr0ryr r/r.r4r]r=rLr©r­rÐrr«r¡r¯r»rÉrÓrârr+r6r*ÚmainrrrrÚsp    ÿ  !nT}"U.HL`#Z