a 5êdgd4ã@sddlZddlmZddlmZddlmZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Zddl mZmZmZmZmZmZmZddlmZddlZddlZGdd„dejƒZGd d „d ejƒZGd d „d ƒZGd d„dƒZGdd„de ƒZ!Gdd„dej"ƒZ#Gdd„dƒZ$Gdd„dƒZ%Gdd„dej&ƒZ'Gdd„dƒZ(Gdd„dƒZ)dd„Z*dd „Z+Gd!d"„d"ej,j-ƒZ.Gd#d$„d$ej,j/ƒZ0Gd%d&„d&ej,j-ƒZ1Gd'd(„d(ƒZ2Gd)d*„d*ejƒZ3d+d,„Z4Gd-d.„d.ejƒZ5Gd/d0„d0ejƒZ6Gd1d2„d2ejƒZ7e8d3kre 9¡dS)4éN)Úsupport)Ú socket_helper)Ú test_urllib)ÚRequestÚOpenerDirectorÚHTTPBasicAuthHandlerÚHTTPPasswordMgrWithPriorAuthÚ _parse_proxyÚ_proxy_bypass_macosx_sysconfÚAbstractDigestAuthHandler)Úurlparsec@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) Ú TrivialTestsc CsœdD]’}i}td||ƒ|d=|dkrdtjdkrd| d¡| d¡}}| |jd¡| |jd¡| ¡D](\}}| |jd |d |||jf¡qlqdS) N)ÚrequestÚresponseÚparseÚerrorÚ robotparserzfrom urllib.%s import *Ú __builtins__rÚntÚ url2pathnameÚ pathname2urlZ nturl2pathz urllib.%sz.%r is exposed in 'urllib.%s' but defined in %r)ÚexecÚosÚnameÚpopÚ assertEqualÚ __module__Úitems)ÚselfÚmoduleÚcontextÚuÚpÚkÚv©r%ú-/usr/local/lib/python3.9/test/test_urllib2.pyÚ test___all__!s ÿÿzTrivialTests.test___all__cCsŽ| tjj¡| ttjjd¡tj  tjj ¡  tj d¡}tj dkrNd|}nd|}tj |¡}| ¡Wdƒn1s€0YdS)Nz bogus urlú/rz file:///%sú file://%s)Ú addCleanupÚurllibrÚ urlcleanupÚ assertRaisesÚ ValueErrorÚurlopenrÚpathÚabspathÚ__file__ÚreplaceÚseprÚread)rZfnameZfile_urlÚfr%r%r&Ú test_trivial0s  zTrivialTests.test_trivialcCsRdgd¢fdddgfdgd¢fdgd ¢fg}|D]\}}| tj |¡|¡q0dS) Nza,b,c)ÚaÚbÚczpath"o,l"og"i"cal, examplezpath"o,l"og"i"calZexampleza, b, "c", "d", "e,f", g, h)r8r9z"c"z"d"z"e,f"ÚgÚhza="b\"c", d="e\,f", g="h\\i")za="b"c"zd="e,f"zg="h\i")rr+rZparse_http_list)rÚtestsÚstringÚlistr%r%r&Útest_parse_http_listCs  ÿÿû z!TrivialTests.test_parse_http_listcCs"tj d¡}| |jt|ƒ¡dS)NÚreason)r+rÚURLErrorÚassertInrAÚstr)rÚerrr%r%r&Útest_URLError_reasonstrNs z$TrivialTests.test_URLError_reasonstrN)Ú__name__rÚ __qualname__r'r7r@rFr%r%r%r&r s r c@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚRequestHdrsTestscCsDd}| t|ddidjdd¡| t|ddidjdd¡dS)Núhttp://example.comú Spam-eggsÚblah©Úheadersz spam-EggS)rrrN)rÚurlr%r%r&Útest_request_headers_dictUs ÿþþÿþþz*RequestHdrsTests.test_request_headers_dictcCsâd}t|ddid}| | d¡¡| | ¡dg¡| dd¡| t| ¡ƒddg¡| | d ¡¡| |  d ¡¡| |  d d ¡d ¡|  d¡| | d¡¡|  d d ¡| | d ¡¡|  d ¡| | d ¡¡dS) NrJrKrLrM)rKrLzFoo-BarÚbaz)zFoo-barrQz Not-thereÚdefaultzUnredirected-spamZEggs) rÚ assertTrueÚ has_headerrZ header_itemsÚ add_headerÚsortedÚ assertFalseÚ assertIsNoneÚ get_headerZ remove_headerÚadd_unredirected_header)rrOÚreqr%r%r&Útest_request_headers_methodsjs" ÿ   z-RequestHdrsTests.test_request_headers_methodscCsÆtj ¡}|j}|j}|ddddƒ|ddddƒ|dddd ƒ|dd d d ƒ|dd ddƒ| |ddƒd¡| |ddƒd¡| |ddƒd¡| |ddƒd¡| |ddƒd¡| |ddƒd¡|d dddƒ|d dddƒ| |d dƒd¡| |d dƒd¡|ddddƒ|dddd ƒ| |ddƒd!¡|d"dd#d"ƒ| |d"dƒd$¡| |d"d%ƒd&¡| |dd'ƒd&¡| |dd(ƒd)¡| |ddƒd)¡| |dd ƒd*¡| |dd ƒd+¡dS),Nz Some Realmúhttp://example.com/ÚjoeÚpasswordzhttp://example.com/niÚnizhttp://c.example.com:3128Ú3r:z d.example.comÚ4Údze.example.com:3128Ú5Úeú example.com)r^r_rJzhttp://example.com/spamzhttp://example.com/spam/spamzhttp://example.com/fooÚfoozhttp://example.com/barÚbarÚnini)rgr`)rhrir9ÚfirstrLÚsecondÚspam)rkrlr8Ú1)rmr8zhttp://a.example.com/©NNz c.example.comzc.example.com:3128)rar:)rbrc)rdre©r+rZHTTPPasswordMgrÚ add_passwordÚfind_user_passwordr©rZmgrÚaddZfind_user_passr%r%r&Útest_password_managerŽs„  ÿ ÿ ÿ ÿÿþÿþ ÿ ÿ ÿ ÿ ÿ ÿ ÿþ ÿ ÿz&RequestHdrsTests.test_password_managercCsrtj ¡}|j}|j}|ddddƒ|ddddƒ|d d d d ƒ|d dddƒ| |ddƒd¡| |ddƒd¡| |ddƒd¡| |ddƒd¡| |ddƒd¡| |ddƒd¡| |ddƒd¡| |ddƒd¡| |ddƒd¡| |d dƒd¡| |d d ƒd¡| |d dƒd¡| |d dƒd¡| |d d ƒd¡| |d d!ƒd¡| |d d"ƒd¡dS)#Nr6zhttp://g.example.com:80Ú10Újr;zhttp://h.example.comÚ11r#r<zi.example.com:80Ú12ÚlÚiz j.example.comÚ13Úmzg.example.com:100rnzg.example.com:80)rurvz g.example.comzhttp://g.example.com:100zhttp://g.example.comz h.example.com)rwr#zh.example.com:80zhttp://h.example.com:80z i.example.com)rxryzhttp://i.example.com:80)r{r|zj.example.com:80zhttp://j.example.comzhttp://j.example.com:80rorrr%r%r&Ú"test_password_manager_default_portÔsZ  ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿz3RequestHdrsTests.test_password_manager_default_portN)rGrrHrPr\rtr}r%r%r%r&rISs$FrIc@s(eZdZgZdejfdd„Zdd„ZdS)Ú MockOpenerNcCs||||_|_|_dS©N)r[ÚdataÚtimeout)rr[r€rr%r%r&ÚopenszMockOpener.opencGs|||_|_dSr)ÚprotoÚargs)rrƒr„r%r%r&rszMockOpener.error)rGrrHÚ addheadersÚsocketÚ_GLOBAL_DEFAULT_TIMEOUTr‚rr%r%r%r&r~þsr~c@s(eZdZddd„Zd dd„Zdd„ZdS) ÚMockFileNcCsdSrr%©rÚcountr%r%r&r5 sz MockFile.readcCsdSrr%r‰r%r%r&Úreadline szMockFile.readlinecCsdSrr%©rr%r%r&ÚcloseszMockFile.close)N)N)rGrrHr5r‹rr%r%r%r&rˆs  rˆc@seZdZdd„ZdS)Ú MockHeaderscCs t| ¡ƒSr)r?Úvalues)rrr%r%r&Ú getheadersszMockHeaders.getheadersN)rGrrHrr%r%r%r&rŽsrŽc@s&eZdZddd„Zdd„Zdd„ZdS) Ú MockResponseNcCs.tj ||¡||||f\|_|_|_|_dSr)ÚioÚStringIOÚ__init__ÚcodeÚmsgrNrO)rr•r–rNr€rOr%r%r&r”szMockResponse.__init__cCs|jSrrMrŒr%r%r&ÚinfoszMockResponse.infocCs|jSr©rOrŒr%r%r&Úgeturl szMockResponse.geturl)N)rGrrHr”r—r™r%r%r%r&r‘s r‘c@seZdZdd„Zdd„ZdS)Ú MockCookieJarcCs ||_dSr)Úach_req)rrr%r%r&Úadd_cookie_header%szMockCookieJar.add_cookie_headercCs|||_|_dSr)Úec_reqÚec_r)rrrr%r%r&Úextract_cookies(szMockCookieJar.extract_cookiesN)rGrrHrœrŸr%r%r%r&rš$sršc@seZdZdd„Zdd„ZdS)Ú FakeMethodcCs||_||_||_dSr)Ú meth_nameÚhandleÚaction)rr¡r£r¢r%r%r&r”-szFakeMethod.__init__cGs|j|j|jg|¢RŽSr)r¢r¡r£)rr„r%r%r&Ú__call__2szFakeMethod.__call__N)rGrrHr”r¤r%r%r%r&r ,sr c@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚMockHTTPResponsecCs"||_||_||_||_d|_dS)NéÈ)Úfpr–ÚstatusrAr•)rr§r–r¨rAr%r%r&r”7s zMockHTTPResponse.__init__cCsdS)NÚr%rŒr%r%r&r5>szMockHTTPResponse.readcCsiSrr%rŒr%r%r&r—AszMockHTTPResponse.infocCs|jSrr˜rŒr%r%r&r™DszMockHTTPResponse.geturlN)rGrrHr”r5r—r™r%r%r%r&r¥6sr¥c@sTeZdZdd„Zejfdd„Zdd„Zddd „Zdd d œd d „Z dd„Z dd„Z dS)Ú MockHTTPClasscCs(d|_g|_d|_d|_d|_i|_dS)NrF)ÚlevelÚ req_headersr€Úraise_on_endheadersÚsockÚ_tunnel_headersrŒr%r%r&r”Is zMockHTTPClass.__init__cCs||_||_|Sr)Úhostr)rr°rr%r%r&r¤QszMockHTTPClass.__call__cCs ||_dSr)r«)rr«r%r%r&Úset_debuglevelVszMockHTTPClass.set_debuglevelNcCs&||_||_|r||_n |j ¡dSr)Ú _tunnel_hostZ _tunnel_portr¯Úclear)rr°ÚportrNr%r%r&Ú set_tunnelYs zMockHTTPClass.set_tunnelF)Úencode_chunkedcCsP||_||_|dur&|j| ¡7_|j ¡|r:||_||_|jrLtƒ‚dSr) ÚmethodÚselectorr¬rÚsortr€r¶r­ÚOSError)rr·rOÚbodyrNr¶r%r%r&ras zMockHTTPClass.requestcCsttƒiddƒS)Nr¦ÚOK)r¥rˆrŒr%r%r&Ú getresponsenszMockHTTPClass.getresponsecCsdSrr%rŒr%r%r&rqszMockHTTPClass.close)NN)NN) rGrrHr”r†r‡r¤r±rµrr½rr%r%r%r&rªHs ÿ rªc@s@eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dS)Ú MockHandleréôcCs| |¡dSr)Ú_define_methods)rÚmethodsr%r%r&r”zszMockHandler.__init__cCsJ|D]@}t|ƒdkr|\}}n |d}}t|||jƒ}t|j||ƒqdS)Né)Úlenr r¢ÚsetattrÚ __class__)rrÁÚspecrr£Úmethr%r%r&rÀ}s    zMockHandler._define_methodscOsØ|jj ||||f¡|dur"dS|dkr.|S|dkrHtddidƒ}|S|dkrXtdƒS| d¡rÀ|| d ¡d d…}z t|ƒ}Wnty–Yn0tddidƒ}|j  d |d ||di¡S|d krÔt j   d¡‚dS)Nú return selfúreturn responser¦r¼r©úreturn requestz http://blah/rú éÚhttprÚraiserL) ÚparentÚcallsÚappendr‘rÚ startswithÚrfindÚintr.rr+rB)rZfn_namer£r„ÚkwdsÚresr•r%r%r&r¢†s*    zMockHandler.handlecCsdSrr%rŒr%r%r&rszMockHandler.closecCs||_g|j_dSr)rÏrÐ)rrÏr%r%r&Ú add_parent szMockHandler.add_parentcCst|dƒsdS|j|jkS)NÚ handler_orderT)ÚhasattrrØ)rÚotherr%r%r&Ú__lt__¤s zMockHandler.__lt__N) rGrrHrØr”rÀr¢rr×rÛr%r%r%r&r¾us r¾cCsbg}d}|D]P}Gdd„dtƒ}||ƒ}|j|7_| |¡|d}| |¡| |¡q |S)Nrc@s eZdZdS)z6add_ordered_mock_handlers..MockHandlerSubclassN©rGrrHr%r%r%r&ÚMockHandlerSubclassÁsrÝrÌ)r¾rØr×rÑÚ add_handler)ÚopenerÚ meth_specÚhandlersrŠÚmethsrÝr<r%r%r&Úadd_ordered_mock_handlers«s   rãcGstƒ}|D]}| |¡q |Sr)rrÞ)Zhandler_instancesrßr<r%r%r&Úbuild_test_openerÍs räc@s$eZdZdd„Zdd„Zdd„ZdS)ÚMockHTTPHandlercCs||_||_| ¡dSr)r•rNÚreset)rr•rNr%r%r&r”ØszMockHTTPHandler.__init__cCsd|_g|_dS)Nr)Ú_countÚrequestsrŒr%r%r&ræÝszMockHTTPHandler.resetcCs”ddl}ddl}|j | |¡¡|jdkrl|jd|_tjj|j }|  |j ¡}|j   d|tƒ|j ||¡S||_|  d¡}tdd|d| ¡ƒSdS)NrrÌrÍú r¦r¼r©)ÚemailÚcopyrèrÑÚdeepcopyrçrÍÚclientÚ responsesr•Zmessage_from_stringrNrÏrrˆr[r‘Ú get_full_url)rr[rêrërr–r%r%r&Ú http_openás   ÿ zMockHTTPHandler.http_openN©rGrrHr”rærðr%r%r%r&råÔsråc@seZdZddd„Zdd„ZdS)ÚMockHTTPSHandlerrcCstjjj||dtƒ|_dS)N©Ú debuglevel)r+rÚAbstractHTTPHandlerr”rªÚhttpconn)rrôr%r%r&r”ôszMockHTTPSHandler.__init__cCs| |j|¡Sr)Údo_openrö©rr[r%r%r&Ú https_openøszMockHTTPSHandler.https_openN)r)rGrrHr”rùr%r%r%r&ròðs ròc@s$eZdZdd„Zdd„Zdd„ZdS)ÚMockHTTPHandlerCheckAuthcCs||_d|_dS©NF)r•Úhas_auth_header)rr•r%r%r&r”sz!MockHTTPHandlerCheckAuth.__init__cCs d|_dSrû)rürŒr%r%r&ræszMockHTTPHandlerCheckAuth.resetcCs6| d¡rd|_tjj|j}t|j|tƒd| ¡ƒS)NÚ AuthorizationTr©) rTrürÍrírîr•r‘rˆrï)rr[rr%r%r&rðs z"MockHTTPHandlerCheckAuth.http_openNrñr%r%r%r&rúüsrúc@seZdZdd„Zdd„ZdS)ÚMockPasswordManagercCs||_||_||_||_dSr)ÚrealmrOÚuserr_)rrÿZurirr_r%r%r&rpsz MockPasswordManager.add_passwordcCs||_||_|j|jfSr)Ú target_realmÚ target_urlrr_)rrÿZauthurir%r%r&rqsz&MockPasswordManager.find_user_passwordN)rGrrHrprqr%r%r%r&rþsrþc@sDeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dS)ÚOpenerDirectorTestscCs(Gdd„dtƒ}| ttƒj|ƒ¡dS)Nc@s eZdZdS)z.NonHandlerNrÜr%r%r%r&Ú NonHandlersr)Úobjectr-Ú TypeErrorrrÞ)rrr%r%r&Útest_add_non_handlers ÿz(OpenerDirectorTests.test_add_non_handlercCs\ddlm}tƒ}ddgdgg}t||ƒ| tj ¡¡dD]}| ||j |d¡q>dS)Nr)rB)r÷rÈ)Z proxy_openrÈ)Zredirect_requestrÈ)ZdoÚproxyÚredirectz://example.com/) Ú urllib.errorrBrrãrÞr+rZUnknownHandlerr-r‚)rrBÚoràÚschemer%r%r&Útest_badly_named_methods$s þ z,OpenerDirectorTests.test_badly_named_methodsc Cs¤tƒ}gd¢dgdgdgg}t||ƒ}tdƒ}| |¡}| ||d¡|ddf|ddfg}t||jƒD]2\}}|\} } } } | | | f|¡| | |f¡qldS)N)rðÚftp_openÚhttp_error_302r©rðrÈr]rÂrrð)rrãrr‚rÚziprÐ) rr ràrár[ÚrrÐÚexpectedÚgotÚhandlerrr„rÕr%r%r&Ú test_handled9sü   z OpenerDirectorTests.test_handledcCsœtƒ}g}dgdfdgdffD]:\}}Gdd„dtƒ}||ƒ}||_| |¡| |¡q| d¡| |jdd|d¡| |jdd|d¡dS) Nrr¿rðrc@s eZdZdS)zCOpenerDirectorTests.test_handler_order..MockHandlerSubclassNrÜr%r%r%r&rÝXsrÝr]rÌ)rr¾rØrÑrÞr‚rrÐ)rr rárârØrÝr<r%r%r&Útest_handler_orderSsÿ    z&OpenerDirectorTests.test_handler_ordercCsZtƒ}dgdgg}t||ƒ}tdƒ}| tjj|j|¡| |j |dd|fifg¡dS)N)rðrÎrr]rrð) rrãrr-r+rrBr‚rrÐ)rr ràrár[r%r%r&Ú test_raiseesþ zOpenerDirectorTests.test_raisec Cs°tƒ}dgddggd¢dgg}t||ƒ}tdƒ}| |¡|dd|ff|dd|tjd d iffg}t||jƒD]:\}}|\}} } | || f|dd…¡| | |d¡qpdS) N)rðz error 302)Zhttp_error_400rÎrð))rrÉZhttp_error_303Z http_errorrr]rrÂé.r©) rrãrr‚rZ ALWAYS_EQrrÐr) rr ràrár[rÐrrrZ method_namer„r%r%r&Útest_http_errorrs$û  ÿÿ z#OpenerDirectorTests.test_http_errorc Cs tƒ}ddgddgg}t||ƒ}tdƒ}| |¡|ddf|ddf|ddf|ddfg}t|jƒD]ž\}\}}} } |dkr¶| ||f||¡| t| ƒd¡| | dt¡qh| ||f||¡| t| ƒd¡| | dt¡| ddurh| | dt ¡qhdS) N)Ú http_requestrÊ)Ú http_responserÉr]rrrÌrrÂ) rrãrr‚Ú enumeraterÐrrÃZassertIsInstancer‘) rr ràrár[rÐrzrrr„rÕr%r%r&Útest_processors‰s0ÿÿý  þ z#OpenerDirectorTests.test_processorsN) rGrrHrr rrrrrr%r%r%r&rs rcCs\z| d¡Wnty*t d¡‚Yn0tj |¡}tjdkrX|  d¡rX|dd…}|S)Nzutf-8zpath is not encodable to utf8rz///rÂ) ÚencodeÚUnicodeEncodeErrorÚunittestZSkipTestr+rrrrrÒ)r0Úurlpathr%r%r&Úsanepathname2url­s   r#c@s^eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd 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*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd7d8„Ze  e!j"d9kd:¡d;d<„ƒZ#d=d>„Z$d?d@„Z%dAdB„Z&dCdD„Z'dEdF„Z(dGdH„Z)dIdJ„Z*dKdL„Z+dMdN„Z,dOdP„Z-dQdR„Z.dSS)TÚ HandlerTestscs®Gdd„dƒ‰G‡fdd„dtjjƒ}ddl}d}||ƒ}tƒ|_dd|jd d d d d gd df dd|jdd d d d gd df dd|jdd d d d gd df dd|jdd d d d gd df dddd d dd d gd df dd|jd d dgddf fD]Ì\ }}}}} } } } } t|ƒ}d|_|  |¡}|  |j |¡|  |j | ¡|  |j t |¡¡|  |j|¡|  |j| ¡|  |jj| ¡|  |jj| ¡| ¡}|  | d¡| ¡|  t|dƒt|ƒ¡qÜdS)Nc@s$eZdZdd„Zdd„Zdd„ZdS)z-HandlerTests.test_ftp..MockFTPWrappercSs ||_dSr©r€©rr€r%r%r&r”½sz6HandlerTests.test_ftp..MockFTPWrapper.__init__cSs$|||_|_t |j¡t|jƒfSr)ÚfilenameÚfiletyper’r“r€rÃ)rr'r(r%r%r&ÚretrfileÀsz6HandlerTests.test_ftp..MockFTPWrapper.retrfilecSsdSrr%rŒr%r%r&rÄsz3HandlerTests.test_ftp..MockFTPWrapper.closeN)rGrrHr”r)rr%r%r%r&ÚMockFTPWrapper¼sr*cs&eZdZdd„Zejf‡fdd„ ZdS)z-HandlerTests.test_ftp..NullFTPHandlercSs ||_dSrr%r&r%r%r&r”Èsz6HandlerTests.test_ftp..NullFTPHandler.__init__cs4|||_|_|||_|_||_ˆ|jƒ|_|jSr)rÚpasswdr°r´Údirsr€Ú ftpwrapper)rrr+r°r´r,r©r*r%r&Ú connect_ftpËs  z9HandlerTests.test_ftp..NullFTPHandler.connect_ftpN)rGrrHr”r†r‡r/r%r.r%r&ÚNullFTPHandlerÇsÿr0rzrheum rhaponicumz ftp://localhost/foo/bar/baz.htmlÚ localhostr©ÚIrgrhzbaz.htmlz text/htmlz'ftp://parrot@localhost/foo/bar/baz.htmlZparrotz*ftp://%25parrot@localhost/foo/bar/baz.htmlz%parrotz,ftp://%2542parrot@localhost/foo/bar/baz.htmlz %42parrotzftp://localhost:80/foo/bar/éPÚDzftp://localhost/baz.gif;type=aÚAzbaz.gifú Content-typeúContent-length)r+rZ FTPHandlerÚftplibr~rÏZFTP_PORTrrrrrr+r°r†Ú gethostbynamer´r,r-r'r(r—ÚgetrÔrÃ)rr0r8r€r<rOr°r´rr+Útype_r,r'Zmimetyper[rrNr%r.r&Útest_ftp»sX    þ  þ  þ  þ  þ þð zHandlerTests.test_ftpc Csºddl}tj ¡}tƒ}|_tj}tt j   |¡ƒ}d}d|d|dt   d¡|fg}zt   t  ¡¡}Wnt jy‚d}Yn0|rš| d||f¡|D]î} t|dƒ} zŠz|  |¡W|  ¡n |  ¡0| t| ƒ¡} z$|  ¡} |  ¡} |  ¡}W|  ¡n |  ¡0t  |¡}|jj|jd d }Wt  |¡n t  |¡0| | |¡| | d d ¡| | d d¡| | d|¡| || ¡qžd|dddt   d¡t  ¡|fdt  ¡|ffD]f} zRt|dƒ} z|  |¡W|  ¡n |  ¡0|  tj!j"|jt| ƒ¡Wt  |¡n t  |¡0qÀtj ¡}tƒ}|_dD]r\} }t| ƒ}z| |¡Wn"tj!j"y‚| #|¡Yn0| $|j%|¡| |j&d¡| |j&dk|¡qBdS)Nrs hello, world zfile://localhost%sr)z file://%s%sr1r©ÚwbT)Zusegmtr6z text/plainr7r{z Last-modifiedzfile://localhost:80%szfile:///file_does_not_exist.txtz)file://not-a-local-host.com//dir/file.txtzfile://%s:80%s/%sz,file://somerandomhost.ontheinternet.com%s/%s))zfile://ftp.example.com//foo.txtF)z file://ftp.example.com///foo.txtF)zfile://ftp.example.com/foo.txtF)z"file://somehost//foo/something.txtF)z#file://localhost//foo/something.txtFÚftp)'Z email.utilsr+rÚ FileHandlerr~rÏrÚTESTFNr#rr0r1r†r9Ú gethostnameÚgaierrorrÑr‚ÚwriterZ file_openrr5r—r™ÚstatZutilsZ formatdateÚst_mtimeÚremoverÚgetcwdr-rrBrWÚassertIsr[Útype)rrêr<r r@r"ZtowriteÚurlsZ localaddrrOr6rr€rNZrespurlZstatsZmodifiedr>r[r%r%r&Ú test_fileûs„  ý       ÿ ÿú     ÿ   zHandlerTests.test_filec Csftj ¡}tƒ}|_d}dD]â\}}t||ddiƒ}d|_| dd¡tƒ}|  ||¡}|j |j |j |j |j|jdkdf|  ¡} | j| j| |  ¡|¡| |jd ¡| |jd ¡| |j|¡| |jd ¡| |jgd ¢¡| |j|¡qd |_| tjj|j ||¡tddƒ}| t|j|¡dg|_dD]}td|ƒ}t ddidƒ}| |¡} |dur”| !d|j"¡| !d|j"¡n$| |j"dd¡| |j"dd¡| |j"dd ¡| |j"dd¡| dd¡| dd¡| dd¡| dd¡| |¡} | |j"dd¡| |j"dd¡| |j"dd¡| |j"dd¡qDdS)Nr]))ÚGETN)ÚPOSTsblahÚFoorhÚSpamÚeggsr¦r¼rfrr())Ú Connectionr)rNrh©rOrPTZbadpostrR)óNr©r7r6Ú0z!application/x-www-form-urlencodedÚHostrgrQ)#r+rrõr~rÏrrrZrªr÷r5r‹r—r™r•r–r:Ú __contains__rr°r«r·r¸r¬r€r­r-rrBrÚ do_request_r…r‘Ú assertNotInÚunredirected_hdrs) rr<r rOr·r€r[rÍrÚhdrsÚnewreqr%r%r&Ú test_httpWsd        ÿ      ÿ     zHandlerTests.test_httpc Cstj ¡}tƒ}|_tjddd}|j}| ¡|  t j |¡t |dƒL}t d|iƒ}| |¡}| d¡}| |d¡| | d¡¡Wdƒn1sœ0Yt |dƒP}t d|d d iƒ}| |¡}| t| d¡ƒd ¡| | d¡¡Wdƒn1s0YdS) Nzw+bF)ÚmodeÚdeleteÚrbr]úTransfer-encodingÚchunkedr7úContent-Lengthé)r+rrõr~rÏÚtempfileÚNamedTemporaryFilerrr*rÚunlinkr‚rrWrYrrWrTrÔ) rr<r Úfile_objZ file_pathr6r[r[Úter%r%r&Útest_http_body_file™s"       .  z HandlerTests.test_http_body_filecCs¦tj ¡}tƒ}|_t ¡}td|iƒ}| |¡}|  |  d¡d¡|  |  d¡¡ddi}td||ƒ}| |¡}|  t |  d¡ƒd¡|  |  d¡¡| ¡dS)Nr]r`rar7rbrc)r+rrõr~rÏr’ÚBytesIOrrWrrYrWrTrÔr)rr<r rgr[r[rNr%r%r&Útest_http_body_fileobj²s      z#HandlerTests.test_http_body_fileobjc CsÀtj ¡}tƒ}|_tjddg}iddifD]Œ}tj|tj dh}t d|j |ƒ}|  |¡}|s†|  | d¡d¡|  | d¡d ¡n|  t| d¡ƒd¡Wdƒq.1s°0Yq.dS) Nz-cÚpassrbrc)Ústdoutr]r7r`ra)r+rrõr~rÏÚsysÚ executableÚ subprocessÚPopenÚPIPErrmrWrrYrÔ)rr<r ÚcmdrNÚprocr[r[r%r%r&Útest_http_body_pipeÉs     ÿÿz HandlerTests.test_http_body_pipecCsŒtj ¡}tƒ}|_dd„}iddifD]\}td|ƒ|ƒ}| |¡}|sp| | d¡d¡| | d¡d¡q*| t | d¡ƒd¡q*dS) Ncss dVdS)Nsoner%r%r%r%r&Ú iterable_bodyæsz;HandlerTests.test_http_body_iterable..iterable_bodyrbé r]r7r`ra) r+rrõr~rÏrrWrrYrÔ)rr<r rvrNr[r[r%r%r&Útest_http_body_iterableßs    ÿz$HandlerTests.test_http_body_iterablecCsHtj ¡}tƒ|_| tddƒ¡}| | d¡d¡|  |  d¡¡dS)Nr]r%r`rar7) r+rrõr~rÏrWrrrYrWrT)rr<r[r%r%r&Útest_http_body_empty_seqós  z%HandlerTests.test_http_body_empty_seqcCshtj ¡}tƒ}|_t dgd¢¡}iddifD]0}td||ƒ}| |¡}| t |  d¡ƒd¡q2dS)Nr2)rÌrÂéérbér]r7) r+rrõr~rÏÚarrayrrWrrÔrY)rr<r Ziterable_arrayrNr[r[r%r%r&Útest_http_body_arrayûs    z!HandlerTests.test_http_body_arraycCs6tƒ}tdd}| |¡| d¡| |jd¡dS)NrÌrózhttps://www.example.com)rròrÞr‚rZ _debuglevel)rr r<r%r%r&Útest_http_handler_debuglevels    z)HandlerTests.test_http_handler_debuglevelcCsztj ¡}tƒ|_d}gd¢}|D]R}t||ƒ}| |¡}| |jdd¡|  dd¡| |¡}| |jdd¡q"dS)NrS)z#http://example.com/foo/bar/baz.htmlz$http://example.com//foo/bar/baz.htmlz$http://example.com/foo//bar/baz.htmlz$http://example.com/foo/bar//baz.htmlrUrfzsomeproxy:3128) r+rrõr~rÏrrWrrYÚ set_proxy)rr<r€Zds_urlsZds_urlZds_reqZ np_ds_reqZp_ds_reqr%r%r&Útest_http_doubleslashs     z"HandlerTests.test_http_doubleslashcCshgd¢}tdƒ}|D]N}||_t|ƒ}| | ¡|¡| |jpBd|j¡| t| ¡ƒj|j¡qdS)N)zhttp://example.com?foo=bar#bazz)http://example.com?foo=bar&spam=eggs#bashrJrJr©)rÚfull_urlr rrïÚfragmentÚquery)rrJrrOÚparsedr%r%r&Útest_full_url_setter*sz!HandlerTests.test_full_url_settercCs6tdƒ}|`| |j¡| |j¡| |jd¡dS)Núhttp://www.example.comr©)rr‚rXrƒrr¸)rrr%r%r&Útest_full_url_deleterAs   z"HandlerTests.test_full_url_deletercCsztj ¡}tƒ|_d}t|ƒ}| |¡}| |jd¡| |j d¡d}t|ƒ}| |¡}| |jd¡| |j d¡dS)Nzhttp://www.python.org?getspamúwww.python.orgz /?getspamúhttp://www.python.orgr©) r+rrõr~rÏrrWrr°r¸)rr<Z weird_urlr[r[Zurl_without_pathr%r%r&Útest_fixpath_in_weirdurlsHs   z&HandlerTests.test_fixpath_in_weirdurlscCstj ¡}tƒ}|_d}t|ƒ}tddid|ƒ}| ||¡}| ||¡|  t |dƒ¡tddid|ƒ}| ||¡}| ||¡|  t |dƒ¡tdd id|ƒ}| ||¡}| ||¡|  t |dƒ¡td d id|ƒ}|  | ||¡¡|  |j d ¡|  |j||d d if¡dS) Nr]r¦r¼r©rƒéÊZAcceptedéÎzPartial contentiöz Bad gatewayrÍ)r+rZHTTPErrorProcessorr~rÏrr‘rrHrWrÙrXrrƒr„)rr<r rOr[rÚnewrr%r%r&Ú test_errors[s(        zHandlerTests.test_errorscCs¨tƒ}tj |¡}tƒ|_tdƒ}tddidƒ}| |¡}|  |j |¡|  |j |¡|  |j d¡|  |j¡| ||¡}|  |j|¡|  |j|¡|  ||¡dS)Nr]r¦r¼r©rf)ršr+rÚHTTPCookieProcessorr~rÏrr‘rrHr›rÚorigin_req_hostrWZ unverifiablerrrž)rÚcjr<r[rr[rŽr%r%r&Ú test_cookiests    zHandlerTests.test_cookiesc Csdd}d}tj ¡}tƒ}|_dD]Z}dD]N}t|d|ƒ}t||ƒ}tj|_ |  dd¡|durz|  dt t |ƒƒ¡|  d d ¡z||tƒ|d td |iƒƒWn,tjjyÐ| |d ¡| |¡Yn0| |j ¡|¡z| |j ¡d¡Wn"ty| |jj¡Yn0dd„|jjDƒ} | d| ¡| d| ¡| |jjdd¡| d |jj¡| d |jj¡q,q"t|ƒ}tj|_ |fdd„} t|dd}d} tj|_ z| ||dƒ| d} q¶Wn*tjjyú| | tjjj¡Yn0t|dd}d} tj|_ z | ||d| ƒ| d} qWn*tjjy^| | tjjj¡Yn0dS)Núhttp://example.com/a.htmlzhttp://example.com/b.html)i-ri/é3)Nz blah blah z http_error_%sZNonsensezviking=withholdrbrOrlÚBlahÚlocationr•rLcSsg|] }| ¡‘qSr%)Úlower)Ú.0Úxr%r%r&Ú ¤rSz.HandlerTests.test_redirect..zcontent-lengthz content-typec Ss | |tƒddtd|iƒ¡dS)Nrr–r—)rrˆrŽ)r<r[rOr%r%r&r ±s ÿz,HandlerTests.test_redirect..redirectrf)r‘rr]rÌzhttp://example.com/%d)r+rÚHTTPRedirectHandlerr~rÏÚgetattrrr†r‡rrUrDrÃrZrˆrŽrÚ HTTPErrorrÚassertIsNotNoner[rïÚ get_methodÚAttributeErrorrWr€rNrXrYZ max_repeatsZmax_redirections) rÚfrom_urlZto_urlr<r r•r€r·r[rNr rŠr%r%r&Ú test_redirect…sl         ÿ   ÿ    ÿzHandlerTests.test_redirectc CsÂd}gd¢}gd¢}d}tj ¡}tƒ}|_t|ƒ}tj|_|D]6}|d|} |  tj j |j |t ƒddtd| iƒ¡qB|D]>}|d|} |  |t ƒdd td| iƒ¡| |j ¡| ¡q~dS) Nr”)rÍÚhttpsr>)ÚfileÚimapZldapzexample.com/b.htmlz://rzSecurity Loopholer—ú That's fine)r+rrœr~rÏrr†r‡rr-rržrrˆrŽrr[rï) rr¢Z valid_schemesZinvalid_schemesZschemeless_urlr<r r[r Z invalid_urlÚ valid_urlr%r%r&Útest_invalid_redirectÏs(     þ  ÿz"HandlerTests.test_invalid_redirectc Csnd}d}tj ¡}tƒ}|_t|ƒ}tj|_tj   ||¡}|  |t ƒddt d|iƒ¡| |j ¡|¡dS)Nr”z/b.htmlrr§r—)r+rrœr~rÏrr†r‡rrÚurljoinrrˆrŽrr[rï)rr¢Z relative_urlr<r r[r¨r%r%r&Útest_relative_redirectås   ÿz#HandlerTests.test_relative_redirectc Cs‚ddlm}ddlm}|ƒ}||ddƒtddƒ}tj ¡}tj ¡}tj  |¡}t ||||ƒ}|  d¡|  |j  d¡¡dS) Nr)Ú CookieJar)Úinteract_netscapeúhttp://www.example.com/z spam=eggsrz%Location: http://www.cracker.com/ ÚCookie)Zhttp.cookiejarr¬Ztest.test_http_cookiejarr­rår+rÚHTTPDefaultErrorHandlerrœrrär‚rWr[rT) rr¬r­r’ÚhhÚhdehÚhrhZcpr r%r%r&Útest_cookie_redirectòs        z!HandlerTests.test_cookie_redirectcCsTd}tdd|ƒ}tj ¡}tj ¡}t|||ƒ}| d¡}| | ¡|  ¡¡dS)Nz(http://www.example.com/index.html#OK rz Location: r‡) rår+rr°rœrär‚rr™Ústrip)rZredirected_urlr±r²r³r r§r%r%r&Útest_redirect_fragments    z#HandlerTests.test_redirect_fragmentcs|ˆ tjj¡tjj‰d}t |¡tj_ˆ t tjdˆ¡t dƒ‰‡‡‡fdd„}|tjj_tj  d¡}ˆ  |  ¡d¡dS)Ns(HTTP/1.1 302 Found Location: ?query ÚHTTPConnection)z/pathz /path?querycs8ˆ |tˆƒ¡ˆj|||g|¢Ri|¤Žd|j_dS)NsHTTP/1.1 200 OK Hello!)rÚnextrrÅZfakedata)Úconnr·rOÚposÚkw©Z real_classrrJr%r&rsz3HandlerTests.test_redirect_no_path..requestzhttp://python.org/pathzhttp://python.org/path?query)r*r+rr,rÍrír·rÚfakehttprÄÚiterr/rr™)rZ response1rr§r%r¼r&Útest_redirect_no_path s  z"HandlerTests.test_redirect_no_pathc Cs°Gdd„dtjjƒ}|ƒ}tj |¡}d}|D]|\}}| t|ƒ¡Vt d|d¡|_|  d¡}d|d}|j } |  |   |¡t| ƒ¡Wdƒq.1s 0Yq.dS) Nc@seZdZdd„ZdS)z4HandlerTests.test_redirect_encoding..HandlercSs(| |j|¡}|jj|_t d¡|_|S)Ns)HTTP/1.1 200 OK Content-Length: 3 123)r÷Ú connectionÚbufÚlast_bufrr½)rr[Úresultr%r%r&rð"s  ÿz>HandlerTests.test_redirect_encoding..Handler.http_openN)rGrrHrðr%r%r%r&ÚHandler!srÄ))s /pÃ¥-dansk/s/p%C3%A5-dansk/)ó/spaced%20path/rÅ)s /spaced path/rÅ)s /?pÃ¥-dansks/?p%C3%A5-dansks!HTTP/1.1 302 Redirect Location: s r]sGET ó ) r+rÚ HTTPHandlerÚ build_openerÚsubTestÚreprrr½rÀr‚rÂrSrÒ) rrÄrrßr=r—rÃrrrr%r%r&Útest_redirect_encodings"   ÿÿÿ  z#HandlerTests.test_redirect_encodingcCs d}t|dt|dfD]‚}tƒ}tj |¡}| |¡dgg}t||ƒ}tdƒ}| |j d¡|  |¡| |j |¡| |ddfgd d „|j Dƒ¡qdS) Núproxy.example.com:3128©rÍ)ZHTTP)rðrÉzhttp://acme.example.com/zacme.example.comrrðcSsg|]}|dd…‘qS©rrÂr%©r™Útupr%r%r&r›QrSz+HandlerTests.test_proxy..) Údictrr+rÚ ProxyHandlerrÞrãrrr°r‚rÐ)rr!rcr Úphràrár[r%r%r&Ú test_proxyAs  ÿ  ÿzHandlerTests.test_proxycCs”dtjd<tƒ}tj tdd¡}| |¡tdƒ}|  |j d¡|  |¡|  |j d¡tdƒ}|  |j d¡|  |¡|  |j d¡tjd=dS) Nz python.orgÚno_proxyúproxy.example.comrÍzhttp://www.perl.org/ú www.perl.orgrŠr‰© rÚenvironrr+rrÒrÑrÞrrr°r‚©rr rÓr[r%r%r&Útest_proxy_no_proxySs    z HandlerTests.test_proxy_no_proxycCsfdtjd<tƒ}tj tdd¡}| |¡tdƒ}|  |j d¡|  |¡|  |j d¡tjd=dS)NÚ*rÕrÖrÍrŠr‰rØrÚr%r%r&Útest_proxy_no_proxy_allbs   z$HandlerTests.test_proxy_no_proxy_allcCsˆtƒ}tj tdd¡}| |¡dgg}t||ƒ}tdƒ}| |j d¡|  |¡| |j d¡| |ddfgdd „|j Dƒ¡dS) NrÌ©r¤)rùrÉúhttps://www.example.com/úwww.example.comrrùcSsg|]}|dd…‘qSrÎr%rÏr%r%r&r›{rSz1HandlerTests.test_proxy_https..) rr+rrÒrÑrÞrãrrr°r‚rÐ)rr rÓràrár[r%r%r&Útest_proxy_httpsms ÿ  ÿzHandlerTests.test_proxy_httpscCsÆtƒ}tj tdd¡}| |¡tƒ}| |¡tdƒ}| dd¡| dd¡|  |j d¡|  |j ¡|  |¡| d |jj¡| d |jj¡| |j ¡|  |j d¡|  | d ¡d¡dS) NrÌrÞrßúProxy-AuthorizationÚFooBarú User-AgentÚGrailrà)rârã)räråúProxy-authorization)rr+rrÒrÑrÞròrrUrr°rXr²r‚rXrör¬rCrŸrY)rr rÓZ https_handlerr[r%r%r&Ú$test_proxy_https_proxy_authorization}s(      ÿÿ z1HandlerTests.test_proxy_https_proxy_authorizationÚdarwinzonly relevant for OSXcCs®dgd¢dœ}dD]}| t||ƒd|¡qdD]}| t||ƒd|¡q2dgdœ}| td |ƒ¡dd d gdœ}d }| t||ƒd|¡d }| t||ƒd|¡dS)NF)úfoo.barz *.bar.comú 127.0.0.1z10.10z10.0/16)Zexclude_simpleÚ exceptions)réz www.bar.comrêz 10.10.0.1z10.0.0.1z expected bypass of %s to be True)z abc.foo.barzbar.comz 127.0.0.2z 10.11.0.1Z notinbypassz!expected bypass of %s to be FalseTÚtestz 10.0.0.0/40z172.19.10.0/24z 172.19.10.5z10.0.1.5)rSr rW)rZbypassr°r%r%r&Útest_osx_proxy_bypass”s0þ ÿ ÿ þ ÿ ÿz"HandlerTests.test_osx_proxy_bypassc CsŽ|j||dltƒ}tƒ}tj |¡}d |¡d}td|ƒ}| |¡| |¡|  ||d|||dd¡Wdƒn1s€0YdS)N)rÿrNz réé‘rýú!http://acme.example.com/protected) rÉrrþr+rrÚjoinrårÞÚ_test_basic_auth)rrNrÿrßÚpassword_managerÚ auth_handlerr»Ú http_handlerr%r%r&Úcheck_basic_auth¶s     ýzHandlerTests.check_basic_authc Cs.d}d}d|›d}d|›d}d}d|›d}d|›dd|›dd|›d |›d |›|›d |›|›d |›|›d |›|›d |›fD]}d |›g}| ||¡qŽt d tf¡(d |›g}| ||¡Wdƒn1sè0Y||g||g||gfD] } dd„| Dƒ}| ||¡qdS)Nzrealm2@example.comz Basic realm="ú"zOtherscheme xxxzDigest realm="zn", qop="auth, auth-int", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"z Basic realm='ú'z", charset="UTF-8"z, úWWW-Authenticate: zBasic Auth Realm was unquotedzWWW-Authenticate: Basic realm=cSsg|]}d|›‘qS)rør%)r™Z challenger%r%r&r›ísÿz0HandlerTests.test_basic_auth..)rõrZcheck_warningsÚ UserWarning) rrÿZrealm2ÚbasicZbasic2Zother_no_realmÚdigestZ realm_strrNZ challengesr%r%r&Útest_basic_authÄs<           ó ÿ *ýÿzHandlerTests.test_basic_authc Csvtƒ}tj tdd¡}| |¡tƒ}tj |¡}d}tdd|ƒ}| |¡| |¡|  ||d|||dd¡dS)NrÌrÍú ACME Networksi—z(Proxy-Authenticate: Basic realm="%s" ræz&http://acme.example.com:3128/protected) rr+rrÒrÑrÞrþZProxyBasicAuthHandlerrårñ)rrßrÓròrórÿrôr%r%r&Útest_proxy_basic_authñs   ÿ   ýz"HandlerTests.test_proxy_basic_authc Cs¶Gdd„dtƒ}Gdd„dtjjƒ}Gdd„dtjjƒ}|ƒ}tƒ}||ƒ}||ƒ}d}tdd |ƒ} | |¡| |¡| | ¡| ||d || |d d ¡|  |j d d gd¡dS)Nc@seZdZdd„Zdd„ZdS)zQHandlerTests.test_basic_and_digest_auth_handlers..RecordingOpenerDirectorcSst |¡g|_dSr)rr”ÚrecordedrŒr%r%r&r” s zZHandlerTests.test_basic_and_digest_auth_handlers..RecordingOpenerDirector.__init__cSs|j |¡dSr)rÿrÑ)rr—r%r%r&ÚrecordszXHandlerTests.test_basic_and_digest_auth_handlers..RecordingOpenerDirector.recordN)rGrrHr”rr%r%r%r&ÚRecordingOpenerDirector src@seZdZdd„ZdS)zOHandlerTests.test_basic_and_digest_auth_handlers..TestDigestAuthHandlerc_s,|j d¡tjjj|g|¢Ri|¤ŽdS)Nrû)rÏrr+rÚHTTPDigestAuthHandlerÚhttp_error_401©rr„rÕr%r%r&rs   ÿÿz^HandlerTests.test_basic_and_digest_auth_handlers..TestDigestAuthHandler.http_error_401N©rGrrHrr%r%r%r&ÚTestDigestAuthHandlersrc@seZdZdd„ZdS)zNHandlerTests.test_basic_and_digest_auth_handlers..TestBasicAuthHandlerc_s,|j d¡tjjj|g|¢Ri|¤ŽdS)Nrú)rÏrr+rrrrr%r%r&rs   ÿÿz]HandlerTests.test_basic_and_digest_auth_handlers..TestBasicAuthHandler.http_error_401Nrr%r%r%r&ÚTestBasicAuthHandlersrrýrîú&WWW-Authenticate: Basic realm="%s" rýrïrûrúrÂ) rr+rrrrþrårÞrñrrÿ) rrrrrßròZdigest_handlerZ basic_handlerrÿrôr%r%r&Ú#test_basic_and_digest_auth_handlerss( ÿ    ýz0HandlerTests.test_basic_and_digest_auth_handlerscCsDtƒ}tj d¡}tddƒ}| |¡| |¡| t|jd¡dS)NrîzWWW-Authenticate: Kerberos r‡) rr+rrrårÞr-r.r‚)rrßZdigest_auth_handlerrôr%r%r&Ú$test_unsupported_auth_digest_handler4s ÿ  z1HandlerTests.test_unsupported_auth_digest_handlercCsDtƒ}tj d¡}tddƒ}| |¡| |¡| t|jd¡dS)NrîzWWW-Authenticate: NTLM r‡) rr+rrrårÞr-r.r‚)rrßZbasic_auth_handlerrôr%r%r&Ú#test_unsupported_auth_basic_handler>s ÿ  z0HandlerTests.test_unsupported_auth_basic_handlerc CsHddl} d\} } | ||| | ¡| ||j¡| ||j¡| | |j¡| | |j¡| |¡| |j|¡| |j |¡| t |j ƒd¡|  |j d  |¡¡td| | fdƒ} d|  | ¡ ¡ ¡} | |j d |¡| ¡| |j dj|| ¡d|_|_| ¡| |¡| t |j ƒd¡|  |j d  |¡¡dS)Nr©ZwileZcoyoterÂz%s:%sÚasciizBasic rÌ)Úbase64rprrÿrOrr_r‚rrrÃrèrWrTÚbytesZ encodebytesrµÚdecoderYrYræ)rrßróZ auth_headerrÿrôròÚ request_urlZ protected_urlrrr_ZuserpassZauth_hdr_valuer%r%r&rñHs6 ÿÿÿ  zHandlerTests._test_basic_authc Cs~d\}}d}tdƒ}tƒ}t|ƒ}|jd|||dd| |¡}| |¡tƒ}| |¡| |¡| |¡| |j ¡dS)Nr rïr¦T)Úis_authenticated) rúrrrprrSrrÞr‚rü) rrr_rrôÚ pwd_managerÚauth_prior_handlerÚis_authrßr%r%r&Útest_basic_prior_auth_auto_sendms ÿ     z,HandlerTests.test_basic_prior_auth_auto_sendc CsÐd\}}d}d}tƒ}t|ƒ}| ||||¡| |¡}| |¡tƒ}| |¡tdddƒ} | | ¡| |¡| |¡}|  |¡t dƒ} | | j ¡tƒ}| |¡| | ¡| |¡|  | j ¡dS)Nr rïZACMErîrr¦) rrrprrWrrÞrår‚rSrúrü) rrr_rrÿrrrrßrôr%r%r&Ú.test_basic_prior_auth_send_after_first_success‡s0   ÿ        z;HandlerTests.test_basic_prior_auth_send_after_first_successc CsdD]†\}}d |¡}t | ¡|¡}tj ¡}tdƒ}d|_|  ||¡}|  ¡Wdƒn1sj0Y|  |j j d |¡¡qdS)N))zConnection: closeódata)zTransfer-Encoding: chunkeds4 data 0 )zContent-Length: 4rzHTTP/1.1 200 OK {} ú http://dummy/zConnection not closed with {!r})Úformatrr½rr+rrõrrr÷r5rSÚfakesockÚclosed)rZtransferr€Úheaderr¹rr[Zrespr%r%r&Útest_http_closed¯s   & ÿzHandlerTests.test_http_closedcCspt d¡}tj ¡}tdƒ}d|_| tj j ¡|  ||¡Wdƒn1sR0Y|  |j jd¡dS)NrSrzConnection not closed)rr½r+rrõrrr-rÍríZ BadStatusLiner÷rSrr)rr¹rr[r%r%r&Útest_invalid_closedÀs  *z HandlerTests.test_invalid_closedN)/rGrrHr<rKr\rirkrurxryr~rrr†rˆr‹rr“r£r©r«r´r¶r¿rËrÔrÛrÝrárçr!Ú skipUnlessrnÚplatformrírõrürþr r r rñrrrrr%r%r%r&r$¹sR@\B J  #  !-2  %(r$c@sNeZdZdd„Zdd„Ze e d¡d¡dd„ƒZ d d „Z d d „Z d d„Z dS)Ú MiscTestscs"| t‡fdd„|jDƒƒ¡dS)Nc3s|]}|jˆkVqdSr)rÅ)r™r<©Ú handler_classr%r&Ú Îsÿz/MiscTests.opener_has_handler..)rSÚanyrá)rrßr$r%r#r&Úopener_has_handlerÍsÿzMiscTests.opener_has_handlercCs(Gdd„dtjjƒ}Gdd„dtjjƒ}Gdd„dtjjƒ}tjj}|||ƒ}| ||¡| ||¡|||ƒƒ}| ||¡| ||¡||ƒ}| ||¡|ƒ}| |tjj¡|tjjƒ}| |tjj¡|tj ¡ƒ}| |tjj¡Gdd„dtjjƒ}|||ƒ}| ||¡| ||¡dS) Nc@s eZdZdS)z2MiscTests.test_build_opener..MyHTTPHandlerNrÜr%r%r%r&Ú MyHTTPHandlerÒsr(c@seZdZdd„ZdS)z/MiscTests.test_build_opener..FooHandlercSsdSrr%rŒr%r%r&Úfoo_openÖsz8MiscTests.test_build_opener..FooHandler.foo_openN)rGrrHr)r%r%r%r&Ú FooHandlerÕsr*c@seZdZdd„ZdS)z/MiscTests.test_build_opener..BarHandlercSsdSrr%rŒr%r%r&Úbar_openÚsz8MiscTests.test_build_opener..BarHandler.bar_openN)rGrrHr+r%r%r%r&Ú BarHandlerÙsr,c@s eZdZdS)z7MiscTests.test_build_opener..MyOtherHTTPHandlerNrÜr%r%r%r&ÚMyOtherHTTPHandlerösr-)r+rrÇÚ BaseHandlerrÈr')rr(r*r,rÈr r-r%r%r&Útest_build_openerÑs,          zMiscTests.test_build_openerZnetworkztest requires network accesscCs¶t d¡˜tj ¡}tj d¡}| d|j¡| |d  d¡¡| d|j¡| d|  d¡¡| |d  d¡¡| d|j¡| d|  d¡¡Wdƒn1s¨0YdS) Nr®rmzus-asciió1r7Z 1234567890s 1234567890ru) rZtransient_internetr+rrÈrrr€r‚rrY)rrßrr%r%r&Útest_issue16464ýs   zMiscTests.test_issue16464cCs¨d}d}}}d}tj |||||¡}| t|dƒ¡| |jd¡| t|dƒ¡| |jd¡d|j|j f}| t |ƒ|¡d|j|j f}| t |ƒ|¡dS)Nzsomething bad happenedzContent-Length: 42rArNzHTTP Error %s: %sz) r+rržrSrÙrrArNr•r–rDrÊ)rr–rOr•r§rZrEZexpected_errmsgr%r%r&Útest_HTTPError_interface s z"MiscTests.test_HTTPError_interfacecCs:gd¢}|D]\}}| t|ƒ|¡q | ttd¡fdS)N)©rÖ)NNNrÖ©rÌ)NNNrÌr3r4)zjoe:password@proxy.example.com)Nr^r_rÖ)z#joe:password@proxy.example.com:3128)Nr^r_rÌ)zhttp://proxy.example.com/)rÍNNrÖ)zhttp://proxy.example.com:3128/)rÍNNrÌ)z&http://joe:password@proxy.example.com/©rÍr^r_rÖ)z*http://joe:password@proxy.example.com:3128)rÍr^r_rÌ)z1ftp://joe:password@proxy.example.com/rubbish:3128)r>r^r_rÖ)z%http://joe:password@proxy.example.comr5)z&http://user/name:password@localhost:22)rÍú user/namer_ú localhost:22)z&http://username:pass/word@localhost:22)rÍÚusernameú pass/wordr7)z'http://user/name:pass/word@localhost:22)rÍr6r9r7zfile:/ftp.example.com)rr r-r.)rZparse_proxy_test_casesZtcrr%r%r&Útest_parse_proxys' zMiscTests.test_parse_proxycCsPtƒ}| t¡}| d¡Wdƒn1s00Y| t|jƒd¡dS)NÚinvalidz5Unsupported digest authentication algorithm 'invalid')r r-r.Zget_algorithm_implsrrDÚ exception)rrÚexcr%r%r&Útest_unsupported_algorithmLs (þz$MiscTests.test_unsupported_algorithmN) rGrrHr'r/r!r rZis_resource_enabledr1r2r:r>r%r%r%r&r"Ës, ÿ -r"c@sŒeZdZGdd„deƒZdd„Zdd„Zdd„Zd d „Zd d „Z d d„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„ZdS) Ú RequestTestsc@seZdZdZdS)zRequestTests.PutRequestÚPUTN)rGrrHr·r%r%r%r&Ú PutRequestWsrAcCsLtdƒ|_tddddid|_tddd|_| d¡|_|jddd|_dS) Núhttp://www.python.org/~jeremy/r€zX-TestrìrMÚHEAD)r·rM)rr:ÚpostÚheadrAÚputÚ force_postrŒr%r%r&ÚsetUpZs þ ÿzRequestTests.setUpcCs^| d|j ¡¡| d|j ¡¡| d|j ¡¡| d|j ¡¡| d|j ¡¡dS)NrMrLrCr@)rrDr r:rErFrGrŒr%r%r&Ú test_methodds zRequestTests.test_methodcCsL| |jj¡| d|j ¡¡d|j_| |jj¡| d|j ¡¡dS)NrLrlrM)rWr:r€rr rSrŒr%r%r&Ú test_dataks zRequestTests.test_datacCsN| d|jj¡|j dd¡| d|jjd¡d|j_| d|jj¡dS)Nr7é*rl)rXr:rYrZrr€rŒr%r%r&Ú.test_setting_data_should_remove_content_lengthus z;RequestTests.test_setting_data_should_remove_content_lengthcCsT| d|jj¡d|j_|j dd¡| d|jjd¡|j`| d|jj¡dS)Nr7rgrz)rXr:rYr€rZrrŒr%r%r&Ú/test_deleting_data_should_remove_content_length}s zr‰rRrør%r%r&Útest_wrapped_urlŸszRequestTests.test_wrapped_urlcCsLtdƒ}| d|j¡tdƒ}| d|j¡d}t|ƒ}| | ¡|¡dS)Nú-http://www.python.org/?qs=query#fragment=truez /?qs=queryzhttp://www.python.org/#fun=truer(ú.http://docs.python.org/library/urllib2.html#OK)rrr¸rï)rr[rOr%r%r&Útest_url_fragment£szRequestTests.test_url_fragmentcCs0gd¢}|D]}t|ƒ}| | ¡|j¡q dS)N)zhttp://docs.python.orgrVrU)rrrïr‚)rrJrOr[r%r%r&Útest_url_fullurl_get_full_url®sz*RequestTests.test_url_fullurl_get_full_urlN)rGrrHrrArHrIrJrLrMrNrOrPrQrSrÔrTrWrXr%r%r%r&r?Vs   r?Ú__main__):r!rìrZ test.supportrrrr’r†r}rnrdrpZurllib.requestr+rrrrr r r Ú urllib.parser r Z http.clientrÍZTestCaser rIr~rˆrÑrŽr“r‘ršr ÚIOBaser¥rªr¾rãrärr.rårõròrúrþrr#r$r"r?rGÚmainr%r%r%r&Úsd   $ 4,    -6"    a