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_dSN)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)rrr1rrrrTs zEPipeSocket.__init__cCs(|j|vrttjd|j|7_dS)NZgotcha)r1OSErrorerrnoEPIPErrrrrrYs  zEPipeSocket.sendallcCsdSr'rr&rrrr"^szEPipeSocket.closeN)r+r,r-rrr"rrrrr0Rsr0c@s eZdZdddZdddZdS) NoEOFBytesIOcCs"tj||}|dkrtd|SNr zcaller tried to read past EOF)r.r/readAssertionError)rnrrrrr8gszNoEOFBytesIO.readNcCs"tj||}|dkrtd|Sr7)r.r/readliner9)rlengthrrrrr;mszNoEOFBytesIO.readline)r6)N)r+r,r-r8r;rrrrr5as r5cs0eZdZfddZfddZddZZS)FakeSocketHTTPConnectioncs$d|_td||_|j|_dS)Nr example.com) connectionssuperrfake_socket_argscreate_connection_create_connection)rargs __class__rrrvs z!FakeSocketHTTPConnection.__init__cs|jd7_tSr)r?r@connectr&rErrrG|sz FakeSocketHTTPConnection.connectcOs t|jSr')r rArposkwrrrrBsz*FakeSocketHTTPConnection.create_connection)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`rer:keyrrrrrs  z#TransferEncodingTest._parse_requestcCsg}i}d}|d}|||d\}}t|d}|dkrF|d7}qx||t||||d7}|t|krqxqd|S)Nrrrrr )rOintrarPrUr)rrrdtrailersr:rsizechunkrrrrs    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>r) descriptionrphrase)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 rrrrar8 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 rrrrar8rrrrr"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;rrr8rrr"rrrrtest_mixed_reads4s  zBasicTest.test_mixed_readscCsd}t|}t|}|td}||}||d|t|d|| ||}||d|t|d| | ||j | | |j dSr r rrr bytearrayreadintorarrrrrr"rrdr^rbr:rrrtest_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 rrrrar8rrrrrrr"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 r5rrrr8failrr^rrrrtest_read_headszBasicTest.test_read_headcCsTtdt}tj|dd}|td}||dkr@|d|t |ddS)Nrrorrr) r r5rrrrrrrar)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..UpdatingFilerr6cSs t|jSr')nextd)r blocksizerrrr8 sz.UpdatingFile.readN)r6)r+r,r-r#rr8rrrr 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|dd i||jd |j d d d }|||dS) Nr>rabrkr\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)Nrr>rr 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_endrrrrar8r"rIncompleteReadpartialrPrr r)rrr^rr:xr 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^rr:mr 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/r0rrrrar8statusreasonrrrrr")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^rrr:rrrtest_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 rrrrar8rrrrrrtest_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 rrrr8r1rar2rr 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) r0rr]r^rr2 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 rrrJr8rKrrrtest_overflowing_chunked_linesz'BasicTest.test_overflowing_chunked_linecCs`d}t|}t|}|||d||||j | ||j dS)NrHr ) r rrrrar8rrrrr"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_extendedr0rrrrar8r")rextrarr^rrrrtest_chunked_extension&sz BasicTest.test_chunked_extensioncCsBt}ttt}tj|dd}||||| dSNrmr) r-r r.r/rrrrar8r"rrr^rrrrtest_chunked_missing_end0s  z"BasicTest.test_chunked_missing_endcCs\t}ttttt}tj|dd}|| | || |j d| dS)Nrmrr ) r-r r.r/rr0rrrrar8r r"r[rrrtest_chunked_trailers9szBasicTest.test_chunked_trailerscCsjt}d}ttttt|}tj|dd}|| | || |j | d| dS)N extradatarmrr )r-r r.r/rr0rrrrar8r rr")rrr^r^rrrrtest_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 rrrrar8r r"rr^rr^rrrrtest_content_length_syncPsz"BasicTest.test_content_length_synccCs`d}d}td||}tj|dd}|||d|g||j||dSNr`rarbrmri) r rrrra readlinesr r8r"rcrrrtest_readlines_content_length\sz'BasicTest.test_readlines_content_lengthcCs^d}d}td||}tj|dd}|||d|||j||dSre) r rrrraread1r r8r"rcrrrtest_read1_content_lengthgsz#BasicTest.test_read1_content_lengthcCspd}d}td||}tj|dd}|||d|||dd||j||dS)Nr`rarbrmr r ) r rrrrar;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 rrmrr) r rrrrarhr8r r"rcrrrtest_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;rstriprr8)rcaddressreaderrresultservrr run_servers   z2BasicTest.test_response_fileno..run_server)targetrrnz dummy:1234)filenos proxied data )socket create_serverHOST addCleanupr" threadingThreadstartrfloatrr] getsocknamer`rFrar<r;rwrdetach)rruthreadrcrTrrrrrtest_response_filenos,      zBasicTest.test_response_filenocCs4Gdddtj}|d}td|_|dddS)Nc@seZdZddZdS)zRBasicTest.test_putrequest_override_domain_validation..UnsafeHTTPConnectioncSsdSr'rrrrrr_validate_pathszaBasicTest.test_putrequest_override_domain_validation..UnsafeHTTPConnection._validate_pathN)r+r,r-rrrrrUnsafeHTTPConnectionsrr>rjrmz/rr]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)Nc@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/☃rrrrr!test_putrequest_override_encodings z+BasicTest.test_putrequest_override_encodingN)3r+r,r-rrrrrrrrrrrrrr rrrrrr$r%r(r5r8r>r?rArBrGrLrMrPrQrRrVrYr\r]r_rdrgrirkrmrrrrrrrrrs`      +            %  rc@steZdZdZeedddZdZddZdd Z d d Z d d Z ddZ ddZ ddZddZddZdS)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 rrrrr.BufferedReaderfprrrrrsetUps  zExtendedReadTest.setUpcs|j}|jjdfdd }||j_g}|d}|r|t|d|}|t|t|||||t|}| ||n|}| || ||s(qq(| d ||j dS)Nr6cs(|}|dkr|d|S|ddS)Nrrjr)r:rZoldpeekrrmypeeks z*ExtendedReadTest.test_peek..mypeekrrr )r6)rrpeek assertGreaterrPZassertGreaterEqualrrr8rarrUrlines_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)rhassertLessEqualrP)resrrrrr/s z&ExtendedReadTest.test_read1..r)r Readlinerrr;r)rrZ readlinerrrr test_read1-szExtendedReadTest.test_read1cCs<|j}g}|}|sq$||q |d||jdSNr )rrhrUrarrrrrrrrrtest_read1_unbounded6s z%ExtendedReadTest.test_read1_unboundedcCsN|j}g}|d}|sq6|t|d||q |d||jdS)Nrjr )rrhrrPrUrarrrrrrtest_read1_bounded@s  z#ExtendedReadTest.test_read1_boundedcCs||jdddS)Nrr )rarrhr&rrr test_read1_0KszExtendedReadTest.test_read1_0cCs |jd}|dt|dSNr)rrrrP)rrrrr test_peek_0Ns zExtendedReadTest.test_peek_0)r+r,r-rfindrrZ lines_chunkedrrrrrrrrrrrrrrs     rc@seZdZdZdS)ExtendedReadTestChunkedrN)r+r,r-rrrrrrSsrc@seZdZddZddZdS)rcCs||_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)Nrrr6rr )rrrPrUrr)rlimitrZdatalenr8rrrrr;qs*     zReadliner.readlineN)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') rxAF_INET SOCK_STREAMrtr bind_portrZfind_unused_port source_portlistenrcr&rrrrs   zSourceAddressTest.setUpcCs*|jr|jd|_|jd|_dSr')rcr"rtr&rrrtearDowns   zSourceAddressTest.tearDowncCsBtjt|jd|jfd|_|j||jj d|jdS)Nrjsource_addressr) rr]rzrrrcrGrar^rr&rrrtestHTTPConnectionSourceAddresss   z1SourceAddressTest.testHTTPConnectionSourceAddressHTTPSConnectionz'http.client.HTTPSConnection not definedcCstjt|jd|jfd|_dS)Nrjr)rrrzrrrcr&rrr testHTTPSConnectionSourceAddresss z2SourceAddressTest.testHTTPSConnectionSourceAddressN) r+r,r-rrrunittestskipIfrrrrrrrrsrc@s(eZdZdZddZddZddZdS) TimeoutTestNcCs.ttjtj|_t|jt_|jdSr') rxrrrtrrrPORTrr&rrrrszTimeoutTest.setUpcCs|jd|_dSr')rtr"r&rrrrs zTimeoutTest.tearDownc Cs|ttdz$tttj}| Wtdn td0| |j d| |ttdz(tjttjdd}| Wtdn td0| |j d| tjttjdd}| | |j d| dSN)timeout) assertIsNonerxgetdefaulttimeoutsetdefaulttimeoutrr]rzrrrGrar^ 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`rFrar8r?)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)Ncs 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)rrrzrrrar)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)rrrrrrrrrr{r"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_warningsfilterwarningsr r)rrrrrrrtest_tls13_pha*s$      $zHTTPSTest.test_tls13_phaN)r+r,r-rrrrrrZsystem_must_validate_certrrrrrr rrrrrrrrrrrus"  !   * rc@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS)RequestBodyTestcCs,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`rrragetr8)rrrdrrrrrrtest_list_bodyNs       zRequestBodyTest.test_list_bodycCsL|jdddddi|\}}|d|d|dt|dS)NrkrCrdrZ42rr)rcr`rrarrPr8rrrrrrtest_manual_content_lengthbs   z*RequestBodyTest.test_manual_content_lengthcCs`|jddd|\}}|d||||d|d|d|dS)NrkrCrd text/plain4rsbody rcr`rraget_content_typer get_charsetrr8rrrrtest_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 )r{runlinkTESTFNrwritercr`rrarrrrr8rrrrtest_text_file_bodys(  z#RequestBodyTest.test_text_file_bodycCs|tjtjttjd}|dWdn1s<0Yttjdx}|jdd||\}}| d| | | | d| d|d || d |Wdn1s0YdS) Nwbr"rrkrCrrrrs5 body 0 )r{rr&r'rr(rcr`rrarrrrrr8rrrrtest_binary_file_bodys(  z%RequestBodyTest.test_binary_file_bodyN) r+r,r-rrrrr r#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)Nr0defaultvalueszdefault, values)r2r3r-r.rrr5test_getting_nonexistent_header_with_iterable_defaults zFHTTPResponseTest.test_getting_nonexistent_header_with_iterable_defaultcCs|jd}||ddS)Nr0r-r.rrr/test_getting_nonexistent_header_without_defaults z@HTTPResponseTest.test_getting_nonexistent_header_without_defaultcCs |jjddd}||ddS)Nr0rx)r2r-r.rrrtest_getting_header_defaultintsz/HTTPResponseTest.test_getting_header_defaultintN) r+r,r-rr/r1r4r5r6rrrrr,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 )rprrr8rrrBsz9TunnelTests._create_connection..create_connection)NNr)rr8rBrr9rrCszTunnelTests._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)Nr:)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) Nr:ror\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 ddd}| d ||j | d d |ddS) Nrr:rmr\rz!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  ,   zsp      !nT}"U.HL`#Z