ÿØÿà 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 3gx@sddlmZddlmZddlmZddlmZddlmZddl m Z ddl m Z ddl mZmZmZdd lmZdd lmZdd lmZmZdd lmZdd lmZddlmZmZmZddlm Z ddl!m"Z"ddl#Z#ddl$Z$ddl%Z%ddl&Z&ddl'Z'ddlZGdddeZ(GdddeZ)ddZ*ddZ+e*dfddZ,ddZ-Gdd d eZ.Gd!d"d"eZ/Gd#d$d$eZ0Gd%d&d&eZ1Gd'd(d(e1Z2Gd)d*d*eZ3e4d+kre5dS),)mock)support) socket_helper)NoLogRequestHandler)TestCase)setup_testing_defaults)Headers) BaseHandlerBaseCGIHandler SimpleHandler)util) validator) WSGIServerWSGIRequestHandler) make_server)HTTPConnection)StringIOBytesIOBufferedReader) BaseServer)python_implementationNc@s eZdZdZddZddZdS) MockServerzNon-socket HTTP servercCst||||dSN)r__init__ server_bind)selfserver_addressZRequestHandlerClassr0/opt/python39/lib/python3.9/test/test_wsgiref.pyrszMockServer.__init__cCs"|j\}}||_||_|dSr)rZ server_nameZ server_port setup_environ)rhostportrrrr!s zMockServer.server_bindN)__name__ __module__ __qualname____doc__rrrrrrrsrc@s eZdZdZddZddZdS) MockHandlerzNon-socket HTTP handlercCs|j|_|j\|_|_dSr)request connectionZrfileZwfilerrrrsetup*szMockHandler.setupcCsdSrrr)rrrfinish.szMockHandler.finishN)r"r#r$r%r*r+rrrrr&(sr&cCs|dddgdgS)N200 OK Content-Typez text/plainDatezMon, 05 Jun 2006 18:49:54 GMT Hello, world!renvironZstart_responserrr hello_app2s r4cCs2|dddgd|d|d|dgdgS) Nr,r-r/;ZHTTP_X_TEST_HEADER QUERY_STRING PATH_INFO iso-8859-1)joinencoder2rrr header_app:s r;sGET / HTTP/1.0 cCshtdd|tt}tt|}t}tj}t}t_z|||fdW|t_n|t_0| | fS)NP) 127.0.0.1i") rrr&rrsysstderrrZfinish_requestgetvalue)appdataserverinpoutZolderrerrrrr run_amockEs  rHcCs|}d}|D]}|||ks"t|d7}qz ||WntyJYn 0td|z ttfWntytYn\0|}t||urt|D]}t||kstqz t|WntyYn 0td|dS)aUtility to compare a generic 2.1/2.2+ iterator with an iterable If running under Python 2.2+, this tests the iterator using iter()/next(), as well as __getitem__. 'make_it' must be a function returning a fresh iterator to be tested (since this may test the iterator twice).rzToo many items from __getitem__zToo many items from .__next__()N)AssertionError IndexErroriter StopIteration NameErrornext)make_itmatchitnitemrrrcompare_generic_iterSs.        rUc@sfeZdZdddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ dS)IntegrationTestsTcCsFtdtjd}||d|d|r0dp2ddddS) N/rz(HTTP/1.0 200 OK Server: WSGIServer/0.2 zA Content-Type: text/plain Date: Mon, 05 Jun 2006 18:49:54 GMT zContent-Length: 13 r<z Hello, world!r8)rr?versionsplit assertEqualr:)rrF has_lengthpyverrrr check_hellozs   zIntegrationTests.check_hellocCst\}}||dSr)rHr]rrFrGrrrtest_plain_hellos z!IntegrationTests.test_plain_hellocCs*d}tt|\}}||dddS)NsmGET /p%61th/?query=test HTTP/1.0 X-Test-Header: Python test X-Test-Header: Python test 2 Content-Length: 0 s+Python test,Python test 2;query=test;/path/)rHr;rZ splitlines)rr'rFrGrrr test_environs zIntegrationTests.test_environcCs2tddddd\}}||dddS)NsGET xis HTTP/1.0 rCrs!HTTP/1.0 414 Request-URI Too Long)rHrZrar^rrrtest_request_lengthsz$IntegrationTests.test_request_lengthcCs"ttt\}}|j|dddS)NF)r[)rHr r4r]r^rrrtest_validated_hellosz%IntegrationTests.test_validated_hellocCs@dd}tt|\}}||d||dddS)NcSs|dddgS)Nr,r-z Hello, world!rr2rrrbad_apps z>IntegrationTests.test_simple_validation_error..bad_app;A server error occurred. Please contact the administrator.z^AssertionError: Headers (('Content-Type', 'text/plain')) must be of type list: rHr assertTrueendswithrZrarrgrFrGrrrtest_simple_validation_errors z-IntegrationTests.test_simple_validation_errorc Csdd}gd}|D]h\}}|j|dDt||\}}||d||d|Wdq1sr0YqdS)Ncsfdd}|S)Ncs|dgdgS)Nr.ztext/plain; charset=utf-8r1rr2statusrrrgs zWIntegrationTests.test_status_validation_errors..create_bad_app..bad_appr)rqrgrrprcreate_bad_apps zFIntegrationTests.test_status_validation_errors..create_bad_app))Z200z4AssertionError: Status must be at least 4 characters)z20X OKz8AssertionError: Status message must begin w/3-digit code)Z200OKz;AssertionError: Status message must have a space after coderprhri)subTestrHrkrlrZra)rrrZtestsrqZ exc_messagerFrGrrrtest_status_validation_errorss z.IntegrationTests.test_status_validation_errorscCs@dd}tt|\}}||d||dddS)NcSs|d|ddgdgS)N wsgi.inputr,rodata)readesrrrrgs  z1IntegrationTests.test_wsgi_input..bad_apprhrirJrjrmrrrtest_wsgi_inputs z IntegrationTests.test_wsgi_inputcCsldd}tt|\}}||dtjdd}td}|d|}| d|d|dS) NcSs|dddgdgS)Nr,ror0zWed, 24 Dec 2008 13:29:32 GMTrvrrxrrrrBs z3IntegrationTests.test_bytes_validation..appz"GET / HTTP/1.0" 200 4 rascii/s(HTTP/1.0 200 OK Server: WSGIServer/0.2 sV Content-Type: text/plain; charset=utf-8 Date: Wed, 24 Dec 2008 13:29:32 GMT data) rHr rkrlr?rXrYr:rrZ)rrBrFrGverpyr\rrrtest_bytes_validations  z&IntegrationTests.test_bytes_validationcCs>dd}tt|dd\}}|dtjdddd g|dS) NcSs|dddg|ddgS)Nr,r-r|r7latin1r:rxrrrrBs z-IntegrationTests.test_cp1252_url..appsGET /%80 HTTP/1.0rdsHTTP/1.0 200 OKsContent-Type: text/plains#Date: Wed, 24 Dec 2008 13:29:32 GMTs/)rHr rZrANYra)rrBrFrGrrrtest_cp1252_urls  z IntegrationTests.test_cp1252_urlcsttddd}Gdddtt}ttjd||d|j t fdd }ttj |}|tjtj |dt fd d }t j|d }|||tjd dS)N pthread_killcSs|dgdtjgS)Nr,)r SOCK_MAX_SIZEr2rrrrBs z4IntegrationTests.test_interrupted_write..appc@s eZdZdS)z.WsgiHandlerNr"r#r$rrrr WsgiHandlersrr)Z handler_classcs dSr)set)signumframe) interruptedrrsignal_handlersz?IntegrationTests.test_interrupted_write..signal_handlercstj}|dd|F}|dtjjtddr*qJq*t |Wdn1sj0Y| dS)NGETrWdrI)timeout) rrr'Z getresponserwsignalSIGUSR1waitfloatlenclose)httpresponser main_threadrZreceivedrDrr run_clients     *z;IntegrationTests.test_interrupted_write..run_client)targetr)rZ get_attributerrrrrZHOSTZ addCleanupZ server_close threadingEventr get_identThreadstartZhandle_requestr9rZr)rrBrrZoriginalrZ backgroundrrrtest_interrupted_writes"    z'IntegrationTests.test_interrupted_writeN)T)r"r#r$r]r_rbrerfrnrtr{rrrrrrrrVxs   rVc@seZdZddZd$ddZddZdd Zd%d d Zej e d ddZ ddZ ddZ ddZddZddZddZddZddZd d!Zd"d#ZdS)& UtilityTestscCsJ||d}t||t||||d|||d||S)N SCRIPT_NAMEr7r7r)r rrZZshift_path_info)rZsn_inZpi_inpartZsn_outZpi_outenvrrr checkShift2s   zUtilityTests.checkShiftNcCs|i}t|t|tr*|||tn,t|trF|||tn||||||i}t|||||dSr)r r isinstancerZassertIsInstancerrZZassertIs)rkeyvaluealtrrrr checkDefault:s    zUtilityTests.checkDefaultcKst|||||dSr)r rrZ)rrrkwrrrcheckCrossDefaultJs zUtilityTests.checkCrossDefaultcKs t||t||dSr)r rrZZapplication_uri)rurirrrr checkAppURINs zUtilityTests.checkAppURIrIcKs"t||t|||dSr)r rrZZ request_uri)rrqueryrrrr checkReqURIRs zUtilityTests.checkReqURI)categorycCs^||fdd}t|||}||jj|D]}q0||jj|||jjdS)NcSstt||Sr)r FileWrapperr)textsizerrrrPYsz%UtilityTests.checkFW..make_it)rU assertFalseZfilelikeclosedrrk)rrrrQrPrRrTrrrcheckFWVs zUtilityTests.checkFWcCsPttdd}|td ||ddWdn1sB0YdS)NZfoobarzUse iterator protocol insteadrIfoo)r rrassertWarnsRegexDeprecationWarningrZ)rwrapperrrr$test_filewrapper_getitem_deprecationis z1UtilityTests.test_filewrapper_getitem_deprecationcCs^|ddddd|ddddd|ddddd|ddddd|dd ddddS) Nr<rWz/xx/az/x/yz/a/x/yz/x/rr)rrrtestSimpleShiftsps zUtilityTests.testSimpleShiftscCs|ddddd|ddddd|dddd d|dd dd d |dd dd d|dd dd d |ddddd|ddddd|ddddd|ddddd |ddddddS)Nz/a/bz/../yz..rrr<z//yyz/a/b/yz//y/rWz/./yz/./y/z///./..//y/.//z/y/z///z/a/b/z/.//z/x//rz/a/b/xz/.rr)rrrtestNormalizedShiftswsz!UtilityTests.testNormalizedShiftscCsFddddddddd d d d tfd tfdfD]\}}|||q,dS)N) SERVER_NAMEr>) SERVER_PORT80)SERVER_PROTOCOLHTTP/1.0) HTTP_HOSTr>)ZREQUEST_METHODr)rr<)r7rW) wsgi.versionrIr) wsgi.run_oncer)wsgi.multithreadr)wsgi.multiprocessrru wsgi.errors)wsgi.url_schemer)rrr)rrrrrr testDefaultss  zUtilityTests.testDefaultscCst|jdddd|jdddd|jdddd|jddd d|jdd d d|jd d d d|jd ddddS)Nrzfoo.barrrhttpsonHTTPS1yesrrrrZ443)rr)rrrtestCrossDefaultsszUtilityTests.testCrossDefaultscCsn|tid|tddid|tddid|tddid|tddiddS)Nrrrrrrr)rZr Z guess_schemer)rrrtestGuessSchemes zUtilityTests.testGuessSchemecCsv|d|jddd|jddd|jddd d |jd d d |jddd d|jddd|jdddddS)Nhttp://127.0.0.1/http://127.0.0.1/spam/spamrhttp://127.0.0.1/sp%E4m/spämzhttp://spam.example.com:2071/zspam.example.com:2071Z2071)rrzhttp://spam.example.com/zspam.example.comrr>)rrzhttps://127.0.0.1/rrzhttp://127.0.0.1:8000/Z8000)rr)rr)rrr testAppURIss  zUtilityTests.testAppURIscCs|d|jddd|jddd|jdddd |jd ddd |jd dd d |jd ddd |jddddd|jddddd|jdddddddS)Nrrrrrrzhttp://127.0.0.1/spammity/spamz /spammityrz http://127.0.0.1/spammity/sp%E4mz"http://127.0.0.1/spammity/spam;hamz /spam;hamz/http://127.0.0.1/spammity/spam;cookie=1234,5678z/spam;cookie=1234,5678z%http://127.0.0.1/spammity/spam?say=nizsay=ni)rr7r6z'http://127.0.0.1/spammity/spam?s%E4y=nizs%E4y=nir)rr)rrr testReqURIss0 zUtilityTests.testReqURIscCs|ddddgdS)NZxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxZxxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzZxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz)rr)rrrtestFileWrapperszUtilityTests.testFileWrappercCs|dD]2}||||fD]}|t|q$qdD]2}||||fD]}|t|q`qDdS)NzbConnection Keep-Alive Proxy-Authenticate Proxy-Authorization TE Trailers Transfer-Encoding Upgradez4Accept Cache-Control Date Pragma Trailer Via Warning)rYtitleupperlowerrkr Z is_hop_by_hopr)rZhoprrrr testHopByHops  zUtilityTests.testHopByHop)N)rI)r"r#r$rrrrrrZignore_warningsrrrrrrrrrrrrrrrrr0s"      rc@s$eZdZddZddZddZdS) HeaderTestscCsdg}|ttd|ttgd|tt|ddd|t|dddg|t|dddg|t|dd||t||t}|d=d|d<|j|j|j |j fD]<}| |d| |d| |d | |dq||ddd |d<||d d || dd g||dd d ||d d d || dd d || d d d ||dd ||d d dS) N)rrrrIrrrbarFooZFOObazZwheeZzoo)rZrrkeysvaluesitemsZ assertIsNot __contains__getget_all __getitem__rkr setdefault)rtesthmrrrtestMappingInterfaces4z HeaderTests.testMappingInterfacecCs|ttddS)Nr) assertRaises TypeErrorrr)rrrtestRequireListszHeaderTests.testRequireListcCst}|t|d|jdddd||dd|t|d|jdddd ||ddd g|t|d dS) Nz rrZspam)rzbar; baz="spam"zfoo: bar; baz="spam" r)Zcheesez bar; cheesez*foo: bar; baz="spam" Foo: bar; cheese )rrZstrZ add_headerrrrrrr testExtrass  zHeaderTests.testExtrasN)r"r#r$rrrrrrrrs rc@s&eZdZdZeejZddZ dS) ErrorHandlerz/Simple handler subclass for testing BaseHandlerc Ks*t|tj|ttt|ddddS)NT) multithread multiprocess)rr rrr)rrrrrrs zErrorHandler.__init__N) r"r#r$r%dictosr3r os_environrrrrrrsrc@seZdZdZddZdS) TestHandlerzASimple handler subclass for testing BaseHandler, w/error passthrucCsdSrrr)rrr handle_error#szTestHandler.handle_errorN)r"r#r$r%r rrrrr  sr c@sxeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZdS) HandlerTestsicCsdddddd}ttd|$tdd d }|Wdn1sH0Yd D]$}|t|d ||jd |qVi}t||D]\}}||vr|||<q| dd dd| | dddddt j d ||j|dS)Nz/my/homez/my/pathz fr_FR.UTF-8Ztest_script_nameZtest_server_name)HOMEPATHLANGrrr Yz/override/home)Xr)rXrrZrun_onceZ file_wrapperZwsgi_zwsgi.r<r>rFrT) rrrrrurrrrrrzwsgi.file_wrapper)rZ swap_attrr rrZgetattrr3rrupdate get_stdin get_stderrr rZassertDictEqual)rr handlerattrZexpectedrrrrr testEnviron+sB  &  zHandlerTests.testEnvironcCs2tdddi}|dD]}|||jqdS)N)rrur)r rassertInr3)rrrrrrtestCGIEnvironaszHandlerTests.testCGIEnvironcCsHtdd}|||jddt}|||jdddS)Nrrrrr)r rrZr3rrrr testSchemegszHandlerTests.testSchemecCs6t}dD]}|tt||q |t|jddS)N)Z_flushrrZ add_cgi_varsr)r rNotImplementedErrorr_write)rrnamerrrtestAbstractMethodsmsz HandlerTests.testAbstractMethodscCsdd}dd}dd}dd}t}||||jd d t}||||jd d t}||||jd t}||||jd dS)NcSs|dg|ddgSNr,rr8rrxrrr trivial_app1xs z4HandlerTests.testContentLength..trivial_app1cSs|dg|ddgSr"rrxrrr trivial_app2|sz4HandlerTests.testContentLength..trivial_app2cSs|dgddgS)Nr,uтестzutf-8rrxrrr trivial_app3s z4HandlerTests.testContentLength..trivial_app3cSs|ddggS)Nr,)zContent-LengthZ12345rrxrrr trivial_app4s z4HandlerTests.testContentLength..trivial_app4z)Status: 200 OK Content-Length: 4 httpr8zStatus: 200 OK https-Status: 200 OK Content-Length: 8 тестs)Status: 200 OK Content-Length: 12345 )r runrZstdoutrAr:)rr#r$r%r&rrrrtestContentLengthus8        zHandlerTests.testContentLengthcCsdd}dd}t}||||jdd||jdt}||||jd|jt|j fd|j | d |jdS) NcSs|dggSNr,rrxrrr non_error_apps z8HandlerTests.testBasicErrorOutput..non_error_appcSs tddS)N This should be caught by handlerrJrxrrr error_appsz4HandlerTests.testBasicErrorOutput..error_app%Status: 200 OK Content-Length: 0 r8r<z.error_appzStatus: 200 OK r8rJ)rr'rZr(rAr:rr@rr.rrr2rtestErrorAfterOutputs   z!HandlerTests.testErrorAfterOutputc Csdd}d}dd}dD]}|r*d|p,d}d D]}d D]}t|d }d |_||_||_|||||jt|d }d |_||_||_|||dkr||jdq:| t |||fd|j|||fd|jfq:q2qdS)NcSs|dggSr*rrxrrrr+s z5HandlerTests.testHeaderFormats..non_error_appzfHTTP/%s 200 OK\r\nDate: \w{3}, [ 0123]\d \w{3} \d{4} \d\d:\d\d:\d\d GMT\r\n%sContent-Length: 0\r\n\r\nr/r8)z FooBar/1.0Nz Server: %s r<)z1.0z1.1)HTTP/0.9rzHTTP/1.1)rFTr6r) r:r Z origin_serverZ http_versionZserver_softwarer'rZr(rArkrerQ) rr+ZstdpatZshortpatZsswswrXprotorrrrtestHeaderFormatss@    zHandlerTests.testHeaderFormatscCs.dd}t}|||d|jdS)NcSs|ddgdgS)Nr,rorvrrxrrrrBsz'HandlerTests.testBytesData..appsRStatus: 200 OK Content-Type: text/plain; charset=utf-8 Content-Length: 4 data)r r'rZr(rA)rrBrrrr testBytesDatas  zHandlerTests.testBytesDatacs>ddidfdd}t}|||dddS)N close_calledFr1cs(|dgGfdddt}|S)Nr,cs eZdZddZfddZdS)zHHandlerTests.testCloseOnError..error_app..CrashyIterablecssdVtdqdS)Nsblahr,r-r)rrr__iter__szQHandlerTests.testCloseOnError..error_app..CrashyIterable.__iter__cs dd<dS)NTr<rr) side_effectsrrrszNHandlerTests.testCloseOnError..error_app..CrashyIterable.closeN)r"r#r$r=rrr>rrCrashyIterablesr@)object)ryrzr@r3r?rrr.sz0HandlerTests.testCloseOnError..error_appT)rr'rZr4rrBrtestCloseOnError s   zHandlerTests.testCloseOnErrorcs~tGfddd}ddi}tt|tj|}d}|t||tWdn1sd0Y| ddS)Ncs eZdZfddZddZdS)z4HandlerTests.testPartialWrite..PartialWritercs|dd}|t|S)N)extendr)rbpartialZwrittenrrwrite!s  z:HandlerTests.testPartialWrite..PartialWriter.writecSsdSrrr)rrrflush&sz:HandlerTests.testPartialWrite..PartialWriter.flushN)r"r#r$rIrJrrHrr PartialWriter s rKrrzshould not do partial writesssHTTP/1.0 200 OK Content-Type: text/plain Date: Mon, 05 Jun 2006 18:49:54 GMT Content-Length: 13 Hello, world!) bytearrayr rr?r@rrr'r4rZ)rrKr3rmsgrrHrtestPartialWrites (zHandlerTests.testPartialWritec sddi}tttfD]r|jdRGfddd}t}tt|||}|t| | Wdq1sz0YqdS)Nrr exceptioncseZdZfddZdS)zEHandlerTests.testClientConnectionTerminations..AbortingWritercsdSrrrrFrOrrrI?szKHandlerTests.testClientConnectionTerminations..AbortingWriter.writeNr"r#r$rIrrOrrAbortingWriter>srS) ConnectionAbortedErrorBrokenPipeErrorConnectionResetErrorrsrr rr'r4rrA)rr3rSr@rrrOr testClientConnectionTerminations6s z-HandlerTests.testClientConnectionTerminationscsGdddtGfddd}t}ddi}tt|||}|t|d|||j ||j ||j ||j dS)Nc@s eZdZdS)zKHandlerTests.testDontResetInternalStateOnException..CustomExceptionNrrrrrCustomExceptionIsrXcseZdZfddZdS)zJHandlerTests.testDontResetInternalStateOnException..AbortingWritercsdSrrrQrXrrrIQszPHandlerTests.testDontResetInternalStateOnException..AbortingWriter.writeNrRrrYrrrSPsrSrr) ValueErrorrr rr'r4rrAZassertIsNotNoneresultZheadersrqr3)rrSr@r3rrrYr%testDontResetInternalStateOnExceptionHs    z2HandlerTests.testDontResetInternalStateOnExceptionN)r"r#r$ZmaxDiffrrrr!r)r0r5r:r;rCrNrWr\rrrrr's62 +r__main__)6ZunittestrrrZ test.supportrZtest.test_httpserversrrZ wsgiref.utilrZwsgiref.headersrZwsgiref.handlersr r r Zwsgirefr Zwsgiref.validater Zwsgiref.simple_serverrrrZ http.clientriorrr socketserverrplatformrr r7rr?rrr&r4r;rHrUrVrrrr rr"mainrrrrsN               %9+7=