a 5êdgaã@szddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZz ddlZWney‚dZYn0ej e¡Zej ed¡Zej ed¡ZGdd„dejjƒZGdd „d ejƒZGd d „d ƒZGd d „d ejjƒZGdd„dejjƒZ Gdd„de j!ƒZ"e #d¡Gdd„de j!ƒƒZ$dd„Z%Gdd„de j!ƒZ&da'dd„Z(dd„Z)e*dkrve  +¡dS)éN)Úsupport)Úhashlib_helperz keycert.pemz keycert2.pemc@s eZdZdZdd„Zdd„ZdS)ÚLoopbackHttpServerz^HTTP server w/ a few modifications that make it useful for loopback testing purposes. cCs"tjj |||¡|j d¡dS)Ngš™™™™™¹?)ÚhttpÚserverÚ HTTPServerÚ__init__ÚsocketÚ settimeout)ÚselfZserver_addressZRequestHandlerClass©r ú6/usr/local/lib/python3.9/test/test_urllib2_localnet.pyr!s  þzLoopbackHttpServer.__init__cCs |j ¡\}}| d¡||fS)zHTTPServer method, overridden.g$@)r Úacceptr )r ÚrequestZclient_addressr r r Ú get_request*s zLoopbackHttpServer.get_requestN)Ú__name__Ú __module__Ú __qualname__Ú__doc__rrr r r r rs rc@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚLoopbackHttpServerThreadz2Stoppable thread that runs a loopback http server.cCs<tj |¡d|_t ¡|_d|_td|ƒ|_|jj |_ dS)NFzHTTP/1.0)z 127.0.0.1r) Ú threadingÚThreadrÚ _stop_serverÚEventÚreadyZprotocol_versionrÚhttpdZ server_portÚport©r Úrequest_handlerr r r r9s  ÿz!LoopbackHttpServerThread.__init__cCsd|_| ¡|j ¡dS)z.Stops the webserver if it's currently running.TN)rÚjoinrZ server_close©r r r r ÚstopBszLoopbackHttpServerThread.stopcCs |j ¡|js|j ¡q dS©N)rÚsetrrÚhandle_requestr r r r ÚrunJs zLoopbackHttpServerThread.runN)rrrrrr!r%r r r r r6s rc@sXeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dS)ÚDigestAuthHandlerz-Handler for performing digest authentication.cCs"d|_g|_i|_d|_d|_dS)Nrz Test RealmÚauth)Ú _request_numÚ_noncesÚ_usersÚ _realm_nameÚ_qopr r r r rTs zDigestAuthHandler.__init__cCs ||_dSr")r,)r Zqopr r r Úset_qop[szDigestAuthHandler.set_qopcCs ||_dSr")r*)r Zusersr r r Ú set_users^szDigestAuthHandler.set_userscCs ||_dSr")r+)r Zrealmr r r Ú set_realmbszDigestAuthHandler.set_realmcCs8|jd7_t t|jƒ d¡¡ ¡}|j |¡|S)NéÚascii)r(ÚhashlibÚmd5ÚstrÚencodeÚ hexdigestr)Úappend)r Únoncer r r Ú_generate_noncees z!DigestAuthHandler._generate_noncecCs‚| d¡}||dd…}| d¡}i}|D]P}| d¡\}}| ¡}|ddkrl|ddkrl|dd…}n| ¡}|||<q,|S)Nú r0ú,ú=rú"éÿÿÿÿ)ÚfindÚsplitÚstrip)r Zauth_strZfirst_space_indexÚpartsÚ auth_dictÚpartÚnameÚvaluer r r Ú_create_auth_dictks   z#DigestAuthHandler._create_auth_dictc Cs–i}| |¡||d<||d<||d<d|}t | d¡¡ ¡}d|}t | d¡¡ ¡} ||d<| |d<d |} t |  d¡¡ ¡} | |d kS) NÚpasswordÚmethodÚuriz#%(username)s:%(realm)s:%(password)sr1z%(method)s:%(uri)sÚHA1ÚHA2z3%(HA1)s:%(nonce)s:%(nc)s:%(cnonce)s:%(qop)s:%(HA2)sÚresponse)Úupdater2r3r5r6) r rCrHrIrJZ final_dictZHA1_strrKZHA2_strrLZ response_strrMr r r Ú_validate_auth|s  ÿz DigestAuthHandler._validate_authcCsN| dd¡| dd¡| dd|j|j| ¡f¡| ¡|j d¡dS) Ni—zProxy Authentication Requiredú Content-Typeú text/htmlzProxy-Authenticatez(Digest realm="%s", qop="%s",nonce="%s", sProxy Authentication Required.F)Ú send_responseÚ send_headerr+r,r9Ú end_headersÚwfileÚwriterr r r Ú_return_auth_challengeŽs  ýÿ z(DigestAuthHandler._return_auth_challengecCsÊt|jƒdkrdSd|jvr&| |¡S| |jd¡}|d|jvrT|j|d}n | |¡S| d¡|jvrx| |¡S|j |d¡d}|j|j fD]}|  |||j |¡r˜d}q˜|sÂ| |¡SdSdS)aPerforms digest authentication on the given HTTP request handler. Returns True if authentication was successful, False otherwise. If no users have been set, then digest auth is effectively disabled and this method will always return True. rTzProxy-AuthorizationÚusernamer8FN) Úlenr*ÚheadersrWrGÚgetr)ÚremoveÚpathÚ short_pathrOZcommand)r rrCrHZauth_validatedr]r r r r$s0   ÿ  ý z DigestAuthHandler.handle_requestN) rrrrrr-r.r/r9rGrOrWr$r r r r r&Qsr&c@sfeZdZdZdZdZdZdeefZe  e  d¡¡  d¡Z dd„Z d d „Zd d „Zd d„Zdd„ZdS)ÚBasicAuthHandlerz,Handler for performing basic authentication.ÚtestUserÚtestPassÚTestz%s:%sr1cOs tjjj|g|¢Ri|¤ŽdSr")rrÚBaseHTTPRequestHandlerr)r ÚargsÚkwargsr r r rÓszBasicAuthHandler.__init__cGsdSr"r ©r Úformatrdr r r Ú log_messageÖszBasicAuthHandler.log_messagecCs"| d¡| dd¡| ¡dS)NéÈú Content-typerQ)rRrSrTr r r r Údo_HEADÚs  zBasicAuthHandler.do_HEADcCs4| d¡| dd|j¡| dd¡| ¡dS)Ni‘zWWW-AuthenticatezBasic realm="%s"rjrQ)rRrSÚREALMrTr r r r Ú do_AUTHHEADßs  zBasicAuthHandler.do_AUTHHEADcCsh|j dd¡s$| ¡|j d¡n@|j dd¡d|jkr\| d¡| ¡|j d¡n| ¡dS)NZ AuthorizationÚsNo Auth header receivedzBasic risIt works)rZr[rmrUrVÚ ENCODED_AUTHrRrTr r r r Údo_GETåsÿÿ zBasicAuthHandler.do_GETN)rrrrÚUSERÚPASSWDrlZ USER_PASSWDÚbase64Z b64encoder5Údecoderorrhrkrmrpr r r r r_Ês r_c@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚFakeProxyHandlerzÏThis is a 'fake proxy' that makes it look like the entire internet has gone down due to a sudden zombie invasion. It main utility is in providing us with authentication support for testing. cOs&||_tjjj|g|¢Ri|¤ŽdSr")Údigest_auth_handlerrrrcr)r rvrdrer r r rýszFakeProxyHandler.__init__cGsdSr"r rfr r r rhszFakeProxyHandler.log_messagecCsvtj |jd¡\}}}}}}||_|j |¡rr| dd¡| dd¡|  ¡|j   t d|jdƒ¡|j   d¡dS) NrriZOKrPrQzYou've reached %s!
r1sFOur apologies, but our server is down due to a sudden zombie invasion.) ÚurllibÚparseÚurlparser]r^rvr$rRrSrTrUrVÚbytes)r ZscmÚnetlocr]ÚparamsÚqueryÚfragmentr r r rpsÿ   ÿzFakeProxyHandler.do_GETN)rrrrrrhrpr r r r ruösrucsPeZdZdZdZdZdZ‡fdd„Zdd„Z‡fd d „Z d d „Z d d„Z ‡Z S)ÚBasicAuthTestsr`raZ IncorrectrbcsTtt|ƒ ¡dd„}t|ƒ|_| |j¡d|jj|_|j  ¡|jj   ¡dS)Nc_st|i|¤ŽSr")r_©rdrer r r Ú#http_server_with_basic_auth_handler szABasicAuthTests.setUp..http_server_with_basic_auth_handlerzhttp://127.0.0.1:%s) ÚsuperrÚsetUprrÚ addCleanupÚ stop_serverrÚ server_urlÚstartrÚwait)r r©Ú __class__r r rƒs   zBasicAuthTests.setUpcCs|j ¡d|_dSr"©rr!r r r r r…(s zBasicAuthTests.stop_servercstt|ƒ ¡dSr")r‚rÚtearDownr r‰r r rŒ,szBasicAuthTests.tearDowncCsztj ¡}| |j|j|j|j¡tj tj  |¡¡z|  tj  |j¡¡Wn&tj j yt| d|j¡Yn0dS)Nz!Basic auth failed for the url: %s)rwrÚHTTPBasicAuthHandlerÚ add_passwordrlr†rqrrÚinstall_openerÚ build_openerÚ assertTrueÚurlopenÚerrorÚ HTTPErrorÚfail©r Zahr r r Útest_basic_auth_success/s z&BasicAuthTests.test_basic_auth_successcCsRtj ¡}| |j|j|j|j¡tj tj  |¡¡|  tj j tjj |j¡dSr")rwrrrŽrlr†rqÚINCORRECT_PASSWDrrÚ assertRaisesr“r”r’r–r r r Útest_basic_auth_httperror8s z(BasicAuthTests.test_basic_auth_httperror) rrrrqrrr˜rlrƒr…rŒr—ršÚ __classcell__r r r‰r rs   rr3csTeZdZdZdZdZdZ‡fdd„Zdd„Zd d „Z d d „Z d d„Z dd„Z ‡Z S)ÚProxyAuthTestszhttp://localhostZtesterZtest123Z TestRealmcsÜttˆƒ ¡dd„}ˆ |tj ¡¡dtjd<dtjd<tƒˆ_ˆj  ˆj ˆj i¡ˆj  ˆj ¡‡fdd„}t|ƒˆ_ˆ ˆj¡ˆj ¡ˆjj ¡dˆjj}tj d |i¡}tj ¡ˆ_tj |ˆj¡ˆ_dS) NcSstj ¡tj |¡dSr"©ÚosÚenvironÚclearrN©Z old_environr r r Úrestore_environJs z-ProxyAuthTests.setUp..restore_environrnÚNO_PROXYÚno_proxycstˆjg|¢Ri|¤ŽSr")rurvr€r r r Úcreate_fake_proxy_handlerUsz7ProxyAuthTests.setUp..create_fake_proxy_handlerzhttp://127.0.0.1:%dr)r‚rœrƒr„ržrŸÚcopyr&rvr.rqrrr/rlrrr…r‡rrˆrrwrZ ProxyHandlerZProxyDigestAuthHandlerÚproxy_digest_handlerrÚopener)r r¢r¥Z proxy_urlÚhandlerr‰r r rƒGs&         ÿzProxyAuthTests.setUpcCs|j ¡d|_dSr"r‹r r r r r…bs zProxyAuthTests.stop_servercCsF|j |j|j|j|jd¡|j d¡| t j j |j j |j¡dS)NZbadr')r§rŽrlÚURLrqrrrvr-r™rwr“r”r¨Úopenr r r r Ú-test_proxy_with_bad_password_raises_httperrorfs ÿ  þz.FakeHTTPRequestHandlerz TestHTTP/éPcSs*| ¡}|r&|j |¡}||d…}qdSr")Ú send_headrUrV)r ÚbodyÚdoner r r rp–s z8GetRequestHandler..FakeHTTPRequestHandler.do_GETcSs2|jd}|j t|ƒ¡}| ¡|j |¡dS)NzContent-Length)rZZrfiler¯ÚintrpÚrequestsr7)r Zcontent_lengthZ post_datar r r Údo_POSTœs z9GetRequestHandler..FakeHTTPRequestHandler.do_POSTcs||jˆ_|j |j¡ˆ d¡\}}}| |¡|D]\}}| ||d|ji¡q4|rp| dd¡|  ¡|S|  ¡dS)Nrrrjz text/plain) rZÚheaders_receivedrºr7r]ÚpoprRrSrrT)r Z response_coderZr·ÚheaderrF©ÚFakeHTTPRequestHandlerÚ responsesr r r¶¢s   z;GetRequestHandler..FakeHTTPRequestHandler.send_headcWsdSr"r )r rdr r r rh±sz=GetRequestHandler..FakeHTTPRequestHandler.log_messageN) rrrZserver_versionrºr¼rrpr»r¶rhr r¿r r rÀsrÀ)rrrc)rÁr r¿r ÚGetRequestHandlers&rÂcs¾eZdZdZ‡fdd„Zd+dd„Zdd„Zd,d d „Zd-d 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*„Z‡ZS).Ú TestUrlopenaNTests urllib.request.urlopen using the network. These tests are not exhaustive. Assuming that testing using files does a good job overall of some of the basic interface features. There are no tests exercising the optional 'data' and 'proxies' arguments. No tests for transparent redirection have been written. csNtt|ƒ ¡| tjj¡dd„}| |tj  ¡¡dtjd<dtjd<dS)NcSstj ¡tj |¡dSr"rr¡r r r r¢Ès z*TestUrlopen.setUp..restore_environÚ*r£r¤) r‚rÃrƒr„rwrÚ urlcleanupržrŸr¦)r r¢r‰r r rƒÁs  zTestUrlopen.setUpNcKsxg}tjj||fi|¤Ž}zH| | d¡¡| | ¡¡| | d¡¡| | ¡¡W| ¡n | ¡0d  |¡S)Nriió) rwrr’ÚextendÚ readlinesr7Úreadliner¯Úcloser)r ÚurlÚdatareÚlÚfr r r r’ÏszTestUrlopen.urlopencCs|j ¡d|_dSr"r‹r r r r r…Üs zTestUrlopen.stop_servercCsZ|durdgdfg}t|ƒ}t|ƒ|_| |j¡|j ¡|jj ¡|jj}||_|S)Nris we don't care) rÂrrr„r…r‡rrˆr)r rÁr©rr r r Ú start_serveràs     zTestUrlopen.start_servercKs^ttjdƒs| d¡ddlm}|dur6dgdfg}t|ƒ}||fd|i|¤Ž}|j|_|S)NZ HTTPSHandlerzssl support requiredr)Úmake_https_serverrió we care a bitZ handler_class)ÚhasattrrwrÚskipTestZtest.ssl_serversrÐrÂr)r rÁrerÐr©rr r r Ústart_https_serverís    zTestUrlopen.start_https_servercCsVd}ddgdfdg|fg}| |¡}| d|j¡}| ||¡| |jddg¡dS) NsWe got here...i.)ZLocationz(http://localhost:%(port)s/somewhere_elsernriúhttp://localhost:%s/ú/z/somewhere_else©rÏr’rÚ assertEqualrº)r Úexpected_responserÁr©rÌr r r Útest_redirectionøsÿý  zTestUrlopen.test_redirectioncCs@d}d}ddg|fg}| |¡}| d|j¡}| ||¡dS)Ns hello worldsa hello worl 1 d 0 ri)zTransfer-EncodingZchunkedrÕ)rÏr’rrØ)r rÙZ chunked_startrMr©rÌr r r Ú test_chunkedsÿ zTestUrlopen.test_chunkedc CsŽd}| dg|fg¡}z| d|j¡Wn8tjjyb}z| ¡}| ¡WYd}~nd}~00| d¡|  ||¡|  |j dg¡dS)NsBad bad bad...i”zhttp://localhost:%s/weeblez404 should raise URLErrorz/weeble) rÏr’rrwr“r³r¯rÊr•rØrº)r rÙr©rÎrÌr r r Útest_404s  zTestUrlopen.test_404cCsFd}| dg|fg¡}| d|j¡}| ||¡| |jdg¡dS)Nó pycon 2008...riúhttp://localhost:%s/bizarreú/bizarrerשr rÙr©rÌr r r Útest_200"s  zTestUrlopen.test_200cCsJd}| dg|fg¡}| d|jd¡}| ||¡| |jddg¡dS)NrÝrirÞsget=with_feelingrßr×ràr r r Útest_200_with_parameters)s ÿ z$TestUrlopen.test_200_with_parameterscCs8| ¡}tjtd}|jd|j|d}| |d¡dS)N©Zcafileúhttps://localhost:%s/bizarre©ÚcontextrÑ)rÔÚsslÚcreate_default_contextÚCERT_localhostr’rrØ)r r©rærÌr r r Ú test_https1s zTestUrlopen.test_httpsc Csî|jtd}t dtf¡À|jd|jtd}| |d¡| t j j ¡$}|jd|jt dWdƒn1st0Y|jt d}| t j j ¡$}|jd|jt dWdƒn1sÂ0YWdƒn1sà0YdS)N©ÚcertfilernrärãrÑ) rÔrérÚcheck_warningsÚDeprecationWarningr’rrØr™rwr“r³ÚCERT_fakehostname)r r©rÌÚcmr r r Útest_https_with_cafile7s  ÿ  ÿ$  ÿz"TestUrlopen.test_https_with_cafilec Cs€|jtd}t dtf¡R| tjj¡$}|j d|j ddWdƒn1sT0YWdƒn1sr0YdS)NrërnräT)Z cadefault) rÔrérrírîr™rwr“r³r’r)r r©rðr r r Útest_https_with_cadefaultHs   ÿz%TestUrlopen.test_https_with_cadefaultcs†tdur| d¡tjs"| d¡d‰‡fdd„}t tj¡}| |¡|j|td}tjtd}|j d|j |d|  ˆd ¡dS) Nzssl module requiredzSNI support required in OpenSSLcs|‰dSr"r )Zssl_sockZ server_nameZinitial_context©Zsni_namer r Úcb_sniVsz*TestUrlopen.test_https_sni..cb_sni)rærìrãzhttps://localhost:%sråÚ localhost) rçrÓZHAS_SNIZ SSLContextZPROTOCOL_TLS_SERVERZset_servername_callbackrÔrérèr’rrØ)r rôrær©r rór Útest_https_sniPs      zTestUrlopen.test_https_snicCsd| ¡}tjjd|jddid}tj |¡Wdƒn1sD0Y| |jdd¡dS)NrÕZRangez bytes=20-39)rZ)rÏrwrZRequestrr’rØr¼)r r©Zreqr r r Útest_sending_headers`sÿz TestUrlopen.test_sending_headerscCsn| ¡}tj d|j¡@}dD]}| t||ƒd|¡q | | ¡d¡Wdƒn1s`0YdS)Núhttp://localhost:%s)r¯rÊÚinfoÚgeturlz3object returned from urlopen lacks the %s attributezcalling 'read' failed)rÏrwrr’rr‘rÒr¯)r r©Úopen_urlÚattrr r r Ú test_basichsÿzTestUrlopen.test_basiccCsl| ¡}tj d|j¡}|| ¡}Wdƒn1s<0Y| |tjj d¡|  |  ¡d¡dS)NrøzEobject returned by 'info' is not an instance of email.message.MessageZplain) rÏrwrr’rrùZassertIsInstanceÚemailÚmessageZMessagerØZget_content_subtype)r r©rûZinfo_objr r r Ú test_infopsÿ& ÿzTestUrlopen.test_infocCs\| ¡}tj d|j¡}|| ¡}Wdƒn1s<0Y| |d|j¡dS)Nrø)rÏrwrr’rrúrØ)r r©rûrËr r r Ú test_geturl{s &zTestUrlopen.test_geturlcCsBd}| dg|fg¡}tj d|j¡}|D]}| ||¡q,dS)NrÝrirø)rÏrwrr’rrØ)r rÙr©rÌÚliner r r Útest_iterationƒs zTestUrlopen.test_iterationc Cs”ddddddg}d |¡}| dg|fg¡}tj d |j¡}t|ƒD]0\}}| |||d |t||ƒt|ƒf¡qJ| |d t|ƒ¡dS) NsWe sgot shere s verylong i ó rÆrirøzQFetched line number %s doesn't match expected: Expected length was %s, got %sr0) rrÏrwrr’rÚ enumeraterØrY)r ÚlinesrÙr©rÌÚindexrr r r Útest_line_iterationŠs  þÿzTestUrlopen.test_line_iteration)N)N)N)rrrrrƒr’r…rÏrÔrÚrÛrÜrárârêrñròrör÷rýrrrrr›r r r‰r røs*     rÃcCs t ¡adSr")rZthreading_setupÚ threads_keyr r r r Ú setUpModule™sr cCstrtjtŽdSr")r rZthreading_cleanupr r r r ÚtearDownModuleŸsr Ú__main__),rsržrþÚ urllib.parserwZurllib.requestZ http.serverrrZunittestr2ÚtestrZ test.supportrrçÚ ImportErrorr]ÚdirnameÚ__file__Úhererrérïrrrrrr&rcr_ruZTestCaserZrequires_hashdigestrœrÂrÃr r r rÚmainr r r r ÚsB      y,!(M+`