kWc@sddlZddlZddlZddlZddlZddlZddlZddlZddlm Z e j dde Z e j dZ yddlZWnek reZnXejjeZejjedZejjedZdejfd YZd e jfd YZd ejfd YZdfdYZdejfdYZdejfdYZ de fdYZ!de fdYZ"dZ#de fdYZ$dZ%e&dkre%ndS(iN(t test_supportt mimetoolst deprecatedt threadings keycert.pems keycert2.pemtLoopbackHttpServercBs eZdZdZdZRS(s^HTTP server w/ a few modifications that make it useful for loopback testing purposes. cCs*tjj||||jjddS(Ng?(tBaseHTTPServert HTTPServert__init__tsockett settimeout(tselftserver_addresstRequestHandlerClass((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR!s cCs,|jj\}}|jd||fS(s"BaseHTTPServer method, overridden.g$@(RtacceptR (R trequesttclient_address((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyt get_request*s (t__name__t __module__t__doc__RR(((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyRs tLoopbackHttpServerThreadcBs)eZdZdZdZdZRS(s2Stoppable thread that runs a loopback http server.cCsVtjj|t|_tj|_d|_td||_ |j j |_ dS(NsHTTP/1.0s 127.0.0.1i(s 127.0.0.1i( RtThreadRtFalset_stoptEventtreadytprotocol_versionRthttpdt server_porttport(R trequest_handler((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR9s   cCst|_|jdS(s.Stops the webserver if it's currently running.N(tTrueRtjoin(R ((s0/usr/lib/python2.7/test/test_urllib2_localnet.pytstopDs cCs.|jjx|js)|jjqWdS(N(RtsetRRthandle_request(R ((s0/usr/lib/python2.7/test/test_urllib2_localnet.pytrunLs  (RRRRR!R$(((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR6s tBasicAuthHandlercBsleZdZdZdZdZdeefZejeZ dZ dZ dZ dZ d ZRS( s,Handler for performing Basic Authentication.ttestUserttestPasstTests%s:%scOstjj|||dS(N(RtBaseHTTPRequestHandlerR(R targstkwargs((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR]scGsdS(N((R tformatR*((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyt log_message`scCs+|jd|jdd|jdS(Nis Content-types text/html(t send_responset send_headert end_headers(R ((s0/usr/lib/python2.7/test/test_urllib2_localnet.pytdo_HEADds cCsB|jd|jdd|j|jdd|jdS(NisWWW-AuthenticatesBasic realm="%s"s Content-types text/html(R.R/tREALMR0(R ((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyt do_AUTHHEADis cCsu|jjddkr5|j|jjdn<|jjdd|jkrg|jjdn |jdS(Nt AuthorizationsNo Auth Header ReceivedsBasic s It works!(theaderst getheadertNoneR3twfiletwritet ENCODED_AUTH(R ((s0/usr/lib/python2.7/test/test_urllib2_localnet.pytdo_GETos  (RRRtUSERtPASSWDR2t USER_PASSWDtbase64t b64encodeR:RR-R1R3R;(((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR%Ts    tDigestAuthHandlercBs_eZdZdZdZdZdZdZdZdZ dZ d Z RS( s-Handler for performing digest authentication.cCs1d|_g|_i|_d|_d|_dS(Nis Test Realmtauth(t _request_numt_noncest_userst _realm_namet_qop(R ((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR~s     cCs ||_dS(N(RG(R tqop((s0/usr/lib/python2.7/test/test_urllib2_localnet.pytset_qopscCs"t|tst||_dS(N(t isinstancetdicttAssertionErrorRE(R tusers((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyt set_usersscCs ||_dS(N(RF(R trealm((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyt set_realmscCsA|jd7_tjt|jj}|jj||S(Ni(RCthashlibtmd5tstrt hexdigestRDtappend(R tnonce((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyt_generate_noncescCs|jd}||d}|jd}i}xu|D]m}|jd\}}|j}|ddkr|ddkr|dd!}n |j}||||j |j gD]*}|j |||j |rt}qqW|s|j|StSdS(sPerforms 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. isProxy-AuthorizationtusernameRVN(tlenRERR5RsRftgetRDtremoveRtpatht short_pathRrtcommand(R RRbRgtauth_validatedRx((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR#s,        ( RRRRRIRNRPRWRfRrRsR#(((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyRA{s        tFakeProxyHandlercBs)eZdZdZdZdZRS(sThis 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#||_tjj|||dS(N(tdigest_auth_handlerRR)R(R R}R*R+((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyRs cGsdS(N((R R,R*((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR-scCstj|jd\}}}}}}||_|jj|r|jdd|jdd|j|jj d|j|jj dndS(NthttpitOKs Content-Types text/htmlsYou've reached %s!
sFOur apologies, but our server is down due to a sudden zombie invasion.( turlparseRxRyR}R#R.R/R0R8R9(R tscmtnetlocRxtparamstquerytfragment((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR;s!  (RRRRR-R;(((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR|s  t BaseTestCasecBseZdZdZRS(cCstj|_dS(N(Rtthreading_setupt_threads(R ((s0/usr/lib/python2.7/test/test_urllib2_localnet.pytsetUpscCstj|jdS(N(Rtthreading_cleanupR(R ((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyttearDowns(RRRR(((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyRs tBasicAuthTestscBsDeZdZdZdZdZdZdZdZdZ RS(R&R't IncorrectR(cCs_tt|jd}t||_d|jj|_|jj|jjj dS(Nc_s t||S(N(R%(R*R+((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyt#http_server_with_basic_auth_handler&sshttp://127.0.0.1:%s( tsuperRRRtserverRt server_urltstartRtwait(R R((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR#s   cCs$|jjtt|jdS(N(RR!RRR(R ((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR-s cCstj}|j|j|j|j|jtjtj|y|j tj |jWn@tj k r|j d|jnt k r}|nXdS(NsBasic Auth Failed for url: %s(turllib2tHTTPBasicAuthHandlert add_passwordR2RR<R=tinstall_openert build_openert assertTrueturlopent HTTPErrortfailt Exception(R tahte((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyttest_basic_auth_success1s "cCsdtj}|j|j|j|j|jtjtj||j tj tj |jdS(N( RRRR2RR<tINCORRECT_PASSWDRRt assertRaisesRR(R R((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyttest_basic_auth_httperror<s   ( RRR<R=RR2RRRR(((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyRs  tProxyAuthTestscBsVeZdZdZdZdZdZdZdZdZ dZ d Z RS( shttp://localhostttesterttest123t TestRealmcsttjt_jjijj6jjj fd}t |_ j j j j jdj j}tji|d6}tj_tj|j_dS(Ncstj||S(N(R|R}(R*R+(R (s0/usr/lib/python2.7/test/test_urllib2_localnet.pytcreate_fake_proxy_handlerQsshttp://127.0.0.1:%dR~(RRRRAR}RNR=R<RPR2RRRRRRRt ProxyHandlertProxyDigestAuthHandlertproxy_digest_handlerRtopener(R Rt proxy_urlthandler((R s0/usr/lib/python2.7/test/test_urllib2_localnet.pyRKs  cCs$|jjtt|jdS(N(RR!RRR(R ((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR\s cCs\|jj|j|j|j|jd|jjd|jt j |j j |jdS(NtbadRB( RRR2tURLR<R=R}RIRRRRtopen(R ((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyt-test_proxy_with_bad_password_raises_httperror`s   cCs3|jjd|jtj|jj|jdS(NRB(R}RIRRRRRR(R ((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyt,test_proxy_with_no_password_raises_httperrorhs  cCsk|jj|j|j|j|j|jjd|jj |j}x|j r\qMW|j dS(NRB( RRR2RR<R=R}RIRRtreadtclose(R tresult((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyttest_proxy_qop_auth_worksnscCs|jj|j|j|j|j|jjdy|jj |j}Wnt j k rjd}nX|rx|j rqtW|jndS(Nsauth-int(RRR2RR<R=R}RIRRRtURLErrorR7RR(R R((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyt0test_proxy_qop_auth_int_works_or_throws_urlerrorws ( RRRR<R=R2RRRRRR(((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyRDs     cs&dtjffdYS(NtFakeHTTPRequestHandlercsMeZdZgZgZdZdZdZfdZdZ RS(s TestHTTP/iPcSs)|j}|r%|jj|ndS(N(t send_headR8R9(R tbody((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR;s cSsC|jd}|jjt|}|j|jj|dS(NsContent-Length(R5trfileRtintR;trequestsRU(R tcontent_lengtht post_data((s0/usr/lib/python2.7/test/test_urllib2_localnet.pytdo_POSTs  cs|j_|jj|jjd\}}}|j|x+|D]#\}}|j|||jqKW|r|jdd|j |S|j dS(Nis Content-types text/plain( R5theaders_receivedRRURxtpopR.R/RR0(R t response_codeR5RtheaderRe(Rt responses(s0/usr/lib/python2.7/test/test_urllib2_localnet.pyRs   cWsdS(N((R R*((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyR-s( RRtserver_versionRRRR;RRR-((RR(s0/usr/lib/python2.7/test/test_urllib2_localnet.pyRs  (RR)(R((RRs0/usr/lib/python2.7/test/test_urllib2_localnet.pytGetRequestHandlers"%t TestUrlopencBseZdZdZddZdZddZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdZdZRS(sGTests urllib2.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. cCsBtji}tj|}tj|tt|jdS(N(RRRRRRR(R t proxy_handlerR((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyRs cKsg}tj|||}zV|j|jd|j|j|j|jd|j|jWd|jXdj|S(Niit( RRtextendt readlinesRUtreadlineRRR (R turltdataR+tltf((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyRs cCsQt|}t||_|jj|jjj|jj}||_|S(N(RRRRRRR(R RRR((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyt start_servers    cKsttds|jdnddlm}|dkrPdgdfg}nt|}||d||}|j|_|S(Nt HTTPSHandlersssl support requiredi(tmake_https_serveris we care a bitt handler_class(thasattrRtskipTestttest.ssl_serversRR7RR(R RR+RRR((s0/usr/lib/python2.7/test/test_urllib2_localnet.pytstart_https_servers   cCsd}dd gdfdg|fg}|j|}zYtjd|j}|j}|j|j|||j|jdd gWd|jj XdS( NsWe got here...i.tLocations"http://localhost:%s/somewhere_elseRishttp://localhost:%s/t/s/somewhere_else(Rs"http://localhost:%s/somewhere_else( RRRRRRt assertEqualRRR!(R texpected_responseRRRR((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyttest_redirections  cCsd}|jdg|fg}z~ytjd|jWntjk rT}nX|jd|j}|j|j|||j|j dgWd|j j XdS(NsBad bad bad...ishttp://localhost:%s/weebles404 should raise URLErrors/weeble( RRRRRRRRRRRR!(R RRRR((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyttest_404s   cCsd}|jdg|fg}zVtjd|j}|j}|j|j|||j|jdgWd|jj XdS(Ns pycon 2008...ishttp://localhost:%s/bizarres/bizarre( RRRRRRRRRR!(R RRRR((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyttest_200 s  cCsd}|jdg|fg}z\tjd|jd}|j}|j|j|||j|jddgWd|jj XdS(Ns pycon 2008...ishttp://localhost:%s/bizarresget=with_feelings/bizarre( RRRRRRRRRR!(R RRRR((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyttest_200_with_parameterss  cCsN|j}tjdt}|jd|jd|}|j|ddS(Ntcafileshttps://localhost:%s/bizarretcontexts we care a bit(Rtssltcreate_default_contexttCERT_localhostRRR(R RRR((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyt test_https(s c Cs|jdt}ddl}|jd|jdt}|j|d|jtj|jd|jdt WdQX|jdt }|j|j |jd|jdt WdQXdS(Ntcertfileishttps://localhost:%s/bizarreRs we care a bit( RRRRRRRRRtCERT_fakehostnametCertificateError(R RRR((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyttest_https_with_cafile.s   cCsI|jdt}|jtj|jd|jdtWdQXdS(NRshttps://localhost:%s/bizarret cadefault(RRRRRRRR(R R((s0/usr/lib/python2.7/test/test_urllib2_localnet.pyttest_https_with_cadefault?scstdkr|jdntjs5|jdndgfd}tjtj}|j||jd|dt}tj dt}|j d|j d||j dd dS( Nsssl module requiredsSNI support required in OpenSSLcs|ds>          'z 'D *