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@seZdZdd„Zdd„ZdS)ÚLoopbackHttpServercCs"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)Ng$@)r Úacceptr )r ÚrequestZclient_addressr r r Ú get_request*s zLoopbackHttpServer.get_requestN)Ú__name__Ú __module__Ú __qualname__rrr r r r rs rc@s$eZdZdd„Zdd„Zdd„ZdS)ÚLoopbackHttpServerThreadcCs<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)NT)rÚjoinrZ server_close©r r r r ÚstopBszLoopbackHttpServerThread.stopcCs |j ¡|js|j ¡q dS©N)rÚsetrrÚhandle_requestrr r r ÚrunJs zLoopbackHttpServerThread.runN)rrrrr r$r r r r r6s rc@sTeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dS)ÚDigestAuthHandlercCs"d|_g|_i|_d|_d|_dS)Nrz Test RealmÚauth)Ú _request_numÚ_noncesÚ_usersÚ _realm_nameÚ_qoprr 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ú r/ú,ú=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)sr0z%(method)s:%(uri)sÚHA1ÚHA2z3%(HA1)s:%(nonce)s:%(nc)s:%(cnonce)s:%(qop)s:%(HA2)sÚresponse)Úupdater1r2r4r5) r rBrGrHrIZ final_dictZHA1_strrJZHA2_strrKZ response_strrLr 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+r8Ú 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)NrTzProxy-AuthorizationÚusernamer7F) Úlenr)ÚheadersrVrFÚgetr(ÚremoveÚpathÚ short_pathrNZcommand)r rrBrGZauth_validatedr\r r r r#s0   ÿ  ý z DigestAuthHandler.handle_requestN) rrrrr,r-r.r8rFrNrVr#r r r r r%Qsr%c@sbeZdZdZdZdZdeefZe e  d¡¡  d¡Z dd„Z dd „Z d d „Zd d „Zdd„ZdS)ÚBasicAuthHandlerÚtestUserÚtestPassÚTestz%s:%sr0cOs tjjj|g|¢Ri|¤ŽdSr!)rrÚBaseHTTPRequestHandlerr)r ÚargsÚkwargsr r r rÓszBasicAuthHandler.__init__cGsdSr!r ©r Úformatrcr r r Ú log_messageÖszBasicAuthHandler.log_messagecCs"| d¡| dd¡| ¡dS)NéÈú Content-typerP)rQrRrSrr r r Údo_HEADÚs  zBasicAuthHandler.do_HEADcCs4| d¡| dd|j¡| dd¡| ¡dS)Ni‘zWWW-AuthenticatezBasic realm="%s"rirP)rQrRÚREALMrSrr 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 rhsIt works)rYrZrlrTrUÚ ENCODED_AUTHrQrSrr r r Údo_GETåsÿÿ zBasicAuthHandler.do_GETN)rrrÚUSERÚPASSWDrkZ USER_PASSWDÚbase64Z b64encoder4Údecodernrrgrjrlror r r r r^Ês r^c@s$eZdZdd„Zdd„Zdd„ZdS)ÚFakeProxyHandlercOs&||_tjjj|g|¢Ri|¤ŽdSr!)Údigest_auth_handlerrrrbr)r rurcrdr r r rýszFakeProxyHandler.__init__cGsdSr!r rer r r rgszFakeProxyHandler.log_messagecCsvtj |jd¡\}}}}}}||_|j |¡rr| dd¡| dd¡|  ¡|j   t d|jdƒ¡|j   d¡dS) NrrhZOKrOrPzYou've reached %s!
r0sFOur apologies, but our server is down due to a sudden zombie invasion.) ÚurllibÚparseÚurlparser\r]rur#rQrRrSrTrUÚbytes)r ZscmÚnetlocr\ÚparamsÚqueryÚfragmentr r r rosÿ   ÿzFakeProxyHandler.do_GETN)rrrrrgror r r r rtösrtcsPeZdZdZdZdZdZ‡fdd„Zdd„Z‡fd d „Z d d „Z d d„Z ‡Z S)ÚBasicAuthTestsr_r`Z IncorrectracsTtt|ƒ ¡dd„}t|ƒ|_| |j¡d|jj|_|j  ¡|jj   ¡dS)Nc_st|i|¤ŽSr!)r^©rcrdr 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 rr r r r„(s zBasicAuthTests.stop_servercstt|ƒ ¡dSr!)rr~ÚtearDownrrˆ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)rvrÚHTTPBasicAuthHandlerÚ add_passwordrkr…rprqÚ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!)rvrrŒrrkr…rpÚINCORRECT_PASSWDrŽrÚ assertRaisesr’r“r‘r•r r r Útest_basic_auth_httperror8s z(BasicAuthTests.test_basic_auth_httperror) rrrrprqr—rkr‚r„r‹r–r™Ú __classcell__r r rˆr r~s   r~r2csTeZdZdZdZdZdZ‡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ÚclearrM©Z old_environr r r Úrestore_environJs z-ProxyAuthTests.setUp..restore_environrmÚNO_PROXYÚno_proxycstˆjg|¢Ri|¤ŽSr!)rtrurrr r Úcreate_fake_proxy_handlerUsz7ProxyAuthTests.setUp..create_fake_proxy_handlerzhttp://127.0.0.1:%dr)rr›r‚rƒrržÚcopyr%rur-rprqr.rkrrr„r†rr‡rrvrZ ProxyHandlerZProxyDigestAuthHandlerÚproxy_digest_handlerrÚopener)r r¡r¤Z proxy_urlÚhandlerrˆrr r‚Gs&         ÿzProxyAuthTests.setUpcCs|j ¡d|_dSr!rŠrr r r r„bs zProxyAuthTests.stop_servercCsF|j |j|j|j|jd¡|j d¡| t j j |j j |j¡dS)NZbadr&)r¦rrkÚURLrprqrur,r˜rvr’r“r§Úopenrr r r Ú-test_proxy_with_bad_password_raises_httperrorfs ÿ  þz.FakeHTTPRequestHandlerz TestHTTP/éPcSs*| ¡}|r&|j |¡}||d…}qdSr!)Ú send_headrTrU)r ÚbodyÚdoner r r ro–s z8GetRequestHandler..FakeHTTPRequestHandler.do_GETcSs2|jd}|j t|ƒ¡}| ¡|j |¡dS)NzContent-Length)rYZrfiler®ÚintroÚrequestsr6)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)Nrrriz text/plain) rYÚheaders_receivedr¹r6r\ÚpoprQrRrrS)r Z response_coderYr¶ÚheaderrE©ÚFakeHTTPRequestHandlerÚ responsesr r rµ¢s   z;GetRequestHandler..FakeHTTPRequestHandler.send_headcWsdSr!r )r rcr r r rg±sz=GetRequestHandler..FakeHTTPRequestHandler.log_messageN) rrrZserver_versionr¹r»rrorºrµrgr r¾r r r¿sr¿)rrrb)rÀr r¾r ÚGetRequestHandlers&rÁcsºeZdZ‡fdd„Zd*dd„Zdd„Zd+dd „Zd,d d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Z‡ZS)-Ú TestUrlopencsNtt|ƒ ¡| tjj¡dd„}| |tj  ¡¡dtjd<dtjd<dS)NcSstj ¡tj |¡dSr!rœr r r r r¡Ès z*TestUrlopen.setUp..restore_environÚ*r¢r£) rrÂr‚rƒrvrÚ urlcleanuprržr¥)r r¡rˆr r r‚Ás  zTestUrlopen.setUpNcKsxg}tjj||fi|¤Ž}zH| | d¡¡| | ¡¡| | d¡¡| | ¡¡W| ¡n | ¡0d  |¡S)Nrhió) rvrr‘ÚextendÚ readlinesr6Úreadliner®Úcloser)r ÚurlÚdatardÚlÚfr r r r‘ÏszTestUrlopen.urlopencCs|j ¡d|_dSr!rŠrr r r r„Üs zTestUrlopen.stop_servercCsZ|durdgdfg}t|ƒ}t|ƒ|_| |j¡|j ¡|jj ¡|jj}||_|S)Nrhs 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_serverrhó we care a bitZ handler_class)ÚhasattrrvrÚskipTestZtest.ssl_serversrÏrÁr)r rÀrdrÏ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_elsermrhú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 rh)zTransfer-EncodingZchunkedrÔ)rÎr‘rr×)r rØZ chunked_startrLr¨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‘rrvr’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...rhú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ÜrhrÝ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©ÚcertfilermrãrârÐ) rÓrèrÚcheck_warningsÚDeprecationWarningr‘rr×r˜rvr’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êrmrãT)Z cadefault) rÓrèrrìrír˜rvr’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)rY)rÎrvrZRequestrr‘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Îrvrr‘rrrÑ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Îrvrr‘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Îrvrr‘rrùr×)r r¨rúrÊr r r Ú test_geturl{s &zTestUrlopen.test_geturlcCsBd}| dg|fg¡}tj d|j¡}|D]}| ||¡q,dS)NrÜrhr÷)rÎrvrr‘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Århr÷zQFetched line number %s doesn't match expected: Expected length was %s, got %sr/) rrÎrvrr‘rÚ enumerater×rX)r ÚlinesrØr¨rËÚindexrr r r Útest_line_iterationŠs  þÿzTestUrlopen.test_line_iteration)N)N)N)rrrr‚r‘r„rÎrÓrÙrÚrÛràrárérðrñrõrörürÿrrrršr r rˆr r¸s(     rÂcCs t ¡adSr!)rZthreading_setupÚ threads_keyr r r r Ú setUpModule™sr cCstrtjtŽdSr!)rrZthreading_cleanupr r r r ÚtearDownModuleŸsr Ú__main__),rrrrýÚ urllib.parservZurllib.requestZ http.serverrrZunittestr1ÚtestrZ test.supportrræÚ ImportErrorr\ÚdirnameÚ__file__Úhererrèrîrrrrrr%rbr^rtZTestCaser~Zrequires_hashdigestr›rÁrÂrr r rÚmainr r r r ÚsB      y,!(M+`