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)rrr1rrrrTs zEPipeSocket.__init__cCs(|j|vrttjdƒ‚|j|7_dS)NZgotcha)r1ÚOSErrorÚerrnoÚEPIPErrrrrrYs  zEPipeSocket.sendallcCsdSr'rr&rrrr"^szEPipeSocket.closeN)r+r,r-rrr"rrrrr0Rsr0c@s eZdZddd„Zddd„ZdS) Ú NoEOFBytesIOéÿÿÿÿcCs"tj ||¡}|dkrtdƒ‚|S©Nr zcaller tried to read past EOF)r.r/ÚreadÚAssertionError)rÚnrrrrr8gszNoEOFBytesIO.readNcCs"tj ||¡}|dkrtdƒ‚|Sr7)r.r/Úreadliner9)rÚlengthrrrrr;mszNoEOFBytesIO.readline)r6)N)r+r,r-r8r;rrrrr5as r5cs0eZdZ‡fdd„Z‡fdd„Zdd„Z‡ZS)ÚFakeSocketHTTPConnectioncs$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ƒ ¡Sr)r?r@Úconnectr&rErrrG|sz FakeSocketHTTPConnection.connectcOs t|jŽSr')r rA©rÚposÚkwrrrrBsz*FakeSocketHTTPConnection.create_connection)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`rer:Ú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Útrailersr:r§Ú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>Ú descriptionr)rŸÚphraseé”)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‡rar8Ú 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‡rar8rØ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Ùr8r€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ŠÚbr:rrrÚ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‡rar8rØ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 r5rr†r‡r8Úfail©rr^rŠrrrÚtest_read_headÀsüzBasicTest.test_read_headcCsTtdtƒ}tj|dd}| ¡tdƒ}| |¡dkr@| d¡| t |ƒd¡dS)Nrrorérró) r r5rr†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..UpdatingFilerr6cSs t|jƒSr')ÚnextÚd)rÚ blocksizerrrr8 sz.UpdatingFile.readN)r6)r+r,r-r#rr8r©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 |¡dd i¡| |jd ¡|j   d d ¡d }| ||¡dS) Nér>©ró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)Nrr>rr 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‡rar8r"r’ÚIncompleteReadÚpartialrPrÞr r)rrƒr^rŠr:Ú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Šr:Ú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‡rar8Ú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ër:rrrÚ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‡rar8r€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‡r8r1rar2rÞ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) r0rr]r^rÛr2Ú 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ÛrJr8rKrrrÚtest_overflowing_chunked_lineýsþþÿz'BasicTest.test_overflowing_chunked_linecCs`d}t|ƒ}t |¡}| ¡| | ¡d¡| | ¡¡| |j ¡|  ¡| |j ¡dS)NrHr ) r rr†r‡rar8r€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‡rar8r")rÚextrarƒr^rŠrrrÚtest_chunked_extension&sz BasicTest.test_chunked_extensioncCsBt}tttƒ}tj|dd}| ¡| | ¡|¡|  ¡dS©Nrmr) r-r r.r/rr†r‡rar8r"©rrƒr^rŠrrrÚtest_chunked_missing_end0s  z"BasicTest.test_chunked_missing_endcCs\t}tttttƒ}tj|dd}| ¡|  |  ¡|¡|  |j   ¡d¡|  ¡dS)Nrmrr ) r-r r.r/rÍr0rr†r‡rar8r r"r[rrrÚtest_chunked_trailers9szBasicTest.test_chunked_trailerscCsjt}d}ttttt|ƒ}tj|dd}| ¡|  |  ¡|¡|  |j   ¡|  d¡¡|  ¡dS)NÚ extradatarmrr )r-r r.r/rÍr0rr†r‡rar8r rr")rrƒr^r^rŠrrrÚtest_chunked_syncDszBasicTest.test_chunked_synccCs\d}d}td||ƒ}tj|dd}| ¡| | ¡|¡| |j ¡|¡| ¡dS)Nó extradataó Hello123 ó'HTTP/1.1 200 OK Content-Length: 10 rmr)r rr†r‡rar8r r"©rr^rƒr^rŠrrrÚtest_content_length_syncPsz"BasicTest.test_content_length_synccCs`d}d}td||ƒ}tj|dd}| ¡| | d¡|g¡| |j ¡|¡| ¡dS©Nr`rarbrmriÐ) r rr†r‡raÚ readlinesr r8r"rcrrrÚtest_readlines_content_length\sz'BasicTest.test_readlines_content_lengthcCs^d}d}td||ƒ}tj|dd}| ¡| | d¡|¡| |j ¡|¡| ¡dSre) r rr†r‡raÚread1r r8r"rcrrrÚtest_read1_content_lengthgsz#BasicTest.test_read1_content_lengthcCspd}d}td||ƒ}tj|dd}| ¡| | d¡|¡| | d¡d¡| |j ¡|¡| ¡dS)Nr`rarbrmré r ) r rr†r‡rar;r r8r"rcrrrÚ"test_readline_bound_content_lengthrsz,BasicTest.test_readline_bound_content_lengthcCsvd}d}td|d|ƒ}tj|dd}| ¡| | d¡|d¡| | ¡|¡| |j ¡|¡| ¡dS) Nr`ras'HTTP/1.1 200 OK Content-Length: 30 r¢rmrér¡) r rr†r‡rarhr8r r"rcrrrÚ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;Úrstriprr8)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;rwrÚdetach)rruÚthreadrcrTrrrrrÚtest_response_filenoŠs,     ÿ zBasicTest.test_response_filenocCs4Gdd„dtjƒ}|dƒ}tdƒ|_| dd¡dS)Nc@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/©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)Nc@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/☃r‡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_rdrgrirkrmrƒr‰r‹rrrrrrÐs`      +            %  rÐc@steZdZdZee d¡d… d¡ZdZdd„Zdd „Z d d „Z d d „Z dd„Z dd„Z dd„Zdd„Zdd„ZdS)ÚExtendedReadTestzOHTTP/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¡|_||_dSrZ) 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)Nr6cs(ˆ|ƒ}|dkr|d|…S|dd…S)Nrrjr)r:rý©ZoldpeekrrÚmypeeks z*ExtendedReadTest.test_peek..mypeekr¢rr )r6)rŠr‘ÚpeekÚ assertGreaterrPZassertGreaterEqualr€rr8rarØ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é)rhÚ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ŠrhrUrar”r—©rrŠr˜rrrrÚtest_read1_unbounded6s z%ExtendedReadTest.test_read1_unboundedcCsN|j}g}| d¡}|sq6| t|ƒd¡| |¡q | d |¡|j¡dS)Nrjr )rŠrhrŸrPrUrar”r—r¥rrrÚtest_read1_bounded@s  z#ExtendedReadTest.test_read1_boundedcCs| |j d¡d¡dS)Nrr )rarŠrhr&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§Úfindrr—Z lines_chunkedr’r™r›ršr£r¦r§r¨rªrrrrrŽÖsÿÿ     rŽc@seZdZdZdS)ÚExtendedReadTestChunkedrN)r+r,r-r§rrrrr¬Ssÿr¬c@seZdZdd„Zdd„ZdS)r¢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)Nrrr6rr )r®r«rPrUr­r”)rÚlimitrZdatalenr8rÇrrrr;qs*     zReadliner.readlineN)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') rxÚAF_INETÚ SOCK_STREAMrtrÚ bind_portrZfind_unused_portÚ source_portÚlistenrcr&rrrr’ás   zSourceAddressTest.setUpcCs*|jr|j ¡d|_|j ¡d|_dSr')rcr"rtr&rrrÚtearDownès   zSourceAddressTest.tearDowncCsBtjt|jd|jfd|_|j ¡| |jj  ¡d|j¡dS)Nrj©Úsource_addressr) rr]rzrrÀrcrGrar^r€r&rrrÚtestHTTPConnectionSourceAddressïs  ÿ z1SourceAddressTest.testHTTPConnectionSourceAddressÚHTTPSConnectionz'http.client.HTTPSConnection not definedcCstjt|jd|jfd|_dS)NrjrÃ)rrÆrzrrÀ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') rxr½r¾rtrr¿rÊÚPORTrÁr&rrrr’szTimeoutTest.setUpcCs|j ¡d|_dSr')rtr"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)Ú assertIsNonerxÚgetdefaulttimeoutÚsetdefaulttimeoutrr]rzrÊ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`rFrar8r?)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)Ncs 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ÆrzrÊ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Ærr{r"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Úfilterwarningsr r)rrírürôrrrÚtest_tls13_pha*s$     ÿ ÿ$zHTTPSTest.test_tls13_phaN)r+r,r-r’rçrèròr÷rZsystem_must_validate_certrørrrrr rÈrÉr¹rrÿrrrrrrãus"  !   *ÿ rãc@sTeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dS)ÚRequestBodyTestcCs,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Úgetr8)rržrdrƒr“rrrrÚtest_list_bodyNs þ      zRequestBodyTest.test_list_bodycCsL|j dddddi¡| ¡\}}| d| d¡¡| dt| ¡ƒ¡dS)NrkrCrdrZ42r·rž)rcr`rrarrPr8©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_charsetrr8rrrrÚ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 )r{rÚunlinkÚTESTFNrÚwritercr`rrarrÏrrr8rrrrÚ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 )r{rr&r'rr(rcr`rrarrÏrrr¾r8rrrrÚtest_binary_file_body’s(  z%RequestBodyTest.test_binary_file_bodyN) r+r,r-r’rrrr r#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)Nr0ÚdefaultÚvalueszdefault, values)r2r3r-r.rrrÚ5test_getting_nonexistent_header_with_iterable_default´s zFHTTPResponseTest.test_getting_nonexistent_header_with_iterable_defaultcCs|j d¡}| |d¡dS)Nr0r-r.rrrÚ/test_getting_nonexistent_header_without_default»s z@HTTPResponseTest.test_getting_nonexistent_header_without_defaultcCs |jjddd}| |d¡dS)Nr0rx)r2r-r.rrrÚtest_getting_header_defaultint¿sz/HTTPResponseTest.test_getting_header_defaultintN) r+r,r-r’r/r1r4r5r6rrrrr, 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 )rprÎrÄ©r8rrrBÒsz9TunnelTests._create_connection..create_connection)NNr)rr8rBrr9rrCÑ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)Nr:)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) Nr:ror\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 ddd}|  d |¡|j |  d ¡d |›ddS) Nrr:rmr\rz!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  ,  þ þzsp    ÿ  !nT}"U.HL`#Z