ÿØÿà JFIF    ÿÛ „ !.%+&8&+/1555$;@;4?.451 4,$,44444444444414444444444444444444444444444444444444ÿÀ  á á" ÿÄ     ÿÄ ?    !1AQaq"2‘¡±ÁðBRbrÑá#‚’¢²3S CñÿÄ   ÿÄ !    !1QAa‘2ÿÚ   ? 5˜Z¯V¦cø)›t/? z¨±>Õ5€¶‹Á¤·¼z¼Ü¬+ñ®v¤¨_ˆR­BFn©—˜ý®ç̝P8gýt·ÉSTŦˆìät?þé¼íìN/Þa)ì–í6ô… Ï¿øÃj´¿KÇü]ÿ ªô¹-eKànëÕHTx}ýSÜ›ÿ ”7Ø×&µ<¦  ¥ÑO¶[Ù¯ä¨ÞÃÿ PZ-¬;#õ|•oaÿ ©CìÞz3˜öː/¤­ñTûIØ}š^ mÓ%ªxˆ¥ÉŸu=Z+ISe¿45™¼u;ú&WØ÷€æßQ™®{|íx*TC“#ZŠìZ§²‹ 6pv…³¿¡äª*áZÐ%ÒOáˆo"x«OHk w±æ+¬V(kMúŸ5Vö«$ ÁrÏbàb57/luR ¸ÑÛj Òµì`Мq­û žICÀÊ•©4€Âcà¨Ï€O´<èÐ:›ù(Ë^L8þ‘ÍÌ#¸Ð_Ì©ÙK(Öz 4¬û+¸;ü’V’84‘¬ÃŽ:[â‡ÔÌáõp¢~§ªlæ£ö{®G>J¼"°‡7¯ÆÉèßû ‹É‹§ÁòÃýâßî ^ƾÙõ‹×óH#«LP½ïX=xÑÍ$|W?•~• îëÔ©ª‹ {ÝT…Kÿ ”hûâá)J*ö˜–ÔU;iÇ€/ ÆþjóZ\ýwØ=Ìm ºèËL9 ýèÆð/¨’¥öo=nË.%Îì ŽÕ¯È|{Oj²ƒE6e/ßdÄõ²Ìâ1O®ò×TsəԸhOMýíMˆ¿¼H˜l²,7Â¥#MF/Úf°Ö½± ¸–dr‹NýÊ íjqx{œÉ ä-È ¦ øÄër¨q°ð †nцýÑÄÆ’mä…n<0È™;ÁÝá¯ÁZƒ7FÀmì­ É&9ˆîéi¶ùN§Y• ÃZãAâ?•‡©‰ , ó¾IŸŠc1 4â&y­&pŠ­6;M À 0¹qç»p.á …ŸÅáK@%6·y6ƒ‰3?”úºŽ‰éX5ªPT §µ!=Mž«Ú½‹ÅgÂSâÉaþÓoö–¯ÁÔìR>5éÿ üs¶ÆUcÌ kÇR ]ÿ ù¬¼«VŽ;Â|‡~¢¦”ÏŰæ {L™Õ°Óv¹ò¸írޡעCÃ!íVÕ {¶»sŒNPg/ "uÕbkm²“$ďå¿é¹§°½æz¯6 †s¿!s–wÚÝ“™Œ °.ûj>·+™Òa…©Œ&rÝÎtÛë긪Ît’LAVp%c Úý[ÄzJ¾ÇàXXç@˜ó<êL]·T˜¾¥1Ó©V‡g´æ½¦Ý@¹óø!_@´ÞâSÁ —S3™•& ]@JHÚý©ZŽ €×æÔr»Áf!‡yÞ4Mv*èÓã_{‘åóUuљØ«Oïé*®EvÑ Œ÷‡U \"㪒ÍK+À 4“M¡ï:0¥5í!'<@î´”>Ç»&Z–ïCCV˜Ì5Šo&îhè.žû |ÓK©h$s6KìŒëã)¹hI¦GïOåóI;ììü#É$Š0…Ææ¥TØ.5­¾gn´ “ÂÖ\:hœ89G)J@„}œ:’Ò{/Š"¦_Æ×7Æ3VÇŠÊa]ÚŒÙ€Ä–=®uÁßâACZƒ§§£ Qnâ:«,×{tyø¬iÛcœÜÄ€H½ÄÍCk´÷šß .W'b¤Íåh]÷€=,Žv×cÚEÚHXJX¶îo¨FÒtèöŸ>ªª6[J®Fµ£sGÁeqõfe\íjÒÐïÄÐGˆe1Ø‹.Ø”‘Ëuø Y­ˆÜ ŽG|zùªüMpDnQWÄ”%JŠ™)â*p@Örš«ÕT2Ð%ˆG#ª„ ·¤!°ŸOTÂT¸aÚ%4&h™LµšØüÐ.F¿²ÐÞ_Ç‚¾ÅÃaÜ÷09Æ q€öy˜v‡85õN÷]¬äѼóS{°_MެúÔ#°Ç¸0åÞè2ëôPcvÆw9®ií1Ä8F™˜à‰´+‰Ik1òÝ7“Ñ×ÒsÝ\x‚h`ÞÑ`ó"|µEcý£n˜h`}GÞ !±ù²Ápü²ß6 0ïi󜵩SÈÇ7˜-ÕURO˜¦´f$ªž-Í6(œ}<„ éc øs]ŽŽ„*—¾ ìdŽ„)méª\¿êÎIg¾ØÞ~I#C/¼¼´EÁÈŽi8“©õådô·>euä ƒ'Ê×लR1ÉJE1ÐAát`t;ÇР%Ý<‡¥„ÍÆ`×Oyó)õiI€ñQaŸ4Ûù\áàaÃÔ¹HÃu¹*k€¦<„e S‡&õÏ B!ŽhüÞ`yj}mªf×\¿ Ç~æ­9‡û\՞Ǖg²1Žû5V7 !àöšm° c`ܬøÇìµÒ'P"?…´Ö,"§^•õލsÔ)6˜sæéÍR¼ ò|Sl”‹7 nPW Gòú÷½§O¯‡„l¡kSÞŒr½PÊ@æ¢pŽ-mÿ #Ÿ˜Àº¶Áä¦;ïÔæ$1££`“Õ>„—·ž)ßð³ñ#Ï Ô$¶œ‰ÊE‹À;÷º ¯«P:Ñ”8–IÊtpÞ3ª“>ê“þës4ò2OÏÕ­±zô†Õ§‰.÷ä¸;¿˜“'œ›žª}«Œ{ª±Ì 9ÔóÞÕ‡0 $íWV3Üì¬ —@kÝ4@¿r¼±½¬™›?øØæ´'Áé®CË3-g$˜ö‡×auÚi´Žp/êÛ æF›Ú2v‹ã¿¿,nB1̨ƃqÞa5͝@&Æû“él÷ \C²½UÍc ¯k×¢U ÖéQå™—-r wô ÞÏ<Ò=&=ÿ Ôê Òêˈt,i—;LîÜ á¸*ÚÃ1$êL•LÍ <É)ýÐà’ ;F™{ƒ™˜€&'}‚ãÄK`¡ÞT@I;®žZóè‚s’7®°›+§O­Åq©é»²9<Ô J ¼9O’HL»Ùïì¸rk¼Ž_ý‘TŸu[²ßÚŒ·ü÷B%¯E ŸÔX5êO´ Ç•€’I0 ÉJX` ñ¹õ%;µŸD‘«´€àwÒ™U ûئžÖö\×®×´8 ½‡ºÐÆÓ§?Àkmœ=;d5*@-ì0F Rªýš[Ü6âö̃ڸr*KA9· u*µæ£?U¸Âêí†8@¦X4 e-ò„0s{ HâUpU?¼mñRa°®a%Ð'tÉ×’\¾ÊÉ]t›h>·(Ë@R¼¡Ãt h}’O÷au<+nT…Ö…MӐ??Óe95 q>í/;&JSû °¯ÊéÞ øƒ*Ã2½Ài&:nôUl=¾¿5eˆ3”ñc|Ú2V”>„»&eE;«ÚäC p¢Û úy 9š[ŒÌx¼擼A&DåÒ¯ˆ¤ÀÌ;"˜ ÏQä¸åhÊ}Ûq«Û0WžÒ|»€ø®öCm5•\ÇÀ§Pe3£]0ÃàLDÉ‰1øªxjgwT‚÷¿LΨK‹›ùs—xˆÜ±µ kæ¸f‰‰ÜGk/LÛØ6d9ò¶ùA{ƒA3š/¬D¬khÓk‰`˜"㯒r¿±Óã jx‡°e}<Ñø\3y:'À•/h½Í€Ç4~g ?Û(¼]v‘ªlKÎâ~?O‚W%{Ì:“'©úNq¾›úo(X’¥¯ˆ nFê{Ç€ü?º'ë ø‹ì Þ09ŒÌç9Æ —ËC`j@ÓÄ(+a‹un¸#ÂꟋ{K`‘ÑÍÍ'à´»/Û,KW;Þ4²þð ï Nm|~fGÏ(…³Ã)«1ö­Õ ¥‡¨©ƒÃ™ü-s=à=U66Ï«Ýc蓦W¹íž®›nÔ%êÇìŒ<#Ü×84ån®Ð ÒåOC` ñânÑs‡¢ç 1õ%Îhì½Ã½® e:ݼUZo™`  ÅZŸŒÊ«ê1ÏÄo$q¹Þ€©ˆhÐÉä¯ñ[!…Ú˜àJ:x2$Íß&PåT£6ç— ‡Í*4Ýšçjÿ ‰É nófÐ ó(L5C•åÆ\rMÒ@ò }y-W}™üýVù—ú¢=Ù”c®‘< M ž ´Phr ¦©TD ‘ù.$´÷O‡‘V2Æò.=IUŒ=ž‡â¬i™aþÓåÙ?òUø'ØÖ•.~* šTŒ!•-×áºTâ®ä#õü'´ eýlYÅÓeÕKÂrT"CÚ@u!Óxƒ{š3€}1¿(r}%«nËamjÑ%ÑNEò v ˜à  σöK³,*º.àzù¨™Ó ÚçâU¦*¿ 9{%Ö¹ njûdaXöb) kÛÆ±ûÓ\°M7ˆÂ=û›ç¿Ã‚­V»Cg–8ÙêE- j)k$º`Ã-ùEýeBÆÇ]c¡°ñty&Òd0nõ'¡W+ƒ*|–øµFa\GQªEAÔp5\Ǽ·¼Ç8·õ -â§Ú[ ‡ uZeÖ 3}×d'+¹:ð+K†Û®s!Ï$úe€<Û”x)1»a­¡LC]¸µík…ÚàA»AYº{†ªS[¦5HÒ7ù --,ísòDØ€èk ÞÀîÜ ò@â( ËNˆë›4ô½•/¦o‡€Û7 ê•ÆêòðÜy'Án½µ á˜ݦ ndeo…[ì¶Ê,¥R³Ä=À±—–ß;£™´ñSâ*g§”ïaið‘Jå~™ÓÞ ß³Õ¢»8x埒²52>AÊb&-÷\7´éÄù€T˜,w;3{ï˜k…à¹ÄqÀ«œ{€\ ˆ¾[´¨јr &Úé„Ívˆ±8†¿]|¬ņ4I×pÞS1ÈÖz‰#Ìv‡G!YNògñ:màTz¢Ý1ô©^O=~ë|5Bã™ç•¼µõ•bÆ@úÕS¬ÈŒ#¬zünrŸ û” Z²•èðV"ÁHÚý©wÝ €7¼Ìu1hÑa3Éä û f$o¿É ™Ú›ÝçnpÒ3äÌ3†Í§,Äï]$‰/pê †«À¼¸e9­Æê_C]žƒ·ý·frÁN«, E=›Çq -‰öŒ:aÏ¿±í&£Í:-} 84‘ÿ eƒQÑeëSsuiA ³g㟥ú£?ÿ ʼn*”“÷aühe:ÊWa@ÒÞk±eØ] F Ô—r.åä˜ @ö¥ªZoÐýYL·¥S²G/‡ñ <~*ZÆ´è>JlòàÛÆ½ÿ 窘ìGN¢:I®KšJp/`íIÁÀõ#Ä-€ö­šµŒoF4|ÆQØÆ@Ì|£Ô…¢À{9˜è½Üó›€ôYÒÎYsið;ís¤€à²ˆ‚4qÉVŒI$ ‰"° æµ8cXGjœˏ¡Aâý•ËÜ¢ûï e·çLx']á"oÅÎê3¯Ç—¹”ó0nå‚âg{Œñ> S´˜îè°g238‚ãköÝfÚd´6Ò€;ò÷±¢™¼›º ¢Æ'¥Ðx'e¬ç ]bÈÆV¢ó‹kýBO ðÊâ$Ÿ!×T 3Mýמ žìٍàÌü‘8÷€àæØ8æ©6‰©L´«…oãpð„~Çk‰!ñ;‹”ÛžÍ àž±z Ÿôû øŸÝužÏ;ÿ #|u6™Þ¬ÚˆÐõA4¶â|ôl|Ê2ŽÇ¤ÝÅÇY.<#Aí.k§hóF‚”Y; M½Ö4hŸ4&›­¿tès´%FìL¥£Ãk‰ÇT¤haÁ¤ÚxfÉ`ÑìË›>i 3t‚:,–+^÷´–{Û–Nxi"x‘Ûg î¨>¥Õ܁ùZH,2Û“:8xÊ¢Çí9.É-Ìâã-=çjwµS˜dütžçwýGòú®®ûº_ˆýx$–¡ãøO EÚÛÏ÷R„×w+3£Á£öUMyR²¹âŒ°š›¸Ñãò9§Ó_Dl+Ùßc›úšGÅÌc†Ž!Ko=¶.‘Îÿ c²(2®V mª.ÿ ¹B›¹å ù„öŸSV>™ü¯$y:G¢Z×àøúdî¹û­·ýÇ´:•c LÍõi_‹ö+ÎæGÊè>OŠ•äž´§Þ{X}¨1ÚTc›»Qþ•êô°t¿OP?eæ~É{5]•ÙR£r5†nZ\ã@ &îJõ ¾àC°þV>fé¥/ü5ñÊIº_é5 ;e­h<@ Ä&æÃëE%;X,ÒãÆÞ`Oò¦kŸm#˜!ÀyÄ¢| óLšò¥Ä` ¶R=|ÈCâh5ò3DˆïF†ðÒ#ÅìÛœ?¸yhBãœí ZxßÎÄhºRK„`Þödvײ™ÀÈÑÒgŒuY w³%†ƒÓzõ ÖÏp‚dH®¦A´ù§»ÓÇMæ~)ˆð‡û:ù&Ä •vGD´À n ݇¼Ö8Fö óáà£~Ë¥x`oK|Ä?fxiØü%pìR>éò+Û±éÎ>núlFŤ'tq8LZÏvÃ?„¡ß±È⽆¯³íü@x|PöUäèØã¡ð‚ŒAìÏ"vÍwóŸÍ{ ý0.z È•Ö{,N¡£¡ŸKÕÙž>Ýœþ ÍÀ°<×EA!Å‚D™IúOÍ¡>ôG}Â` ÍßkÜL™Ž Þð™ {IøF²¹òQ3&!ÃÂÞz.d&Ï-sH¸,Ôõ˜ŽP€ 77ˆÝ¼ÊëÜw =cÕ Ú,ØÐ5ÎYÐ)ì´öœgŒ[¤ßv㙑8心>h]§µháYš£²ºÑ.{Ï7Sð•?´~×SÃKýJÛ˜ ™Íäiúu<µX¶1õ^kâçIÑ£sZ4h>j*ÔšD:4­¿_ ÷¸ Õxæÿ ¸?Mù _•­ÊÐ ä ÷ý ÑwL œ­ïnTkÛUÍN©ë:¦fV ¶ÜÔÜMªÅâA½–¿R×TXš-%iTÊT•‡Ù‚JôϐZxWÑè‰f‰òG º ×Õû2aZ7OU3[“×AT–ÞŒ…-‘¤”Ì ì&(ˆ¿­•ƒkï’:ðY¦W‘ Å)“†‘˜³Åtcø˜ñTÂwÚÇ4|üLÇªí–v- qˆèU qPE.†â‘˜µ Æ,ÐÅs]8¾„oúÑ i>ÜxxÈó)ƒ ´æÁâØ$À‰vžŸf$Ž |ãw;ÀÁIJ»b` {¦Ó¤Ú$©YÀ‘n@Óïž«9J¼êG m¤ ܯ¹ÌW4€ÐÒÅÛ‡#褕Ÿn-?í|с¥÷Ú¹¬'´ÞÜ9ÓK `hê£SÄSà?7—Wí_´…óB›»:=Ãïq`<8ñÓŒÑlú2d¬ê³£hÖ[l|$vÝro~'R®‰§°ñmY ͧäP |PUª¹·:3Œ[Û{Xÿ ºâ@‚W–Äé u‚ ¯´*=íή.pûÒdt @G‰¬ s¸ ëÉücr ÞæÑ¨Ê@>¤¢Ö±. Þ'¯°ÌME[YéïĵÂCå½ Ué©Áû'Ê9%eÔðNU”ë‘ÌsD3/®+UI˜9h.WC”빓$#:pz:YÓ ¿xž* ³$Í +$kñAŠ‹†¢ Uê>¸)_š¬÷©ßAÂÔb9ÇU ¯¾á•9¯ÏÏ÷O÷¼¼Fähal1‰3Ì[Ïr•´UCksNÐ] R‘¸¥H+§Šé†c©vÖÞ0iÓ76s†î!§=ß ¼~Ô'°Ãmäoäš³ªøi1úÉ)³yV8 CLÄØÁ‘WYïi€H6ÖÑiámø^ÈY´°Ñ7¥Û*—Ñ©L«Qƒï—Ùrÿ ›£Ð*š¸ˆL©ˆ$ˆ ÷¾D§9È®«qbqC)–ˆïv´çñsÑVT­Ø, <àïºÀO«Jý·õ àfPìð .wFšir´þ’2_Y *Æ€x\« ì€9š@ Ž|F⇥ˆkZ@hÖÄ0t¿-<“‹qµ¾*ZL¤Ú)&BJpÓF5=$„at*Zš$’ÑtdûÝRI1 2މ$€$I$#‰SÞ’Hë¬ï;Á$¡t$’`<(ñÇt)$‡Ð.Êf¢X’Kt=Éé$‚ˆªè¢oÝëòI%Rgcª÷ŠyI%¡‰ÿ !ñ)´õ $¤ Ô’IIGÿÙa 3ge@srddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZz ddlZWneydZYn0ejeZejedZejedZGdddejjZGdd d ejZGd d d ZGd d d ejjZGdddejjZ Gddde j!Z"ej#dddGddde j!Z$ddZ%Gddde j!Z&ddZ'e(dkrne )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 9/opt/python39/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   rr5T)ZopensslcsTeZdZdZdZdZdZfddZddZd 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/ddZddZd0d d Zd1d d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.ZZS)2 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-39r\)rryrRequestrrrrr rZreqr r r test_sending_headers`sz TestUrlopen.test_sending_headerscCsv|}tjjd|jddid}tj|Wdn1sD0Y|d|j| d|jdS)Nrz X-SoMe-hEaderZfoobarrz X-Some-Header) rryrrrrZassertInrkeysZ assertNotInrr r r test_sending_headers_camelhsz&TestUrlopen.test_sending_headers_camelcCsn|}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_basicqszTestUrlopen.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_infoys& zTestUrlopen.test_infocCs\|}tjd|j}||}Wdn1s<0Y||d|jdS)Nr)rryrrrrr)r rrrr r r test_geturls &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 linesrrrindexr r r r test_line_iterations  zTestUrlopen.test_line_iterationcCs|dgdfdgdfg}tj}tjd|j}|d|j||d d|d|j|d| d||d d|d |j|d | ddS) Nrksanyr1zus-ascii1zContent-lengthZ 1234567890s 1234567890Z10) rryrrrrrrrr7Z get_header)r rrrr r r test_issue16464s zTestUrlopen.test_issue16464)N)N)N)rrrrrrrrrrrrrrrrrrrrrrrr rrrr r rr rs.       rcCs t}tjtjg|RdSr")rZthreading_setupunittestZaddModuleCleanupZthreading_cleanup) thread_infor r r setUpModulesr__main__)*rurr urllib.parseryZurllib.requestZ http.serverrrrr4testrZ test.supportrr ImportErrorr_dirname__file__hererrrrrrrrr&rerarwZTestCaserZrequires_hashdigestrrrrrmainr r r r s>      y,!( M+{