ÿØÿà 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 3g8@s4ddlZddlmZmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl m Z e jZddlmZddlmZejeZejedZejedZejedZd Zd Zd Zd Zd edZdZ dZ!ej"Z"GdddZ#Gddde#Z$Gdddej%Z&Gdddej'Z(GdddeZ)GdddeZ*GdddeZ+GdddeZ,Gd d!d!eZ-Gd"d#d#e-Z.Gd$d%d%Z/Gd&d'd'eZ0Gd(d)d)eZ1Gd*d+d+eZ2Gd,d-d-eZ3Gd.d/d/eZ4Gd0d1d1eZ5Gd2d3d3eZ6Gd4d5d5eZ7e8d6kr0e j9d7d8dS)9N)client HTTPStatus)mock)support) socket_helperz keycert.pemz keycert2.pemzselfsigned_pythontestdotnet.pemz{HTTP/1.1 200 OK Transfer-Encoding: chunked a hello worl 3 d! 8 and now 22 for something completely different s7hello world! and now for something completely differentz;foo=barz0 0 zX-Dummy: foo X-Dumm2: bar c@sHeZdZejddfddZddZdddZdd Zd d Z d d Z dS) FakeSocketNcCsBt|tr|d}||_||_d|_d|_d|_||_||_ dS)NasciirF) isinstancestrencodetext fileclassdata sendall_calls file_closedhostport)selfrrrrr0/opt/python39/lib/python3.9/test/test_httplib.py__init__2s  zFakeSocket.__init__cCs |jd7_|j|7_dS)N)rrrrrrrsendall=szFakeSocket.sendallcCs6|dkr|dkrt||j|_|j|j_|jS)Nrrb)rZUnimplementedFileModerrfile file_closeclose)rmodebufsizerrrmakefileAs  zFakeSocket.makefilecCs d|_dS)NT)rrrrrr IszFakeSocket.file_closecCsdSNrr%rrrr!LszFakeSocket.closecCsdSr&r)rlevelZoptnamevaluerrr setsockoptOszFakeSocket.setsockopt)N) __name__ __module__ __qualname__ioBytesIOrrr$r r!r)rrrrr 1s   r c@s$eZdZddZddZddZdS) EPipeSocketcCst||||_dSr&)r r pipe_trigger)rrr0rrrrTs zEPipeSocket.__init__cCs(|j|vrttjd|j|7_dS)NZgotcha)r0OSErrorerrnoEPIPErrrrrrYs  zEPipeSocket.sendallcCsdSr&rr%rrrr!^szEPipeSocket.closeN)r*r+r,rrr!rrrrr/Rsr/c@s$eZdZdZdddZd ddZdS) NoEOFBytesIOzLike BytesIO, but raises AssertionError on EOF. This is used below to test that http.client doesn't try to read more from the underlying file than it should. cCs"tj||}|dkrtd|SNr zcaller tried to read past EOF)r-r.readAssertionError)rnrrrrr7gszNoEOFBytesIO.readNcCs"tj||}|dkrtd|Sr6)r-r.readliner8)rlengthrrrrr:mszNoEOFBytesIO.readline)r5)N)r*r+r,__doc__r7r:rrrrr4as r4cs4eZdZdZfddZfddZddZZS)FakeSocketHTTPConnectionz@HTTPConnection subclass using FakeSocket; counts connect() callscs$d|_td||_|j|_dS)Nr example.com) connectionssuperrfake_socket_argscreate_connection_create_connection)rargs __class__rrrvs z!FakeSocketHTTPConnection.__init__cs|jd7_tS)z.Count the number of times connect() is invokedr)r?r@connectr%rErrrG|sz FakeSocketHTTPConnection.connectcOs t|jSr&)r rArposkwrrrrBsz*FakeSocketHTTPConnection.create_connection)r*r+r,r<rrGrB __classcell__rrrErr=ss  r=c@sLeZdZddZddZddZddZd d Zd d Zd dZ ddZ dS) HeaderTestscCsGdddt}dD]n}dD]d}td}td|_||_d}i}|rXtt|||<|dd ||| |jj | d qqdS) Nc@seZdZddZddZdS)z;HeaderTests.test_auto_headers..HeaderCountingBuffercSs i|_dSr&)countr%rrrrszDHeaderTests.test_auto_headers..HeaderCountingBuffer.__init__cSsX|d}t|dkrH|dd}|j|d|j|d7<t||dS)N:rrr )splitlendecodelowerrM setdefaultlistappend)ritemkvZlcKeyrrrrUs   zBHeaderTests.test_auto_headers..HeaderCountingBuffer.appendNr*r+r,rrUrrrrHeaderCountingBuffersrY)TF)Content-lengthZHostzAccept-encodingr>Z blahblahblahZ spamspamspamPOST/r) rTrHTTPConnectionr sock_bufferr rPrequest assertEqualrMrR)rrYZexplicit_headerheaderconnbodyheadersrrrtest_auto_headerss   zHeaderTests.test_auto_headerscCsfGdddt}d}d}t||D]J\}}td}td|_||_||d|| |jj dd |q$d }|D]F}td}td|_||_||dd| |jj dd |qx|D]F}td}td|_||_||dd | |jj dd |qt ||D]H}td}td|_||_||dd | |jj d d |qdS)Nc@seZdZddZddZdS)z?HeaderTests.test_content_length_0..ContentLengthCheckercSst|d|_dSr&)rTrcontent_lengthr%rrrrs zHHeaderTests.test_content_length_0..ContentLengthChecker.__init__cSsF|dd}t|dkr6|ddkr6|d|_t||dS)NrNrrscontent-length)rOrPrRstriprgrTrU)rrVrWrrrrUs zFHeaderTests.test_content_length_0..ContentLengthChecker.appendNrXrrrrContentLengthCheckersri)N)PUTr[ZPATCHr>r\0z%Header Content-Length incorrect on {})GETCONNECTZDELETEHEADZOPTIONSZTRACEz.Header Content-Length set for empty body on {}rj 1) rT itertoolsproductrr]r r^r_r`rargformatchain)rriZbodiesZmethods_with_bodymethodrdrcZmethods_without_bodyrrrtest_content_length_0sP         z!HeaderTests.test_content_length_0cCstd}td|_|dd|dd|d|j|dd|d |j|d d |d |j|d d|d|j|ddd|d|j|dd|d|j|dd|d|j|dd|d|j|dd|d|j|d d!|d"|j|d#d$|d%|j|d&d$|d'|j|d(d$|d)|j|d*d$|d+|jdS),Nr>rmr\rZ*sContent-length: 42ZFooz bar s Foo: bar ZBarz baz s Bar: baz Z AuthorizationzBearer mytokensAuthorization: Bearer mytokenZ IterHeaderZIterAZIterBsIterHeader: IterA IterBZ LatinHeadersLatinHeader: Z Utf8HeadersÀsUtf8Header: Àz C1-Controls nextlinesC1-Control: nextlinezEmbedded-Fold-Spacez is alloweds!Embedded-Fold-Space: is allowedzEmbedded-Fold-Tabz is allowedsEmbedded-Fold-Tab: is allowedz Key Spacer(sKey Space: valuez KeySpace sKeySpace : valuesNonbreakSpacesNonbreakSpace: valuesNonbreakSpacesNonbreakSpace: value)rr]r r^ putrequest putheaderassertInr_rrcrrrtest_putheaders>                zHeaderTests.test_putheadercCsxd}td}td}||_|dd||j|d}td}td}||_|dd||j|dS)NsCGET /foo HTTP/1.1 Host: [2001::]:81 Accept-Encoding: identity z [2001::]:81rjrm/foosEGET /foo HTTP/1.1 Host: [2001:102A::] Accept-Encoding: identity z [2001:102A::])rr]r r^r` assertTruer startswithrexpectedrcr^rrrtest_ipv6host_headers    z HeaderTests.test_ipv6host_headercCsFd}t|}t|}|||dd||dddS)Nz4HTTP/1.1 200 OK First: val : nval Second: val ZFirstvalZSecond)r r HTTPResponsebeginra getheaderrrdr^resprrr!test_malformed_headers_coped_withs  z-HeaderTests.test_malformed_headers_coped_withcCs,dttdddttddd}t|}t|}|||dd ||jdd ||d d ||jd d d t t tdd}||d |||jd || |d| d|j|d|jdfD]0}||d| d|||dqdS)Ns0HTTP/1.1 200 OK !#$%&'*+-.^_`|~: value VCHAR: !s obs-text: sM obs-fold: text folded with space folded with tab Content-Length: 0 Content-Lengthrz!#$%&'*+-.^_`|~r(rjZVCHARzobs-textzobs-foldrz folded with spacezfolded with tab)bytesranger rrrrarmsgjoinmapchrZassertIsNotNoner|rrendswith)rrdr^rZvcharZfoldedrrrtest_parse_all_octets#s4     z!HeaderTests.test_parse_all_octetsc Cstd}td|_|ddd}|D]n\}}|||fH|td|||Wdn1sn0YWdq(1s0Yq(dS)Nr>rjrmr\))s Invalid Name ValidValue)s Invalid Namer)s Invalid Namer)s InvalidNamer)s InvalidNamer)s InvalidNamer)s InvalidNamer)s InvalidNamer)s Invalid:Namer)s :InvalidNamer) ValidNamesInvalid Value)rs Invalid Value)rs Invalid Value)rsInvalidValue )rs InvalidValue )rs InvalidValue zInvalid header) rr]r r^rzsubTestassertRaisesRegex ValueErrorr{)rrccasesnamer(rrrtest_invalid_headersAs    z HeaderTests.test_invalid_headerscCsd}t|}tj|dd}t}|Wdn1s@0Y|}||dd||dd||dd||d d dS) Ns9HTTP/1.1 200 OK First: val Second: val1 Second: val2 r)Z debuglevelrzreply: 'HTTP/1.1 200 OK\r\n'zheader: First: valzheader: Second: val1zheader: Second: val2) r rrrcaptured_stdoutrgetvalue splitlinesra)rrdr^routputlinesrrrtest_headers_debuglevel_s & z#HeaderTests.test_headers_debuglevelN) r*r+r,rfrwr~rrrrrrrrrrLsB" rLc@seZdZddZdS)HttpMethodTestsc Cs`d}|D]R}|td2td}td|_|j|ddWdq1sP0YqdS)N) zGET zPOST zPUT z POST Valuez POST HOST:abczGET rHost:abc zPOST Remainder: z GET HOST: z PUTz'method can't contain control charactersr>r\)rvurl)rrrr]r r^r`)rmethodsrvrcrrrtest_invalid_method_namesrs   z)HttpMethodTests.test_invalid_method_namesN)r*r+r,rrrrrrqsrc@sJeZdZdZddZddZddZdd Zdd d Zd dZ ddZ dS)TransferEncodingTestsIt's just a flesh woundcCsbtd}td|_|dd|j|dd||jj\}}}| |}| ||j dS)Nr>r r[r\T)encode_chunked) rr]r r^rzZ endheaders _make_body_parse_requestr_parse_chunkedra expected_body)rrc_rdrrrtest_endheaders_chunkeds    z,TransferEncodingTest.test_endheaders_chunkedcCsvtd}td|_|dd|ddi||jj\}}}|ddd | D| |dd| ||j td}td|_|dd|j d ddi||jj\}}}|dd d | D| |dd| ||j td}td|_|jdddd id |d||jj\}}}|ddd |D| |dd | | ||j dS)Nr>r r[r\Transfer-Encodingchunkedcontent-lengthcSsg|] }|qSrrR.0krrr r z>TransferEncodingTest.test_explicit_headers..latin-1cSsg|] }|qSrrrrrrrr z gzip, chunkedT)rerrdcSsg|] }|qSrrrrrrrr )rr]r r^r`rrr assertNotInkeysrarrQrrrcrrerdrrrtest_explicit_headerss<      z*TransferEncodingTest.test_explicit_headerscCsdD]}td}td|_|dd|j|d||jj\}}}||}| ||j | |dd| d d d |DqdS) N)FTr>r r[r\) empty_linesrrrcSsg|] }|qSrrrrrrrr z5TransferEncodingTest.test_request..) rr]r r^r`rrrrrarr)rrrcrrerdrrr test_requests   z!TransferEncodingTest.test_requestcCsltd}td|_|ddd||jj\}}}||dd|dd d |D||d dS) Nr>r r[r\rrrrcSsg|] }|qSrrrrrrrr z8TransferEncodingTest.test_empty_body..s0 ) rr]r r^r`rrrarrrrrtest_empty_bodys  z$TransferEncodingTest.test_empty_bodyFccsV|jd}t|D]<\}}|r.|dr.dV|t|dkrJ|dVq|VqdS)N rr r)rrO enumeraterP)rrridxlinerrrrs   zTransferEncodingTest._make_bodycCs|d}|d}i}d}|t|krrt||dkrr||d\}}|d}|d||<|d7}q||d||ddfS)N rrrNr)rOrPrQrhr)rrrr`rer9keyrrrrrs  z#TransferEncodingTest._parse_requestcCsg}i}d}|d}|||d\}}t|d}|dkrF|d7}qx||t||||d7}|t|krqxqd|S)Nrrrrr )rOintrarPrUr)rrrdtrailersr9rsizechunkrrrrs    z#TransferEncodingTest._parse_chunkedN)F) r*r+r,rrrrrrrrrrrrrs &  rc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!d?d@Z"dAdBZ#dCdDZ$dEdFZ%dGdHZ&dIdJZ'dKdLZ(dMdNZ)dOdPZ*dQdRZ+dSdTZ,dUdVZ-dWdXZ.dYdZZ/d[d\Z0d]d^Z1d_d`Z2daS)b BasicTestcCs"|hdtttdkdS)N> descriptionr(rphrase)rsetdirrr%rrr&test_dir_with_added_behavior_on_statussz0BasicTest.test_dir_with_added_behavior_on_statuscCsd}t|}t|}|||dd||||j||d| |||j| | |jd}t|}t|}| tj |jdS)NHTTP/1.1 200 Ok Textrr sTextzHTTP/1.1 400.100 Not Ok Text) r rrrrar7 assertFalseisclosedclosedrr! assertRaises BadStatusLinerrrrtest_status_lines s      zBasicTest.test_status_linescCstd}|t|ddS)NrjzBadStatusLine("''"))rrrarepr)rexcrrrtest_bad_status_repr!s zBasicTest.test_bad_status_reprcCsd}t|}t|}|||dd||||dd||||j | ||j dSNz*HTTP/1.1 200 Ok Content-Length: 4 TextrText r rrrrar7rrrrr!rrrrtest_partial_reads%s  zBasicTest.test_partial_readscCs~d}t|}t|}|||d||||d| |||j | | |j dS)Nz4HTTP/1.1 200 Ok Content-Length: 13 Text AnothersText sAnother) r rrrrar:rrr7rrr!rrrrtest_mixed_reads4s  zBasicTest.test_mixed_readscCsd}t|}t|}|td}||}||d|t|d|| ||}||d|t|d| | ||j | | |j dSr r rrr bytearrayreadintorarrrrrr!rrdr^rbr9rrrtest_partial_readintosCs       z BasicTest.test_partial_readintoscCsd}t|}t|}|||dd||||dd||dd||||j | ||j dS)Nrrrrrr rrrrr$test_partial_reads_no_content_lengthWs  z.BasicTest.test_partial_reads_no_content_lengthcCsd}t|}t|}|td}||}||d|t|d|| ||}||d|t|d||}||d| | dS)Nrrrrr) r rrrrrrarrrrrrrr(test_partial_readintos_no_content_lengthgs       z2BasicTest.test_partial_readintos_no_content_lengthcCstd}t|}t|}|||dd||||dd||dd||dS)N+HTTP/1.1 200 Ok Content-Length: 10 Textrrrrr ) r rrrrar7rrrrrrr"test_partial_reads_incomplete_bodyzs z,BasicTest.test_partial_reads_incomplete_bodycCsd}t|}t|}|td}||}||d|t|d|| ||}||d|t|d||}||d| | ||j | | |j dS)Nrrrrrrrrrr&test_partial_readintos_incomplete_bodys$        z0BasicTest.test_partial_readintos_incomplete_bodycCsVdD]}|tjtj|qdD]0\}}}t|}|||j|||jq dS)Nzwww.python.org:abczuser:password@www.python.org)z[fe80::207:e9ff:fe9b]:8000fe80::207:e9ff:fe9bi@)zwww.python.org:80www.python.orgP)www.python.org:rr)rrr)[fe80::207:e9ff:fe9b]rr)[fe80::207:e9ff:fe9b]:rr)rr InvalidURLr]rarrrZhphpcrrrtest_host_ports  zBasicTest.test_host_portcCs<d}d}t|}t|}||d}|||dS)NzHTTP/1.1 200 OK Set-Cookie: Customer="WILE_E_COYOTE"; Version="1"; Path="/acme" Set-Cookie: Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme" No body zrCustomer="WILE_E_COYOTE"; Version="1"; Path="/acme", Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"z Set-Cookie)r rrrrra)rrZhdrsrZcookiesrrrtest_response_headerss  zBasicTest.test_response_headerscCs6tdt}tj|dd}||r2|ddS)N*HTTP/1.1 200 OK Content-Length: 14432 rorv)Did not expect response from HEAD request)r r4rrrr7failrr^rrrrtest_read_headszBasicTest.test_read_headcCsTtdt}tj|dd}|td}||dkr@|d|t |ddS)Nrrorrr) r r4rrrrrrrar)rr^rrrrrtest_readinto_heads zBasicTest.test_readinto_headcCsRdddttjdDd}d|}t|}t|}|tjd|jdS)Nrcss|]}d|VqdS)z Header%d: fooNr)rirrr sz2BasicTest.test_too_many_headers..rzHTTP/1.1 200 OK zgot more than \d+ headers) rrrZ _MAXHEADERSr rr HTTPExceptionr)rrerrrrrrtest_too_many_headerss   zBasicTest.test_too_many_headersc Csd}ttd`}td}t|}||_|dd|||j |d|jdt ||fWdn1st0YdS)Ns_GET /foo HTTP/1.1 Host: example.com Accept-Encoding: identity Transfer-Encoding: chunked rr>rmrz%r != %r) open__file__rr]r r^r`rrrrPrrrdrcr^rrrtest_send_files  zBasicTest.test_send_filecCsd}td}td}||_|||||jd|_|td||||jd|_|t ||||jdS)Ns"this is a test this is only a testr>r r) rr]r r^sendrararrayr-r.rrrr test_sends  zBasicTest.test_sendcsXddGfdddtj}d}td}td}||_||||j|dS)NcssdVdVdVdS)NrZdata_tworrrrrrsz/BasicTest.test_send_updating_file..datacs eZdZdZZdddZdS)z7BasicTest.test_send_updating_file..UpdatingFilerr5cSs t|jSr&)nextd)r blocksizerrrr7 sz.UpdatingFile.readN)r5)r*r+r,r"rr7rrrr UpdatingFilesrsdatar>rj) r- TextIOBaserr]r r^rrar)rrrrcr^rrrtest_send_updating_files  z!BasicTest.test_send_updating_filecCsLd}dd}td}td}||_|dd|dd i||j|dS) NsbGET /foo HTTP/1.1 Host: example.com Accept-Encoding: identity Content-Length: 11 onetwothreecssdVdVdVdS)Nsonestwosthreerrrrrrdsz&BasicTest.test_send_iter..bodyr>rjrmrrZ11)rr]r r^r`rarrrrrtest_send_iters zBasicTest.test_send_itercCsvd}tjd|d}td}||_d|d}|ddt|d d i||jd |j d d d }|||dS)z8Check that request() respects the configured block size.r>rNabrkr\r9r r) rr]r r^r`r-r.rarrrO)rrrcr^rrdrrrtest_blocksize_request&s z BasicTest.test_blocksize_requestcCs\d}tjd|d}td}||_d|d}|t|||jd||j |dS)z5Check that send() respects the configured block size.rr>rNr r!r) rr]r r^rr-r.rarr)rrrcr^rrrrtest_blocksize_send2s zBasicTest.test_blocksize_sendcCsPtd}td|_|t|dd|Wdn1sB0YdS)Nr>rjr[test)rr]r r^r TypeErrorr`r}rrrtest_send_type_error=s   zBasicTest.test_send_type_errorc Csft}tttt}tj|dd}||| || t ddD]V}tttt}tj|dd}||| || || || qLdD]}tt|}tj|dd}|zz | Wnbtj y>}zF||j |dt|}|t|||t||WYd}~nd}~00|dW| q| 0qdS)Nrmrr rjzfoo IncompleteRead(%d bytes read)IncompleteRead expected)chunked_expectedr chunked_start last_chunk chunked_endrrrrar7r!rIncompleteReadpartialrPrr r)rrr^rr9xr expected_messagerrr test_chunkedDs2$    & zBasicTest.test_chunkedc Cst}t|}td}tttt}tj|dd}| | |}| |d||| ||| t ddD]}tttt}tj|dd}| t|}| |d|}|| ||||7}|| ||d7}| |d||| ||| qvdD]} tt| }tj|dd}| zz| |}Wnbtjy}zF| |j|dt|} | t|| | t|| WYd}~nd}~00|d W| n | 0qdS) Nrrmrrr)rr*r+r,)r-rPrr r.r/r0rrrrrar!r memoryviewr1r2rr r) rrZ nexpectedrr^rr9mr r3r4rrrtest_readinto_chunkeddsD      & zBasicTest.test_readinto_chunkedcCsd}t|tt}tj|dd}|||d||jd||j d| | | |j || |j dS)NEHTTP/1.1 200 OK Transfer-Encoding: chunked a hello world 1 d rorr OK)r r/r0rrrrar7statusreasonrrrrr!)rr.r^rrrrtest_chunked_heads zBasicTest.test_chunked_headcCsd}t|tt}tj|dd}|td}||}||d|t |d||j d||j d| | ||j|| |jdS) Nr9rorrrr r:r;)r r/r0rrrrrrarr<r=rrrrr!)rr.r^rrr9rrrtest_readinto_chunked_heads   z$BasicTest.test_readinto_chunked_headcCs@td}tj|dd}|||d||dS)Nz.HTTP/1.1 200 OK Content-Length: -1 Hello rmrHello )r rrrrar7rrrrrrtest_negative_content_lengthsz&BasicTest.test_negative_content_lengthc Cstd}tj|dd}|z |Wnbtjy}zH||jd|t|d|t |d| | WYd}~nd}~00| ddS)Nz.HTTP/1.1 200 OK Content-Length: 10 Hello rmrr@z-IncompleteRead(7 bytes read, 3 more expected)r,) r rrrr7r1rar2rr rrr)rr^rr rrrtest_incomplete_reads   $zBasicTest.test_incomplete_readcsZtdd}td|_|tfdd}|d|j|d| ddS) NzgHTTP/1.0 401 Authorization Required Content-type: text/html WWW-Authenticate: Basic realm="example" sContent-Lengthr>csdddS)Nrk/urlrd)r`rrcrrr z&BasicTest.test_epipe..izBasic realm="example"zwww-authenticate) r/rr]r^rr1 getresponserar<rrrrDr test_epipes  zBasicTest.test_epipecCs8dddd}tt|}|tjtjf|jdS)NHTTP/1.1 200 Okrr)rrr r LineTooLongrrrrdrrrrtest_overflowing_status_linesz&BasicTest.test_overflowing_status_linecCs2dddd}tt|}|tj|jdS)NzHTTP/1.1 200 OK X-Foo: barrrIz )rrr rrJrrKrrrtest_overflowing_header_linesz&BasicTest.test_overflowing_header_linecCsrdd}tt|}|tj}|Wdn1s@0Y|dt|j|dt|jdS)NzHTTP/1.1 100 OK r izgot more than re) rrr rr rr|r exception)rrdrcmrrr'test_overflowing_header_limit_after_100s&z1BasicTest.test_overflowing_header_limit_after_100cCs:dddd}tt|}||tj|jdS)Nz/HTTP/1.1 200 OK Transfer-Encoding: chunked rrIza hello world 0 )rrr rrrJr7rKrrrtest_overflowing_chunked_linesz'BasicTest.test_overflowing_chunked_linecCs`d}t|}t|}|||d||||j | ||j dS)NrHr ) r rrrrar7rrrrr!rrrrtest_early_eof s  zBasicTest.test_early_eofcsntd}dGfdddtj}||_td|_|dd|tj|j | j | |jj dS)Nr>cseZdZfddZdS)z+BasicTest.test_error_leak..Responsecs"|tjj|g|Ri|dSr&)rrrrHresponserrrsz4BasicTest.test_error_leak..Response.__init__N)r*r+r,rrrSrrResponsesrUzInvalid status linermr\) rr]rZresponse_classr r^r`rrrFrrr)rrcrUrrSrtest_error_leaks    zBasicTest.test_error_leakcCsRd}td}tt|tt}tj|dd}||| || dS)Nz3;foo=bar abc sabcrmr) r-r r.last_chunk_extendedr0rrrrar7r!)rextrarr^rrrrtest_chunked_extension&sz BasicTest.test_chunked_extensioncCsBt}ttt}tj|dd}||||| dS)z9some servers may serve up a short chunked encoding streamrmrN) r-r r.r/rrrrar7r!rrr^rrrrtest_chunked_missing_end0s  z"BasicTest.test_chunked_missing_endcCs\t}ttttt}tj|dd}|| | || |j d| dS)z&See that trailers are read and ignoredrmrr N) r-r r.r/rr0rrrrar7rr!rZrrrtest_chunked_trailers9szBasicTest.test_chunked_trailerscCsjt}d}ttttt|}tj|dd}|| | || |j | d| dS)zDCheck that we don't read past the end of the chunked-encoding stream extradatarmrr N)r-r r.r/rr0rrrrar7rrr!)rrr]r^rrrrtest_chunked_syncDszBasicTest.test_chunked_synccCs\d}d}td||}tj|dd}||||||j||dS)zBCheck that we don't read past the end of the Content-Length stream extradata Hello123 'HTTP/1.1 200 OK Content-Length: 10 rmrN)r rrrrar7rr!rr]rr^rrrrtest_content_length_syncPsz"BasicTest.test_content_length_synccCs`d}d}td||}tj|dd}|||d|g||j||dSNr_r`rarmri) r rrrra readlinesrr7r!rbrrrtest_readlines_content_length\sz'BasicTest.test_readlines_content_lengthcCs^d}d}td||}tj|dd}|||d|||j||dSrd) r rrrraread1rr7r!rbrrrtest_read1_content_lengthgsz#BasicTest.test_read1_content_lengthcCspd}d}td||}tj|dd}|||d|||dd||j||dS)Nr_r`rarmr r ) r rrrrar:rr7r!rbrrr"test_readline_bound_content_lengthrsz,BasicTest.test_readline_bound_content_lengthcCsvd}d}td|d|}tj|dd}|||d|d|||||j||dS) Nr_r`s'HTTP/1.1 200 OK Content-Length: 30 rrmrr) r rrrrargr7rr!rbrrrtest_read1_bound_content_length~sz)BasicTest.test_read1_bound_content_lengthcsttdf|jdfdd}tj|d}|||jt dt j  }| dd|}zV||jt jtj|d}z|d W|n |0W||n||0||d dS) Nrc s\}}|b|d8}|}|dsq4q|d|Wdn1sZ0YWdn1sx0YdS)Nrrs'HTTP/1.1 200 Connection established )acceptr$r:rstriprr7)rcaddressreaderrresultservrr run_servers   z2BasicTest.test_response_fileno..run_server)targetrrnz dummy:1234)filenos proxied data )socket create_serverHOST addCleanupr! threadingThreadstartrfloatrr] getsocknamer`rFrar<r;rvrdetach)rrtthreadrcrTrrrqrtest_response_filenos,      zBasicTest.test_response_filenocCs4Gdddtj}|d}td|_|dddS)zv It should be possible to override the default validation behavior in putrequest (bpo-38216). c@seZdZddZdS)zRBasicTest.test_putrequest_override_domain_validation..UnsafeHTTPConnectioncSsdSr&rrrrrr_validate_pathszaBasicTest.test_putrequest_override_domain_validation..UnsafeHTTPConnection._validate_pathN)r*r+r,rrrrrUnsafeHTTPConnectionsrr>rjrmz/Nrr]r r^rzrrrcrrr*test_putrequest_override_domain_validations z4BasicTest.test_putrequest_override_domain_validationcCs8Gdddtj}|d}td|_|jdddddS) Nc@seZdZddZdS)zPBasicTest.test_putrequest_override_host_validation..UnsafeHTTPConnectioncSsdSr&rrrrr_validate_hostsz_BasicTest.test_putrequest_override_host_validation..UnsafeHTTPConnection._validate_hostN)r*r+r,rrrrrrsrz example.com rjrmr\r)Z skip_hostrrrrr(test_putrequest_override_host_validations z2BasicTest.test_putrequest_override_host_validationcCs4Gdddtj}|d}td|_|dddS)z It should be possible to override the default encoding to transmit bytes in another encoding even if invalid (bpo-36274). c@seZdZddZdS)zIBasicTest.test_putrequest_override_encoding..UnsafeHTTPConnectioncSs |dS)Nzutf-8)r)rZstr_urlrrr_encode_requestszYBasicTest.test_putrequest_override_encoding..UnsafeHTTPConnection._encode_requestN)r*r+r,rrrrrrsrr>rjrmu/☃Nrrrrr!test_putrequest_override_encodings z+BasicTest.test_putrequest_override_encodingN)3r*r+r,rrrrrrrrrrrrrr rrrrrr$r%r(r5r8r>r?rArBrGrLrMrPrQrRrVrYr[r\r^rcrfrhrjrlrrrrrrrrrs`      +            %  rc@sxeZdZdZdZeedddZdZddZ d d Z d d Z d dZ ddZ ddZddZddZddZdS)ExtendedReadTestz* Test peek(), read1(), readline() zOHTTP/1.1 200 OK hello world! and now for something completely different fooZhelloNr HTTP/1.1 200 OK Transfer-Encoding: chunked a hello worl 3 d! 9 and now 23 for something completely different 3 foo 0 cCs8t|j}tj|dd}|t|j|_||_dS)Nrmr) r rrrrr-BufferedReaderfprrrrrsetUps  zExtendedReadTest.setUpcs|j}|jjdfdd }||j_g}|d}|r|t|d|}|t|t|||||t|}| ||n|}| || ||s(qq(| d ||j dS)Nr5cs(|}|dkr|d|S|ddS)Nrrir)r9rZoldpeekrrmypeeks z*ExtendedReadTest.test_peek..mypeekrrr )r5)rrpeek assertGreaterrPZassertGreaterEqualrrr7rarrUrlines_expected)rrrallrZp2rrrr test_peeks&   zExtendedReadTest.test_peekcCs|j}||jj|jdSr&)r_verify_readliner:r)rrrrr test_readlineszExtendedReadTest.test_readlinecCs\g}|d}|r4|dkr4t|dkr4||d|||sqFq|d||dS)Nrfoo r )rPrrrUrar)rr:rrrrrrr s   z!ExtendedReadTest._verify_readlinecs0jfdd}t|}|jjdS)Ncsd}t|d|S)N)rgassertLessEqualrP)resrrrrr/s z&ExtendedReadTest.test_read1..r)r Readlinerrr:r)rrZ readlinerrrr test_read1-szExtendedReadTest.test_read1cCs<|j}g}|}|sq$||q |d||jdSNr )rrgrUrarrrrrrrrrtest_read1_unbounded6s z%ExtendedReadTest.test_read1_unboundedcCsN|j}g}|d}|sq6|t|d||q |d||jdS)Nrir )rrgrrPrUrarrrrrrtest_read1_bounded@s  z#ExtendedReadTest.test_read1_boundedcCs||jdddS)Nrr )rarrgr%rrr test_read1_0KszExtendedReadTest.test_read1_0cCs |jd}|dt|dSNr)rrrrP)rrrrr test_peek_0Ns zExtendedReadTest.test_peek_0)r*r+r,r<rfindrrZ lines_chunkedrrrrrrrrrrrrrrs     rc@seZdZdZdZdS)ExtendedReadTestChunkedz: Test peek(), read1(), readline() in chunked mode rN)r*r+r,r<rrrrrrSsrc@s eZdZdZddZddZdS)rzT a simple readline class that uses an arbitrary read function and buffering cCs||_d|_dSr)readfunc remainder)rrrrrrmszReadliner.__init__cCsg}d}|j}z|d}|dkr$q^|t||kr@||d}|||}|sd}q^q|d7}||d|||d|_d|WSd||_Yn0dS)Nrrr5rr )rrrPrUrr)rlimitrZdatalenr7rrrrr:qs*     zReadliner.readlineN)r*r+r,r<rr:rrrrrisrc@s$eZdZddZddZddZdS) OfflineTestcCsfdh}ddh}ttD]<}|ds||vr.qtt|}t|dddkr||q|tj|dS)N responsesZ HTTPMessage parse_headersrr+z http.client)rrrgetattraddZassertCountEqual__all__)rrZ blacklistrZ module_objectrrrtest_alls   zOfflineTest.test_allcCs|tjtjddS)Nz Not Found)rarr NOT_FOUNDr%rrrtest_responsesszOfflineTest.test_responsesc CsRgd}|D]@}|j|d |tt|Wdq 1sB0Yq dS)N):ZCONTINUEZSWITCHING_PROTOCOLSZ PROCESSINGr;ZCREATEDZACCEPTEDZNON_AUTHORITATIVE_INFORMATIONZ NO_CONTENTZ RESET_CONTENTZPARTIAL_CONTENTZ MULTI_STATUSZIM_USEDZMULTIPLE_CHOICESZMOVED_PERMANENTLYZFOUNDZ SEE_OTHERZ NOT_MODIFIEDZ USE_PROXYZTEMPORARY_REDIRECTZ BAD_REQUESTZ UNAUTHORIZEDZPAYMENT_REQUIREDZ FORBIDDENrZMETHOD_NOT_ALLOWEDZNOT_ACCEPTABLEZPROXY_AUTHENTICATION_REQUIREDZREQUEST_TIMEOUTZCONFLICTZGONEZLENGTH_REQUIREDZPRECONDITION_FAILEDZREQUEST_ENTITY_TOO_LARGEZREQUEST_URI_TOO_LONGZUNSUPPORTED_MEDIA_TYPEZREQUESTED_RANGE_NOT_SATISFIABLEZEXPECTATION_FAILEDZ IM_A_TEAPOTZMISDIRECTED_REQUESTZUNPROCESSABLE_ENTITYZLOCKEDZFAILED_DEPENDENCYZUPGRADE_REQUIREDZPRECONDITION_REQUIREDZTOO_MANY_REQUESTSZREQUEST_HEADER_FIELDS_TOO_LARGEZUNAVAILABLE_FOR_LEGAL_REASONSZINTERNAL_SERVER_ERRORZNOT_IMPLEMENTEDZ BAD_GATEWAYZSERVICE_UNAVAILABLEZGATEWAY_TIMEOUTZHTTP_VERSION_NOT_SUPPORTEDZINSUFFICIENT_STORAGEZ NOT_EXTENDEDZNETWORK_AUTHENTICATION_REQUIREDZ EARLY_HINTSZ TOO_EARLY)Zconstant)rrhasattrr)rrconstrrrtest_client_constantss<z!OfflineTest.test_client_constantsN)r*r+r,rrrrrrrrsrc@s@eZdZddZddZddZeee d dd d Z d S) SourceAddressTestcCs>ttjtj|_t|j|_t|_|j d|_ dSr&) rwAF_INET SOCK_STREAMrsr bind_portrZfind_unused_port source_portlistenrcr%rrrrs   zSourceAddressTest.setUpcCs*|jr|jd|_|jd|_dSr&)rcr!rsr%rrrtearDowns   zSourceAddressTest.tearDowncCsBtjt|jd|jfd|_|j||jj d|jdS)Nrjsource_addressr) rr]ryrrrcrGrar^rr%rrrtestHTTPConnectionSourceAddresss   z1SourceAddressTest.testHTTPConnectionSourceAddressHTTPSConnectionz'http.client.HTTPSConnection not definedcCstjt|jd|jfd|_dS)Nrjr)rrryrrrcr%rrr testHTTPSConnectionSourceAddresss z2SourceAddressTest.testHTTPSConnectionSourceAddressN) r*r+r,rrrunittestskipIfrrrrrrrrsrc@s(eZdZdZddZddZddZdS) TimeoutTestNcCs.ttjtj|_t|jt_|jdSr&) rwrrrsrrrPORTrr%rrrrszTimeoutTest.setUpcCs|jd|_dSr&)rsr!r%rrrrs zTimeoutTest.tearDownc Cs|ttdz$tttj}| Wtdn td0| |j d| |ttdz(tjttjdd}| Wtdn td0| |j d| tjttjdd}| | |j d| dSN)timeout) assertIsNonerwgetdefaulttimeoutsetdefaulttimeoutrr]ryrrrGrar^ gettimeoutr!)rZhttpConnrrrtestTimeoutAttribute s,     z TimeoutTest.testTimeoutAttribute)r*r+r,rrrrrrrrrsrc@s$eZdZddZddZddZdS)PersistenceTestc Csd}|D]\}}}|j||dd||}t|}||j|dd|,}||jdu| |Wdn1s0Y||jdu| ||j d|dd||j |rdndWdq1s0YqdS) N))1.0rjF)rzConnection: keep-alive T)1.1rjT)rzConnection: close F)rzConnection: keep-ALIVE T)rzConnection: cloSE F)versionrbz4HTTP/{} 200 OK {}Content-Length: 12 Dummy body rmz/open-connectionrz/subsequent-requestr) rrtr=rr^r`rFrar7r?)rtestsrrbZreuserrcrTrrrtest_reuse_reconnect/s"   & z$PersistenceTest.test_reuse_reconnectc Csdd}tjtjf|tff}|D]~\}}|j|dZtd|}|dd|||j | |j |dd| |j dWdq 1s0Yq dS) Ncs&t|fdd}|_tS)z3Return BufferedReader that raises ECONNRESET at EOFcs tj|}|dkrt|Sr)r-r.rConnectionResetError)bufferrstreamrrrRszNPersistenceTest.test_disconnected..make_reset_reader..readinto)r-r.rr)rrrrrmake_reset_readerOs  z.make_reset_reader)rNr rmz /eof-response /reconnectr)r-r.rRemoteDisconnectedrrr=r`rrFrr^rar?)rrrZstream_factoryrNrcrrrtest_disconnectedMs      z!PersistenceTest.test_disconnectedcCsVtd}|jddddid|tj|j||j|dd||j ddS) NsHTTP/1.1 100 Continue rmr\ZExpectz 100-continue)rerr) r=r`rrrrFrr^rar?r}rrrtest_100_closehs  zPersistenceTest.test_100_closeN)r*r+r,rrrrrrrr-src@seZdZddZddZddZddZd d Zej d d Z d dZ ddZ ddZ ddZddZeeed dddZddZdS) HTTPSTestcCsttds|ddS)Nrzssl support required)rrskipTestr%rrrrws zHTTPSTest.setUpcCsddlm}|||dS)Nr)make_https_server)certfile)Ztest.ssl_serversr)rrrrrr make_server{s zHTTPSTest.make_servercCs$tjttjdd}||jddSr)rrryrrrar)rrrrrtest_attributesszHTTPSTest.test_attributesc Csddl}tdtddtdd}||j}| ddWdn1sX0Y| |j j dWdn1s0YdS)Nrnetworkself-signed.pythontest.netrmr\CERTIFICATE_VERIFY_FAILED) sslrrequiresrtransient_internetrrrSSLErrorr`rarNr=)rrrexc_inforrrtest_networkeds   *zHTTPSTest.test_networkedcCsddl}tdtd^|}tjdd|d}|dd| }| | d| d | Wdn1s0YdS) Nrrrrcontextrmr\nginxserver) rrrrrZ_create_unverified_contextrrr`rFr!r|r)rrrrrrrrtest_networked_noverifications   z'HTTPSTest.test_networked_noverificationcCs~tdtdVtdd}|dd|}|d}| | | d|Wdn1sp0YdS)Nrrrrmr\z content-typez text/html) rrrrrrr`rFrr!r|)rrrZ content_typerrr&test_networked_trusted_by_default_certs     z0HTTPSTest.test_networked_trusted_by_default_certc Csddl}tdd}t|||j}||j|j ||j d| t z(t j|d|d}|dd|}WnT|jy}z:t|}td |rtd |d |d WYd}~n d}~00|d }|||d|Wdn1s0YdS)NrrrTrrrmr\z(?i)key.too.weakzGot z trying to connect to z). See https://bugs.python.org/issue36816.rr)rrrrr SSLContextPROTOCOL_TLS_CLIENTraZ verify_modeZ CERT_REQUIREDcheck_hostnameload_verify_locations CERT_selfsigned_pythontestdotnetrrr`rFrr researchrZSkipTestrr!r|) rrZselfsigned_pythontestdotnetrrrZssl_errZ ssl_err_strZ server_stringrrrtest_networked_good_certs6        z"HTTPSTest.test_networked_good_certc Csddl}tdtd~||j}|tt j dd|d}| |j }| ddWdn1sr0Y||jjdWdn1s0YdS) Nrrrrrrmr\r)rrrrrrrrCERT_localhostrrrrr`rarNr=)rrrrrrrrtest_networked_bad_certs    *z!HTTPSTest.test_networked_bad_certcCslddl}|t}td|j}||j}|ddWdn1sN0Y| |j j ddS)Nr localhostrmr\r) rrrrrrrrr`rarNr=)rrrrrrrrtest_local_unknown_certs  *z!HTTPSTest.test_local_unknown_certcCsxddl}|t}||j}|ttjd|j|d}| |j | dd| }| |j | |jddS)Nrrrrm /nonexistentr)rrrrrrrrrrzr!r`rFrar<rrrrrrrrrtest_local_good_hostnames      z"HTTPSTest.test_local_good_hostnamecCs4ddl}|t}||j}|ttjd|j|d}| |j | ddWdn1sh0Yt dtf$tjd|j|dd}Wdn1s0Y| |j | ddWdn1s0Yd |_t dtf$tjd|j|d d}Wdn1s,0Y| dd |}||||jd d |_tjd|j|d}| dd |}||jd ||t dtf$tjd|j|dd}Wdn1s0Y| |j | ddWdn1s&0YdS) Nrrrrmr\rjT)rrFrr)rrCERT_fakehostnamerrrrrrrZCertificateErrorr`rZcheck_warningsDeprecationWarningrrFr!rar<rrrrtest_local_bad_hostnamesH   * $* &   &z!HTTPSTest.test_local_bad_hostnamerz)http.client.HTTPSConnection not availablecCsVdD]}|tjtj|qdD]0\}}}t|}|||j|||jq dS)Nr)r)zwww.python.org:443rr)rrr)rrr)rrr)rrr)rrrrrarrrrrrrs  zHTTPSTest.test_host_portcCsddl}|js|dtdd}||jj||j }| |jtjdd|d}| |j|| |jjt 0t ddttjdd|td}Wdn1s0Y||jjdS) NrzTLS 1.3 support requiredrrrignorez5key_file, cert_file and check_hostname are deprecated)rZ cert_file)rZ HAS_TLSv1_3rrrrZ_contextZpost_handshake_authrrrZassertIswarningscatch_warningsfilterwarningsrr)rrrrrrrtest_tls13_pha*s$      $zHTTPSTest.test_tls13_phaN)r*r+r,rrrrrrZsystem_must_validate_certrrrrrr rrrrrrrrrrrus"  !   * rc@sXeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ dS)RequestBodyTestz3Test cases where a request includes a message body.cCs,td|_td|j_|_|j|j_dS)Nr>rj)rr]rcr r^r%rrrrCs zRequestBodyTest.setUpcCs(t|jj}|t|}||fSr&)r-r.r^rr:rrrfmessagerrrget_headers_and_fpHs z"RequestBodyTest.get_headers_and_fpc Csddgdfdf}|D]\}}||td|_td|j_|_|jdd||\}}|d ||d || | d d | || Wdq1s0YqdS) Nrbar3 foo 3 bar 0 ))rrrr>rjrkrCz Content-Typerrr) rrr]rcr r^r`rrragetr7)rrrdrrrrrrtest_list_bodyNs       zRequestBodyTest.test_list_bodycCsL|jdddddi|\}}|d|d|dt|dS)NrkrCrdrZ42rr)rcr`rrarrPr7rrrrrrtest_manual_content_lengthbs   z*RequestBodyTest.test_manual_content_lengthcCs`|jddd|\}}|d||||d|d|d|dS)NrkrCrd text/plain4rsbody rcr`rraget_content_typer get_charsetrr7rrrrtest_ascii_bodyks  zRequestBodyTest.test_ascii_bodycCs`|jddd|\}}|d||||d|d|d|dS)NrkrCubodyÁr5rbodyrrrrrtest_latin1_bodyss  z RequestBodyTest.test_latin1_bodycCs`|jddd|\}}|d||||d|d|d|dS)NrkrCr!rr rrrrrrtest_bytes_body{s  zRequestBodyTest.test_bytes_bodycCs|tjtjttjd}|dWdn1s<0Yttj|}|jdd||\}}| d| | | | | d| d| d| d |Wdn1s0YdS) NwrdrkrCrrrztransfer-encodings4 body 0 )rzrunlinkTESTFNrwritercr`rrarrrrr7rrrrtest_text_file_bodys(  z#RequestBodyTest.test_text_file_bodycCs|tjtjttjd}|dWdn1s<0Yttjdx}|jdd||\}}| d| | | | d| d|d || d |Wdn1s0YdS) Nwbr!rrkrCrrrrs5 body 0 )rzrr%r&rr'rcr`rrarrrrrr7rrrrtest_binary_file_bodys(  z%RequestBodyTest.test_binary_file_bodyN) r*r+r,r<rrrrrr"r#r(r*rrrrr@s rc@s<eZdZddZddZddZddZd d Zd d Zd S)HTTPResponseTestcCs&d}t|}t||_|jdS)NzXHTTP/1.1 200 Ok My-Header: first-value My-Header: second-value Text)r rrrr)rrdr^rrrrs zHTTPResponseTest.setUpcCs6|jd}||d|jdd}||ddS)Nz My-Headerzfirst-value, second-valuez some defaultrrrarrbrrrtest_getting_headers  z$HTTPResponseTest.test_getting_headercCs|jdd}||ddS)NNo-Such-Headerz default-valuer,r-rrr3test_getting_nonexistent_header_with_string_defaultszDHTTPResponseTest.test_getting_nonexistent_header_with_string_defaultcCs<|jdddg}||d|jdd}||ddS)Nr/defaultvalueszdefault, values)r1r2r,r-rrr5test_getting_nonexistent_header_with_iterable_defaults zFHTTPResponseTest.test_getting_nonexistent_header_with_iterable_defaultcCs|jd}||ddS)Nr/r,r-rrr/test_getting_nonexistent_header_without_defaults z@HTTPResponseTest.test_getting_nonexistent_header_without_defaultcCs |jjddd}||ddS)Nr/rx)r1r,r-rrrtest_getting_header_defaultintsz/HTTPResponseTest.test_getting_header_defaultintN) r*r+r,rr.r0r3r4r5rrrrr+s r+c@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS) TunnelTestscCs*d}d|_t|j|_|||j_dS)Nz:HTTP/1.0 200 OK HTTP/1.1 200 OK Content-Length: 42 z proxy.com)rrr]rcrC)r response_textrrrrs zTunnelTests.setUpcCs|jdSr&)rcr!r%rrrrszTunnelTests.tearDowncsdfdd }|S)Ncst|d|ddS)Nrr)rr)r )rorrr7rrrBsz9TunnelTests._create_connection..create_connection)NNr)rr7rBrr8rrCszTunnelTests._create_connectioncCsd}d}ddi}|jj|||d|jddd||jjj|j||jjjtj||jj |||jj |||jj |dS) Ndestination.comi"z User-Agentz!Mozilla/5.0 (compatible, MSIE 11))rreror\rj) rc set_tunnelr`rar^rrr HTTP_PORTZ _tunnel_hostZ _tunnel_portZ_tunnel_headers)rZ tunnel_hostZ tunnel_portZtunnel_headersrrr!test_set_tunnel_host_port_headerss z-TunnelTests.test_set_tunnel_host_port_headerscCs |j|t|jjddS)Nr9)rcrGr RuntimeErrorr:r%rrr&test_disallow_set_tunnel_after_connects  z2TunnelTests.test_disallow_set_tunnel_after_connectcCs|jd|jddd||jjj|j||jjjtj| d|jjj | d|jjj | d|jjj | d|jjj dS) Nr9ror\rjCONNECT destination.comsHost: destination.com:NoneHost: destination.comsHost: proxy.com) rcr:r`rar^rrrr;r|rrr%rrrtest_connect_with_tunnels z$TunnelTests.test_connect_with_tunnelcCstj|jd4}|jd|j|jddWdn1sJ0Y||jt |j dd|j d|j d dd }| d ||j | d d |ddS) z8Regresstion test for https://bugs.python.org/issue43332.rr9rmr\Nrz!unexpected number of send calls: )rrr?r#zunexpected proxy data sent )rZpatchobjectrcr:rGr`Z assert_calledrrPZ mock_callsr|rr)rZ mock_sendZproxy_setup_data_sentrrr0test_tunnel_connect_single_send_connection_setups  ,   zrArCrDrErrrrr6s   r6__main__r) verbosity):r2httprrr-rrosrrrwr{r rrZTestCaser&rZ test.supportrpathdirnamerhererrrrr.r-Zchunk_extensionr/rWrr0ryr r/r.r4r]r=rLrrrrrrrrrrrrr+r6r*mainrrrrsp      !nT}"U.HL`#Z