a ze`@snddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZz ddlZWneydZYn0ejeZejedZejedZGdddejjZGdd d ejZGd d d ZGd d d ejjZGdddejjZ Gddde j!Z"e#dGddde j!Z$ddZ%Gddde j!Z&ddZ'e(dkrje )dS)N)support)hashlib_helperz keycert.pemz keycert2.pemc@s eZdZdZddZddZdS)LoopbackHttpServerz^HTTP server w/ a few modifications that make it useful for loopback testing purposes. cCs"tjj||||jddS)Ng?)httpserver HTTPServer__init__socket settimeout)selfZserver_addressZRequestHandlerClassr N/opt/bitninja-python-dojo/embedded/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(eZdZdZddZddZddZdS) LoopbackHttpServerThreadz2Stoppable thread that runs a loopback http server.cCs<tj|d|_t|_d|_td||_|jj |_ dS)NFzHTTP/1.0)z 127.0.0.1r) threadingThreadr _stop_serverEventreadyZprotocol_versionrhttpdZ server_portportr request_handlerr r r r9s  z!LoopbackHttpServerThread.__init__cCsd|_||jdS)z.Stops the webserver if it's currently running.TN)rjoinrZ server_closer r r r stopBszLoopbackHttpServerThread.stopcCs |j|js|jq dSN)rsetrrhandle_requestr r r r runJs zLoopbackHttpServerThread.runN)rrrrrr!r%r r r r r6s rc@sXeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ dS)DigestAuthHandlerz-Handler for performing digest authentication.cCs"d|_g|_i|_d|_d|_dS)Nrz Test Realmauth) _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|tsJ||_dSr") isinstancedictr*)r Zusersr r r set_users^szDigestAuthHandler.set_userscCs ||_dSr")r+)r Zrealmr r r set_realmbszDigestAuthHandler.set_realmcCs8|jd7_tt|jd}|j||S)Nascii)r(hashlibmd5strencode 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")findsplitstrip)r Zauth_strZfirst_space_indexparts auth_dictpartnamevaluer r r _create_auth_dictks   z#DigestAuthHandler._create_auth_dictc Csi}||||d<||d<||d<d|}t|d}d|}t|d} ||d<| |d<d |} t| d} | |d kS) Npasswordmethoduriz#%(username)s:%(realm)s:%(password)sr3z%(method)s:%(uri)sHA1HA2z3%(HA1)s:%(nonce)s:%(nc)s:%(cnonce)s:%(qop)s:%(HA2)sresponse)updater4r5r7r8) r rErJrKrLZ final_dictZHA1_strrMZHA2_strrNZ response_strrOr r r _validate_auth|s  z DigestAuthHandler._validate_authcCsN|dd|dd|dd|j|j|f||jddS) NizProxy 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_headerswfilewriterr r r _return_auth_challenges   z(DigestAuthHandler._return_auth_challengecCst|jdkrdSd|jvr&||S||jd}|d|jvrT|j|d}n ||S|d|jvrx||S|j|dd}|j|j fD]}| |||j |rd}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-Authorizationusernamer:FN) lenr*headersrYrIgetr)removepath 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 dZ ddZ d d Zd d Zd dZddZdS)BasicAuthHandlerz,Handler for performing basic authentication.testUsertestPassTestz%s:%sr3cOs tjjj|g|Ri|dSr")rrBaseHTTPRequestHandlerr)r argskwargsr r r rszBasicAuthHandler.__init__cGsdSr"r r formatrfr r r log_messageszBasicAuthHandler.log_messagecCs"|d|dd|dS)N Content-typerS)rTrUrVr r r r do_HEADs  zBasicAuthHandler.do_HEADcCs4|d|dd|j|dd|dS)NizWWW-AuthenticatezBasic realm="%s"rlrS)rTrUREALMrVr r r r do_AUTHHEADs  zBasicAuthHandler.do_AUTHHEADcCsh|jdds$||jdn@|jddd|jkr\|d||jdn|dS)NZ AuthorizationsNo Auth header receivedzBasic rksIt works)r\r]rorWrX ENCODED_AUTHrTrVr r r r do_GETs zBasicAuthHandler.do_GETN)rrrrUSERPASSWDrnZ USER_PASSWDbase64Z b64encoder7decoderqrrjrmrorrr r r r ras rac@s(eZdZdZddZddZddZdS) FakeProxyHandlerzThis 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 rszFakeProxyHandler.__init__cGsdSr"r rhr r r rjszFakeProxyHandler.log_messagecCsvtj|jd\}}}}}}||_|j|rr|dd|dd| |j t d|jd|j ddS) NrrkZOKrRrSzYou've reached %s!
r3sFOur apologies, but our server is down due to a sudden zombie invasion.) urllibparseurlparser_r`rxr$rTrUrVrWrXbytes)r Zscmnetlocr_paramsqueryfragmentr r r rrs   zFakeProxyHandler.do_GETN)rrrrrrjrrr r r r rwsrwcsPeZdZdZdZdZdZfddZddZfd d Z d d Z d dZ Z S)BasicAuthTestsrbrcZ IncorrectrdcsTtt|dd}t||_||jd|jj|_|j |jj dS)Nc_st|i|Sr")rarfrgr r r #http_server_with_basic_auth_handler szABasicAuthTests.setUp..http_server_with_basic_auth_handlerzhttp://127.0.0.1:%s) superrsetUprr addCleanup stop_serverr server_urlstartrwait)r r __class__r r rs   zBasicAuthTests.setUpcCs|jd|_dSr"rr!r r r r r(s zBasicAuthTests.stop_servercstt|dSr")rrtearDownr rr r r,szBasicAuthTests.tearDowncCsztj}||j|j|j|jtjtj |z| tj |jWn&tj j yt|d|jYn0dS)Nz!Basic auth failed for the url: %s)ryrHTTPBasicAuthHandler add_passwordrnrrsrtinstall_opener build_opener assertTrueurlopenerror HTTPErrorfailr Zahr r r test_basic_auth_success/s z&BasicAuthTests.test_basic_auth_successcCsRtj}||j|j|j|jtjtj || tj j tjj |jdSr")ryrrrrnrrsINCORRECT_PASSWDrr assertRaisesrrrrr r r test_basic_auth_httperror8s z(BasicAuthTests.test_basic_auth_httperror) rrrrsrtrrnrrrrr __classcell__r r rr rs   rr5csTeZdZdZdZdZdZfddZddZd d Z d d Z d dZ ddZ Z S)ProxyAuthTestszhttp://localhostZtesterZtest123Z TestRealmcsttdd}|tjdtjd<dtjd<t_j j j ij j fdd}t|_jjjjdjj}tjd |i}tj_tj|j_dS) NcSstjtj|dSr"osenvironclearrPZ old_environr r r restore_environJs z-ProxyAuthTests.setUp..restore_environrpNO_PROXYno_proxycstjg|Ri|Sr")rwrxrr r r create_fake_proxy_handlerUsz7ProxyAuthTests.setUp..create_fake_proxy_handlerzhttp://127.0.0.1:%dr)rrrrrrcopyr&rxr0rsrtr1rnrrrrrrrryrZ ProxyHandlerZProxyDigestAuthHandlerproxy_digest_handlerropener)r rrZ proxy_urlhandlerrr r rGs&         zProxyAuthTests.setUpcCs|jd|_dSr"rr r r r rbs zProxyAuthTests.stop_servercCsF|j|j|j|j|jd|jd|t j j |j j |jdS)NZbadr')rrrnURLrsrtrxr-rryrrropenr r r r -test_proxy_with_bad_password_raises_httperrorfs   z.FakeHTTPRequestHandlerz TestHTTP/PcSs*|}|r&|j|}||d}qdSr") send_headrWrX)r bodydoner r r rrs z8GetRequestHandler..FakeHTTPRequestHandler.do_GETcSs2|jd}|jt|}||j|dS)NzContent-Length)r\Zrfilerintrrrequestsr9)r Zcontent_lengthZ post_datar r r do_POSTs z9GetRequestHandler..FakeHTTPRequestHandler.do_POSTcs||j_|j|jd\}}}|||D]\}}|||d|jiq4|rp|dd| |S| dS)Nrrrlz text/plain) r\headers_receivedrr9r_poprTrUrrV)r Z response_coder\rheaderrHFakeHTTPRequestHandler responsesr r rs   z;GetRequestHandler..FakeHTTPRequestHandler.send_headcWsdSr"r )r rfr r r rjsz=GetRequestHandler..FakeHTTPRequestHandler.log_messageN) rrrZserver_versionrrrrrrrrjr rr r rsr)rrre)rr rr GetRequestHandlers&rcseZdZdZfddZd+ddZddZd,d d Zd-d d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*ZZS). 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||tjjdd}||tj dtjd<dtjd<dS)NcSstjtj|dSr"rrr r r rs z*TestUrlopen.setUp..restore_environ*rr) rrrrryr urlcleanuprrr)r rrr r rs  zTestUrlopen.setUpNcKsxg}tjj||fi|}zH||d||||d||W|n |0d |S)Nrki) ryrrextend readlinesr9readlinercloser)r urldatarglfr r r rszTestUrlopen.urlopencCs|jd|_dSr"rr r r r rs zTestUrlopen.stop_servercCsZ|durdgdfg}t|}t||_||j|j|jj|jj}||_|S)Nrks we don't care) rrrrrrrrr)r rrrr r r start_servers     zTestUrlopen.start_servercKs^ttjds|dddlm}|dur6dgdfg}t|}||fd|i|}|j|_|S)NZ HTTPSHandlerzssl support requiredr)make_https_serverrk we care a bitZ handler_class)hasattrryrskipTestZtest.ssl_serversrrr)r rrgrrrr r r start_https_servers    zTestUrlopen.start_https_servercCsVd}ddgdfdg|fg}||}|d|j}|||||jddgdS) NsWe got here...i.)ZLocationz(http://localhost:%(port)s/somewhere_elserprkhttp://localhost:%s//z/somewhere_elserrr assertEqualr)r expected_responserrrr r r test_redirections  zTestUrlopen.test_redirectioncCs@d}d}ddg|fg}||}|d|j}|||dS)Ns hello worldsa hello worl 1 d 0 rk)zTransfer-EncodingZchunkedr)rrrr)r rZ chunked_startrOrrr r r test_chunkeds zTestUrlopen.test_chunkedc Csd}|dg|fg}z|d|jWn8tjjyb}z|}|WYd}~nd}~00|d| ||| |j dgdS)NsBad bad bad...izhttp://localhost:%s/weeblez404 should raise URLErrorz/weeble) rrrryrrrrrrr)r rrrrr r r test_404s  zTestUrlopen.test_404cCsFd}|dg|fg}|d|j}|||||jdgdS)N pycon 2008...rkhttp://localhost:%s/bizarre/bizarrerr rrrr r r test_200"s  zTestUrlopen.test_200cCsJd}|dg|fg}|d|jd}|||||jddgdS)Nrrkrsget=with_feelingrrrr r r test_200_with_parameters)s  z$TestUrlopen.test_200_with_parameterscCs8|}tjtd}|jd|j|d}||ddS)NZcafilehttps://localhost:%s/bizarrecontextr)rsslcreate_default_contextCERT_localhostrrr)r rrrr r r test_https1s zTestUrlopen.test_httpsc Cs|jtd}tdtf|jd|jtd}||d|t j j $}|jd|jt dWdn1st0Y|jt d}|t j j $}|jd|jt dWdn1s0YWdn1s0YdS)Ncertfilerprrr) rrrcheck_warningsDeprecationWarningrrrrryrrCERT_fakehostname)r rrcmr r r test_https_with_cafile7s    $  z"TestUrlopen.test_https_with_cafilec Cs|jtd}tdtfR|tjj$}|j d|j ddWdn1sT0YWdn1sr0YdS)NrrprT)Z cadefault) rrrrrrryrrrr)r rrr r r test_https_with_cadefaultHs   z%TestUrlopen.test_https_with_cadefaultcstdur|dtjs"|ddfdd}ttj}|||j|td}tjtd}|j d|j |d| d dS) Nzssl module requiredzSNI support required in OpenSSLcs|dSr"r )Zssl_sockZ server_nameZinitial_contextZsni_namer r cb_sniVsz*TestUrlopen.test_https_sni..cb_sni)rrrzhttps://localhost:%sr localhost) rrZHAS_SNIZ SSLContextZPROTOCOL_TLS_SERVERZset_servername_callbackrrrrrr)r rrrr rr test_https_sniPs      zTestUrlopen.test_https_snicCsd|}tjjd|jddid}tj|Wdn1sD0Y||jdddS)NrZRangez bytes=20-39)r\)rryrZRequestrrrr)r rZreqr r r test_sending_headers`sz TestUrlopen.test_sending_headerscCsn|}tjd|j@}dD]}|t||d|q ||dWdn1s`0YdS)Nhttp://localhost:%s)rrinfogeturlz3object returned from urlopen lacks the %s attributezcalling 'read' failed)rryrrrrrr)r ropen_urlattrr r r test_basichszTestUrlopen.test_basiccCsl|}tjd|j}||}Wdn1s<0Y||tjj d| | ddS)NrzEobject returned by 'info' is not an instance of email.message.MessageZplain) rryrrrrZassertIsInstanceemailmessageZMessagerZget_content_subtype)r rrZinfo_objr r r test_infops& zTestUrlopen.test_infocCs\|}tjd|j}||}Wdn1s<0Y||d|jdS)Nr)rryrrrrr)r rrrr r r test_geturl{s &zTestUrlopen.test_geturlcCsBd}|dg|fg}tjd|j}|D]}|||q,dS)Nrrkr)rryrrrr)r rrrliner r r test_iterations zTestUrlopen.test_iterationc Csddddddg}d|}|dg|fg}tjd |j}t|D]0\}}||||d |t||t|fqJ||d t|dS) NsWe sgot shere s verylong i  rrkrzQFetched line number %s doesn't match expected: Expected length was %s, got %sr2) rrryrrr enumeraterr[)r linesrrrindexrr r r test_line_iterations  zTestUrlopen.test_line_iteration)N)N)N)rrrrrrrrrrrrrrrrrrrrrrrr rr r rr rs*     rcCs t}tjtjg|RdSr")rZthreading_setupunittestZaddModuleCleanupZthreading_cleanup) thread_infor r r setUpModulesr __main__)*rurr urllib.parseryZurllib.requestZ http.serverrrr r4testrZ test.supportrr ImportErrorr_dirname__file__hererrrrrrrrr&rerarwZTestCaserZrequires_hashdigestrrrr rmainr r r r s>      y,!(M+`