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_qopcCst|tƒsJ‚||_dSr")Ú isinstanceÚdictr*)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ú r2ú,ú=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)sr3z%(method)s:%(uri)sÚHA1ÚHA2z3%(HA1)s:%(nonce)s:%(nc)s:%(cnonce)s:%(qop)s:%(HA2)sÚresponse)Úupdater4r5r7r8) r rErJrKrLZ final_dictZHA1_strrMZHA2_strrNZ response_strrOr 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,r;Ú 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Úusernamer:FN) Úlenr*ÚheadersrYrIÚgetr)ÚremoveÚpathÚ short_pathrQZcommand)r rrErJZauth_validatedr_r r r r$s0   ÿ  ý z DigestAuthHandler.handle_requestN) rrrrrr-r0r1r;rIrQrYr$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:%sr3cOs tjjj|g|¢Ri|¤ŽdSr")rrÚBaseHTTPRequestHandlerr)r ÚargsÚkwargsr r r rÓszBasicAuthHandler.__init__cGsdSr"r ©r Úformatrfr r r Ú log_messageÖszBasicAuthHandler.log_messagecCs"| d¡| dd¡| ¡dS)NéÈú Content-typerS)rTrUrVr r r r Údo_HEADÚs  zBasicAuthHandler.do_HEADcCs4| d¡| dd|j¡| dd¡| ¡dS)Ni‘zWWW-AuthenticatezBasic realm="%s"rlrS)rTrUÚREALMrVr 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 rksIt works)r\r]rorWrXÚ ENCODED_AUTHrTrVr r r r Údo_GETåsÿÿ zBasicAuthHandler.do_GETN)rrrrÚUSERÚPASSWDrnZ USER_PASSWDÚbase64Z b64encoder7Údecoderqrrjrmrorrr r r r raÊs rac@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_handlerrrrer)r rxrfrgr r r rýszFakeProxyHandler.__init__cGsdSr"r rhr r r rjszFakeProxyHandler.log_messagecCsvtj |jd¡\}}}}}}||_|j |¡rr| dd¡| dd¡|  ¡|j   t d|jdƒ¡|j   d¡dS) NrrkZOKrRrSzYou've reached %s!
r3sFOur apologies, but our server is down due to a sudden zombie invasion.) ÚurllibÚparseÚurlparser_r`rxr$rTrUrVrWrXÚbytes)r ZscmÚnetlocr_ÚparamsÚqueryÚfragmentr r r rrsÿ   ÿzFakeProxyHandler.do_GETN)rrrrrrjrrr r r r rwösrwcsPeZdZdZdZdZdZ‡fdd„Zdd„Z‡fd d „Z d d „Z d d„Z ‡Z S)ÚBasicAuthTestsrbrcZ IncorrectrdcsTtt|ƒ ¡dd„}t|ƒ|_| |j¡d|jj|_|j  ¡|jj   ¡dS)Nc_st|i|¤ŽSr")ra©rfrgr 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)ryrÚHTTPBasicAuthHandlerÚ add_passwordrnrˆrsrtÚ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")ryrrrrnrˆrsÚINCORRECT_PASSWDr‘r’Ú assertRaisesr•r–r”r˜r r r Útest_basic_auth_httperror8s z(BasicAuthTests.test_basic_auth_httperror) rrrrsrtršrnr…r‡rŽr™rœÚ __classcell__r r r‹r rs   rr5csTeZdZdZdZdZdZ‡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ÚclearrP©Z old_environr r r Úrestore_environJs z-ProxyAuthTests.setUp..restore_environrpÚNO_PROXYÚno_proxycstˆjg|¢Ri|¤ŽSr")rwrxr‚r r r Úcreate_fake_proxy_handlerUsz7ProxyAuthTests.setUp..create_fake_proxy_handlerzhttp://127.0.0.1:%dr)r„ržr…r†r r¡Úcopyr&rxr0rsrtr1rnrrr‡r‰rrŠrryrZ ProxyHandlerZProxyDigestAuthHandlerÚproxy_digest_handlerr’Úopener)r r¤r§Z proxy_urlÚhandlerr‹r r r…Gs&         ÿzProxyAuthTests.setUpcCs|j ¡d|_dSr"rr r r r r‡bs zProxyAuthTests.stop_servercCsF|j |j|j|j|jd¡|j d¡| t j j |j j |j¡dS)NZbadr')r©rrnÚURLrsrtrxr-r›ryr•r–rªÚopenr r r r Ú-test_proxy_with_bad_password_raises_httperrorfs ÿ  þz.FakeHTTPRequestHandlerz TestHTTP/éPcSs*| ¡}|r&|j |¡}||d…}qdSr")Ú send_headrWrX)r ÚbodyÚdoner r r rr–s z8GetRequestHandler..FakeHTTPRequestHandler.do_GETcSs2|jd}|j t|ƒ¡}| ¡|j |¡dS)NzContent-Length)r\Zrfiler±ÚintrrÚrequestsr9)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)Nrrrlz text/plain) r\Úheaders_receivedr¼r9r_ÚpoprTrUrrV)r Z response_coder\r¹ÚheaderrH©ÚFakeHTTPRequestHandlerÚ responsesr r r¸¢s   z;GetRequestHandler..FakeHTTPRequestHandler.send_headcWsdSr"r )r rfr r r rj±sz=GetRequestHandler..FakeHTTPRequestHandler.log_messageN) rrrZserver_versionr¼r¾rrrr½r¸rjr rÁr r rÂsrÂ)rrre)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"rŸr£r r r r¤Ès z*TestUrlopen.setUp..restore_environÚ*r¥r¦) r„rÅr…r†ryrÚ urlcleanupr r¡r¨)r r¤r‹r r r…Ás  zTestUrlopen.setUpNcKsxg}tjj||fi|¤Ž}zH| | d¡¡| | ¡¡| | d¡¡| | ¡¡W| ¡n | ¡0d  |¡S)Nrkió) ryrr”ÚextendÚ readlinesr9Úreadliner±Úcloser)r ÚurlÚdatargÚlÚfr r r r”ÏszTestUrlopen.urlopencCs|j ¡d|_dSr"rr r r r r‡Üs zTestUrlopen.stop_servercCsZ|durdgdfg}t|ƒ}t|ƒ|_| |j¡|j ¡|jj ¡|jj}||_|S)Nrks 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_serverrkó we care a bitZ handler_class)ÚhasattrryrÚskipTestZtest.ssl_serversrÒrÄr)r rÃrgrÒ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_elserprkú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 rk)zTransfer-EncodingZchunkedr×)rÑr”rrÚ)r rÛZ chunked_startrOr«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”rryr•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...rkú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ßrkrà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©ÚcertfilerprærårÓ) rÖrërÚcheck_warningsÚDeprecationWarningr”rrÚr›ryr•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írpræT)Z cadefault) rÖrërrïrðr›ryr•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)r\)rÑryrZRequestrr”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Ñryrr”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Ñryrr”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Ñryrr”rrürÚ)r r«rýrÍr r r Ú test_geturl{s &zTestUrlopen.test_geturlcCsBd}| dg|fg¡}tj d|j¡}|D]}| ||¡q,dS)Nrßrkrú)rÑryrr”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ÈrkrúzQFetched line number %s doesn't match expected: Expected length was %s, got %sr2) rrÑryrr”rÚ enumeraterÚr[)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ÿrrrr rr 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__),rur rÚ urllib.parseryZurllib.requestZ http.serverrrZunittestr4ÚtestrZ test.supportrréÚ ImportErrorr_ÚdirnameÚ__file__Úhererrërñrrrrrr&rerarwZTestCaserZrequires_hashdigestržrÄrÅr r r rÚmainr r r r ÚsB      y,!(M+`