ÿØÿà 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_qopcCs ||_dSr")r*)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 r0,=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)sr1z%(method)s:%(uri)sHA1HA2z3%(HA1)s:%(nonce)s:%(nc)s:%(cnonce)s:%(qop)s:%(HA2)sresponse)updater2r3r5r6) r rCrHrIrJZ final_dictZHA1_strrKZHA2_strrLZ response_strrMr 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,r9 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-Authorizationusernamer8FN) lenr*headersrWrGgetr)removepath short_pathrOZcommand)r rrCrHZauth_validatedr]r r r r$s0      z DigestAuthHandler.handle_requestN) rrrrrr-r.r/r9rGrOrWr$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:%sr1cOs tjjj|g|Ri|dSr")rrBaseHTTPRequestHandlerr)r argskwargsr r r rszBasicAuthHandler.__init__cGsdSr"r r formatrdr r r log_messageszBasicAuthHandler.log_messagecCs"|d|dd|dS)N Content-typerQ)rRrSrTr r r r do_HEADs  zBasicAuthHandler.do_HEADcCs4|d|dd|j|dd|dS)NizWWW-AuthenticatezBasic realm="%s"rjrQ)rRrSREALMrTr r r r do_AUTHHEADs  zBasicAuthHandler.do_AUTHHEADcCsh|jdds$||jdn@|jddd|jkr\|d||jdn|dS)NZ AuthorizationsNo Auth header receivedzBasic risIt works)rZr[rmrUrV ENCODED_AUTHrRrTr r r r do_GETs zBasicAuthHandler.do_GETN)rrrrUSERPASSWDrlZ USER_PASSWDbase64Z b64encoder5decoderorrhrkrmrpr r r r r_s r_c@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_handlerrrrcr)r rvrdrer r r rszFakeProxyHandler.__init__cGsdSr"r rfr r r rhszFakeProxyHandler.log_messagecCsvtj|jd\}}}}}}||_|j|rr|dd|dd| |j t d|jd|j ddS) NrriZOKrPrQzYou've reached %s!
r1sFOur apologies, but our server is down due to a sudden zombie invasion.) urllibparseurlparser]r^rvr$rRrSrTrUrVbytes)r Zscmnetlocr]paramsqueryfragmentr r r rps   zFakeProxyHandler.do_GETN)rrrrrrhrpr r r r rusrucsPeZdZdZdZdZdZfddZddZfd d Z d d Z d dZ Z S)BasicAuthTestsr`raZ IncorrectrbcsTtt|dd}t||_||jd|jj|_|j |jj dS)Nc_st|i|Sr")r_rdrer 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)rwrHTTPBasicAuthHandler add_passwordrlrrqrrinstall_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")rwrrrrlrrqINCORRECT_PASSWDrr assertRaisesrrrrr r r test_basic_auth_httperror8s z(BasicAuthTests.test_basic_auth_httperror) rrrrqrrrrlrrrrr __classcell__r r rr rs   rr3T)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"osenvironclearrNZ old_environr r r restore_environJs z-ProxyAuthTests.setUp..restore_environrnNO_PROXYno_proxycstjg|Ri|Sr")rurvrr r r create_fake_proxy_handlerUsz7ProxyAuthTests.setUp..create_fake_proxy_handlerzhttp://127.0.0.1:%dr)rrrrrrcopyr&rvr.rqrrr/rlrrrrrrrrwrZ 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')rrrlURLrqrrrvr-rrwrrropenr r r r -test_proxy_with_bad_password_raises_httperrorfs   z.FakeHTTPRequestHandlerz TestHTTP/PcSs*|}|r&|j|}||d}qdSr") send_headrUrV)r bodydoner r r rps z8GetRequestHandler..FakeHTTPRequestHandler.do_GETcSs2|jd}|jt|}||j|dS)NzContent-Length)rZZrfilerintrprequestsr7)r Zcontent_lengthZ post_datar r r do_POSTs z9GetRequestHandler..FakeHTTPRequestHandler.do_POSTcs||j_|j|jd\}}}|||D]\}}|||d|jiq4|rp|dd| |S| dS)Nrrrjz text/plain) rZheaders_receivedrr7r]poprRrSrrT)r Z response_coderZrheaderrFFakeHTTPRequestHandler responsesr r rs   z;GetRequestHandler..FakeHTTPRequestHandler.send_headcWsdSr"r )r rdr r r rhsz=GetRequestHandler..FakeHTTPRequestHandler.log_messageN) rrrZserver_versionrrrrprrrhr rr r rsr)rrrc)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) rrrrrwr urlcleanuprrr)r rrr r rs  zTestUrlopen.setUpNcKsxg}tjj||fi|}zH||d||||d||W|n |0d |S)Nrii) rwrrextend readlinesr7readlinercloser)r urldatarelfr r r rszTestUrlopen.urlopencCs|jd|_dSr"rr r r r rs zTestUrlopen.stop_servercCsZ|durdgdfg}t|}t||_||j|j|jj|jj}||_|S)Nris 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_serverri we care a bitZ handler_class)hasattrrwrskipTestZtest.ssl_serversrrr)r rrerrrr r r start_https_servers    zTestUrlopen.start_https_servercCsVd}ddgdfdg|fg}||}|d|j}|||||jddgdS) NsWe got here...i.)ZLocationz(http://localhost:%(port)s/somewhere_elsernrihttp://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 ri)zTransfer-EncodingZchunkedr)rrrr)r rZ chunked_startrMrrr 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) rrrrwrrrrrrr)r rrrrr r r test_404s  zTestUrlopen.test_404cCsFd}|dg|fg}|d|j}|||||jdgdS)N pycon 2008...rihttp://localhost:%s/bizarre/bizarrerr rrrr r r test_200"s  zTestUrlopen.test_200cCsJd}|dg|fg}|d|jd}|||||jddgdS)Nrrirsget=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)Ncertfilernrrr) rrrcheck_warningsDeprecationWarningrrrrrwrrCERT_fakehostname)r rrcmr r r test_https_with_cafile7s    $  z"TestUrlopen.test_https_with_cafilec Cs|jtd}tdtfR|tjj$}|j d|j ddWdn1sT0YWdn1sr0YdS)NrrnrT)Z cadefault) rrrrrrrwrrrr)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-39rZ)rrwrRequestrrrrr 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) rrwrrrrZassertInrkeysZ 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)rrwrrrrrr)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) rrwrrrrZassertIsInstanceemailmessageZMessagerZget_content_subtype)r rrZinfo_objr r r test_infoys& zTestUrlopen.test_infocCs\|}tjd|j}||}Wdn1s<0Y||d|jdS)Nr)rrwrrrrr)r rrrr r r test_geturls &zTestUrlopen.test_geturlcCsBd}|dg|fg}tjd|j}|D]}|||q,dS)Nrrir)rrwrrrr)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  rrirzQFetched line number %s doesn't match expected: Expected length was %s, got %sr0) rrrwrrr enumeraterrY)r linesrrrindexrr 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) Nrisanyr1zus-ascii1zContent-lengthZ 1234567890s 1234567890Z10) rrwrrrrrrrr5Z get_header)r rrrr r r test_issue16464s zTestUrlopen.test_issue16464)N)N)N)rrrrrrrrrrrrrrrrrrrrrrrrr rrr r rr rs.       rcCs t}tjtjg|RdSr")rZthreading_setupunittestZaddModuleCleanupZthreading_cleanup) thread_infor r r setUpModulesr__main__)*rsrr urllib.parserwZurllib.requestZ http.serverrrrr2testrZ test.supportrr ImportErrorr]dirname__file__hererrrrrrrrr&rcr_ruZTestCaserZrequires_hashdigestrrrrrmainr r r r s>      y,!( M+{