a 5êdgeã@sHddlZddlZddlZddlZdZdZdZdZdgfdgfdgfdd gfd d gfd d gfdd gfddgfdddgfdddgfdgfdgfdgfddgfddgfddgfd dgfd!d"gfd#d$d%gfd&d'd(gfd)d*gfd+d,gfd-d.gfd/d0gfgZ difdifdifdddgifd dd gifd d dgifdd dgifdd d1gifdd2gd3gdœfdd d4d5gifdifdifdifdddgifdddgifdddgifd ddgifd!dd6gifd#d7gd8gd"œfd&dd9d:gifd)d;d1gifd+d dgifgZ Gd?d@„d@ej ƒZ GdAdB„dBej ƒZ GdCdD„dDej ƒZedEkrDe ¡dS)FéNúhttp://a/b/c/d;p?q#fúhttp://a/b/c/d;p?qúhttp://a/b/c/dÚú&z&&ú=)rrz=a)rÚar)rrza=z&a=b©rÚbz a=a+b&b=b+c©rúa b©r úb cza=1&a=2©rÚ1©rÚ2óó&s&&ó=)rrs=a)róar)rrsa=s&a=b©róbs a=a+b&b=b+c©róa b©rób csa=1&a=2©ró1©ró2ú;a=b)ú;ar ú a=a+b;b=b+c)rú a b;b=b có;a=b)ó;aró a=a+b;b=b+c)ró a b;b=b cr r rrrrrrrr r"r$r&r(c@steZdZdd„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„Zd9d:„Zd;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+dSdT„Z,dUdV„Z-dWdX„Z.dYdZ„Z/d[S)\ÚUrlParseTestCasecCs`tj |¡}| ||¡|j|j|j|j|j|j f}| ||¡tj  |¡}| ||¡| ||  ¡¡tj |  ¡¡}| |  ¡|  ¡¡| ||¡| |j|j¡| |j|j¡| |j|j¡| |j|j¡| |j|j¡| |j |j ¡| |j |j ¡| |j |j ¡| |j|j¡| |j|j¡tj |¡}| ||¡|j|j|j|j|j f}| ||¡tj |¡}| ||¡| ||  ¡¡tj |  ¡¡}| |  ¡|  ¡¡| ||¡| |j|j¡| |j|j¡| |j|j¡| |j|j¡| |j |j ¡| |j |j ¡| |j |j ¡| |j|j¡| |j|j¡dS©N)ÚurllibÚparseÚurlparseÚ assertEqualÚschemeÚnetlocÚpathÚparamsÚqueryÚfragmentÚ urlunparseÚgeturlÚusernameÚpasswordÚhostnameÚportÚurlsplitÚ urlunsplit)ÚselfÚurlÚparsedÚsplitÚresultÚtZresult2Zresult3©rCú./usr/local/lib/python3.9/test/test_urlparse.pyÚcheckRoundtripsIsV    ÿ       ÿ    z UrlParseTestCase.checkRoundtripscCsdtD]Z\}}tjj|dd}| ||d|¡dd„|Dƒ}tjj|dd}| ||d|¡qdS)NT©Úkeep_blank_valuesúError parsing %rcSsg|]}t|dƒr|‘qS)é©Úlen©Ú.0ÚvrCrCrDÚ €rz-UrlParseTestCase.test_qsl..F)Úparse_qsl_test_casesr+r,Ú parse_qslr.)r=ÚorigÚexpectrAÚexpect_without_blanksrCrCrDÚtest_qsl|s ÿzUrlParseTestCase.test_qslcshtD]^\}‰tjj|dd}| |ˆd|¡‡fdd„ˆDƒ}tjj|dd}| ||d|¡qdS)NTrFrHcs&i|]}tˆ|dƒr|ˆ|“qS)rrJrL©rSrCrDÚ ‰sÿz,UrlParseTestCase.test_qs..F)Úparse_qs_test_casesr+r,Úparse_qsr.)r=rRrArTrCrVrDÚtest_qs…s  ÿÿzUrlParseTestCase.test_qscsHgd¢}dd„‰‡fdd„|Dƒ}||D]\}}}| |||¡q*dS)N))zfile:///tmp/junk.txt)Úfilerú /tmp/junk.txtrrr)r[rr\rr)zimap://mail.python.org/mbox1)Úimapúmail.python.orgú/mbox1rrr)r]r^r_rr)z1mms://wms.sys.hinet.net/cts/Drama/09006251100.asf)Úmmsúwms.sys.hinet.netú/cts/Drama/09006251100.asfrrr)r`rarbrr)znfs://server/path/to/file.txt)ÚnfsÚserverú/path/to/file.txtrrr)rcrdrerr)z0svn+ssh://svn.zope.org/repos/main/ZConfig/trunk/)úsvn+sshú svn.zope.orgú/repos/main/ZConfig/trunk/rrr)rfrgrhrr)z)git+ssh://git@github.com/user/project.git)úgit+sshúgit@github.comú/user/project.gitrrr)rirjrkrrcSs8|d d¡tdd„|dDƒƒtdd„|dDƒƒfS)NrÚasciicss|]}| d¡VqdS©rlN©Úencode©rMÚxrCrCrDÚ ¬rzDUrlParseTestCase.test_roundtrips.._encode..rIcss|]}| d¡VqdSrmrnrprCrCrDrr­ré©roÚtuple©rBrCrCrDÚ_encodeªs þz1UrlParseTestCase.test_roundtrips.._encodecsg|] }ˆ|ƒ‘qSrCrCrp©rwrCrDrO®rz4UrlParseTestCase.test_roundtrips..©rE)r=Ú str_casesÚ bytes_casesr>r?r@rCrxrDÚtest_roundtripss z UrlParseTestCase.test_roundtripsc s”gd¢}dd„‰‡fdd„|Dƒ}d}d}||f}||f}||fD]L\}}|D]>} |D]4\} } } | | } | f| } | f| } | | | | ¡qVqNqBdS)N))z://www.python.org)úwww.python.orgrrrr)r}rrr)z://www.python.org#abc)r}rrrÚabc)r}rrr~)z://www.python.org?q=abc)r}rrúq=abcr)r}rrr)z://www.python.org/#abc)r}ú/rrr~)r}r€rr~)z://a/b/c/d;p?q#f)rz/b/c/dÚpÚqÚf)rz/b/c/d;pr‚rƒcSs8|d d¡tdd„|dDƒƒtdd„|dDƒƒfS)Nrrlcss|]}| d¡VqdSrmrnrprCrCrDrrÉrzIUrlParseTestCase.test_http_roundtrips.._encode..rIcss|]}| d¡VqdSrmrnrprCrCrDrrÊrrsrtrvrCrCrDrwÇs þz6UrlParseTestCase.test_http_roundtrips.._encodecsg|] }ˆ|ƒ‘qSrCrCrprxrCrDrOËrz9UrlParseTestCase.test_http_roundtrips..)ÚhttpÚhttps)óhttpóhttpsry) r=rzr{Z str_schemesZ bytes_schemesZ str_testsZ bytes_testsZschemesZ test_casesr/r>r?r@rCrxrDÚtest_http_roundtrips²s  z%UrlParseTestCase.test_http_roundtripsc CsR|||f}| tj ||¡|¡dd„|Dƒ}\}}}| tj ||¡|¡dS)NcSsg|]}| d¡‘qS©rlrnrprCrCrDrOÛsz.UrlParseTestCase.checkJoin..)r.r+r,Úurljoin) r=ÚbaseZrelurlÚexpectedZstr_componentsZbytes_componentsZbasebZrelurlbZ expectedbrCrCrDÚ checkJoinØs  ÿzUrlParseTestCase.checkJoincCs`gd¢}dd„|Dƒ}||D]<}| tj tj |¡¡|¡| tj tj |¡¡|¡qdS)N)ÚPythonz./Pythonúx-newscheme://foo.com/stuffzx://yzx:/yzx:/r€cSsg|]}| d¡‘qSr‰rnrprCrCrDrOárz7UrlParseTestCase.test_unparse_parse..)r.r+r,r<r;r5r-)r=rzr{ÚurCrCrDÚtest_unparse_parseßs  z#UrlParseTestCase.test_unparse_parsecCs¶| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| td d ¡| td d ¡| td d¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| td d¡| td!d"¡| td#d$¡| td%d$¡| td&d¡| td'd(¡| td)d*¡| td+d,¡| td-d.¡| td/d0¡| td1d"¡| td2d¡| td3d4¡| td5d6¡dS)7Núg:hÚgúhttp://a/b/c/gú./gúg/úhttp://a/b/c/g/ú/gú http://a/gú//gúhttp://gúg?yúhttp://a/b/c/g?yúg?y/./xúhttp://a/b/c/g?y/./xú#súhttp://a/b/c/d;p?q#súg#súhttp://a/b/c/g#súg#s/./xúhttp://a/b/c/g#s/./xúg?y#súhttp://a/b/c/g?y#súg;xúhttp://a/b/c/g;xúg;x?y#súhttp://a/b/c/g;x?y#sÚ.ú http://a/b/c/ú./ú..ú http://a/b/ú../ú../gú http://a/b/gú../..ú http://a/ú../../ú../../grrúg.úhttp://a/b/c/g.ú.gúhttp://a/b/c/.gúg..úhttp://a/b/c/g..ú..gúhttp://a/b/c/..gú./../gú./g/.úg/./húhttp://a/b/c/g/húg/../húhttp://a/b/c/h)rÚ RFC1808_BASE©r=rCrCrDÚ test_RFC1808æs>zUrlParseTestCase.test_RFC1808cCs| tj d¡d¡dS)Nzmailto:1337@example.org)Úmailtorz1337@example.orgrrr©r.r+r,r-rÇrCrCrDÚ test_RFC2368sÿzUrlParseTestCase.test_RFC2368cCsî| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| td d ¡| td d ¡| td d¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd ¡| td!d ¡| td"d¡| td#t¡| td$d%¡| td&d'¡| td(d)¡| td*d+¡| td,d¡| td-d¡| td.d/¡| td0d1¡| td2d3¡| td4d5¡| td6d7¡| td8d9¡| td:d;¡| tdNr’r“r”r•r–r—r˜r™ršr›rœrr r¡r¢r£r¦r§r¨r©rªr«r¬r­r®r¯r°r±r²r³r´rµr¶r·rr¸r¹rºr»r¼r½r¾r¿rÀrÁrÂrÃrÄrÅú g;x=1/./yúhttp://a/b/c/g;x=1/yú g;x=1/../yúhttp://a/b/c/yržrŸúg?y/../xúhttp://a/b/c/g?y/../xr¤r¥úg#s/../xúhttp://a/b/c/g#s/../x)rÚ RFC2396_BASErÇrCrCrDÚ test_RFC2396sFzUrlParseTestCase.test_RFC2396cCsˆ| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| td d ¡| td d ¡| td d¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| td d!¡| td"d!¡| td#d$¡| td%d&¡| td'd&¡| td(d ¡| td)d ¡| td)d ¡| td*d ¡| td+d ¡| td,d ¡| td-d.¡| td/d0¡| td1d2¡| td3d4¡| td5d$¡| td6d ¡| td7d8¡| td9d:¡| td;d<¡| td=d>¡| td?d@¡| tdAdB¡| tdCdD¡| tdEdF¡| tdGd¡| dHdd¡dS)INú?yzhttp://a/b/c/d;p?yz;xzhttp://a/b/c/;xr’r“r”r•r–r—r˜r™ršr›rœrr r¡r¢r£r¦r§r¨r©rªr«rrr¬r­r®r¯r°r±r²r³r´rµr¶r·z ../../../gz ../../../../gz/./gz/../gr¸r¹rºr»r¼r½r¾r¿rÀrÁrÂrÃrÄrÅrÌrÍrÎrÏržrŸrÐrÑr¤r¥rÒrÓúhttp:gzhttp://a/b/c/de)rÚ RFC3986_BASErÇrCrCrDÚ test_RFC3986Hs\zUrlParseTestCase.test_RFC3986cCsX| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd ¡| td d ¡| td d ¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd¡| tdd ¡| tdd¡| td d ¡| td!d"¡| td#d$¡| tdd¡| tdd¡| td%d¡| td&d¡| td'd¡| d(dd(¡| d)dd¡| d)d*d*¡| d+d,d-¡| d.d,d/¡| d0dd1¡| d2dd3¡| td4d5td6¡| d7d8d9¡| d:d8d;¡| d7dd?¡| dd8d=¡| d@dAdA¡dS)BNr’r×r”úhttp:rr“r•r–r—r˜r™ršr›rÖzhttp://a/b/c/d?yrœrržrŸr¬r­r®r¯r°r±r²r³r´rµr·rÀrÁrÂrÃrÄrÅzhttp:?yzhttp:g?yz http:g?y/./xzhttp:///rz http://a/./gzsvn://pathtorepo/dir1Zdir2zsvn://pathtorepo/dir2zsvn+ssh://pathtorepo/dir1zsvn+ssh://pathtorepo/dir2zws://a/bzws://a/gz wss://a/bz wss://a/gr€Úfooz/foozhttp://a/b/c/d/e/z ../../f/g/zhttp://a/b/c/f/g/zhttp://a/b/c/d/ezhttp://a/b/f/g/z /../../f/g/z http://a/f/g/z ../../f/gzhttp://a/b/c/f/grr )rÚ SIMPLE_BASErÇrCrCrDÚ test_urljoinssTzUrlParseTestCase.test_urljoinscs”gd¢}dd„‰‡fdd„|Dƒ}||D].\}}}tj |¡}| |j|jf||f¡q*gd¢}dd„|Dƒ}||D]}| ttjj|¡qxdS)N))z http://Test.python.org:5432/foo/útest.python.orgé8)zhttp://12.34.56.78:5432/foo/ú 12.34.56.78rß)zhttp://[::1]:5432/foo/ú::1rß)zhttp://[dead:beef::1]:5432/foo/ú dead:beef::1rß)zhttp://[dead:beef::]:5432/foo/ú dead:beef::rß)z:http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]:5432/foo/ú'dead:beef:cafe:5417:affe:8fa3:deaf:feedrß)z http://[::12.34.56.78]:5432/foo/ú ::12.34.56.78rß)z%http://[::ffff:12.34.56.78]:5432/foo/ú::ffff:12.34.56.78rß)zhttp://Test.python.org/foo/rÞN)zhttp://12.34.56.78/foo/ràN)zhttp://[::1]/foo/ráN)zhttp://[dead:beef::1]/foo/râN)zhttp://[dead:beef::]/foo/rãN)z5http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/räN)zhttp://[::12.34.56.78]/foo/råN)z http://[::ffff:12.34.56.78]/foo/ræN)zhttp://Test.python.org:/foo/rÞN)zhttp://12.34.56.78:/foo/ràN)zhttp://[::1]:/foo/ráN)zhttp://[dead:beef::1]:/foo/râN)zhttp://[dead:beef::]:/foo/rãN)z6http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]:/foo/räN)zhttp://[::12.34.56.78]:/foo/råN)z!http://[::ffff:12.34.56.78]:/foo/ræNcSs"|d d¡|d d¡|dfS)NrrlrIrsrnrvrCrCrDrwÙsz.UrlParseTestCase.test_RFC2732.._encodecsg|] }ˆ|ƒ‘qSrCrCrprxrCrDrOÛrz1UrlParseTestCase.test_RFC2732..)zhttp://::12.34.56.78]/zhttp://[::1/foo/zftp://[::1/foo/bad]/badzhttp://[::1/foo/bad]/badzhttp://[::ffff:12.34.56.78cSsg|]}| d¡‘qSr‰rnrprCrCrDrOær)r+r,r-r.r9r:Ú assertRaisesÚ ValueError)r=rzr{r>r9r:Z urlparsedZ invalid_urlrCrxrDÚ test_RFC2732¸s   zUrlParseTestCase.test_RFC2732c sžddddddddtd d ftd d fg }d d „‰‡fdd„|Dƒ}||D]R\}}}tj |¡}| | ¡|¡| |||f¡| |j|¡| |j|¡qFdS)N)zhttp://python.org#fragúhttp://python.orgÚfrag)rêrêr)zhttp://python.org/#fragúhttp://python.org/rë)rìrìr)zhttp://python.org/?q#fragúhttp://python.org/?qrë)rírír)zhttp://python.org/p#fragzhttp://python.org/prë)úhttp://python.org/p?qrîrrrƒrcSst|ƒdd„|DƒƒS)Ncss|]}| d¡VqdSrmrnrprCrCrDrrørzCUrlParseTestCase.test_urldefrag.._encode..)ÚtypervrCrCrDrw÷sz0UrlParseTestCase.test_urldefrag.._encodecsg|] }ˆ|ƒ‘qSrCrCrprxrCrDrOùrz3UrlParseTestCase.test_urldefrag..) rÆrÔr+r,Ú urldefragr.r6r>r4)r=rzr{r>ÚdefragrërArCrxrDÚtest_urldefragês&ö  zUrlParseTestCase.test_urldefragcCsTtj d¡}| |jd¡| |jd¡tj d¡}| |jd¡| |jd¡dS)Nz,http://[FE80::822a:a8ff:fe49:470c%tESt]:1234zfe80::822a:a8ff:fe49:470c%tEStz%[FE80::822a:a8ff:fe49:470c%tESt]:1234s,http://[FE80::822a:a8ff:fe49:470c%tESt]:1234sfe80::822a:a8ff:fe49:470c%tESts%[FE80::822a:a8ff:fe49:470c%tESt]:1234)r+r,r;r.r9r0)r=rrCrCrDÚtest_urlsplit_scoped_IPv6s   z*UrlParseTestCase.test_urlsplit_scoped_IPv6cCsd}tj |¡}| |jd¡| |jd¡| |jd¡| |jd¡| |jd¡| |j d¡| |j d¡| |j d¡| |j d¡| |  ¡dd…|dd…¡d }tj |¡}| |jd¡| |jd ¡| |jd¡| |jd ¡| |jd¡| |j d ¡| |j d ¡| |j d¡| |j d¡| |  ¡|¡d}tj |¡}| |jd¡| |jd¡| |jd¡| |jd ¡| |jd¡| |j d¡| |j d ¡| |j d¡| |j d¡| |  ¡|¡d}tj |¡}| |jd¡| |jd¡| |jd¡| |jd¡| |jd¡| |j d¡| |j d¡| |j d¡| |j d¡| |  ¡dd…|dd…¡d}tj |¡}| |jd¡| |jd¡| |jd¡| |jd¡| |jd¡| |j d¡| |j d¡| |j d¡| |j d¡| |  ¡|¡d}tj |¡}| |jd¡| |jd¡| |jd¡| |jd¡| |jd¡| |j d ¡| |j d¡| |j d¡| |j d¡| |  ¡|¡d!}tj |¡}| td"¡|j Wdƒn1s0YdS)#NzHTTP://WWW.PYTHON.ORG/doc/#fragr„zWWW.PYTHON.ORGz/doc/rrër}éz7http://User:Pass@www.python.org:080/doc/?query=yes#fragúUser:Pass@www.python.org:080z query=yesZUserZPasséPzChttp://User@example.com:Pass@www.python.org:080/doc/?query=yes#fragú(User@example.com:Pass@www.python.org:080zUser@example.comsHTTP://WWW.PYTHON.ORG/doc/#fragr†sWWW.PYTHON.ORGs/doc/rsfragówww.python.orgs7http://User:Pass@www.python.org:080/doc/?query=yes#fragsUser:Pass@www.python.org:080s query=yessUsersPasssChttp://User@example.com:Pass@www.python.org:080/doc/?query=yes#frags(User@example.com:Pass@www.python.org:080sUser@example.coms%HTTP://WWW.PYTHON.ORG:65536/doc/#fragz out of range)r+r,r;r.r/r0r1r3r4r7r8r9r:r6ÚassertRaisesRegexrè)r=r>rrCrCrDÚtest_urlsplit_attributes s˜         z)UrlParseTestCase.test_urlsplit_attributescCs†d}tj |¡}| |jd¡| |jd¡| |jd¡| |jd¡| |jd¡| |j d¡| |j d¡| |j d¡| |j d¡| |  ¡d¡d}tj |¡}| |jd ¡| |jd ¡| |jd ¡| |jd ¡| |jd ¡| |j d¡| |j d¡| |j d ¡| |j d¡| |  ¡d¡d}d}tdƒD]4}tjj||d}| |jd¡| |  ¡d¡qLdS)NzQhttp ://www.python .org /java script: alert('msg ')/?query = something#frag mentr„r}z/javascript:alert('msg')/zquery=somethingr4zGhttp://www.python.org/javascript:alert('msg')/?query=something#fragmentsQhttp ://www.python .org /java script: alert('msg ')/?query = something#frag mentr†røs/javascript:alert('msg')/squery=somethingófragmentsGhttp://www.python.org/javascript:alert('msg')/?query=something#fragmentzNhttp://www.python.org/java script: alert('msg ')/?query = something#frag mentzht tprs©r/)r+r,r;r.r/r0r1r3r4r7r8r9r:r6Úrange)r=r>rr/Ú_rCrCrDÚ!test_urlsplit_remove_unsafe_bytesgs<   z2UrlParseTestCase.test_urlsplit_remove_unsafe_bytesc CsÌdD]Â}tjjtjjfD]¬}dD]¢}|j|||d~d|}d|}|r^| d¡}| d¡}||ƒ}| |j|¡| t ¡|j Wdƒn1sš0YWdƒq 1s¸0Yq qqdS)z Check handling of invalid ports.)FT)rÛz1.5z-1Z0x10)Úbytesr,r:zwww.example.net:zhttp://rlN) r+r,r;r-ÚsubTestror.r0rçrèr:)r=rr,r:r0r>rrCrCrDÚtest_attributes_bad_portŒs   z)UrlParseTestCase.test_attributes_bad_portcCs”d}tj |¡}| |jd¡| |jd¡| |jd¡| |jd¡| |jd¡| |  ¡|¡tj  |¡}| |jd¡| |jd¡| |jd¡| |jd¡| |jd¡| |  ¡|¡d}tj |¡}| |jd¡| |jd¡| |jd¡| |jd¡| |jd¡| |  ¡|¡tj  |¡}| |jd¡| |jd¡| |jd¡| |jd¡| |jd¡| |  ¡|¡dS)Nz0sip:alice@atlanta.com;maddr=239.255.255.1;ttl=15rs0sip:alice@atlanta.com;maddr=239.255.255.1;ttl=15r) r+r,r;r.r0r7r8r9r:r6r-)r=ZurirrCrCrDÚtest_attributes_without_netlocœs<    z/UrlParseTestCase.test_attributes_without_netloccCs,| tj d¡d¡| tj d¡d¡dS)Nz http://example.com?blahblah=/foo)r„z example.comrrz blahblah=/foors http://example.com?blahblah=/foo)r†s example.comrrs blahblah=/foorrÊrÇrCrCrDÚ test_noslashÅs ÿÿzUrlParseTestCase.test_noslashcCs|| tj d¡d¡| tj d¡d¡| tj d¡d¡| tj d¡d¡| tj d ¡d ¡| tj d ¡d ¡dS) Nr1)rrr1rrrz//www.python.org:80)rúwww.python.org:80rrrrúhttp://www.python.org:80©r„rrrrrópath)rrrrrrs//www.python.org:80)rówww.python.org:80rrrróhttp://www.python.org:80©r†r rrrrrÊrÇrCrCrDÚtest_withoutschemeÌs$ÿÿÿÿÿÿz#UrlParseTestCase.test_withoutschemecCsô| tj d¡d¡| tj d¡d¡| tj d¡d¡| tj d¡d¡| tj d ¡d ¡| tj d ¡d ¡| tj d ¡d¡| tj d¡d¡| tj d¡d¡| tj d¡d¡| tj d¡d¡| tj d¡d¡dS)Nzhttp:80)r„rÚ80rrrzhttps:80)r…rr rrrzpath:80)r1rr rrrrÚ)r„rrrrrzhttps:)r…rrrrrrrshttp:80)r†ró80rrrshttps:80)r‡rrrrrspath:80)rrrrrrshttp:)r†rrrrrshttps:)r‡rrrrrr r rÊrÇrCrCrDÚtest_portseparatorßs ÿÿz#UrlParseTestCase.test_portseparatorcCs| ttjjd¡dS)NrÛ)rçÚ TypeErrorr+r,Ú urlencoderÇrCrCrDÚ test_usingsysñszUrlParseTestCase.test_usingsyscCs¤| tj d¡d¡| tj d¡d¡| tj d¡d¡| tj d¡d¡| tj d ¡d ¡| tj d ¡d ¡| tj d ¡d¡| tj d¡d¡dS)Nzs3://foo.com/stuff)Zs3úfoo.comú/stuffrrrr)ú x-newschemerrrrrz*x-newscheme://foo.com/stuff?query#fragment)rrrrr3r4z!x-newscheme://foo.com/stuff?query)rrrrr3rss3://foo.com/stuff)ss3ófoo.comó/stuffrrrsx-newscheme://foo.com/stuff)ó x-newschemerrrrrs*x-newscheme://foo.com/stuff?query#fragment)rrrróqueryrûs!x-newscheme://foo.com/stuff?query)rrrrrrrÊrÇrCrCrDÚtest_anyschemeõs0ÿÿÿÿÿÿÿÿzUrlParseTestCase.test_anyschemec CsîtjjtjjfD]Ø}|j|d¸|ddƒ}| |jd¡|ddƒ}| |jd¡| |ddƒjd¡| |ddd jd¡| |d dd jd¡| |dƒjd ¡| |d ƒjd ¡| |d d ƒjd ¡Wdƒq1sÞ0YqdS) N)Úfunctionzhttp://example.net/Úftpr„shttp://example.net/sftpr†r1rürrr)r+r,r-r;rr.r/)r=ÚfuncrArCrCrDÚtest_default_scheme s  z$UrlParseTestCase.test_default_schemec Csd}|D] \}}}tjjtjjfD]î}|dkr@|tjjur@d}|j||d²||dd}| |jd¡| t||ƒ  d|¡¡| ||ddƒjd¡||d d}| |j|¡|  t||ƒ  |¡¡| ||dd ƒj|¡| ||ƒj|¡Wdƒq$1s0Yq$qdS) N) )z http:#fragr1rë)z//example.net#fragr1rë)zindex.html#fragr1rë)z ;a=b#fragr2rë)z ?a=b#fragr3rë)z#fragr1rë)z abc#@fragr1ú@frag)z //abc#@fragr1r)z//abc:80#@fragr1r)z//abc#@frag:80r1z@frag:80r2r1)r>rF)Úallow_fragmentsrú#T) r+r,r-r;rr.r4Z assertTrueÚgetattrÚendswithZ assertFalse)r=Ztestsr>ÚattrZ expected_fragrrArCrCrDÚtest_parse_fragmentss*  ÿ ÿÿz%UrlParseTestCase.test_parse_fragmentscCsL| td¡tj dd¡Wdƒn1s00Y| td¡tj dd¡Wdƒn1sj0Y| td¡tj dd¡Wdƒn1s¤0Y| td¡tj dd¡Wdƒn1sÞ0Y| td¡tj d¡Wdƒn1s0Y| td¡tj d¡Wdƒn1sR0Y| td¡tj d¡Wdƒn1sŒ0Y| td¡tj d ¡Wdƒn1sÆ0Y| td¡tj d d ¡Wdƒn1s0Y| td¡tj d d ¡Wdƒn1s>0YdS) NzCannot mix strr}r†rør„)r†r}rrrr)r„rørrrr)r†r}rrr)r„rørrrrêshttp://python.org) rùrr+r,r-r;r5r<rŠrÇrCrCrDÚtest_mixed_types_rejected:s(,,,,,,,,.z*UrlParseTestCase.test_mixed_types_rejectedc Cs:t|jƒ}|j}| |j|¡d|}d|}||Ž}||Ž}d}d} | ||¡| | ¡|¡| | ¡|¡| | |¡|¡| | |¡|¡| | || ¡|¡| | || ¡|¡| ||¡| | ¡|¡| | ¡|¡| | |¡|¡| | |¡|¡| | || ¡|¡| | || ¡|¡dS)N)r)rrlÚstrict)rKÚ_fieldsÚ_encoded_counterpartZassertIsÚ_decoded_counterpartr.Údecodero) r=Zstr_typeZnum_argsZ bytes_typeZstr_argsZ bytes_argsZ str_resultZ bytes_resultÚencodingÚerrorsrCrCrDÚ_check_result_typeRs.   z#UrlParseTestCase._check_result_typecCs.tjjtjjtjjg}|D]}| |¡qdSr*)r+r,Ú DefragResultÚ SplitResultÚ ParseResultr.)r=Z result_typesZ result_typerCrCrDÚtest_result_pairsks ýz"UrlParseTestCase.test_result_pairscCs°tjjddd}| |ddgi¡tjjddd}| |ddgi¡tjjddd}| |dd gi¡tjjd dd}| |dd gi¡tjjd dd d }| |ddgi¡dS)Nõ key=Å%E9úlatin-1©r,ÚkeyõÅéõ key=Å%C3%A9úutf-8rlõÅ��õ key=Å%E9-õÅ�-Úignore©r,r-õÅ-)r+r,rYr.©r=rArCrCrDÚtest_parse_qs_encodingus ÿz'UrlParseTestCase.test_parse_qs_encodingcCsœtjjddd}| |dg¡tjjddd}| |dg¡tjjddd}| |dg¡tjjd dd}| |d g¡tjjd dd d }| |d g¡dS)Nr3r4r5)r6r7r8r9rl)r6r:r;)r6r<r=r>)r6r?)r+r,rQr.r@rCrCrDÚtest_parse_qsl_encoding‚s ÿz(UrlParseTestCase.test_parse_qsl_encodingcCsf| t¡,tjjd dgd¡ddWdƒn1s<0Ytjjd dgd¡dddS)Nrza=aé é )Úmax_num_fields)rçrèr+r,rYÚjoinrÇrCrCrDÚtest_parse_qsl_max_num_fieldss :z.UrlParseTestCase.test_parse_qsl_max_num_fieldsc Csüdifdifdddgifddgdgd œfd dd d gifd ifdifdddgifddgdgdœfddddgifg }|D]‚\}}| d|›d|›¡Ttjj|dd}| ||d|¡tjj|d d}| ||d|¡Wdƒqt1sì0YqtdS)Nú;ú;;r!rr r#r rr úa=1;a=2rró;ó;;r%rrr'rrróa=1;a=2rr ú Original: ú , Expected: ©Ú separatorrH)rr+r,rYr.)r=Zparse_qs_semicolon_casesrRrSrAÚ result_bytesrCrCrDÚtest_parse_qs_separator”s"  ö z(UrlParseTestCase.test_parse_qs_separatorc Csàdgfdgfddgfdddgfdd d gfd gfd gfd dgfdddgfdddgfg }|D]‚\}}| d|›d|›¡Ttjj|dd}| ||d|¡tjj|d d}| ||d|¡WdƒqX1sÐ0YqXdS)NrHrIr!r r#r r rJrrrKrLr%rr'rrrMrrrNrOrPrH)rr+r,rQr.)r=Zparse_qsl_semicolon_casesrRrSrArRrCrCrDÚtest_parse_qsl_separator©s"    ö z)UrlParseTestCase.test_parse_qsl_separatorcCsdtj ddgddœd¡}t| d¡ƒhd£ks2J‚Gdd „d ƒ}tj d |ƒid¡}| |d ¡dS) NrIrs)érôér Tr>zb=4zb=3za=1zb=5za=2c@seZdZdd„ZdS)z:UrlParseTestCase.test_urlencode_sequences..TrivialcSsdS)NZtrivialrCrÇrCrCrDÚ__str__ÆszBUrlParseTestCase.test_urlencode_sequences..Trivial.__str__N)Ú__name__Ú __module__Ú __qualname__rWrCrCrCrDÚTrivialÅsr[rz a=trivial)r+r,rÚsetr@r.)r=rAr[rCrCrDÚtest_urlencode_sequences¾s z)UrlParseTestCase.test_urlencode_sequencescCsjtj ddi¡}| |d¡tjjdditjjd}| |d¡tjjddidtjjd}| |d ¡dS) Nrz some valuez a=some+valuezsome value/another)Ú quote_viaza=some%20value%2Fanotherr€)Úsafer^za=some%20value/another)r+r,rr.Úquoter@rCrCrDÚtest_urlencode_quote_viaÌs  ÿ  ÿz)UrlParseTestCase.test_urlencode_quote_viacCsF| ttjjd¡tj d¡}| |d¡tj d¡}| |d¡dS)NrÛsarchaeological arcanazarchaeological%20arcanarr)rçrr+r,Úquote_from_bytesr.r@rCrCrDÚtest_quote_from_bytesÖs    z&UrlParseTestCase.test_quote_from_bytescCs4tj d¡}| |d¡tj d¡}| |d¡dS)Nz abc%20defsabc defrr)r+r,Úunquote_to_bytesr.r@rCrCrDÚtest_unquote_to_bytesÝs   z&UrlParseTestCase.test_unquote_to_bytescCs0|jttjjddd|jttjjddddS)Nsfoor9r5r')r-)rçrr+r,r`rÇrCrCrDÚtest_quote_errorsãsÿz"UrlParseTestCase.test_quote_errorscCs¤tj d¡}| |jd¡| |jd¡tj d¡}| |jd¡| |jd¡tj d¡}| |jd¡| |jd¡tj d¡}| |jd¡| |jd¡dS)Nztel:+31-641044153Útelz +31-641044153ztel:+31641044153z +31641044153)r+r,r;r.r/r1r-)r=Úp1Úp2rCrCrDÚtest_issue14072ès    z UrlParseTestCase.test_issue14072cCs„d}tj d¡}| t|¡|jWdƒn1s80Ytj d¡}| t|¡|jWdƒn1sv0YdS)Nz3Port could not be cast to integer value as 'oracle'z%http://Server=sde; Service=sde:oracle)r+r,r-rùrèr:r;)r=ÚmessagerhrirCrCrDÚ!test_port_casting_failure_message÷s $ z2UrlParseTestCase.test_port_casting_failure_messagecCsÜtj d¡}| |jd¡| |jd¡| |jd¡tj d¡}| |jd¡| |jd¡| |jd¡tj d¡}| |jd¡| |jd ¡| |jd ¡tj d ¡}| |jd¡| |jd ¡| |jd ¡dS)Nz"tel:123-4;phone-context=+1-650-516rgz123-4zphone-context=+1-650-516ztel:+1-201-555-0123z+1-201-555-0123rz"tel:7042;phone-context=example.comZ7042zphone-context=example.comz%tel:863-1234;phone-context=+1-914-555z863-1234zphone-context=+1-914-555)r+r,r-r.r/r1r2)r=rhrCrCrDÚtest_telurl_paramss     z#UrlParseTestCase.test_telurl_paramscCs$tj tjj¡}| dt|ƒ¡dS)NÚQuoter)r+r,rnÚ _ALWAYS_SAFEÚassertInÚrepr)r=ÚquoterrCrCrDÚtest_Quoter_reprsz!UrlParseTestCase.test_Quoter_reprcCsjg}hd£}ttjƒD]>}| d¡s||vr.qttj|ƒ}t|ddƒdkr| |¡q| tjj|¡dS)N>rnÚ splitpasswdÚunwrapÚ splitportÚ clear_cacheÚ splitnportÚ splituserÚ splittypeÚto_bytesÚ splitvalueÚ splithostÚ splitattrÚ splitqueryÚsplittagÚ ResultBaserþrYz urllib.parse)Údirr+r,Ú startswithr"ÚappendZassertCountEqualÚ__all__)r=rŒZ undocumentedÚnameÚobjectrCrCrDÚtest_alls  zUrlParseTestCase.test_allc s2d‰dd„ˆDƒ‰‡‡fdd„tttdtjƒƒDƒ}| d|¡| d|¡tj d ¡|  t ¡tj d ¡Wdƒn1s„0Yd D]š}d D]}|D]†}d   ||  |¡¡}|j |d  t |ƒ¡dF|  t ¡tj |¡Wdƒn1sþ0YWdƒq¢1s0Yq¢qšq’dS)Nz/:#?@cSsh|]}d t|ƒ¡’qS)ú{:04X})ÚformatÚord©rMÚcrCrCrDÚ /rz?UrlParseTestCase.test_urlsplit_normalization..cs.g|]&}ˆtt |¡ ¡ƒ@r|ˆvr|‘qSrC)r\Ú unicodedataÚ decompositionr@rŒ©Z hex_charsZ illegal_charsrCrDrO0sþz@UrlParseTestCase.test_urlsplit_normalization..é€uâ„€u#uhttp://プ:80uhttp://プ︓80)r„r…r)znetloc{}false.netloczn{}user@netlocz {}://{}/pathr‰)r>Úchar)ÚmapÚchrrýÚsysÚ maxunicoderpr+r,r;rçrèrŠrr‹)r=Z denorm_charsr/r0rr>rCr‘rDÚtest_urlsplit_normalization*s" ÿ    * z,UrlParseTestCase.test_urlsplit_normalizationN)0rXrYrZrErUrZr|rˆrr‘rÈrËrÕrÙrÝréròrórúrÿrrrr rrrrr%r&r.r2rArBrGrSrTr]rarcrerfrjrlrmrsrˆr˜rCrCrCrDr)GsZ3  #&0-972 ]%)!     r)c@speZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„ZdS)Ú Utility_Testsz=Testcase to test the various utility functions in the urllib.cCs\tjj}| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd¡| |d ƒd ¡dS) Nztype:opaquestring)rïÚ opaquestringrš)Nršú :opaquestring)Nr›ztype:)rïrztype:opaque:string)rïz opaque:string)r+r,Ú _splittyper.)r=rzrCrCrDÚtest_splittypeKs zUtility_Tests.test_splittypecCs¬tjj}| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd¡| |d ƒd ¡| |d ƒd ¡| |d ƒd¡| |dƒd¡| |dƒd¡| |dƒd¡dS)Nz%//www.example.org:80/foo/bar/baz.html)úwww.example.org:80ú/foo/bar/baz.htmlz//www.example.org:80)ržrrŸ)NrŸz//127.0.0.1#@host.com)ú 127.0.0.1ú /#@host.comz//127.0.0.1#@host.com:80)r z/#@host.com:80z//127.0.0.1:80#@host.com)z 127.0.0.1:80r¡z///file)rz/filez//example.net/file;)ú example.netz/file;z//example.net/file?)r¢z/file?z//example.net/file#)r¢z/file#)r+r,Ú _splithostr.)r=r}rCrCrDÚtest_splithostSs> ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿzUtility_Tests.test_splithostcCs\tjj}| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd¡| |d ƒd ¡dS) Nrõ)ú User:Passúwww.python.org:080z@www.python.org:080)rr¦r¦)Nr¦z User:Pass@)r¥rr÷)zUser@example.com:Passr¦)r+r,Ú _splituserr.)r=ryrCrCrDÚtest_splituserps  ÿ ÿ ÿ ÿ ÿzUtility_Tests.test_splitusercCsÜtjj}| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd¡| |d ƒd ¡| |d ƒd ¡| |d ƒd¡| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd¡dS)Nzuser:ab)ÚuserÚabzuser:a b)r©za bzuser:a b)r©za bzuser:a b)r©za bzuser:a b)r©za bzuser:a b)r©za bzuser:a:b)r©za:bzuser:a b)r©r z user 2:ab)zuser 2rªz user+1:a+b)zuser+1za+bzuser:)r©rr©)r©Nz:ab)rrª)r+r,Ú _splitpasswdr.)r=rtrCrCrDÚtest_splitpasswd}szUtility_Tests.test_splitpasswdcCsŒtjj}| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd ¡| |d ƒd ¡| |d ƒd ¡| |dƒd¡dS)Nú parrot:88)ÚparrotÚ88r®©r®Núparrot:r )r Nú parrot:cheese)r²Nz[::1]:88)ú[::1]r¯r³)r³Nz:88)rr¯)r+r,Ú _splitportr.)r=rvrCrCrDÚtest_splitportszUtility_Tests.test_splitportcCs¤tjj}| |dƒd¡| |dƒd¡| |ddƒd¡| |dƒd¡| |ddƒd¡| |dƒd ¡| |ddƒd ¡| |d ƒd ¡| |d dƒd ¡dS) Nr­)r®éXr®)r®éÿÿÿÿé7)r®r¸r±r )r r·)r r¸r²r°)r+r,Ú _splitnportr.)r=rxrCrCrDÚtest_splitnportšszUtility_Tests.test_splitnportcCsLtjj}| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd¡dS) Núhttp://python.org/fake?foo=bar)úhttp://python.org/fakeúfoo=barzhttp://python.org/fake?foo=bar?)r»rr¼)r¼Nz?foo=bar)rr½)r+r,Ú _splitqueryr.)r=rrCrCrDÚtest_splitquery¦s ÿ ÿ ÿzUtility_Tests.test_splitquerycCs\tjj}| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd¡| |d ƒd ¡dS) Núhttp://example.com?foo=bar#baz)úhttp://example.com?foo=barÚbazzhttp://example.com?foo=bar#)rÁrz#baz)rrÂrÁ)rÁNz"http://example.com?foo=bar#baz#boo)rÀZboo)r+r,Ú _splittagr.)r=r€rCrCrDÚ test_splittag²s ÿ ÿ ÿ ÿzUtility_Tests.test_splittagcCsftjj}| |dƒdddgf¡| |dƒddgf¡| |dƒdddgf¡| |dƒdgf¡dS)Nz/path;attr1=value1;attr2=value2z/pathz attr1=value1z attr2=value2z/path;rz;attr1=value1;attr2=value2)r+r,Ú _splitattrr.)r=r~rCrCrDÚtest_splitattr¾s  ÿ  ÿzUtility_Tests.test_splitattrcCs\tjj}| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd¡| |d ƒd ¡dS) Nr½)rÛÚbarzfoo=)rÛrz=bar)rrÇÚfoobar)rÈNz foo=bar=baz)rÛzbar=baz)r+r,Ú _splitvaluer.)r=r|rCrCrDÚtest_splitvalueÇs zUtility_Tests.test_splitvaluecCs.tj d¡}| |d¡| ttjjd¡dS)Nzhttp://www.python.orguhttp://www.python.org/mediæval)r+r,Ú _to_bytesr.rçÚ UnicodeErrorr@rCrCrDÚ test_to_bytesÑs    ÿzUtility_Tests.test_to_bytescCs&dD]}tj |¡}| |d¡qdS)N)zzzURL:scheme://host/pathúscheme://host/pathrÎ)r+r,rur.)r=Z wrapped_urlr>rCrCrDÚ test_unwrap×s zUtility_Tests.test_unwrapN)rXrYrZÚ__doc__rr¤r¨r¬rµrºr¿rÄrÆrÊrÍrÏrCrCrCrDr™Gs       r™c@sdeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dS)ÚDeprecationTestcCsL| t¡}tj d¡Wdƒn1s,0Y| t|jƒd¡dS)NrzUurllib.parse.splittype() is deprecated as of 3.8, use urllib.parse.urlparse() instead)Ú assertWarnsÚDeprecationWarningr+r,rzr.ÚstrÚwarning©r=ÚcmrCrCrDÚtest_splittype_deprecationàs  * ÿz*DeprecationTest.test_splittype_deprecationcCsL| t¡}tj d¡Wdƒn1s,0Y| t|jƒd¡dS)NrzUurllib.parse.splithost() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rÒrÓr+r,r}r.rÔrÕrÖrCrCrDÚtest_splithost_deprecationçs  * ÿz*DeprecationTest.test_splithost_deprecationcCsL| t¡}tj d¡Wdƒn1s,0Y| t|jƒd¡dS)NrzUurllib.parse.splituser() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rÒrÓr+r,ryr.rÔrÕrÖrCrCrDÚtest_splituser_deprecationîs  * ÿz*DeprecationTest.test_splituser_deprecationcCsL| t¡}tj d¡Wdƒn1s,0Y| t|jƒd¡dS)NrzWurllib.parse.splitpasswd() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rÒrÓr+r,rtr.rÔrÕrÖrCrCrDÚtest_splitpasswd_deprecationõs  * ÿz,DeprecationTest.test_splitpasswd_deprecationcCsL| t¡}tj d¡Wdƒn1s,0Y| t|jƒd¡dS)NrzUurllib.parse.splitport() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rÒrÓr+r,rvr.rÔrÕrÖrCrCrDÚtest_splitport_deprecationüs  * ÿz*DeprecationTest.test_splitport_deprecationcCsL| t¡}tj d¡Wdƒn1s,0Y| t|jƒd¡dS)NrzVurllib.parse.splitnport() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rÒrÓr+r,rxr.rÔrÕrÖrCrCrDÚtest_splitnport_deprecations  * ÿz+DeprecationTest.test_splitnport_deprecationcCsL| t¡}tj d¡Wdƒn1s,0Y| t|jƒd¡dS)NrzVurllib.parse.splitquery() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rÒrÓr+r,rr.rÔrÕrÖrCrCrDÚtest_splitquery_deprecation s  * ÿz+DeprecationTest.test_splitquery_deprecationcCsL| t¡}tj d¡Wdƒn1s,0Y| t|jƒd¡dS)NrzTurllib.parse.splittag() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rÒrÓr+r,r€r.rÔrÕrÖrCrCrDÚtest_splittag_deprecations  * ÿz)DeprecationTest.test_splittag_deprecationcCsL| t¡}tj d¡Wdƒn1s,0Y| t|jƒd¡dS)NrzUurllib.parse.splitattr() is deprecated as of 3.8, use urllib.parse.urlparse() instead)rÒrÓr+r,r~r.rÔrÕrÖrCrCrDÚtest_splitattr_deprecations  * ÿz*DeprecationTest.test_splitattr_deprecationcCsL| t¡}tj d¡Wdƒn1s,0Y| t|jƒd¡dS)NrzWurllib.parse.splitvalue() is deprecated as of 3.8, use urllib.parse.parse_qsl() instead)rÒrÓr+r,r|r.rÔrÕrÖrCrCrDÚtest_splitvalue_deprecations  * ÿz+DeprecationTest.test_splitvalue_deprecationcCsL| t¡}tj d¡Wdƒn1s,0Y| t|jƒd¡dS)Nrz/urllib.parse.to_bytes() is deprecated as of 3.8)rÒrÓr+r,r{r.rÔrÕrÖrCrCrDÚtest_to_bytes_deprecation&s  * ÿz)DeprecationTest.test_to_bytes_deprecationN)rXrYrZrØrÙrÚrÛrÜrÝrÞrßràrárârCrCrCrDrÑÞsrÑÚ__main__)r–rZunittestÚ urllib.parser+rÆrÔrØrÜrPrXZTestCaser)r™rÑrXÚmainrCrCrCrDÚsŽ    è              èO