transport_test.go 169 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547
  1. // Copyright 2011 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. // Tests for transport.go.
  5. //
  6. // More tests are in clientserver_test.go (for things testing both client & server for both
  7. // HTTP/1 and HTTP/2). This
  8. package http_test
  9. import (
  10. "bufio"
  11. "bytes"
  12. "compress/gzip"
  13. "context"
  14. "crypto/rand"
  15. "crypto/tls"
  16. "crypto/x509"
  17. "encoding/binary"
  18. "errors"
  19. "fmt"
  20. "go/token"
  21. "internal/nettrace"
  22. "io"
  23. "log"
  24. mrand "math/rand"
  25. "net"
  26. . "net/http"
  27. "net/http/httptest"
  28. "net/http/httptrace"
  29. "net/http/httputil"
  30. "net/http/internal/testcert"
  31. "net/textproto"
  32. "net/url"
  33. "os"
  34. "reflect"
  35. "runtime"
  36. "strconv"
  37. "strings"
  38. "sync"
  39. "sync/atomic"
  40. "testing"
  41. "testing/iotest"
  42. "time"
  43. "golang.org/x/net/http/httpguts"
  44. )
  45. // TODO: test 5 pipelined requests with responses: 1) OK, 2) OK, Connection: Close
  46. // and then verify that the final 2 responses get errors back.
  47. // hostPortHandler writes back the client's "host:port".
  48. var hostPortHandler = HandlerFunc(func(w ResponseWriter, r *Request) {
  49. if r.FormValue("close") == "true" {
  50. w.Header().Set("Connection", "close")
  51. }
  52. w.Header().Set("X-Saw-Close", fmt.Sprint(r.Close))
  53. w.Write([]byte(r.RemoteAddr))
  54. })
  55. // testCloseConn is a net.Conn tracked by a testConnSet.
  56. type testCloseConn struct {
  57. net.Conn
  58. set *testConnSet
  59. }
  60. func (c *testCloseConn) Close() error {
  61. c.set.remove(c)
  62. return c.Conn.Close()
  63. }
  64. // testConnSet tracks a set of TCP connections and whether they've
  65. // been closed.
  66. type testConnSet struct {
  67. t *testing.T
  68. mu sync.Mutex // guards closed and list
  69. closed map[net.Conn]bool
  70. list []net.Conn // in order created
  71. }
  72. func (tcs *testConnSet) insert(c net.Conn) {
  73. tcs.mu.Lock()
  74. defer tcs.mu.Unlock()
  75. tcs.closed[c] = false
  76. tcs.list = append(tcs.list, c)
  77. }
  78. func (tcs *testConnSet) remove(c net.Conn) {
  79. tcs.mu.Lock()
  80. defer tcs.mu.Unlock()
  81. tcs.closed[c] = true
  82. }
  83. // some tests use this to manage raw tcp connections for later inspection
  84. func makeTestDial(t *testing.T) (*testConnSet, func(n, addr string) (net.Conn, error)) {
  85. connSet := &testConnSet{
  86. t: t,
  87. closed: make(map[net.Conn]bool),
  88. }
  89. dial := func(n, addr string) (net.Conn, error) {
  90. c, err := net.Dial(n, addr)
  91. if err != nil {
  92. return nil, err
  93. }
  94. tc := &testCloseConn{c, connSet}
  95. connSet.insert(tc)
  96. return tc, nil
  97. }
  98. return connSet, dial
  99. }
  100. func (tcs *testConnSet) check(t *testing.T) {
  101. tcs.mu.Lock()
  102. defer tcs.mu.Unlock()
  103. for i := 4; i >= 0; i-- {
  104. for i, c := range tcs.list {
  105. if tcs.closed[c] {
  106. continue
  107. }
  108. if i != 0 {
  109. tcs.mu.Unlock()
  110. time.Sleep(50 * time.Millisecond)
  111. tcs.mu.Lock()
  112. continue
  113. }
  114. t.Errorf("TCP connection #%d, %p (of %d total) was not closed", i+1, c, len(tcs.list))
  115. }
  116. }
  117. }
  118. func TestReuseRequest(t *testing.T) {
  119. defer afterTest(t)
  120. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  121. w.Write([]byte("{}"))
  122. }))
  123. defer ts.Close()
  124. c := ts.Client()
  125. req, _ := NewRequest("GET", ts.URL, nil)
  126. res, err := c.Do(req)
  127. if err != nil {
  128. t.Fatal(err)
  129. }
  130. err = res.Body.Close()
  131. if err != nil {
  132. t.Fatal(err)
  133. }
  134. res, err = c.Do(req)
  135. if err != nil {
  136. t.Fatal(err)
  137. }
  138. err = res.Body.Close()
  139. if err != nil {
  140. t.Fatal(err)
  141. }
  142. }
  143. // Two subsequent requests and verify their response is the same.
  144. // The response from the server is our own IP:port
  145. func TestTransportKeepAlives(t *testing.T) {
  146. defer afterTest(t)
  147. ts := httptest.NewServer(hostPortHandler)
  148. defer ts.Close()
  149. c := ts.Client()
  150. for _, disableKeepAlive := range []bool{false, true} {
  151. c.Transport.(*Transport).DisableKeepAlives = disableKeepAlive
  152. fetch := func(n int) string {
  153. res, err := c.Get(ts.URL)
  154. if err != nil {
  155. t.Fatalf("error in disableKeepAlive=%v, req #%d, GET: %v", disableKeepAlive, n, err)
  156. }
  157. body, err := io.ReadAll(res.Body)
  158. if err != nil {
  159. t.Fatalf("error in disableKeepAlive=%v, req #%d, ReadAll: %v", disableKeepAlive, n, err)
  160. }
  161. return string(body)
  162. }
  163. body1 := fetch(1)
  164. body2 := fetch(2)
  165. bodiesDiffer := body1 != body2
  166. if bodiesDiffer != disableKeepAlive {
  167. t.Errorf("error in disableKeepAlive=%v. unexpected bodiesDiffer=%v; body1=%q; body2=%q",
  168. disableKeepAlive, bodiesDiffer, body1, body2)
  169. }
  170. }
  171. }
  172. func TestTransportConnectionCloseOnResponse(t *testing.T) {
  173. defer afterTest(t)
  174. ts := httptest.NewServer(hostPortHandler)
  175. defer ts.Close()
  176. connSet, testDial := makeTestDial(t)
  177. c := ts.Client()
  178. tr := c.Transport.(*Transport)
  179. tr.Dial = testDial
  180. for _, connectionClose := range []bool{false, true} {
  181. fetch := func(n int) string {
  182. req := new(Request)
  183. var err error
  184. req.URL, err = url.Parse(ts.URL + fmt.Sprintf("/?close=%v", connectionClose))
  185. if err != nil {
  186. t.Fatalf("URL parse error: %v", err)
  187. }
  188. req.Method = "GET"
  189. req.Proto = "HTTP/1.1"
  190. req.ProtoMajor = 1
  191. req.ProtoMinor = 1
  192. res, err := c.Do(req)
  193. if err != nil {
  194. t.Fatalf("error in connectionClose=%v, req #%d, Do: %v", connectionClose, n, err)
  195. }
  196. defer res.Body.Close()
  197. body, err := io.ReadAll(res.Body)
  198. if err != nil {
  199. t.Fatalf("error in connectionClose=%v, req #%d, ReadAll: %v", connectionClose, n, err)
  200. }
  201. return string(body)
  202. }
  203. body1 := fetch(1)
  204. body2 := fetch(2)
  205. bodiesDiffer := body1 != body2
  206. if bodiesDiffer != connectionClose {
  207. t.Errorf("error in connectionClose=%v. unexpected bodiesDiffer=%v; body1=%q; body2=%q",
  208. connectionClose, bodiesDiffer, body1, body2)
  209. }
  210. tr.CloseIdleConnections()
  211. }
  212. connSet.check(t)
  213. }
  214. func TestTransportConnectionCloseOnRequest(t *testing.T) {
  215. defer afterTest(t)
  216. ts := httptest.NewServer(hostPortHandler)
  217. defer ts.Close()
  218. connSet, testDial := makeTestDial(t)
  219. c := ts.Client()
  220. tr := c.Transport.(*Transport)
  221. tr.Dial = testDial
  222. for _, connectionClose := range []bool{false, true} {
  223. fetch := func(n int) string {
  224. req := new(Request)
  225. var err error
  226. req.URL, err = url.Parse(ts.URL)
  227. if err != nil {
  228. t.Fatalf("URL parse error: %v", err)
  229. }
  230. req.Method = "GET"
  231. req.Proto = "HTTP/1.1"
  232. req.ProtoMajor = 1
  233. req.ProtoMinor = 1
  234. req.Close = connectionClose
  235. res, err := c.Do(req)
  236. if err != nil {
  237. t.Fatalf("error in connectionClose=%v, req #%d, Do: %v", connectionClose, n, err)
  238. }
  239. if got, want := res.Header.Get("X-Saw-Close"), fmt.Sprint(connectionClose); got != want {
  240. t.Errorf("For connectionClose = %v; handler's X-Saw-Close was %v; want %v",
  241. connectionClose, got, !connectionClose)
  242. }
  243. body, err := io.ReadAll(res.Body)
  244. if err != nil {
  245. t.Fatalf("error in connectionClose=%v, req #%d, ReadAll: %v", connectionClose, n, err)
  246. }
  247. return string(body)
  248. }
  249. body1 := fetch(1)
  250. body2 := fetch(2)
  251. bodiesDiffer := body1 != body2
  252. if bodiesDiffer != connectionClose {
  253. t.Errorf("error in connectionClose=%v. unexpected bodiesDiffer=%v; body1=%q; body2=%q",
  254. connectionClose, bodiesDiffer, body1, body2)
  255. }
  256. tr.CloseIdleConnections()
  257. }
  258. connSet.check(t)
  259. }
  260. // if the Transport's DisableKeepAlives is set, all requests should
  261. // send Connection: close.
  262. // HTTP/1-only (Connection: close doesn't exist in h2)
  263. func TestTransportConnectionCloseOnRequestDisableKeepAlive(t *testing.T) {
  264. defer afterTest(t)
  265. ts := httptest.NewServer(hostPortHandler)
  266. defer ts.Close()
  267. c := ts.Client()
  268. c.Transport.(*Transport).DisableKeepAlives = true
  269. res, err := c.Get(ts.URL)
  270. if err != nil {
  271. t.Fatal(err)
  272. }
  273. res.Body.Close()
  274. if res.Header.Get("X-Saw-Close") != "true" {
  275. t.Errorf("handler didn't see Connection: close ")
  276. }
  277. }
  278. // Test that Transport only sends one "Connection: close", regardless of
  279. // how "close" was indicated.
  280. func TestTransportRespectRequestWantsClose(t *testing.T) {
  281. tests := []struct {
  282. disableKeepAlives bool
  283. close bool
  284. }{
  285. {disableKeepAlives: false, close: false},
  286. {disableKeepAlives: false, close: true},
  287. {disableKeepAlives: true, close: false},
  288. {disableKeepAlives: true, close: true},
  289. }
  290. for _, tc := range tests {
  291. t.Run(fmt.Sprintf("DisableKeepAlive=%v,RequestClose=%v", tc.disableKeepAlives, tc.close),
  292. func(t *testing.T) {
  293. defer afterTest(t)
  294. ts := httptest.NewServer(hostPortHandler)
  295. defer ts.Close()
  296. c := ts.Client()
  297. c.Transport.(*Transport).DisableKeepAlives = tc.disableKeepAlives
  298. req, err := NewRequest("GET", ts.URL, nil)
  299. if err != nil {
  300. t.Fatal(err)
  301. }
  302. count := 0
  303. trace := &httptrace.ClientTrace{
  304. WroteHeaderField: func(key string, field []string) {
  305. if key != "Connection" {
  306. return
  307. }
  308. if httpguts.HeaderValuesContainsToken(field, "close") {
  309. count += 1
  310. }
  311. },
  312. }
  313. req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
  314. req.Close = tc.close
  315. res, err := c.Do(req)
  316. if err != nil {
  317. t.Fatal(err)
  318. }
  319. defer res.Body.Close()
  320. if want := tc.disableKeepAlives || tc.close; count > 1 || (count == 1) != want {
  321. t.Errorf("expecting want:%v, got 'Connection: close':%d", want, count)
  322. }
  323. })
  324. }
  325. }
  326. func TestTransportIdleCacheKeys(t *testing.T) {
  327. defer afterTest(t)
  328. ts := httptest.NewServer(hostPortHandler)
  329. defer ts.Close()
  330. c := ts.Client()
  331. tr := c.Transport.(*Transport)
  332. if e, g := 0, len(tr.IdleConnKeysForTesting()); e != g {
  333. t.Errorf("After CloseIdleConnections expected %d idle conn cache keys; got %d", e, g)
  334. }
  335. resp, err := c.Get(ts.URL)
  336. if err != nil {
  337. t.Error(err)
  338. }
  339. io.ReadAll(resp.Body)
  340. keys := tr.IdleConnKeysForTesting()
  341. if e, g := 1, len(keys); e != g {
  342. t.Fatalf("After Get expected %d idle conn cache keys; got %d", e, g)
  343. }
  344. if e := "|http|" + ts.Listener.Addr().String(); keys[0] != e {
  345. t.Errorf("Expected idle cache key %q; got %q", e, keys[0])
  346. }
  347. tr.CloseIdleConnections()
  348. if e, g := 0, len(tr.IdleConnKeysForTesting()); e != g {
  349. t.Errorf("After CloseIdleConnections expected %d idle conn cache keys; got %d", e, g)
  350. }
  351. }
  352. // Tests that the HTTP transport re-uses connections when a client
  353. // reads to the end of a response Body without closing it.
  354. func TestTransportReadToEndReusesConn(t *testing.T) {
  355. defer afterTest(t)
  356. const msg = "foobar"
  357. var addrSeen map[string]int
  358. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  359. addrSeen[r.RemoteAddr]++
  360. if r.URL.Path == "/chunked/" {
  361. w.WriteHeader(200)
  362. w.(Flusher).Flush()
  363. } else {
  364. w.Header().Set("Content-Length", strconv.Itoa(len(msg)))
  365. w.WriteHeader(200)
  366. }
  367. w.Write([]byte(msg))
  368. }))
  369. defer ts.Close()
  370. buf := make([]byte, len(msg))
  371. for pi, path := range []string{"/content-length/", "/chunked/"} {
  372. wantLen := []int{len(msg), -1}[pi]
  373. addrSeen = make(map[string]int)
  374. for i := 0; i < 3; i++ {
  375. res, err := Get(ts.URL + path)
  376. if err != nil {
  377. t.Errorf("Get %s: %v", path, err)
  378. continue
  379. }
  380. // We want to close this body eventually (before the
  381. // defer afterTest at top runs), but not before the
  382. // len(addrSeen) check at the bottom of this test,
  383. // since Closing this early in the loop would risk
  384. // making connections be re-used for the wrong reason.
  385. defer res.Body.Close()
  386. if res.ContentLength != int64(wantLen) {
  387. t.Errorf("%s res.ContentLength = %d; want %d", path, res.ContentLength, wantLen)
  388. }
  389. n, err := res.Body.Read(buf)
  390. if n != len(msg) || err != io.EOF {
  391. t.Errorf("%s Read = %v, %v; want %d, EOF", path, n, err, len(msg))
  392. }
  393. }
  394. if len(addrSeen) != 1 {
  395. t.Errorf("for %s, server saw %d distinct client addresses; want 1", path, len(addrSeen))
  396. }
  397. }
  398. }
  399. func TestTransportMaxPerHostIdleConns(t *testing.T) {
  400. defer afterTest(t)
  401. stop := make(chan struct{}) // stop marks the exit of main Test goroutine
  402. defer close(stop)
  403. resch := make(chan string)
  404. gotReq := make(chan bool)
  405. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  406. gotReq <- true
  407. var msg string
  408. select {
  409. case <-stop:
  410. return
  411. case msg = <-resch:
  412. }
  413. _, err := w.Write([]byte(msg))
  414. if err != nil {
  415. t.Errorf("Write: %v", err)
  416. return
  417. }
  418. }))
  419. defer ts.Close()
  420. c := ts.Client()
  421. tr := c.Transport.(*Transport)
  422. maxIdleConnsPerHost := 2
  423. tr.MaxIdleConnsPerHost = maxIdleConnsPerHost
  424. // Start 3 outstanding requests and wait for the server to get them.
  425. // Their responses will hang until we write to resch, though.
  426. donech := make(chan bool)
  427. doReq := func() {
  428. defer func() {
  429. select {
  430. case <-stop:
  431. return
  432. case donech <- t.Failed():
  433. }
  434. }()
  435. resp, err := c.Get(ts.URL)
  436. if err != nil {
  437. t.Error(err)
  438. return
  439. }
  440. if _, err := io.ReadAll(resp.Body); err != nil {
  441. t.Errorf("ReadAll: %v", err)
  442. return
  443. }
  444. }
  445. go doReq()
  446. <-gotReq
  447. go doReq()
  448. <-gotReq
  449. go doReq()
  450. <-gotReq
  451. if e, g := 0, len(tr.IdleConnKeysForTesting()); e != g {
  452. t.Fatalf("Before writes, expected %d idle conn cache keys; got %d", e, g)
  453. }
  454. resch <- "res1"
  455. <-donech
  456. keys := tr.IdleConnKeysForTesting()
  457. if e, g := 1, len(keys); e != g {
  458. t.Fatalf("after first response, expected %d idle conn cache keys; got %d", e, g)
  459. }
  460. addr := ts.Listener.Addr().String()
  461. cacheKey := "|http|" + addr
  462. if keys[0] != cacheKey {
  463. t.Fatalf("Expected idle cache key %q; got %q", cacheKey, keys[0])
  464. }
  465. if e, g := 1, tr.IdleConnCountForTesting("http", addr); e != g {
  466. t.Errorf("after first response, expected %d idle conns; got %d", e, g)
  467. }
  468. resch <- "res2"
  469. <-donech
  470. if g, w := tr.IdleConnCountForTesting("http", addr), 2; g != w {
  471. t.Errorf("after second response, idle conns = %d; want %d", g, w)
  472. }
  473. resch <- "res3"
  474. <-donech
  475. if g, w := tr.IdleConnCountForTesting("http", addr), maxIdleConnsPerHost; g != w {
  476. t.Errorf("after third response, idle conns = %d; want %d", g, w)
  477. }
  478. }
  479. func TestTransportMaxConnsPerHostIncludeDialInProgress(t *testing.T) {
  480. defer afterTest(t)
  481. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  482. _, err := w.Write([]byte("foo"))
  483. if err != nil {
  484. t.Fatalf("Write: %v", err)
  485. }
  486. }))
  487. defer ts.Close()
  488. c := ts.Client()
  489. tr := c.Transport.(*Transport)
  490. dialStarted := make(chan struct{})
  491. stallDial := make(chan struct{})
  492. tr.Dial = func(network, addr string) (net.Conn, error) {
  493. dialStarted <- struct{}{}
  494. <-stallDial
  495. return net.Dial(network, addr)
  496. }
  497. tr.DisableKeepAlives = true
  498. tr.MaxConnsPerHost = 1
  499. preDial := make(chan struct{})
  500. reqComplete := make(chan struct{})
  501. doReq := func(reqId string) {
  502. req, _ := NewRequest("GET", ts.URL, nil)
  503. trace := &httptrace.ClientTrace{
  504. GetConn: func(hostPort string) {
  505. preDial <- struct{}{}
  506. },
  507. }
  508. req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
  509. resp, err := tr.RoundTrip(req)
  510. if err != nil {
  511. t.Errorf("unexpected error for request %s: %v", reqId, err)
  512. }
  513. _, err = io.ReadAll(resp.Body)
  514. if err != nil {
  515. t.Errorf("unexpected error for request %s: %v", reqId, err)
  516. }
  517. reqComplete <- struct{}{}
  518. }
  519. // get req1 to dial-in-progress
  520. go doReq("req1")
  521. <-preDial
  522. <-dialStarted
  523. // get req2 to waiting on conns per host to go down below max
  524. go doReq("req2")
  525. <-preDial
  526. select {
  527. case <-dialStarted:
  528. t.Error("req2 dial started while req1 dial in progress")
  529. return
  530. default:
  531. }
  532. // let req1 complete
  533. stallDial <- struct{}{}
  534. <-reqComplete
  535. // let req2 complete
  536. <-dialStarted
  537. stallDial <- struct{}{}
  538. <-reqComplete
  539. }
  540. func TestTransportMaxConnsPerHost(t *testing.T) {
  541. defer afterTest(t)
  542. CondSkipHTTP2(t)
  543. h := HandlerFunc(func(w ResponseWriter, r *Request) {
  544. _, err := w.Write([]byte("foo"))
  545. if err != nil {
  546. t.Fatalf("Write: %v", err)
  547. }
  548. })
  549. testMaxConns := func(scheme string, ts *httptest.Server) {
  550. defer ts.Close()
  551. c := ts.Client()
  552. tr := c.Transport.(*Transport)
  553. tr.MaxConnsPerHost = 1
  554. if err := ExportHttp2ConfigureTransport(tr); err != nil {
  555. t.Fatalf("ExportHttp2ConfigureTransport: %v", err)
  556. }
  557. mu := sync.Mutex{}
  558. var conns []net.Conn
  559. var dialCnt, gotConnCnt, tlsHandshakeCnt int32
  560. tr.Dial = func(network, addr string) (net.Conn, error) {
  561. atomic.AddInt32(&dialCnt, 1)
  562. c, err := net.Dial(network, addr)
  563. mu.Lock()
  564. defer mu.Unlock()
  565. conns = append(conns, c)
  566. return c, err
  567. }
  568. doReq := func() {
  569. trace := &httptrace.ClientTrace{
  570. GotConn: func(connInfo httptrace.GotConnInfo) {
  571. if !connInfo.Reused {
  572. atomic.AddInt32(&gotConnCnt, 1)
  573. }
  574. },
  575. TLSHandshakeStart: func() {
  576. atomic.AddInt32(&tlsHandshakeCnt, 1)
  577. },
  578. }
  579. req, _ := NewRequest("GET", ts.URL, nil)
  580. req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
  581. resp, err := c.Do(req)
  582. if err != nil {
  583. t.Fatalf("request failed: %v", err)
  584. }
  585. defer resp.Body.Close()
  586. _, err = io.ReadAll(resp.Body)
  587. if err != nil {
  588. t.Fatalf("read body failed: %v", err)
  589. }
  590. }
  591. wg := sync.WaitGroup{}
  592. for i := 0; i < 10; i++ {
  593. wg.Add(1)
  594. go func() {
  595. defer wg.Done()
  596. doReq()
  597. }()
  598. }
  599. wg.Wait()
  600. expected := int32(tr.MaxConnsPerHost)
  601. if dialCnt != expected {
  602. t.Errorf("round 1: too many dials (%s): %d != %d", scheme, dialCnt, expected)
  603. }
  604. if gotConnCnt != expected {
  605. t.Errorf("round 1: too many get connections (%s): %d != %d", scheme, gotConnCnt, expected)
  606. }
  607. if ts.TLS != nil && tlsHandshakeCnt != expected {
  608. t.Errorf("round 1: too many tls handshakes (%s): %d != %d", scheme, tlsHandshakeCnt, expected)
  609. }
  610. if t.Failed() {
  611. t.FailNow()
  612. }
  613. mu.Lock()
  614. for _, c := range conns {
  615. c.Close()
  616. }
  617. conns = nil
  618. mu.Unlock()
  619. tr.CloseIdleConnections()
  620. doReq()
  621. expected++
  622. if dialCnt != expected {
  623. t.Errorf("round 2: too many dials (%s): %d", scheme, dialCnt)
  624. }
  625. if gotConnCnt != expected {
  626. t.Errorf("round 2: too many get connections (%s): %d != %d", scheme, gotConnCnt, expected)
  627. }
  628. if ts.TLS != nil && tlsHandshakeCnt != expected {
  629. t.Errorf("round 2: too many tls handshakes (%s): %d != %d", scheme, tlsHandshakeCnt, expected)
  630. }
  631. }
  632. testMaxConns("http", httptest.NewServer(h))
  633. testMaxConns("https", httptest.NewTLSServer(h))
  634. ts := httptest.NewUnstartedServer(h)
  635. ts.TLS = &tls.Config{NextProtos: []string{"h2"}}
  636. ts.StartTLS()
  637. testMaxConns("http2", ts)
  638. }
  639. func TestTransportRemovesDeadIdleConnections(t *testing.T) {
  640. setParallel(t)
  641. defer afterTest(t)
  642. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  643. io.WriteString(w, r.RemoteAddr)
  644. }))
  645. defer ts.Close()
  646. c := ts.Client()
  647. tr := c.Transport.(*Transport)
  648. doReq := func(name string) string {
  649. // Do a POST instead of a GET to prevent the Transport's
  650. // idempotent request retry logic from kicking in...
  651. res, err := c.Post(ts.URL, "", nil)
  652. if err != nil {
  653. t.Fatalf("%s: %v", name, err)
  654. }
  655. if res.StatusCode != 200 {
  656. t.Fatalf("%s: %v", name, res.Status)
  657. }
  658. defer res.Body.Close()
  659. slurp, err := io.ReadAll(res.Body)
  660. if err != nil {
  661. t.Fatalf("%s: %v", name, err)
  662. }
  663. return string(slurp)
  664. }
  665. first := doReq("first")
  666. keys1 := tr.IdleConnKeysForTesting()
  667. ts.CloseClientConnections()
  668. var keys2 []string
  669. if !waitCondition(3*time.Second, 50*time.Millisecond, func() bool {
  670. keys2 = tr.IdleConnKeysForTesting()
  671. return len(keys2) == 0
  672. }) {
  673. t.Fatalf("Transport didn't notice idle connection's death.\nbefore: %q\n after: %q\n", keys1, keys2)
  674. }
  675. second := doReq("second")
  676. if first == second {
  677. t.Errorf("expected a different connection between requests. got %q both times", first)
  678. }
  679. }
  680. // Test that the Transport notices when a server hangs up on its
  681. // unexpectedly (a keep-alive connection is closed).
  682. func TestTransportServerClosingUnexpectedly(t *testing.T) {
  683. setParallel(t)
  684. defer afterTest(t)
  685. ts := httptest.NewServer(hostPortHandler)
  686. defer ts.Close()
  687. c := ts.Client()
  688. fetch := func(n, retries int) string {
  689. condFatalf := func(format string, arg ...any) {
  690. if retries <= 0 {
  691. t.Fatalf(format, arg...)
  692. }
  693. t.Logf("retrying shortly after expected error: "+format, arg...)
  694. time.Sleep(time.Second / time.Duration(retries))
  695. }
  696. for retries >= 0 {
  697. retries--
  698. res, err := c.Get(ts.URL)
  699. if err != nil {
  700. condFatalf("error in req #%d, GET: %v", n, err)
  701. continue
  702. }
  703. body, err := io.ReadAll(res.Body)
  704. if err != nil {
  705. condFatalf("error in req #%d, ReadAll: %v", n, err)
  706. continue
  707. }
  708. res.Body.Close()
  709. return string(body)
  710. }
  711. panic("unreachable")
  712. }
  713. body1 := fetch(1, 0)
  714. body2 := fetch(2, 0)
  715. // Close all the idle connections in a way that's similar to
  716. // the server hanging up on us. We don't use
  717. // httptest.Server.CloseClientConnections because it's
  718. // best-effort and stops blocking after 5 seconds. On a loaded
  719. // machine running many tests concurrently it's possible for
  720. // that method to be async and cause the body3 fetch below to
  721. // run on an old connection. This function is synchronous.
  722. ExportCloseTransportConnsAbruptly(c.Transport.(*Transport))
  723. body3 := fetch(3, 5)
  724. if body1 != body2 {
  725. t.Errorf("expected body1 and body2 to be equal")
  726. }
  727. if body2 == body3 {
  728. t.Errorf("expected body2 and body3 to be different")
  729. }
  730. }
  731. // Test for https://golang.org/issue/2616 (appropriate issue number)
  732. // This fails pretty reliably with GOMAXPROCS=100 or something high.
  733. func TestStressSurpriseServerCloses(t *testing.T) {
  734. defer afterTest(t)
  735. if testing.Short() {
  736. t.Skip("skipping test in short mode")
  737. }
  738. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  739. w.Header().Set("Content-Length", "5")
  740. w.Header().Set("Content-Type", "text/plain")
  741. w.Write([]byte("Hello"))
  742. w.(Flusher).Flush()
  743. conn, buf, _ := w.(Hijacker).Hijack()
  744. buf.Flush()
  745. conn.Close()
  746. }))
  747. defer ts.Close()
  748. c := ts.Client()
  749. // Do a bunch of traffic from different goroutines. Send to activityc
  750. // after each request completes, regardless of whether it failed.
  751. // If these are too high, OS X exhausts its ephemeral ports
  752. // and hangs waiting for them to transition TCP states. That's
  753. // not what we want to test. TODO(bradfitz): use an io.Pipe
  754. // dialer for this test instead?
  755. const (
  756. numClients = 20
  757. reqsPerClient = 25
  758. )
  759. activityc := make(chan bool)
  760. for i := 0; i < numClients; i++ {
  761. go func() {
  762. for i := 0; i < reqsPerClient; i++ {
  763. res, err := c.Get(ts.URL)
  764. if err == nil {
  765. // We expect errors since the server is
  766. // hanging up on us after telling us to
  767. // send more requests, so we don't
  768. // actually care what the error is.
  769. // But we want to close the body in cases
  770. // where we won the race.
  771. res.Body.Close()
  772. }
  773. if !<-activityc { // Receives false when close(activityc) is executed
  774. return
  775. }
  776. }
  777. }()
  778. }
  779. // Make sure all the request come back, one way or another.
  780. for i := 0; i < numClients*reqsPerClient; i++ {
  781. select {
  782. case activityc <- true:
  783. case <-time.After(5 * time.Second):
  784. close(activityc)
  785. t.Fatalf("presumed deadlock; no HTTP client activity seen in awhile")
  786. }
  787. }
  788. }
  789. // TestTransportHeadResponses verifies that we deal with Content-Lengths
  790. // with no bodies properly
  791. func TestTransportHeadResponses(t *testing.T) {
  792. defer afterTest(t)
  793. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  794. if r.Method != "HEAD" {
  795. panic("expected HEAD; got " + r.Method)
  796. }
  797. w.Header().Set("Content-Length", "123")
  798. w.WriteHeader(200)
  799. }))
  800. defer ts.Close()
  801. c := ts.Client()
  802. for i := 0; i < 2; i++ {
  803. res, err := c.Head(ts.URL)
  804. if err != nil {
  805. t.Errorf("error on loop %d: %v", i, err)
  806. continue
  807. }
  808. if e, g := "123", res.Header.Get("Content-Length"); e != g {
  809. t.Errorf("loop %d: expected Content-Length header of %q, got %q", i, e, g)
  810. }
  811. if e, g := int64(123), res.ContentLength; e != g {
  812. t.Errorf("loop %d: expected res.ContentLength of %v, got %v", i, e, g)
  813. }
  814. if all, err := io.ReadAll(res.Body); err != nil {
  815. t.Errorf("loop %d: Body ReadAll: %v", i, err)
  816. } else if len(all) != 0 {
  817. t.Errorf("Bogus body %q", all)
  818. }
  819. }
  820. }
  821. // TestTransportHeadChunkedResponse verifies that we ignore chunked transfer-encoding
  822. // on responses to HEAD requests.
  823. func TestTransportHeadChunkedResponse(t *testing.T) {
  824. defer afterTest(t)
  825. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  826. if r.Method != "HEAD" {
  827. panic("expected HEAD; got " + r.Method)
  828. }
  829. w.Header().Set("Transfer-Encoding", "chunked") // client should ignore
  830. w.Header().Set("x-client-ipport", r.RemoteAddr)
  831. w.WriteHeader(200)
  832. }))
  833. defer ts.Close()
  834. c := ts.Client()
  835. // Ensure that we wait for the readLoop to complete before
  836. // calling Head again
  837. didRead := make(chan bool)
  838. SetReadLoopBeforeNextReadHook(func() { didRead <- true })
  839. defer SetReadLoopBeforeNextReadHook(nil)
  840. res1, err := c.Head(ts.URL)
  841. <-didRead
  842. if err != nil {
  843. t.Fatalf("request 1 error: %v", err)
  844. }
  845. res2, err := c.Head(ts.URL)
  846. <-didRead
  847. if err != nil {
  848. t.Fatalf("request 2 error: %v", err)
  849. }
  850. if v1, v2 := res1.Header.Get("x-client-ipport"), res2.Header.Get("x-client-ipport"); v1 != v2 {
  851. t.Errorf("ip/ports differed between head requests: %q vs %q", v1, v2)
  852. }
  853. }
  854. var roundTripTests = []struct {
  855. accept string
  856. expectAccept string
  857. compressed bool
  858. }{
  859. // Requests with no accept-encoding header use transparent compression
  860. {"", "gzip", false},
  861. // Requests with other accept-encoding should pass through unmodified
  862. {"foo", "foo", false},
  863. // Requests with accept-encoding == gzip should be passed through
  864. {"gzip", "gzip", true},
  865. }
  866. // Test that the modification made to the Request by the RoundTripper is cleaned up
  867. func TestRoundTripGzip(t *testing.T) {
  868. setParallel(t)
  869. defer afterTest(t)
  870. const responseBody = "test response body"
  871. ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
  872. accept := req.Header.Get("Accept-Encoding")
  873. if expect := req.FormValue("expect_accept"); accept != expect {
  874. t.Errorf("in handler, test %v: Accept-Encoding = %q, want %q",
  875. req.FormValue("testnum"), accept, expect)
  876. }
  877. if accept == "gzip" {
  878. rw.Header().Set("Content-Encoding", "gzip")
  879. gz := gzip.NewWriter(rw)
  880. gz.Write([]byte(responseBody))
  881. gz.Close()
  882. } else {
  883. rw.Header().Set("Content-Encoding", accept)
  884. rw.Write([]byte(responseBody))
  885. }
  886. }))
  887. defer ts.Close()
  888. tr := ts.Client().Transport.(*Transport)
  889. for i, test := range roundTripTests {
  890. // Test basic request (no accept-encoding)
  891. req, _ := NewRequest("GET", fmt.Sprintf("%s/?testnum=%d&expect_accept=%s", ts.URL, i, test.expectAccept), nil)
  892. if test.accept != "" {
  893. req.Header.Set("Accept-Encoding", test.accept)
  894. }
  895. res, err := tr.RoundTrip(req)
  896. if err != nil {
  897. t.Errorf("%d. RoundTrip: %v", i, err)
  898. continue
  899. }
  900. var body []byte
  901. if test.compressed {
  902. var r *gzip.Reader
  903. r, err = gzip.NewReader(res.Body)
  904. if err != nil {
  905. t.Errorf("%d. gzip NewReader: %v", i, err)
  906. continue
  907. }
  908. body, err = io.ReadAll(r)
  909. res.Body.Close()
  910. } else {
  911. body, err = io.ReadAll(res.Body)
  912. }
  913. if err != nil {
  914. t.Errorf("%d. Error: %q", i, err)
  915. continue
  916. }
  917. if g, e := string(body), responseBody; g != e {
  918. t.Errorf("%d. body = %q; want %q", i, g, e)
  919. }
  920. if g, e := req.Header.Get("Accept-Encoding"), test.accept; g != e {
  921. t.Errorf("%d. Accept-Encoding = %q; want %q (it was mutated, in violation of RoundTrip contract)", i, g, e)
  922. }
  923. if g, e := res.Header.Get("Content-Encoding"), test.accept; g != e {
  924. t.Errorf("%d. Content-Encoding = %q; want %q", i, g, e)
  925. }
  926. }
  927. }
  928. func TestTransportGzip(t *testing.T) {
  929. setParallel(t)
  930. defer afterTest(t)
  931. const testString = "The test string aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
  932. const nRandBytes = 1024 * 1024
  933. ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
  934. if req.Method == "HEAD" {
  935. if g := req.Header.Get("Accept-Encoding"); g != "" {
  936. t.Errorf("HEAD request sent with Accept-Encoding of %q; want none", g)
  937. }
  938. return
  939. }
  940. if g, e := req.Header.Get("Accept-Encoding"), "gzip"; g != e {
  941. t.Errorf("Accept-Encoding = %q, want %q", g, e)
  942. }
  943. rw.Header().Set("Content-Encoding", "gzip")
  944. var w io.Writer = rw
  945. var buf bytes.Buffer
  946. if req.FormValue("chunked") == "0" {
  947. w = &buf
  948. defer io.Copy(rw, &buf)
  949. defer func() {
  950. rw.Header().Set("Content-Length", strconv.Itoa(buf.Len()))
  951. }()
  952. }
  953. gz := gzip.NewWriter(w)
  954. gz.Write([]byte(testString))
  955. if req.FormValue("body") == "large" {
  956. io.CopyN(gz, rand.Reader, nRandBytes)
  957. }
  958. gz.Close()
  959. }))
  960. defer ts.Close()
  961. c := ts.Client()
  962. for _, chunked := range []string{"1", "0"} {
  963. // First fetch something large, but only read some of it.
  964. res, err := c.Get(ts.URL + "/?body=large&chunked=" + chunked)
  965. if err != nil {
  966. t.Fatalf("large get: %v", err)
  967. }
  968. buf := make([]byte, len(testString))
  969. n, err := io.ReadFull(res.Body, buf)
  970. if err != nil {
  971. t.Fatalf("partial read of large response: size=%d, %v", n, err)
  972. }
  973. if e, g := testString, string(buf); e != g {
  974. t.Errorf("partial read got %q, expected %q", g, e)
  975. }
  976. res.Body.Close()
  977. // Read on the body, even though it's closed
  978. n, err = res.Body.Read(buf)
  979. if n != 0 || err == nil {
  980. t.Errorf("expected error post-closed large Read; got = %d, %v", n, err)
  981. }
  982. // Then something small.
  983. res, err = c.Get(ts.URL + "/?chunked=" + chunked)
  984. if err != nil {
  985. t.Fatal(err)
  986. }
  987. body, err := io.ReadAll(res.Body)
  988. if err != nil {
  989. t.Fatal(err)
  990. }
  991. if g, e := string(body), testString; g != e {
  992. t.Fatalf("body = %q; want %q", g, e)
  993. }
  994. if g, e := res.Header.Get("Content-Encoding"), ""; g != e {
  995. t.Fatalf("Content-Encoding = %q; want %q", g, e)
  996. }
  997. // Read on the body after it's been fully read:
  998. n, err = res.Body.Read(buf)
  999. if n != 0 || err == nil {
  1000. t.Errorf("expected Read error after exhausted reads; got %d, %v", n, err)
  1001. }
  1002. res.Body.Close()
  1003. n, err = res.Body.Read(buf)
  1004. if n != 0 || err == nil {
  1005. t.Errorf("expected Read error after Close; got %d, %v", n, err)
  1006. }
  1007. }
  1008. // And a HEAD request too, because they're always weird.
  1009. res, err := c.Head(ts.URL)
  1010. if err != nil {
  1011. t.Fatalf("Head: %v", err)
  1012. }
  1013. if res.StatusCode != 200 {
  1014. t.Errorf("Head status=%d; want=200", res.StatusCode)
  1015. }
  1016. }
  1017. // If a request has Expect:100-continue header, the request blocks sending body until the first response.
  1018. // Premature consumption of the request body should not be occurred.
  1019. func TestTransportExpect100Continue(t *testing.T) {
  1020. setParallel(t)
  1021. defer afterTest(t)
  1022. ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
  1023. switch req.URL.Path {
  1024. case "/100":
  1025. // This endpoint implicitly responds 100 Continue and reads body.
  1026. if _, err := io.Copy(io.Discard, req.Body); err != nil {
  1027. t.Error("Failed to read Body", err)
  1028. }
  1029. rw.WriteHeader(StatusOK)
  1030. case "/200":
  1031. // Go 1.5 adds Connection: close header if the client expect
  1032. // continue but not entire request body is consumed.
  1033. rw.WriteHeader(StatusOK)
  1034. case "/500":
  1035. rw.WriteHeader(StatusInternalServerError)
  1036. case "/keepalive":
  1037. // This hijacked endpoint responds error without Connection:close.
  1038. _, bufrw, err := rw.(Hijacker).Hijack()
  1039. if err != nil {
  1040. log.Fatal(err)
  1041. }
  1042. bufrw.WriteString("HTTP/1.1 500 Internal Server Error\r\n")
  1043. bufrw.WriteString("Content-Length: 0\r\n\r\n")
  1044. bufrw.Flush()
  1045. case "/timeout":
  1046. // This endpoint tries to read body without 100 (Continue) response.
  1047. // After ExpectContinueTimeout, the reading will be started.
  1048. conn, bufrw, err := rw.(Hijacker).Hijack()
  1049. if err != nil {
  1050. log.Fatal(err)
  1051. }
  1052. if _, err := io.CopyN(io.Discard, bufrw, req.ContentLength); err != nil {
  1053. t.Error("Failed to read Body", err)
  1054. }
  1055. bufrw.WriteString("HTTP/1.1 200 OK\r\n\r\n")
  1056. bufrw.Flush()
  1057. conn.Close()
  1058. }
  1059. }))
  1060. defer ts.Close()
  1061. tests := []struct {
  1062. path string
  1063. body []byte
  1064. sent int
  1065. status int
  1066. }{
  1067. {path: "/100", body: []byte("hello"), sent: 5, status: 200}, // Got 100 followed by 200, entire body is sent.
  1068. {path: "/200", body: []byte("hello"), sent: 0, status: 200}, // Got 200 without 100. body isn't sent.
  1069. {path: "/500", body: []byte("hello"), sent: 0, status: 500}, // Got 500 without 100. body isn't sent.
  1070. {path: "/keepalive", body: []byte("hello"), sent: 0, status: 500}, // Although without Connection:close, body isn't sent.
  1071. {path: "/timeout", body: []byte("hello"), sent: 5, status: 200}, // Timeout exceeded and entire body is sent.
  1072. }
  1073. c := ts.Client()
  1074. for i, v := range tests {
  1075. tr := &Transport{
  1076. ExpectContinueTimeout: 2 * time.Second,
  1077. }
  1078. defer tr.CloseIdleConnections()
  1079. c.Transport = tr
  1080. body := bytes.NewReader(v.body)
  1081. req, err := NewRequest("PUT", ts.URL+v.path, body)
  1082. if err != nil {
  1083. t.Fatal(err)
  1084. }
  1085. req.Header.Set("Expect", "100-continue")
  1086. req.ContentLength = int64(len(v.body))
  1087. resp, err := c.Do(req)
  1088. if err != nil {
  1089. t.Fatal(err)
  1090. }
  1091. resp.Body.Close()
  1092. sent := len(v.body) - body.Len()
  1093. if v.status != resp.StatusCode {
  1094. t.Errorf("test %d: status code should be %d but got %d. (%s)", i, v.status, resp.StatusCode, v.path)
  1095. }
  1096. if v.sent != sent {
  1097. t.Errorf("test %d: sent body should be %d but sent %d. (%s)", i, v.sent, sent, v.path)
  1098. }
  1099. }
  1100. }
  1101. func TestSOCKS5Proxy(t *testing.T) {
  1102. defer afterTest(t)
  1103. ch := make(chan string, 1)
  1104. l := newLocalListener(t)
  1105. defer l.Close()
  1106. defer close(ch)
  1107. proxy := func(t *testing.T) {
  1108. s, err := l.Accept()
  1109. if err != nil {
  1110. t.Errorf("socks5 proxy Accept(): %v", err)
  1111. return
  1112. }
  1113. defer s.Close()
  1114. var buf [22]byte
  1115. if _, err := io.ReadFull(s, buf[:3]); err != nil {
  1116. t.Errorf("socks5 proxy initial read: %v", err)
  1117. return
  1118. }
  1119. if want := []byte{5, 1, 0}; !bytes.Equal(buf[:3], want) {
  1120. t.Errorf("socks5 proxy initial read: got %v, want %v", buf[:3], want)
  1121. return
  1122. }
  1123. if _, err := s.Write([]byte{5, 0}); err != nil {
  1124. t.Errorf("socks5 proxy initial write: %v", err)
  1125. return
  1126. }
  1127. if _, err := io.ReadFull(s, buf[:4]); err != nil {
  1128. t.Errorf("socks5 proxy second read: %v", err)
  1129. return
  1130. }
  1131. if want := []byte{5, 1, 0}; !bytes.Equal(buf[:3], want) {
  1132. t.Errorf("socks5 proxy second read: got %v, want %v", buf[:3], want)
  1133. return
  1134. }
  1135. var ipLen int
  1136. switch buf[3] {
  1137. case 1:
  1138. ipLen = net.IPv4len
  1139. case 4:
  1140. ipLen = net.IPv6len
  1141. default:
  1142. t.Errorf("socks5 proxy second read: unexpected address type %v", buf[4])
  1143. return
  1144. }
  1145. if _, err := io.ReadFull(s, buf[4:ipLen+6]); err != nil {
  1146. t.Errorf("socks5 proxy address read: %v", err)
  1147. return
  1148. }
  1149. ip := net.IP(buf[4 : ipLen+4])
  1150. port := binary.BigEndian.Uint16(buf[ipLen+4 : ipLen+6])
  1151. copy(buf[:3], []byte{5, 0, 0})
  1152. if _, err := s.Write(buf[:ipLen+6]); err != nil {
  1153. t.Errorf("socks5 proxy connect write: %v", err)
  1154. return
  1155. }
  1156. ch <- fmt.Sprintf("proxy for %s:%d", ip, port)
  1157. // Implement proxying.
  1158. targetHost := net.JoinHostPort(ip.String(), strconv.Itoa(int(port)))
  1159. targetConn, err := net.Dial("tcp", targetHost)
  1160. if err != nil {
  1161. t.Errorf("net.Dial failed")
  1162. return
  1163. }
  1164. go io.Copy(targetConn, s)
  1165. io.Copy(s, targetConn) // Wait for the client to close the socket.
  1166. targetConn.Close()
  1167. }
  1168. pu, err := url.Parse("socks5://" + l.Addr().String())
  1169. if err != nil {
  1170. t.Fatal(err)
  1171. }
  1172. sentinelHeader := "X-Sentinel"
  1173. sentinelValue := "12345"
  1174. h := HandlerFunc(func(w ResponseWriter, r *Request) {
  1175. w.Header().Set(sentinelHeader, sentinelValue)
  1176. })
  1177. for _, useTLS := range []bool{false, true} {
  1178. t.Run(fmt.Sprintf("useTLS=%v", useTLS), func(t *testing.T) {
  1179. var ts *httptest.Server
  1180. if useTLS {
  1181. ts = httptest.NewTLSServer(h)
  1182. } else {
  1183. ts = httptest.NewServer(h)
  1184. }
  1185. go proxy(t)
  1186. c := ts.Client()
  1187. c.Transport.(*Transport).Proxy = ProxyURL(pu)
  1188. r, err := c.Head(ts.URL)
  1189. if err != nil {
  1190. t.Fatal(err)
  1191. }
  1192. if r.Header.Get(sentinelHeader) != sentinelValue {
  1193. t.Errorf("Failed to retrieve sentinel value")
  1194. }
  1195. var got string
  1196. select {
  1197. case got = <-ch:
  1198. case <-time.After(5 * time.Second):
  1199. t.Fatal("timeout connecting to socks5 proxy")
  1200. }
  1201. ts.Close()
  1202. tsu, err := url.Parse(ts.URL)
  1203. if err != nil {
  1204. t.Fatal(err)
  1205. }
  1206. want := "proxy for " + tsu.Host
  1207. if got != want {
  1208. t.Errorf("got %q, want %q", got, want)
  1209. }
  1210. })
  1211. }
  1212. }
  1213. func TestTransportProxy(t *testing.T) {
  1214. defer afterTest(t)
  1215. testCases := []struct{ httpsSite, httpsProxy bool }{
  1216. {false, false},
  1217. {false, true},
  1218. {true, false},
  1219. {true, true},
  1220. }
  1221. for _, testCase := range testCases {
  1222. httpsSite := testCase.httpsSite
  1223. httpsProxy := testCase.httpsProxy
  1224. t.Run(fmt.Sprintf("httpsSite=%v, httpsProxy=%v", httpsSite, httpsProxy), func(t *testing.T) {
  1225. siteCh := make(chan *Request, 1)
  1226. h1 := HandlerFunc(func(w ResponseWriter, r *Request) {
  1227. siteCh <- r
  1228. })
  1229. proxyCh := make(chan *Request, 1)
  1230. h2 := HandlerFunc(func(w ResponseWriter, r *Request) {
  1231. proxyCh <- r
  1232. // Implement an entire CONNECT proxy
  1233. if r.Method == "CONNECT" {
  1234. hijacker, ok := w.(Hijacker)
  1235. if !ok {
  1236. t.Errorf("hijack not allowed")
  1237. return
  1238. }
  1239. clientConn, _, err := hijacker.Hijack()
  1240. if err != nil {
  1241. t.Errorf("hijacking failed")
  1242. return
  1243. }
  1244. res := &Response{
  1245. StatusCode: StatusOK,
  1246. Proto: "HTTP/1.1",
  1247. ProtoMajor: 1,
  1248. ProtoMinor: 1,
  1249. Header: make(Header),
  1250. }
  1251. targetConn, err := net.Dial("tcp", r.URL.Host)
  1252. if err != nil {
  1253. t.Errorf("net.Dial(%q) failed: %v", r.URL.Host, err)
  1254. return
  1255. }
  1256. if err := res.Write(clientConn); err != nil {
  1257. t.Errorf("Writing 200 OK failed: %v", err)
  1258. return
  1259. }
  1260. go io.Copy(targetConn, clientConn)
  1261. go func() {
  1262. io.Copy(clientConn, targetConn)
  1263. targetConn.Close()
  1264. }()
  1265. }
  1266. })
  1267. var ts *httptest.Server
  1268. if httpsSite {
  1269. ts = httptest.NewTLSServer(h1)
  1270. } else {
  1271. ts = httptest.NewServer(h1)
  1272. }
  1273. var proxy *httptest.Server
  1274. if httpsProxy {
  1275. proxy = httptest.NewTLSServer(h2)
  1276. } else {
  1277. proxy = httptest.NewServer(h2)
  1278. }
  1279. pu, err := url.Parse(proxy.URL)
  1280. if err != nil {
  1281. t.Fatal(err)
  1282. }
  1283. // If neither server is HTTPS or both are, then c may be derived from either.
  1284. // If only one server is HTTPS, c must be derived from that server in order
  1285. // to ensure that it is configured to use the fake root CA from testcert.go.
  1286. c := proxy.Client()
  1287. if httpsSite {
  1288. c = ts.Client()
  1289. }
  1290. c.Transport.(*Transport).Proxy = ProxyURL(pu)
  1291. if _, err := c.Head(ts.URL); err != nil {
  1292. t.Error(err)
  1293. }
  1294. var got *Request
  1295. select {
  1296. case got = <-proxyCh:
  1297. case <-time.After(5 * time.Second):
  1298. t.Fatal("timeout connecting to http proxy")
  1299. }
  1300. c.Transport.(*Transport).CloseIdleConnections()
  1301. ts.Close()
  1302. proxy.Close()
  1303. if httpsSite {
  1304. // First message should be a CONNECT, asking for a socket to the real server,
  1305. if got.Method != "CONNECT" {
  1306. t.Errorf("Wrong method for secure proxying: %q", got.Method)
  1307. }
  1308. gotHost := got.URL.Host
  1309. pu, err := url.Parse(ts.URL)
  1310. if err != nil {
  1311. t.Fatal("Invalid site URL")
  1312. }
  1313. if wantHost := pu.Host; gotHost != wantHost {
  1314. t.Errorf("Got CONNECT host %q, want %q", gotHost, wantHost)
  1315. }
  1316. // The next message on the channel should be from the site's server.
  1317. next := <-siteCh
  1318. if next.Method != "HEAD" {
  1319. t.Errorf("Wrong method at destination: %s", next.Method)
  1320. }
  1321. if nextURL := next.URL.String(); nextURL != "/" {
  1322. t.Errorf("Wrong URL at destination: %s", nextURL)
  1323. }
  1324. } else {
  1325. if got.Method != "HEAD" {
  1326. t.Errorf("Wrong method for destination: %q", got.Method)
  1327. }
  1328. gotURL := got.URL.String()
  1329. wantURL := ts.URL + "/"
  1330. if gotURL != wantURL {
  1331. t.Errorf("Got URL %q, want %q", gotURL, wantURL)
  1332. }
  1333. }
  1334. })
  1335. }
  1336. }
  1337. // Issue 28012: verify that the Transport closes its TCP connection to http proxies
  1338. // when they're slow to reply to HTTPS CONNECT responses.
  1339. func TestTransportProxyHTTPSConnectLeak(t *testing.T) {
  1340. setParallel(t)
  1341. defer afterTest(t)
  1342. ctx, cancel := context.WithCancel(context.Background())
  1343. defer cancel()
  1344. ln := newLocalListener(t)
  1345. defer ln.Close()
  1346. listenerDone := make(chan struct{})
  1347. go func() {
  1348. defer close(listenerDone)
  1349. c, err := ln.Accept()
  1350. if err != nil {
  1351. t.Errorf("Accept: %v", err)
  1352. return
  1353. }
  1354. defer c.Close()
  1355. // Read the CONNECT request
  1356. br := bufio.NewReader(c)
  1357. cr, err := ReadRequest(br)
  1358. if err != nil {
  1359. t.Errorf("proxy server failed to read CONNECT request")
  1360. return
  1361. }
  1362. if cr.Method != "CONNECT" {
  1363. t.Errorf("unexpected method %q", cr.Method)
  1364. return
  1365. }
  1366. // Now hang and never write a response; instead, cancel the request and wait
  1367. // for the client to close.
  1368. // (Prior to Issue 28012 being fixed, we never closed.)
  1369. cancel()
  1370. var buf [1]byte
  1371. _, err = br.Read(buf[:])
  1372. if err != io.EOF {
  1373. t.Errorf("proxy server Read err = %v; want EOF", err)
  1374. }
  1375. return
  1376. }()
  1377. c := &Client{
  1378. Transport: &Transport{
  1379. Proxy: func(*Request) (*url.URL, error) {
  1380. return url.Parse("http://" + ln.Addr().String())
  1381. },
  1382. },
  1383. }
  1384. req, err := NewRequestWithContext(ctx, "GET", "https://golang.fake.tld/", nil)
  1385. if err != nil {
  1386. t.Fatal(err)
  1387. }
  1388. _, err = c.Do(req)
  1389. if err == nil {
  1390. t.Errorf("unexpected Get success")
  1391. }
  1392. // Wait unconditionally for the listener goroutine to exit: this should never
  1393. // hang, so if it does we want a full goroutine dump — and that's exactly what
  1394. // the testing package will give us when the test run times out.
  1395. <-listenerDone
  1396. }
  1397. // Issue 16997: test transport dial preserves typed errors
  1398. func TestTransportDialPreservesNetOpProxyError(t *testing.T) {
  1399. defer afterTest(t)
  1400. var errDial = errors.New("some dial error")
  1401. tr := &Transport{
  1402. Proxy: func(*Request) (*url.URL, error) {
  1403. return url.Parse("http://proxy.fake.tld/")
  1404. },
  1405. Dial: func(string, string) (net.Conn, error) {
  1406. return nil, errDial
  1407. },
  1408. }
  1409. defer tr.CloseIdleConnections()
  1410. c := &Client{Transport: tr}
  1411. req, _ := NewRequest("GET", "http://fake.tld", nil)
  1412. res, err := c.Do(req)
  1413. if err == nil {
  1414. res.Body.Close()
  1415. t.Fatal("wanted a non-nil error")
  1416. }
  1417. uerr, ok := err.(*url.Error)
  1418. if !ok {
  1419. t.Fatalf("got %T, want *url.Error", err)
  1420. }
  1421. oe, ok := uerr.Err.(*net.OpError)
  1422. if !ok {
  1423. t.Fatalf("url.Error.Err = %T; want *net.OpError", uerr.Err)
  1424. }
  1425. want := &net.OpError{
  1426. Op: "proxyconnect",
  1427. Net: "tcp",
  1428. Err: errDial, // original error, unwrapped.
  1429. }
  1430. if !reflect.DeepEqual(oe, want) {
  1431. t.Errorf("Got error %#v; want %#v", oe, want)
  1432. }
  1433. }
  1434. // Issue 36431: calls to RoundTrip should not mutate t.ProxyConnectHeader.
  1435. //
  1436. // (A bug caused dialConn to instead write the per-request Proxy-Authorization
  1437. // header through to the shared Header instance, introducing a data race.)
  1438. func TestTransportProxyDialDoesNotMutateProxyConnectHeader(t *testing.T) {
  1439. setParallel(t)
  1440. defer afterTest(t)
  1441. proxy := httptest.NewTLSServer(NotFoundHandler())
  1442. defer proxy.Close()
  1443. c := proxy.Client()
  1444. tr := c.Transport.(*Transport)
  1445. tr.Proxy = func(*Request) (*url.URL, error) {
  1446. u, _ := url.Parse(proxy.URL)
  1447. u.User = url.UserPassword("aladdin", "opensesame")
  1448. return u, nil
  1449. }
  1450. h := tr.ProxyConnectHeader
  1451. if h == nil {
  1452. h = make(Header)
  1453. }
  1454. tr.ProxyConnectHeader = h.Clone()
  1455. req, err := NewRequest("GET", "https://golang.fake.tld/", nil)
  1456. if err != nil {
  1457. t.Fatal(err)
  1458. }
  1459. _, err = c.Do(req)
  1460. if err == nil {
  1461. t.Errorf("unexpected Get success")
  1462. }
  1463. if !reflect.DeepEqual(tr.ProxyConnectHeader, h) {
  1464. t.Errorf("tr.ProxyConnectHeader = %v; want %v", tr.ProxyConnectHeader, h)
  1465. }
  1466. }
  1467. // TestTransportGzipRecursive sends a gzip quine and checks that the
  1468. // client gets the same value back. This is more cute than anything,
  1469. // but checks that we don't recurse forever, and checks that
  1470. // Content-Encoding is removed.
  1471. func TestTransportGzipRecursive(t *testing.T) {
  1472. defer afterTest(t)
  1473. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1474. w.Header().Set("Content-Encoding", "gzip")
  1475. w.Write(rgz)
  1476. }))
  1477. defer ts.Close()
  1478. c := ts.Client()
  1479. res, err := c.Get(ts.URL)
  1480. if err != nil {
  1481. t.Fatal(err)
  1482. }
  1483. body, err := io.ReadAll(res.Body)
  1484. if err != nil {
  1485. t.Fatal(err)
  1486. }
  1487. if !bytes.Equal(body, rgz) {
  1488. t.Fatalf("Incorrect result from recursive gz:\nhave=%x\nwant=%x",
  1489. body, rgz)
  1490. }
  1491. if g, e := res.Header.Get("Content-Encoding"), ""; g != e {
  1492. t.Fatalf("Content-Encoding = %q; want %q", g, e)
  1493. }
  1494. }
  1495. // golang.org/issue/7750: request fails when server replies with
  1496. // a short gzip body
  1497. func TestTransportGzipShort(t *testing.T) {
  1498. defer afterTest(t)
  1499. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1500. w.Header().Set("Content-Encoding", "gzip")
  1501. w.Write([]byte{0x1f, 0x8b})
  1502. }))
  1503. defer ts.Close()
  1504. c := ts.Client()
  1505. res, err := c.Get(ts.URL)
  1506. if err != nil {
  1507. t.Fatal(err)
  1508. }
  1509. defer res.Body.Close()
  1510. _, err = io.ReadAll(res.Body)
  1511. if err == nil {
  1512. t.Fatal("Expect an error from reading a body.")
  1513. }
  1514. if err != io.ErrUnexpectedEOF {
  1515. t.Errorf("ReadAll error = %v; want io.ErrUnexpectedEOF", err)
  1516. }
  1517. }
  1518. // Wait until number of goroutines is no greater than nmax, or time out.
  1519. func waitNumGoroutine(nmax int) int {
  1520. nfinal := runtime.NumGoroutine()
  1521. for ntries := 10; ntries > 0 && nfinal > nmax; ntries-- {
  1522. time.Sleep(50 * time.Millisecond)
  1523. runtime.GC()
  1524. nfinal = runtime.NumGoroutine()
  1525. }
  1526. return nfinal
  1527. }
  1528. // tests that persistent goroutine connections shut down when no longer desired.
  1529. func TestTransportPersistConnLeak(t *testing.T) {
  1530. // Not parallel: counts goroutines
  1531. defer afterTest(t)
  1532. const numReq = 25
  1533. gotReqCh := make(chan bool, numReq)
  1534. unblockCh := make(chan bool, numReq)
  1535. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1536. gotReqCh <- true
  1537. <-unblockCh
  1538. w.Header().Set("Content-Length", "0")
  1539. w.WriteHeader(204)
  1540. }))
  1541. defer ts.Close()
  1542. c := ts.Client()
  1543. tr := c.Transport.(*Transport)
  1544. n0 := runtime.NumGoroutine()
  1545. didReqCh := make(chan bool, numReq)
  1546. failed := make(chan bool, numReq)
  1547. for i := 0; i < numReq; i++ {
  1548. go func() {
  1549. res, err := c.Get(ts.URL)
  1550. didReqCh <- true
  1551. if err != nil {
  1552. t.Logf("client fetch error: %v", err)
  1553. failed <- true
  1554. return
  1555. }
  1556. res.Body.Close()
  1557. }()
  1558. }
  1559. // Wait for all goroutines to be stuck in the Handler.
  1560. for i := 0; i < numReq; i++ {
  1561. select {
  1562. case <-gotReqCh:
  1563. // ok
  1564. case <-failed:
  1565. // Not great but not what we are testing:
  1566. // sometimes an overloaded system will fail to make all the connections.
  1567. }
  1568. }
  1569. nhigh := runtime.NumGoroutine()
  1570. // Tell all handlers to unblock and reply.
  1571. close(unblockCh)
  1572. // Wait for all HTTP clients to be done.
  1573. for i := 0; i < numReq; i++ {
  1574. <-didReqCh
  1575. }
  1576. tr.CloseIdleConnections()
  1577. nfinal := waitNumGoroutine(n0 + 5)
  1578. growth := nfinal - n0
  1579. // We expect 0 or 1 extra goroutine, empirically. Allow up to 5.
  1580. // Previously we were leaking one per numReq.
  1581. if int(growth) > 5 {
  1582. t.Logf("goroutine growth: %d -> %d -> %d (delta: %d)", n0, nhigh, nfinal, growth)
  1583. t.Error("too many new goroutines")
  1584. }
  1585. }
  1586. // golang.org/issue/4531: Transport leaks goroutines when
  1587. // request.ContentLength is explicitly short
  1588. func TestTransportPersistConnLeakShortBody(t *testing.T) {
  1589. // Not parallel: measures goroutines.
  1590. defer afterTest(t)
  1591. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1592. }))
  1593. defer ts.Close()
  1594. c := ts.Client()
  1595. tr := c.Transport.(*Transport)
  1596. n0 := runtime.NumGoroutine()
  1597. body := []byte("Hello")
  1598. for i := 0; i < 20; i++ {
  1599. req, err := NewRequest("POST", ts.URL, bytes.NewReader(body))
  1600. if err != nil {
  1601. t.Fatal(err)
  1602. }
  1603. req.ContentLength = int64(len(body) - 2) // explicitly short
  1604. _, err = c.Do(req)
  1605. if err == nil {
  1606. t.Fatal("Expect an error from writing too long of a body.")
  1607. }
  1608. }
  1609. nhigh := runtime.NumGoroutine()
  1610. tr.CloseIdleConnections()
  1611. nfinal := waitNumGoroutine(n0 + 5)
  1612. growth := nfinal - n0
  1613. // We expect 0 or 1 extra goroutine, empirically. Allow up to 5.
  1614. // Previously we were leaking one per numReq.
  1615. t.Logf("goroutine growth: %d -> %d -> %d (delta: %d)", n0, nhigh, nfinal, growth)
  1616. if int(growth) > 5 {
  1617. t.Error("too many new goroutines")
  1618. }
  1619. }
  1620. // A countedConn is a net.Conn that decrements an atomic counter when finalized.
  1621. type countedConn struct {
  1622. net.Conn
  1623. }
  1624. // A countingDialer dials connections and counts the number that remain reachable.
  1625. type countingDialer struct {
  1626. dialer net.Dialer
  1627. mu sync.Mutex
  1628. total, live int64
  1629. }
  1630. func (d *countingDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
  1631. conn, err := d.dialer.DialContext(ctx, network, address)
  1632. if err != nil {
  1633. return nil, err
  1634. }
  1635. counted := new(countedConn)
  1636. counted.Conn = conn
  1637. d.mu.Lock()
  1638. defer d.mu.Unlock()
  1639. d.total++
  1640. d.live++
  1641. runtime.SetFinalizer(counted, d.decrement)
  1642. return counted, nil
  1643. }
  1644. func (d *countingDialer) decrement(*countedConn) {
  1645. d.mu.Lock()
  1646. defer d.mu.Unlock()
  1647. d.live--
  1648. }
  1649. func (d *countingDialer) Read() (total, live int64) {
  1650. d.mu.Lock()
  1651. defer d.mu.Unlock()
  1652. return d.total, d.live
  1653. }
  1654. func TestTransportPersistConnLeakNeverIdle(t *testing.T) {
  1655. defer afterTest(t)
  1656. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1657. // Close every connection so that it cannot be kept alive.
  1658. conn, _, err := w.(Hijacker).Hijack()
  1659. if err != nil {
  1660. t.Errorf("Hijack failed unexpectedly: %v", err)
  1661. return
  1662. }
  1663. conn.Close()
  1664. }))
  1665. defer ts.Close()
  1666. var d countingDialer
  1667. c := ts.Client()
  1668. c.Transport.(*Transport).DialContext = d.DialContext
  1669. body := []byte("Hello")
  1670. for i := 0; ; i++ {
  1671. total, live := d.Read()
  1672. if live < total {
  1673. break
  1674. }
  1675. if i >= 1<<12 {
  1676. t.Fatalf("Count of live client net.Conns (%d) not lower than total (%d) after %d Do / GC iterations.", live, total, i)
  1677. }
  1678. req, err := NewRequest("POST", ts.URL, bytes.NewReader(body))
  1679. if err != nil {
  1680. t.Fatal(err)
  1681. }
  1682. _, err = c.Do(req)
  1683. if err == nil {
  1684. t.Fatal("expected broken connection")
  1685. }
  1686. runtime.GC()
  1687. }
  1688. }
  1689. type countedContext struct {
  1690. context.Context
  1691. }
  1692. type contextCounter struct {
  1693. mu sync.Mutex
  1694. live int64
  1695. }
  1696. func (cc *contextCounter) Track(ctx context.Context) context.Context {
  1697. counted := new(countedContext)
  1698. counted.Context = ctx
  1699. cc.mu.Lock()
  1700. defer cc.mu.Unlock()
  1701. cc.live++
  1702. runtime.SetFinalizer(counted, cc.decrement)
  1703. return counted
  1704. }
  1705. func (cc *contextCounter) decrement(*countedContext) {
  1706. cc.mu.Lock()
  1707. defer cc.mu.Unlock()
  1708. cc.live--
  1709. }
  1710. func (cc *contextCounter) Read() (live int64) {
  1711. cc.mu.Lock()
  1712. defer cc.mu.Unlock()
  1713. return cc.live
  1714. }
  1715. func TestTransportPersistConnContextLeakMaxConnsPerHost(t *testing.T) {
  1716. if runtime.Compiler == "gccgo" {
  1717. t.Skip("fails with conservative stack GC")
  1718. }
  1719. defer afterTest(t)
  1720. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1721. runtime.Gosched()
  1722. w.WriteHeader(StatusOK)
  1723. }))
  1724. defer ts.Close()
  1725. c := ts.Client()
  1726. c.Transport.(*Transport).MaxConnsPerHost = 1
  1727. ctx := context.Background()
  1728. body := []byte("Hello")
  1729. doPosts := func(cc *contextCounter) {
  1730. var wg sync.WaitGroup
  1731. for n := 64; n > 0; n-- {
  1732. wg.Add(1)
  1733. go func() {
  1734. defer wg.Done()
  1735. ctx := cc.Track(ctx)
  1736. req, err := NewRequest("POST", ts.URL, bytes.NewReader(body))
  1737. if err != nil {
  1738. t.Error(err)
  1739. }
  1740. _, err = c.Do(req.WithContext(ctx))
  1741. if err != nil {
  1742. t.Errorf("Do failed with error: %v", err)
  1743. }
  1744. }()
  1745. }
  1746. wg.Wait()
  1747. }
  1748. var initialCC contextCounter
  1749. doPosts(&initialCC)
  1750. // flushCC exists only to put pressure on the GC to finalize the initialCC
  1751. // contexts: the flushCC allocations should eventually displace the initialCC
  1752. // allocations.
  1753. var flushCC contextCounter
  1754. for i := 0; ; i++ {
  1755. live := initialCC.Read()
  1756. if live == 0 {
  1757. break
  1758. }
  1759. if i >= 100 {
  1760. t.Fatalf("%d Contexts still not finalized after %d GC cycles.", live, i)
  1761. }
  1762. doPosts(&flushCC)
  1763. runtime.GC()
  1764. }
  1765. }
  1766. // This used to crash; https://golang.org/issue/3266
  1767. func TestTransportIdleConnCrash(t *testing.T) {
  1768. defer afterTest(t)
  1769. var tr *Transport
  1770. unblockCh := make(chan bool, 1)
  1771. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1772. <-unblockCh
  1773. tr.CloseIdleConnections()
  1774. }))
  1775. defer ts.Close()
  1776. c := ts.Client()
  1777. tr = c.Transport.(*Transport)
  1778. didreq := make(chan bool)
  1779. go func() {
  1780. res, err := c.Get(ts.URL)
  1781. if err != nil {
  1782. t.Error(err)
  1783. } else {
  1784. res.Body.Close() // returns idle conn
  1785. }
  1786. didreq <- true
  1787. }()
  1788. unblockCh <- true
  1789. <-didreq
  1790. }
  1791. // Test that the transport doesn't close the TCP connection early,
  1792. // before the response body has been read. This was a regression
  1793. // which sadly lacked a triggering test. The large response body made
  1794. // the old race easier to trigger.
  1795. func TestIssue3644(t *testing.T) {
  1796. defer afterTest(t)
  1797. const numFoos = 5000
  1798. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1799. w.Header().Set("Connection", "close")
  1800. for i := 0; i < numFoos; i++ {
  1801. w.Write([]byte("foo "))
  1802. }
  1803. }))
  1804. defer ts.Close()
  1805. c := ts.Client()
  1806. res, err := c.Get(ts.URL)
  1807. if err != nil {
  1808. t.Fatal(err)
  1809. }
  1810. defer res.Body.Close()
  1811. bs, err := io.ReadAll(res.Body)
  1812. if err != nil {
  1813. t.Fatal(err)
  1814. }
  1815. if len(bs) != numFoos*len("foo ") {
  1816. t.Errorf("unexpected response length")
  1817. }
  1818. }
  1819. // Test that a client receives a server's reply, even if the server doesn't read
  1820. // the entire request body.
  1821. func TestIssue3595(t *testing.T) {
  1822. setParallel(t)
  1823. defer afterTest(t)
  1824. const deniedMsg = "sorry, denied."
  1825. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1826. Error(w, deniedMsg, StatusUnauthorized)
  1827. }))
  1828. defer ts.Close()
  1829. c := ts.Client()
  1830. res, err := c.Post(ts.URL, "application/octet-stream", neverEnding('a'))
  1831. if err != nil {
  1832. t.Errorf("Post: %v", err)
  1833. return
  1834. }
  1835. got, err := io.ReadAll(res.Body)
  1836. if err != nil {
  1837. t.Fatalf("Body ReadAll: %v", err)
  1838. }
  1839. if !strings.Contains(string(got), deniedMsg) {
  1840. t.Errorf("Known bug: response %q does not contain %q", got, deniedMsg)
  1841. }
  1842. }
  1843. // From https://golang.org/issue/4454 ,
  1844. // "client fails to handle requests with no body and chunked encoding"
  1845. func TestChunkedNoContent(t *testing.T) {
  1846. defer afterTest(t)
  1847. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1848. w.WriteHeader(StatusNoContent)
  1849. }))
  1850. defer ts.Close()
  1851. c := ts.Client()
  1852. for _, closeBody := range []bool{true, false} {
  1853. const n = 4
  1854. for i := 1; i <= n; i++ {
  1855. res, err := c.Get(ts.URL)
  1856. if err != nil {
  1857. t.Errorf("closingBody=%v, req %d/%d: %v", closeBody, i, n, err)
  1858. } else {
  1859. if closeBody {
  1860. res.Body.Close()
  1861. }
  1862. }
  1863. }
  1864. }
  1865. }
  1866. func TestTransportConcurrency(t *testing.T) {
  1867. // Not parallel: uses global test hooks.
  1868. defer afterTest(t)
  1869. maxProcs, numReqs := 16, 500
  1870. if testing.Short() {
  1871. maxProcs, numReqs = 4, 50
  1872. }
  1873. defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(maxProcs))
  1874. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1875. fmt.Fprintf(w, "%v", r.FormValue("echo"))
  1876. }))
  1877. defer ts.Close()
  1878. var wg sync.WaitGroup
  1879. wg.Add(numReqs)
  1880. // Due to the Transport's "socket late binding" (see
  1881. // idleConnCh in transport.go), the numReqs HTTP requests
  1882. // below can finish with a dial still outstanding. To keep
  1883. // the leak checker happy, keep track of pending dials and
  1884. // wait for them to finish (and be closed or returned to the
  1885. // idle pool) before we close idle connections.
  1886. SetPendingDialHooks(func() { wg.Add(1) }, wg.Done)
  1887. defer SetPendingDialHooks(nil, nil)
  1888. c := ts.Client()
  1889. reqs := make(chan string)
  1890. defer close(reqs)
  1891. for i := 0; i < maxProcs*2; i++ {
  1892. go func() {
  1893. for req := range reqs {
  1894. res, err := c.Get(ts.URL + "/?echo=" + req)
  1895. if err != nil {
  1896. t.Errorf("error on req %s: %v", req, err)
  1897. wg.Done()
  1898. continue
  1899. }
  1900. all, err := io.ReadAll(res.Body)
  1901. if err != nil {
  1902. t.Errorf("read error on req %s: %v", req, err)
  1903. wg.Done()
  1904. continue
  1905. }
  1906. if string(all) != req {
  1907. t.Errorf("body of req %s = %q; want %q", req, all, req)
  1908. }
  1909. res.Body.Close()
  1910. wg.Done()
  1911. }
  1912. }()
  1913. }
  1914. for i := 0; i < numReqs; i++ {
  1915. reqs <- fmt.Sprintf("request-%d", i)
  1916. }
  1917. wg.Wait()
  1918. }
  1919. func TestIssue4191_InfiniteGetTimeout(t *testing.T) {
  1920. setParallel(t)
  1921. defer afterTest(t)
  1922. const debug = false
  1923. mux := NewServeMux()
  1924. mux.HandleFunc("/get", func(w ResponseWriter, r *Request) {
  1925. io.Copy(w, neverEnding('a'))
  1926. })
  1927. ts := httptest.NewServer(mux)
  1928. defer ts.Close()
  1929. timeout := 100 * time.Millisecond
  1930. c := ts.Client()
  1931. c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
  1932. conn, err := net.Dial(n, addr)
  1933. if err != nil {
  1934. return nil, err
  1935. }
  1936. conn.SetDeadline(time.Now().Add(timeout))
  1937. if debug {
  1938. conn = NewLoggingConn("client", conn)
  1939. }
  1940. return conn, nil
  1941. }
  1942. getFailed := false
  1943. nRuns := 5
  1944. if testing.Short() {
  1945. nRuns = 1
  1946. }
  1947. for i := 0; i < nRuns; i++ {
  1948. if debug {
  1949. println("run", i+1, "of", nRuns)
  1950. }
  1951. sres, err := c.Get(ts.URL + "/get")
  1952. if err != nil {
  1953. if !getFailed {
  1954. // Make the timeout longer, once.
  1955. getFailed = true
  1956. t.Logf("increasing timeout")
  1957. i--
  1958. timeout *= 10
  1959. continue
  1960. }
  1961. t.Errorf("Error issuing GET: %v", err)
  1962. break
  1963. }
  1964. _, err = io.Copy(io.Discard, sres.Body)
  1965. if err == nil {
  1966. t.Errorf("Unexpected successful copy")
  1967. break
  1968. }
  1969. }
  1970. if debug {
  1971. println("tests complete; waiting for handlers to finish")
  1972. }
  1973. }
  1974. func TestIssue4191_InfiniteGetToPutTimeout(t *testing.T) {
  1975. setParallel(t)
  1976. defer afterTest(t)
  1977. const debug = false
  1978. mux := NewServeMux()
  1979. mux.HandleFunc("/get", func(w ResponseWriter, r *Request) {
  1980. io.Copy(w, neverEnding('a'))
  1981. })
  1982. mux.HandleFunc("/put", func(w ResponseWriter, r *Request) {
  1983. defer r.Body.Close()
  1984. io.Copy(io.Discard, r.Body)
  1985. })
  1986. ts := httptest.NewServer(mux)
  1987. timeout := 100 * time.Millisecond
  1988. c := ts.Client()
  1989. c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
  1990. conn, err := net.Dial(n, addr)
  1991. if err != nil {
  1992. return nil, err
  1993. }
  1994. conn.SetDeadline(time.Now().Add(timeout))
  1995. if debug {
  1996. conn = NewLoggingConn("client", conn)
  1997. }
  1998. return conn, nil
  1999. }
  2000. getFailed := false
  2001. nRuns := 5
  2002. if testing.Short() {
  2003. nRuns = 1
  2004. }
  2005. for i := 0; i < nRuns; i++ {
  2006. if debug {
  2007. println("run", i+1, "of", nRuns)
  2008. }
  2009. sres, err := c.Get(ts.URL + "/get")
  2010. if err != nil {
  2011. if !getFailed {
  2012. // Make the timeout longer, once.
  2013. getFailed = true
  2014. t.Logf("increasing timeout")
  2015. i--
  2016. timeout *= 10
  2017. continue
  2018. }
  2019. t.Errorf("Error issuing GET: %v", err)
  2020. break
  2021. }
  2022. req, _ := NewRequest("PUT", ts.URL+"/put", sres.Body)
  2023. _, err = c.Do(req)
  2024. if err == nil {
  2025. sres.Body.Close()
  2026. t.Errorf("Unexpected successful PUT")
  2027. break
  2028. }
  2029. sres.Body.Close()
  2030. }
  2031. if debug {
  2032. println("tests complete; waiting for handlers to finish")
  2033. }
  2034. ts.Close()
  2035. }
  2036. func TestTransportResponseHeaderTimeout(t *testing.T) {
  2037. setParallel(t)
  2038. defer afterTest(t)
  2039. if testing.Short() {
  2040. t.Skip("skipping timeout test in -short mode")
  2041. }
  2042. inHandler := make(chan bool, 1)
  2043. mux := NewServeMux()
  2044. mux.HandleFunc("/fast", func(w ResponseWriter, r *Request) {
  2045. inHandler <- true
  2046. })
  2047. mux.HandleFunc("/slow", func(w ResponseWriter, r *Request) {
  2048. inHandler <- true
  2049. time.Sleep(2 * time.Second)
  2050. })
  2051. ts := httptest.NewServer(mux)
  2052. defer ts.Close()
  2053. c := ts.Client()
  2054. c.Transport.(*Transport).ResponseHeaderTimeout = 500 * time.Millisecond
  2055. tests := []struct {
  2056. path string
  2057. want int
  2058. wantErr string
  2059. }{
  2060. {path: "/fast", want: 200},
  2061. {path: "/slow", wantErr: "timeout awaiting response headers"},
  2062. {path: "/fast", want: 200},
  2063. }
  2064. for i, tt := range tests {
  2065. req, _ := NewRequest("GET", ts.URL+tt.path, nil)
  2066. req = req.WithT(t)
  2067. res, err := c.Do(req)
  2068. select {
  2069. case <-inHandler:
  2070. case <-time.After(5 * time.Second):
  2071. t.Errorf("never entered handler for test index %d, %s", i, tt.path)
  2072. continue
  2073. }
  2074. if err != nil {
  2075. uerr, ok := err.(*url.Error)
  2076. if !ok {
  2077. t.Errorf("error is not an url.Error; got: %#v", err)
  2078. continue
  2079. }
  2080. nerr, ok := uerr.Err.(net.Error)
  2081. if !ok {
  2082. t.Errorf("error does not satisfy net.Error interface; got: %#v", err)
  2083. continue
  2084. }
  2085. if !nerr.Timeout() {
  2086. t.Errorf("want timeout error; got: %q", nerr)
  2087. continue
  2088. }
  2089. if strings.Contains(err.Error(), tt.wantErr) {
  2090. continue
  2091. }
  2092. t.Errorf("%d. unexpected error: %v", i, err)
  2093. continue
  2094. }
  2095. if tt.wantErr != "" {
  2096. t.Errorf("%d. no error. expected error: %v", i, tt.wantErr)
  2097. continue
  2098. }
  2099. if res.StatusCode != tt.want {
  2100. t.Errorf("%d for path %q status = %d; want %d", i, tt.path, res.StatusCode, tt.want)
  2101. }
  2102. }
  2103. }
  2104. func TestTransportCancelRequest(t *testing.T) {
  2105. setParallel(t)
  2106. defer afterTest(t)
  2107. if testing.Short() {
  2108. t.Skip("skipping test in -short mode")
  2109. }
  2110. unblockc := make(chan bool)
  2111. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2112. fmt.Fprintf(w, "Hello")
  2113. w.(Flusher).Flush() // send headers and some body
  2114. <-unblockc
  2115. }))
  2116. defer ts.Close()
  2117. defer close(unblockc)
  2118. c := ts.Client()
  2119. tr := c.Transport.(*Transport)
  2120. req, _ := NewRequest("GET", ts.URL, nil)
  2121. res, err := c.Do(req)
  2122. if err != nil {
  2123. t.Fatal(err)
  2124. }
  2125. go func() {
  2126. time.Sleep(1 * time.Second)
  2127. tr.CancelRequest(req)
  2128. }()
  2129. t0 := time.Now()
  2130. body, err := io.ReadAll(res.Body)
  2131. d := time.Since(t0)
  2132. if err != ExportErrRequestCanceled {
  2133. t.Errorf("Body.Read error = %v; want errRequestCanceled", err)
  2134. }
  2135. if string(body) != "Hello" {
  2136. t.Errorf("Body = %q; want Hello", body)
  2137. }
  2138. if d < 500*time.Millisecond {
  2139. t.Errorf("expected ~1 second delay; got %v", d)
  2140. }
  2141. // Verify no outstanding requests after readLoop/writeLoop
  2142. // goroutines shut down.
  2143. for tries := 5; tries > 0; tries-- {
  2144. n := tr.NumPendingRequestsForTesting()
  2145. if n == 0 {
  2146. break
  2147. }
  2148. time.Sleep(100 * time.Millisecond)
  2149. if tries == 1 {
  2150. t.Errorf("pending requests = %d; want 0", n)
  2151. }
  2152. }
  2153. }
  2154. func testTransportCancelRequestInDo(t *testing.T, body io.Reader) {
  2155. setParallel(t)
  2156. defer afterTest(t)
  2157. if testing.Short() {
  2158. t.Skip("skipping test in -short mode")
  2159. }
  2160. unblockc := make(chan bool)
  2161. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2162. <-unblockc
  2163. }))
  2164. defer ts.Close()
  2165. defer close(unblockc)
  2166. c := ts.Client()
  2167. tr := c.Transport.(*Transport)
  2168. donec := make(chan bool)
  2169. req, _ := NewRequest("GET", ts.URL, body)
  2170. go func() {
  2171. defer close(donec)
  2172. c.Do(req)
  2173. }()
  2174. start := time.Now()
  2175. timeout := 10 * time.Second
  2176. for time.Since(start) < timeout {
  2177. time.Sleep(100 * time.Millisecond)
  2178. tr.CancelRequest(req)
  2179. select {
  2180. case <-donec:
  2181. return
  2182. default:
  2183. }
  2184. }
  2185. t.Errorf("Do of canceled request has not returned after %v", timeout)
  2186. }
  2187. func TestTransportCancelRequestInDo(t *testing.T) {
  2188. testTransportCancelRequestInDo(t, nil)
  2189. }
  2190. func TestTransportCancelRequestWithBodyInDo(t *testing.T) {
  2191. testTransportCancelRequestInDo(t, bytes.NewBuffer([]byte{0}))
  2192. }
  2193. func TestTransportCancelRequestInDial(t *testing.T) {
  2194. defer afterTest(t)
  2195. if testing.Short() {
  2196. t.Skip("skipping test in -short mode")
  2197. }
  2198. var logbuf bytes.Buffer
  2199. eventLog := log.New(&logbuf, "", 0)
  2200. unblockDial := make(chan bool)
  2201. defer close(unblockDial)
  2202. inDial := make(chan bool)
  2203. tr := &Transport{
  2204. Dial: func(network, addr string) (net.Conn, error) {
  2205. eventLog.Println("dial: blocking")
  2206. if !<-inDial {
  2207. return nil, errors.New("main Test goroutine exited")
  2208. }
  2209. <-unblockDial
  2210. return nil, errors.New("nope")
  2211. },
  2212. }
  2213. cl := &Client{Transport: tr}
  2214. gotres := make(chan bool)
  2215. req, _ := NewRequest("GET", "http://something.no-network.tld/", nil)
  2216. go func() {
  2217. _, err := cl.Do(req)
  2218. eventLog.Printf("Get = %v", err)
  2219. gotres <- true
  2220. }()
  2221. select {
  2222. case inDial <- true:
  2223. case <-time.After(5 * time.Second):
  2224. close(inDial)
  2225. t.Fatal("timeout; never saw blocking dial")
  2226. }
  2227. eventLog.Printf("canceling")
  2228. tr.CancelRequest(req)
  2229. tr.CancelRequest(req) // used to panic on second call
  2230. select {
  2231. case <-gotres:
  2232. case <-time.After(5 * time.Second):
  2233. panic("hang. events are: " + logbuf.String())
  2234. }
  2235. got := logbuf.String()
  2236. want := `dial: blocking
  2237. canceling
  2238. Get = Get "http://something.no-network.tld/": net/http: request canceled while waiting for connection
  2239. `
  2240. if got != want {
  2241. t.Errorf("Got events:\n%s\nWant:\n%s", got, want)
  2242. }
  2243. }
  2244. func TestCancelRequestWithChannel(t *testing.T) {
  2245. setParallel(t)
  2246. defer afterTest(t)
  2247. if testing.Short() {
  2248. t.Skip("skipping test in -short mode")
  2249. }
  2250. unblockc := make(chan bool)
  2251. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2252. fmt.Fprintf(w, "Hello")
  2253. w.(Flusher).Flush() // send headers and some body
  2254. <-unblockc
  2255. }))
  2256. defer ts.Close()
  2257. defer close(unblockc)
  2258. c := ts.Client()
  2259. tr := c.Transport.(*Transport)
  2260. req, _ := NewRequest("GET", ts.URL, nil)
  2261. ch := make(chan struct{})
  2262. req.Cancel = ch
  2263. res, err := c.Do(req)
  2264. if err != nil {
  2265. t.Fatal(err)
  2266. }
  2267. go func() {
  2268. time.Sleep(1 * time.Second)
  2269. close(ch)
  2270. }()
  2271. t0 := time.Now()
  2272. body, err := io.ReadAll(res.Body)
  2273. d := time.Since(t0)
  2274. if err != ExportErrRequestCanceled {
  2275. t.Errorf("Body.Read error = %v; want errRequestCanceled", err)
  2276. }
  2277. if string(body) != "Hello" {
  2278. t.Errorf("Body = %q; want Hello", body)
  2279. }
  2280. if d < 500*time.Millisecond {
  2281. t.Errorf("expected ~1 second delay; got %v", d)
  2282. }
  2283. // Verify no outstanding requests after readLoop/writeLoop
  2284. // goroutines shut down.
  2285. for tries := 5; tries > 0; tries-- {
  2286. n := tr.NumPendingRequestsForTesting()
  2287. if n == 0 {
  2288. break
  2289. }
  2290. time.Sleep(100 * time.Millisecond)
  2291. if tries == 1 {
  2292. t.Errorf("pending requests = %d; want 0", n)
  2293. }
  2294. }
  2295. }
  2296. func TestCancelRequestWithChannelBeforeDo_Cancel(t *testing.T) {
  2297. testCancelRequestWithChannelBeforeDo(t, false)
  2298. }
  2299. func TestCancelRequestWithChannelBeforeDo_Context(t *testing.T) {
  2300. testCancelRequestWithChannelBeforeDo(t, true)
  2301. }
  2302. func testCancelRequestWithChannelBeforeDo(t *testing.T, withCtx bool) {
  2303. setParallel(t)
  2304. defer afterTest(t)
  2305. unblockc := make(chan bool)
  2306. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2307. <-unblockc
  2308. }))
  2309. defer ts.Close()
  2310. defer close(unblockc)
  2311. c := ts.Client()
  2312. req, _ := NewRequest("GET", ts.URL, nil)
  2313. if withCtx {
  2314. ctx, cancel := context.WithCancel(context.Background())
  2315. cancel()
  2316. req = req.WithContext(ctx)
  2317. } else {
  2318. ch := make(chan struct{})
  2319. req.Cancel = ch
  2320. close(ch)
  2321. }
  2322. _, err := c.Do(req)
  2323. if ue, ok := err.(*url.Error); ok {
  2324. err = ue.Err
  2325. }
  2326. if withCtx {
  2327. if err != context.Canceled {
  2328. t.Errorf("Do error = %v; want %v", err, context.Canceled)
  2329. }
  2330. } else {
  2331. if err == nil || !strings.Contains(err.Error(), "canceled") {
  2332. t.Errorf("Do error = %v; want cancellation", err)
  2333. }
  2334. }
  2335. }
  2336. // Issue 11020. The returned error message should be errRequestCanceled
  2337. func TestTransportCancelBeforeResponseHeaders(t *testing.T) {
  2338. defer afterTest(t)
  2339. serverConnCh := make(chan net.Conn, 1)
  2340. tr := &Transport{
  2341. Dial: func(network, addr string) (net.Conn, error) {
  2342. cc, sc := net.Pipe()
  2343. serverConnCh <- sc
  2344. return cc, nil
  2345. },
  2346. }
  2347. defer tr.CloseIdleConnections()
  2348. errc := make(chan error, 1)
  2349. req, _ := NewRequest("GET", "http://example.com/", nil)
  2350. go func() {
  2351. _, err := tr.RoundTrip(req)
  2352. errc <- err
  2353. }()
  2354. sc := <-serverConnCh
  2355. verb := make([]byte, 3)
  2356. if _, err := io.ReadFull(sc, verb); err != nil {
  2357. t.Errorf("Error reading HTTP verb from server: %v", err)
  2358. }
  2359. if string(verb) != "GET" {
  2360. t.Errorf("server received %q; want GET", verb)
  2361. }
  2362. defer sc.Close()
  2363. tr.CancelRequest(req)
  2364. err := <-errc
  2365. if err == nil {
  2366. t.Fatalf("unexpected success from RoundTrip")
  2367. }
  2368. if err != ExportErrRequestCanceled {
  2369. t.Errorf("RoundTrip error = %v; want ExportErrRequestCanceled", err)
  2370. }
  2371. }
  2372. // golang.org/issue/3672 -- Client can't close HTTP stream
  2373. // Calling Close on a Response.Body used to just read until EOF.
  2374. // Now it actually closes the TCP connection.
  2375. func TestTransportCloseResponseBody(t *testing.T) {
  2376. defer afterTest(t)
  2377. writeErr := make(chan error, 1)
  2378. msg := []byte("young\n")
  2379. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2380. for {
  2381. _, err := w.Write(msg)
  2382. if err != nil {
  2383. writeErr <- err
  2384. return
  2385. }
  2386. w.(Flusher).Flush()
  2387. }
  2388. }))
  2389. defer ts.Close()
  2390. c := ts.Client()
  2391. tr := c.Transport.(*Transport)
  2392. req, _ := NewRequest("GET", ts.URL, nil)
  2393. defer tr.CancelRequest(req)
  2394. res, err := c.Do(req)
  2395. if err != nil {
  2396. t.Fatal(err)
  2397. }
  2398. const repeats = 3
  2399. buf := make([]byte, len(msg)*repeats)
  2400. want := bytes.Repeat(msg, repeats)
  2401. _, err = io.ReadFull(res.Body, buf)
  2402. if err != nil {
  2403. t.Fatal(err)
  2404. }
  2405. if !bytes.Equal(buf, want) {
  2406. t.Fatalf("read %q; want %q", buf, want)
  2407. }
  2408. didClose := make(chan error, 1)
  2409. go func() {
  2410. didClose <- res.Body.Close()
  2411. }()
  2412. select {
  2413. case err := <-didClose:
  2414. if err != nil {
  2415. t.Errorf("Close = %v", err)
  2416. }
  2417. case <-time.After(10 * time.Second):
  2418. t.Fatal("too long waiting for close")
  2419. }
  2420. select {
  2421. case err := <-writeErr:
  2422. if err == nil {
  2423. t.Errorf("expected non-nil write error")
  2424. }
  2425. case <-time.After(10 * time.Second):
  2426. t.Fatal("too long waiting for write error")
  2427. }
  2428. }
  2429. type fooProto struct{}
  2430. func (fooProto) RoundTrip(req *Request) (*Response, error) {
  2431. res := &Response{
  2432. Status: "200 OK",
  2433. StatusCode: 200,
  2434. Header: make(Header),
  2435. Body: io.NopCloser(strings.NewReader("You wanted " + req.URL.String())),
  2436. }
  2437. return res, nil
  2438. }
  2439. func TestTransportAltProto(t *testing.T) {
  2440. defer afterTest(t)
  2441. tr := &Transport{}
  2442. c := &Client{Transport: tr}
  2443. tr.RegisterProtocol("foo", fooProto{})
  2444. res, err := c.Get("foo://bar.com/path")
  2445. if err != nil {
  2446. t.Fatal(err)
  2447. }
  2448. bodyb, err := io.ReadAll(res.Body)
  2449. if err != nil {
  2450. t.Fatal(err)
  2451. }
  2452. body := string(bodyb)
  2453. if e := "You wanted foo://bar.com/path"; body != e {
  2454. t.Errorf("got response %q, want %q", body, e)
  2455. }
  2456. }
  2457. func TestTransportNoHost(t *testing.T) {
  2458. defer afterTest(t)
  2459. tr := &Transport{}
  2460. _, err := tr.RoundTrip(&Request{
  2461. Header: make(Header),
  2462. URL: &url.URL{
  2463. Scheme: "http",
  2464. },
  2465. })
  2466. want := "http: no Host in request URL"
  2467. if got := fmt.Sprint(err); got != want {
  2468. t.Errorf("error = %v; want %q", err, want)
  2469. }
  2470. }
  2471. // Issue 13311
  2472. func TestTransportEmptyMethod(t *testing.T) {
  2473. req, _ := NewRequest("GET", "http://foo.com/", nil)
  2474. req.Method = "" // docs say "For client requests an empty string means GET"
  2475. got, err := httputil.DumpRequestOut(req, false) // DumpRequestOut uses Transport
  2476. if err != nil {
  2477. t.Fatal(err)
  2478. }
  2479. if !strings.Contains(string(got), "GET ") {
  2480. t.Fatalf("expected substring 'GET '; got: %s", got)
  2481. }
  2482. }
  2483. func TestTransportSocketLateBinding(t *testing.T) {
  2484. setParallel(t)
  2485. defer afterTest(t)
  2486. mux := NewServeMux()
  2487. fooGate := make(chan bool, 1)
  2488. mux.HandleFunc("/foo", func(w ResponseWriter, r *Request) {
  2489. w.Header().Set("foo-ipport", r.RemoteAddr)
  2490. w.(Flusher).Flush()
  2491. <-fooGate
  2492. })
  2493. mux.HandleFunc("/bar", func(w ResponseWriter, r *Request) {
  2494. w.Header().Set("bar-ipport", r.RemoteAddr)
  2495. })
  2496. ts := httptest.NewServer(mux)
  2497. defer ts.Close()
  2498. dialGate := make(chan bool, 1)
  2499. c := ts.Client()
  2500. c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
  2501. if <-dialGate {
  2502. return net.Dial(n, addr)
  2503. }
  2504. return nil, errors.New("manually closed")
  2505. }
  2506. dialGate <- true // only allow one dial
  2507. fooRes, err := c.Get(ts.URL + "/foo")
  2508. if err != nil {
  2509. t.Fatal(err)
  2510. }
  2511. fooAddr := fooRes.Header.Get("foo-ipport")
  2512. if fooAddr == "" {
  2513. t.Fatal("No addr on /foo request")
  2514. }
  2515. time.AfterFunc(200*time.Millisecond, func() {
  2516. // let the foo response finish so we can use its
  2517. // connection for /bar
  2518. fooGate <- true
  2519. io.Copy(io.Discard, fooRes.Body)
  2520. fooRes.Body.Close()
  2521. })
  2522. barRes, err := c.Get(ts.URL + "/bar")
  2523. if err != nil {
  2524. t.Fatal(err)
  2525. }
  2526. barAddr := barRes.Header.Get("bar-ipport")
  2527. if barAddr != fooAddr {
  2528. t.Fatalf("/foo came from conn %q; /bar came from %q instead", fooAddr, barAddr)
  2529. }
  2530. barRes.Body.Close()
  2531. dialGate <- false
  2532. }
  2533. // Issue 2184
  2534. func TestTransportReading100Continue(t *testing.T) {
  2535. defer afterTest(t)
  2536. const numReqs = 5
  2537. reqBody := func(n int) string { return fmt.Sprintf("request body %d", n) }
  2538. reqID := func(n int) string { return fmt.Sprintf("REQ-ID-%d", n) }
  2539. send100Response := func(w *io.PipeWriter, r *io.PipeReader) {
  2540. defer w.Close()
  2541. defer r.Close()
  2542. br := bufio.NewReader(r)
  2543. n := 0
  2544. for {
  2545. n++
  2546. req, err := ReadRequest(br)
  2547. if err == io.EOF {
  2548. return
  2549. }
  2550. if err != nil {
  2551. t.Error(err)
  2552. return
  2553. }
  2554. slurp, err := io.ReadAll(req.Body)
  2555. if err != nil {
  2556. t.Errorf("Server request body slurp: %v", err)
  2557. return
  2558. }
  2559. id := req.Header.Get("Request-Id")
  2560. resCode := req.Header.Get("X-Want-Response-Code")
  2561. if resCode == "" {
  2562. resCode = "100 Continue"
  2563. if string(slurp) != reqBody(n) {
  2564. t.Errorf("Server got %q, %v; want %q", slurp, err, reqBody(n))
  2565. }
  2566. }
  2567. body := fmt.Sprintf("Response number %d", n)
  2568. v := []byte(strings.Replace(fmt.Sprintf(`HTTP/1.1 %s
  2569. Date: Thu, 28 Feb 2013 17:55:41 GMT
  2570. HTTP/1.1 200 OK
  2571. Content-Type: text/html
  2572. Echo-Request-Id: %s
  2573. Content-Length: %d
  2574. %s`, resCode, id, len(body), body), "\n", "\r\n", -1))
  2575. w.Write(v)
  2576. if id == reqID(numReqs) {
  2577. return
  2578. }
  2579. }
  2580. }
  2581. tr := &Transport{
  2582. Dial: func(n, addr string) (net.Conn, error) {
  2583. sr, sw := io.Pipe() // server read/write
  2584. cr, cw := io.Pipe() // client read/write
  2585. conn := &rwTestConn{
  2586. Reader: cr,
  2587. Writer: sw,
  2588. closeFunc: func() error {
  2589. sw.Close()
  2590. cw.Close()
  2591. return nil
  2592. },
  2593. }
  2594. go send100Response(cw, sr)
  2595. return conn, nil
  2596. },
  2597. DisableKeepAlives: false,
  2598. }
  2599. defer tr.CloseIdleConnections()
  2600. c := &Client{Transport: tr}
  2601. testResponse := func(req *Request, name string, wantCode int) {
  2602. t.Helper()
  2603. res, err := c.Do(req)
  2604. if err != nil {
  2605. t.Fatalf("%s: Do: %v", name, err)
  2606. }
  2607. if res.StatusCode != wantCode {
  2608. t.Fatalf("%s: Response Statuscode=%d; want %d", name, res.StatusCode, wantCode)
  2609. }
  2610. if id, idBack := req.Header.Get("Request-Id"), res.Header.Get("Echo-Request-Id"); id != "" && id != idBack {
  2611. t.Errorf("%s: response id %q != request id %q", name, idBack, id)
  2612. }
  2613. _, err = io.ReadAll(res.Body)
  2614. if err != nil {
  2615. t.Fatalf("%s: Slurp error: %v", name, err)
  2616. }
  2617. }
  2618. // Few 100 responses, making sure we're not off-by-one.
  2619. for i := 1; i <= numReqs; i++ {
  2620. req, _ := NewRequest("POST", "http://dummy.tld/", strings.NewReader(reqBody(i)))
  2621. req.Header.Set("Request-Id", reqID(i))
  2622. testResponse(req, fmt.Sprintf("100, %d/%d", i, numReqs), 200)
  2623. }
  2624. }
  2625. // Issue 17739: the HTTP client must ignore any unknown 1xx
  2626. // informational responses before the actual response.
  2627. func TestTransportIgnore1xxResponses(t *testing.T) {
  2628. setParallel(t)
  2629. defer afterTest(t)
  2630. cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  2631. conn, buf, _ := w.(Hijacker).Hijack()
  2632. buf.Write([]byte("HTTP/1.1 123 OneTwoThree\r\nFoo: bar\r\n\r\nHTTP/1.1 200 OK\r\nBar: baz\r\nContent-Length: 5\r\n\r\nHello"))
  2633. buf.Flush()
  2634. conn.Close()
  2635. }))
  2636. defer cst.close()
  2637. cst.tr.DisableKeepAlives = true // prevent log spam; our test server is hanging up anyway
  2638. var got bytes.Buffer
  2639. req, _ := NewRequest("GET", cst.ts.URL, nil)
  2640. req = req.WithContext(httptrace.WithClientTrace(context.Background(), &httptrace.ClientTrace{
  2641. Got1xxResponse: func(code int, header textproto.MIMEHeader) error {
  2642. fmt.Fprintf(&got, "1xx: code=%v, header=%v\n", code, header)
  2643. return nil
  2644. },
  2645. }))
  2646. res, err := cst.c.Do(req)
  2647. if err != nil {
  2648. t.Fatal(err)
  2649. }
  2650. defer res.Body.Close()
  2651. res.Write(&got)
  2652. want := "1xx: code=123, header=map[Foo:[bar]]\nHTTP/1.1 200 OK\r\nContent-Length: 5\r\nBar: baz\r\n\r\nHello"
  2653. if got.String() != want {
  2654. t.Errorf(" got: %q\nwant: %q\n", got.Bytes(), want)
  2655. }
  2656. }
  2657. func TestTransportLimits1xxResponses(t *testing.T) {
  2658. setParallel(t)
  2659. defer afterTest(t)
  2660. cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  2661. conn, buf, _ := w.(Hijacker).Hijack()
  2662. for i := 0; i < 10; i++ {
  2663. buf.Write([]byte("HTTP/1.1 123 OneTwoThree\r\n\r\n"))
  2664. }
  2665. buf.Write([]byte("HTTP/1.1 204 No Content\r\n\r\n"))
  2666. buf.Flush()
  2667. conn.Close()
  2668. }))
  2669. defer cst.close()
  2670. cst.tr.DisableKeepAlives = true // prevent log spam; our test server is hanging up anyway
  2671. res, err := cst.c.Get(cst.ts.URL)
  2672. if res != nil {
  2673. defer res.Body.Close()
  2674. }
  2675. got := fmt.Sprint(err)
  2676. wantSub := "too many 1xx informational responses"
  2677. if !strings.Contains(got, wantSub) {
  2678. t.Errorf("Get error = %v; want substring %q", err, wantSub)
  2679. }
  2680. }
  2681. // Issue 26161: the HTTP client must treat 101 responses
  2682. // as the final response.
  2683. func TestTransportTreat101Terminal(t *testing.T) {
  2684. setParallel(t)
  2685. defer afterTest(t)
  2686. cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  2687. conn, buf, _ := w.(Hijacker).Hijack()
  2688. buf.Write([]byte("HTTP/1.1 101 Switching Protocols\r\n\r\n"))
  2689. buf.Write([]byte("HTTP/1.1 204 No Content\r\n\r\n"))
  2690. buf.Flush()
  2691. conn.Close()
  2692. }))
  2693. defer cst.close()
  2694. res, err := cst.c.Get(cst.ts.URL)
  2695. if err != nil {
  2696. t.Fatal(err)
  2697. }
  2698. defer res.Body.Close()
  2699. if res.StatusCode != StatusSwitchingProtocols {
  2700. t.Errorf("StatusCode = %v; want 101 Switching Protocols", res.StatusCode)
  2701. }
  2702. }
  2703. type proxyFromEnvTest struct {
  2704. req string // URL to fetch; blank means "http://example.com"
  2705. env string // HTTP_PROXY
  2706. httpsenv string // HTTPS_PROXY
  2707. noenv string // NO_PROXY
  2708. reqmeth string // REQUEST_METHOD
  2709. want string
  2710. wanterr error
  2711. }
  2712. func (t proxyFromEnvTest) String() string {
  2713. var buf bytes.Buffer
  2714. space := func() {
  2715. if buf.Len() > 0 {
  2716. buf.WriteByte(' ')
  2717. }
  2718. }
  2719. if t.env != "" {
  2720. fmt.Fprintf(&buf, "http_proxy=%q", t.env)
  2721. }
  2722. if t.httpsenv != "" {
  2723. space()
  2724. fmt.Fprintf(&buf, "https_proxy=%q", t.httpsenv)
  2725. }
  2726. if t.noenv != "" {
  2727. space()
  2728. fmt.Fprintf(&buf, "no_proxy=%q", t.noenv)
  2729. }
  2730. if t.reqmeth != "" {
  2731. space()
  2732. fmt.Fprintf(&buf, "request_method=%q", t.reqmeth)
  2733. }
  2734. req := "http://example.com"
  2735. if t.req != "" {
  2736. req = t.req
  2737. }
  2738. space()
  2739. fmt.Fprintf(&buf, "req=%q", req)
  2740. return strings.TrimSpace(buf.String())
  2741. }
  2742. var proxyFromEnvTests = []proxyFromEnvTest{
  2743. {env: "127.0.0.1:8080", want: "http://127.0.0.1:8080"},
  2744. {env: "cache.corp.example.com:1234", want: "http://cache.corp.example.com:1234"},
  2745. {env: "cache.corp.example.com", want: "http://cache.corp.example.com"},
  2746. {env: "https://cache.corp.example.com", want: "https://cache.corp.example.com"},
  2747. {env: "http://127.0.0.1:8080", want: "http://127.0.0.1:8080"},
  2748. {env: "https://127.0.0.1:8080", want: "https://127.0.0.1:8080"},
  2749. {env: "socks5://127.0.0.1", want: "socks5://127.0.0.1"},
  2750. // Don't use secure for http
  2751. {req: "http://insecure.tld/", env: "http.proxy.tld", httpsenv: "secure.proxy.tld", want: "http://http.proxy.tld"},
  2752. // Use secure for https.
  2753. {req: "https://secure.tld/", env: "http.proxy.tld", httpsenv: "secure.proxy.tld", want: "http://secure.proxy.tld"},
  2754. {req: "https://secure.tld/", env: "http.proxy.tld", httpsenv: "https://secure.proxy.tld", want: "https://secure.proxy.tld"},
  2755. // Issue 16405: don't use HTTP_PROXY in a CGI environment,
  2756. // where HTTP_PROXY can be attacker-controlled.
  2757. {env: "http://10.1.2.3:8080", reqmeth: "POST",
  2758. want: "<nil>",
  2759. wanterr: errors.New("refusing to use HTTP_PROXY value in CGI environment; see golang.org/s/cgihttpproxy")},
  2760. {want: "<nil>"},
  2761. {noenv: "example.com", req: "http://example.com/", env: "proxy", want: "<nil>"},
  2762. {noenv: ".example.com", req: "http://example.com/", env: "proxy", want: "http://proxy"},
  2763. {noenv: "ample.com", req: "http://example.com/", env: "proxy", want: "http://proxy"},
  2764. {noenv: "example.com", req: "http://foo.example.com/", env: "proxy", want: "<nil>"},
  2765. {noenv: ".foo.com", req: "http://example.com/", env: "proxy", want: "http://proxy"},
  2766. }
  2767. func testProxyForRequest(t *testing.T, tt proxyFromEnvTest, proxyForRequest func(req *Request) (*url.URL, error)) {
  2768. t.Helper()
  2769. reqURL := tt.req
  2770. if reqURL == "" {
  2771. reqURL = "http://example.com"
  2772. }
  2773. req, _ := NewRequest("GET", reqURL, nil)
  2774. url, err := proxyForRequest(req)
  2775. if g, e := fmt.Sprintf("%v", err), fmt.Sprintf("%v", tt.wanterr); g != e {
  2776. t.Errorf("%v: got error = %q, want %q", tt, g, e)
  2777. return
  2778. }
  2779. if got := fmt.Sprintf("%s", url); got != tt.want {
  2780. t.Errorf("%v: got URL = %q, want %q", tt, url, tt.want)
  2781. }
  2782. }
  2783. func TestProxyFromEnvironment(t *testing.T) {
  2784. ResetProxyEnv()
  2785. defer ResetProxyEnv()
  2786. for _, tt := range proxyFromEnvTests {
  2787. testProxyForRequest(t, tt, func(req *Request) (*url.URL, error) {
  2788. os.Setenv("HTTP_PROXY", tt.env)
  2789. os.Setenv("HTTPS_PROXY", tt.httpsenv)
  2790. os.Setenv("NO_PROXY", tt.noenv)
  2791. os.Setenv("REQUEST_METHOD", tt.reqmeth)
  2792. ResetCachedEnvironment()
  2793. return ProxyFromEnvironment(req)
  2794. })
  2795. }
  2796. }
  2797. func TestProxyFromEnvironmentLowerCase(t *testing.T) {
  2798. ResetProxyEnv()
  2799. defer ResetProxyEnv()
  2800. for _, tt := range proxyFromEnvTests {
  2801. testProxyForRequest(t, tt, func(req *Request) (*url.URL, error) {
  2802. os.Setenv("http_proxy", tt.env)
  2803. os.Setenv("https_proxy", tt.httpsenv)
  2804. os.Setenv("no_proxy", tt.noenv)
  2805. os.Setenv("REQUEST_METHOD", tt.reqmeth)
  2806. ResetCachedEnvironment()
  2807. return ProxyFromEnvironment(req)
  2808. })
  2809. }
  2810. }
  2811. func TestIdleConnChannelLeak(t *testing.T) {
  2812. // Not parallel: uses global test hooks.
  2813. var mu sync.Mutex
  2814. var n int
  2815. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2816. mu.Lock()
  2817. n++
  2818. mu.Unlock()
  2819. }))
  2820. defer ts.Close()
  2821. const nReqs = 5
  2822. didRead := make(chan bool, nReqs)
  2823. SetReadLoopBeforeNextReadHook(func() { didRead <- true })
  2824. defer SetReadLoopBeforeNextReadHook(nil)
  2825. c := ts.Client()
  2826. tr := c.Transport.(*Transport)
  2827. tr.Dial = func(netw, addr string) (net.Conn, error) {
  2828. return net.Dial(netw, ts.Listener.Addr().String())
  2829. }
  2830. // First, without keep-alives.
  2831. for _, disableKeep := range []bool{true, false} {
  2832. tr.DisableKeepAlives = disableKeep
  2833. for i := 0; i < nReqs; i++ {
  2834. _, err := c.Get(fmt.Sprintf("http://foo-host-%d.tld/", i))
  2835. if err != nil {
  2836. t.Fatal(err)
  2837. }
  2838. // Note: no res.Body.Close is needed here, since the
  2839. // response Content-Length is zero. Perhaps the test
  2840. // should be more explicit and use a HEAD, but tests
  2841. // elsewhere guarantee that zero byte responses generate
  2842. // a "Content-Length: 0" instead of chunking.
  2843. }
  2844. // At this point, each of the 5 Transport.readLoop goroutines
  2845. // are scheduling noting that there are no response bodies (see
  2846. // earlier comment), and are then calling putIdleConn, which
  2847. // decrements this count. Usually that happens quickly, which is
  2848. // why this test has seemed to work for ages. But it's still
  2849. // racey: we have wait for them to finish first. See Issue 10427
  2850. for i := 0; i < nReqs; i++ {
  2851. <-didRead
  2852. }
  2853. if got := tr.IdleConnWaitMapSizeForTesting(); got != 0 {
  2854. t.Fatalf("for DisableKeepAlives = %v, map size = %d; want 0", disableKeep, got)
  2855. }
  2856. }
  2857. }
  2858. // Verify the status quo: that the Client.Post function coerces its
  2859. // body into a ReadCloser if it's a Closer, and that the Transport
  2860. // then closes it.
  2861. func TestTransportClosesRequestBody(t *testing.T) {
  2862. defer afterTest(t)
  2863. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2864. io.Copy(io.Discard, r.Body)
  2865. }))
  2866. defer ts.Close()
  2867. c := ts.Client()
  2868. closes := 0
  2869. res, err := c.Post(ts.URL, "text/plain", countCloseReader{&closes, strings.NewReader("hello")})
  2870. if err != nil {
  2871. t.Fatal(err)
  2872. }
  2873. res.Body.Close()
  2874. if closes != 1 {
  2875. t.Errorf("closes = %d; want 1", closes)
  2876. }
  2877. }
  2878. func TestTransportTLSHandshakeTimeout(t *testing.T) {
  2879. defer afterTest(t)
  2880. if testing.Short() {
  2881. t.Skip("skipping in short mode")
  2882. }
  2883. ln := newLocalListener(t)
  2884. defer ln.Close()
  2885. testdonec := make(chan struct{})
  2886. defer close(testdonec)
  2887. go func() {
  2888. c, err := ln.Accept()
  2889. if err != nil {
  2890. t.Error(err)
  2891. return
  2892. }
  2893. <-testdonec
  2894. c.Close()
  2895. }()
  2896. getdonec := make(chan struct{})
  2897. go func() {
  2898. defer close(getdonec)
  2899. tr := &Transport{
  2900. Dial: func(_, _ string) (net.Conn, error) {
  2901. return net.Dial("tcp", ln.Addr().String())
  2902. },
  2903. TLSHandshakeTimeout: 250 * time.Millisecond,
  2904. }
  2905. cl := &Client{Transport: tr}
  2906. _, err := cl.Get("https://dummy.tld/")
  2907. if err == nil {
  2908. t.Error("expected error")
  2909. return
  2910. }
  2911. ue, ok := err.(*url.Error)
  2912. if !ok {
  2913. t.Errorf("expected url.Error; got %#v", err)
  2914. return
  2915. }
  2916. ne, ok := ue.Err.(net.Error)
  2917. if !ok {
  2918. t.Errorf("expected net.Error; got %#v", err)
  2919. return
  2920. }
  2921. if !ne.Timeout() {
  2922. t.Errorf("expected timeout error; got %v", err)
  2923. }
  2924. if !strings.Contains(err.Error(), "handshake timeout") {
  2925. t.Errorf("expected 'handshake timeout' in error; got %v", err)
  2926. }
  2927. }()
  2928. select {
  2929. case <-getdonec:
  2930. case <-time.After(5 * time.Second):
  2931. t.Error("test timeout; TLS handshake hung?")
  2932. }
  2933. }
  2934. // Trying to repro golang.org/issue/3514
  2935. func TestTLSServerClosesConnection(t *testing.T) {
  2936. defer afterTest(t)
  2937. closedc := make(chan bool, 1)
  2938. ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2939. if strings.Contains(r.URL.Path, "/keep-alive-then-die") {
  2940. conn, _, _ := w.(Hijacker).Hijack()
  2941. conn.Write([]byte("HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nfoo"))
  2942. conn.Close()
  2943. closedc <- true
  2944. return
  2945. }
  2946. fmt.Fprintf(w, "hello")
  2947. }))
  2948. defer ts.Close()
  2949. c := ts.Client()
  2950. tr := c.Transport.(*Transport)
  2951. var nSuccess = 0
  2952. var errs []error
  2953. const trials = 20
  2954. for i := 0; i < trials; i++ {
  2955. tr.CloseIdleConnections()
  2956. res, err := c.Get(ts.URL + "/keep-alive-then-die")
  2957. if err != nil {
  2958. t.Fatal(err)
  2959. }
  2960. <-closedc
  2961. slurp, err := io.ReadAll(res.Body)
  2962. if err != nil {
  2963. t.Fatal(err)
  2964. }
  2965. if string(slurp) != "foo" {
  2966. t.Errorf("Got %q, want foo", slurp)
  2967. }
  2968. // Now try again and see if we successfully
  2969. // pick a new connection.
  2970. res, err = c.Get(ts.URL + "/")
  2971. if err != nil {
  2972. errs = append(errs, err)
  2973. continue
  2974. }
  2975. slurp, err = io.ReadAll(res.Body)
  2976. if err != nil {
  2977. errs = append(errs, err)
  2978. continue
  2979. }
  2980. nSuccess++
  2981. }
  2982. if nSuccess > 0 {
  2983. t.Logf("successes = %d of %d", nSuccess, trials)
  2984. } else {
  2985. t.Errorf("All runs failed:")
  2986. }
  2987. for _, err := range errs {
  2988. t.Logf(" err: %v", err)
  2989. }
  2990. }
  2991. // byteFromChanReader is an io.Reader that reads a single byte at a
  2992. // time from the channel. When the channel is closed, the reader
  2993. // returns io.EOF.
  2994. type byteFromChanReader chan byte
  2995. func (c byteFromChanReader) Read(p []byte) (n int, err error) {
  2996. if len(p) == 0 {
  2997. return
  2998. }
  2999. b, ok := <-c
  3000. if !ok {
  3001. return 0, io.EOF
  3002. }
  3003. p[0] = b
  3004. return 1, nil
  3005. }
  3006. // Verifies that the Transport doesn't reuse a connection in the case
  3007. // where the server replies before the request has been fully
  3008. // written. We still honor that reply (see TestIssue3595), but don't
  3009. // send future requests on the connection because it's then in a
  3010. // questionable state.
  3011. // golang.org/issue/7569
  3012. func TestTransportNoReuseAfterEarlyResponse(t *testing.T) {
  3013. setParallel(t)
  3014. defer afterTest(t)
  3015. var sconn struct {
  3016. sync.Mutex
  3017. c net.Conn
  3018. }
  3019. var getOkay bool
  3020. closeConn := func() {
  3021. sconn.Lock()
  3022. defer sconn.Unlock()
  3023. if sconn.c != nil {
  3024. sconn.c.Close()
  3025. sconn.c = nil
  3026. if !getOkay {
  3027. t.Logf("Closed server connection")
  3028. }
  3029. }
  3030. }
  3031. defer closeConn()
  3032. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3033. if r.Method == "GET" {
  3034. io.WriteString(w, "bar")
  3035. return
  3036. }
  3037. conn, _, _ := w.(Hijacker).Hijack()
  3038. sconn.Lock()
  3039. sconn.c = conn
  3040. sconn.Unlock()
  3041. conn.Write([]byte("HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nfoo")) // keep-alive
  3042. go io.Copy(io.Discard, conn)
  3043. }))
  3044. defer ts.Close()
  3045. c := ts.Client()
  3046. const bodySize = 256 << 10
  3047. finalBit := make(byteFromChanReader, 1)
  3048. req, _ := NewRequest("POST", ts.URL, io.MultiReader(io.LimitReader(neverEnding('x'), bodySize-1), finalBit))
  3049. req.ContentLength = bodySize
  3050. res, err := c.Do(req)
  3051. if err := wantBody(res, err, "foo"); err != nil {
  3052. t.Errorf("POST response: %v", err)
  3053. }
  3054. donec := make(chan bool)
  3055. go func() {
  3056. defer close(donec)
  3057. res, err = c.Get(ts.URL)
  3058. if err := wantBody(res, err, "bar"); err != nil {
  3059. t.Errorf("GET response: %v", err)
  3060. return
  3061. }
  3062. getOkay = true // suppress test noise
  3063. }()
  3064. time.AfterFunc(5*time.Second, closeConn)
  3065. select {
  3066. case <-donec:
  3067. finalBit <- 'x' // unblock the writeloop of the first Post
  3068. close(finalBit)
  3069. case <-time.After(7 * time.Second):
  3070. t.Fatal("timeout waiting for GET request to finish")
  3071. }
  3072. }
  3073. // Tests that we don't leak Transport persistConn.readLoop goroutines
  3074. // when a server hangs up immediately after saying it would keep-alive.
  3075. func TestTransportIssue10457(t *testing.T) {
  3076. defer afterTest(t) // used to fail in goroutine leak check
  3077. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3078. // Send a response with no body, keep-alive
  3079. // (implicit), and then lie and immediately close the
  3080. // connection. This forces the Transport's readLoop to
  3081. // immediately Peek an io.EOF and get to the point
  3082. // that used to hang.
  3083. conn, _, _ := w.(Hijacker).Hijack()
  3084. conn.Write([]byte("HTTP/1.1 200 OK\r\nFoo: Bar\r\nContent-Length: 0\r\n\r\n")) // keep-alive
  3085. conn.Close()
  3086. }))
  3087. defer ts.Close()
  3088. c := ts.Client()
  3089. res, err := c.Get(ts.URL)
  3090. if err != nil {
  3091. t.Fatalf("Get: %v", err)
  3092. }
  3093. defer res.Body.Close()
  3094. // Just a sanity check that we at least get the response. The real
  3095. // test here is that the "defer afterTest" above doesn't find any
  3096. // leaked goroutines.
  3097. if got, want := res.Header.Get("Foo"), "Bar"; got != want {
  3098. t.Errorf("Foo header = %q; want %q", got, want)
  3099. }
  3100. }
  3101. type closerFunc func() error
  3102. func (f closerFunc) Close() error { return f() }
  3103. type writerFuncConn struct {
  3104. net.Conn
  3105. write func(p []byte) (n int, err error)
  3106. }
  3107. func (c writerFuncConn) Write(p []byte) (n int, err error) { return c.write(p) }
  3108. // Issues 4677, 18241, and 17844. If we try to reuse a connection that the
  3109. // server is in the process of closing, we may end up successfully writing out
  3110. // our request (or a portion of our request) only to find a connection error
  3111. // when we try to read from (or finish writing to) the socket.
  3112. //
  3113. // NOTE: we resend a request only if:
  3114. // - we reused a keep-alive connection
  3115. // - we haven't yet received any header data
  3116. // - either we wrote no bytes to the server, or the request is idempotent
  3117. // This automatically prevents an infinite resend loop because we'll run out of
  3118. // the cached keep-alive connections eventually.
  3119. func TestRetryRequestsOnError(t *testing.T) {
  3120. newRequest := func(method, urlStr string, body io.Reader) *Request {
  3121. req, err := NewRequest(method, urlStr, body)
  3122. if err != nil {
  3123. t.Fatal(err)
  3124. }
  3125. return req
  3126. }
  3127. testCases := []struct {
  3128. name string
  3129. failureN int
  3130. failureErr error
  3131. // Note that we can't just re-use the Request object across calls to c.Do
  3132. // because we need to rewind Body between calls. (GetBody is only used to
  3133. // rewind Body on failure and redirects, not just because it's done.)
  3134. req func() *Request
  3135. reqString string
  3136. }{
  3137. {
  3138. name: "IdempotentNoBodySomeWritten",
  3139. // Believe that we've written some bytes to the server, so we know we're
  3140. // not just in the "retry when no bytes sent" case".
  3141. failureN: 1,
  3142. // Use the specific error that shouldRetryRequest looks for with idempotent requests.
  3143. failureErr: ExportErrServerClosedIdle,
  3144. req: func() *Request {
  3145. return newRequest("GET", "http://fake.golang", nil)
  3146. },
  3147. reqString: `GET / HTTP/1.1\r\nHost: fake.golang\r\nUser-Agent: Go-http-client/1.1\r\nAccept-Encoding: gzip\r\n\r\n`,
  3148. },
  3149. {
  3150. name: "IdempotentGetBodySomeWritten",
  3151. // Believe that we've written some bytes to the server, so we know we're
  3152. // not just in the "retry when no bytes sent" case".
  3153. failureN: 1,
  3154. // Use the specific error that shouldRetryRequest looks for with idempotent requests.
  3155. failureErr: ExportErrServerClosedIdle,
  3156. req: func() *Request {
  3157. return newRequest("GET", "http://fake.golang", strings.NewReader("foo\n"))
  3158. },
  3159. reqString: `GET / HTTP/1.1\r\nHost: fake.golang\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 4\r\nAccept-Encoding: gzip\r\n\r\nfoo\n`,
  3160. },
  3161. {
  3162. name: "NothingWrittenNoBody",
  3163. // It's key that we return 0 here -- that's what enables Transport to know
  3164. // that nothing was written, even though this is a non-idempotent request.
  3165. failureN: 0,
  3166. failureErr: errors.New("second write fails"),
  3167. req: func() *Request {
  3168. return newRequest("DELETE", "http://fake.golang", nil)
  3169. },
  3170. reqString: `DELETE / HTTP/1.1\r\nHost: fake.golang\r\nUser-Agent: Go-http-client/1.1\r\nAccept-Encoding: gzip\r\n\r\n`,
  3171. },
  3172. {
  3173. name: "NothingWrittenGetBody",
  3174. // It's key that we return 0 here -- that's what enables Transport to know
  3175. // that nothing was written, even though this is a non-idempotent request.
  3176. failureN: 0,
  3177. failureErr: errors.New("second write fails"),
  3178. // Note that NewRequest will set up GetBody for strings.Reader, which is
  3179. // required for the retry to occur
  3180. req: func() *Request {
  3181. return newRequest("POST", "http://fake.golang", strings.NewReader("foo\n"))
  3182. },
  3183. reqString: `POST / HTTP/1.1\r\nHost: fake.golang\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 4\r\nAccept-Encoding: gzip\r\n\r\nfoo\n`,
  3184. },
  3185. }
  3186. for _, tc := range testCases {
  3187. t.Run(tc.name, func(t *testing.T) {
  3188. defer afterTest(t)
  3189. var (
  3190. mu sync.Mutex
  3191. logbuf bytes.Buffer
  3192. )
  3193. logf := func(format string, args ...any) {
  3194. mu.Lock()
  3195. defer mu.Unlock()
  3196. fmt.Fprintf(&logbuf, format, args...)
  3197. logbuf.WriteByte('\n')
  3198. }
  3199. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3200. logf("Handler")
  3201. w.Header().Set("X-Status", "ok")
  3202. }))
  3203. defer ts.Close()
  3204. var writeNumAtomic int32
  3205. c := ts.Client()
  3206. c.Transport.(*Transport).Dial = func(network, addr string) (net.Conn, error) {
  3207. logf("Dial")
  3208. c, err := net.Dial(network, ts.Listener.Addr().String())
  3209. if err != nil {
  3210. logf("Dial error: %v", err)
  3211. return nil, err
  3212. }
  3213. return &writerFuncConn{
  3214. Conn: c,
  3215. write: func(p []byte) (n int, err error) {
  3216. if atomic.AddInt32(&writeNumAtomic, 1) == 2 {
  3217. logf("intentional write failure")
  3218. return tc.failureN, tc.failureErr
  3219. }
  3220. logf("Write(%q)", p)
  3221. return c.Write(p)
  3222. },
  3223. }, nil
  3224. }
  3225. SetRoundTripRetried(func() {
  3226. logf("Retried.")
  3227. })
  3228. defer SetRoundTripRetried(nil)
  3229. for i := 0; i < 3; i++ {
  3230. t0 := time.Now()
  3231. req := tc.req()
  3232. res, err := c.Do(req)
  3233. if err != nil {
  3234. if time.Since(t0) < MaxWriteWaitBeforeConnReuse/2 {
  3235. mu.Lock()
  3236. got := logbuf.String()
  3237. mu.Unlock()
  3238. t.Fatalf("i=%d: Do = %v; log:\n%s", i, err, got)
  3239. }
  3240. t.Skipf("connection likely wasn't recycled within %d, interfering with actual test; skipping", MaxWriteWaitBeforeConnReuse)
  3241. }
  3242. res.Body.Close()
  3243. if res.Request != req {
  3244. t.Errorf("Response.Request != original request; want identical Request")
  3245. }
  3246. }
  3247. mu.Lock()
  3248. got := logbuf.String()
  3249. mu.Unlock()
  3250. want := fmt.Sprintf(`Dial
  3251. Write("%s")
  3252. Handler
  3253. intentional write failure
  3254. Retried.
  3255. Dial
  3256. Write("%s")
  3257. Handler
  3258. Write("%s")
  3259. Handler
  3260. `, tc.reqString, tc.reqString, tc.reqString)
  3261. if got != want {
  3262. t.Errorf("Log of events differs. Got:\n%s\nWant:\n%s", got, want)
  3263. }
  3264. })
  3265. }
  3266. }
  3267. // Issue 6981
  3268. func TestTransportClosesBodyOnError(t *testing.T) {
  3269. setParallel(t)
  3270. defer afterTest(t)
  3271. readBody := make(chan error, 1)
  3272. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3273. _, err := io.ReadAll(r.Body)
  3274. readBody <- err
  3275. }))
  3276. defer ts.Close()
  3277. c := ts.Client()
  3278. fakeErr := errors.New("fake error")
  3279. didClose := make(chan bool, 1)
  3280. req, _ := NewRequest("POST", ts.URL, struct {
  3281. io.Reader
  3282. io.Closer
  3283. }{
  3284. io.MultiReader(io.LimitReader(neverEnding('x'), 1<<20), iotest.ErrReader(fakeErr)),
  3285. closerFunc(func() error {
  3286. select {
  3287. case didClose <- true:
  3288. default:
  3289. }
  3290. return nil
  3291. }),
  3292. })
  3293. res, err := c.Do(req)
  3294. if res != nil {
  3295. defer res.Body.Close()
  3296. }
  3297. if err == nil || !strings.Contains(err.Error(), fakeErr.Error()) {
  3298. t.Fatalf("Do error = %v; want something containing %q", err, fakeErr.Error())
  3299. }
  3300. select {
  3301. case err := <-readBody:
  3302. if err == nil {
  3303. t.Errorf("Unexpected success reading request body from handler; want 'unexpected EOF reading trailer'")
  3304. }
  3305. case <-time.After(5 * time.Second):
  3306. t.Error("timeout waiting for server handler to complete")
  3307. }
  3308. select {
  3309. case <-didClose:
  3310. default:
  3311. t.Errorf("didn't see Body.Close")
  3312. }
  3313. }
  3314. func TestTransportDialTLS(t *testing.T) {
  3315. setParallel(t)
  3316. defer afterTest(t)
  3317. var mu sync.Mutex // guards following
  3318. var gotReq, didDial bool
  3319. ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3320. mu.Lock()
  3321. gotReq = true
  3322. mu.Unlock()
  3323. }))
  3324. defer ts.Close()
  3325. c := ts.Client()
  3326. c.Transport.(*Transport).DialTLS = func(netw, addr string) (net.Conn, error) {
  3327. mu.Lock()
  3328. didDial = true
  3329. mu.Unlock()
  3330. c, err := tls.Dial(netw, addr, c.Transport.(*Transport).TLSClientConfig)
  3331. if err != nil {
  3332. return nil, err
  3333. }
  3334. return c, c.Handshake()
  3335. }
  3336. res, err := c.Get(ts.URL)
  3337. if err != nil {
  3338. t.Fatal(err)
  3339. }
  3340. res.Body.Close()
  3341. mu.Lock()
  3342. if !gotReq {
  3343. t.Error("didn't get request")
  3344. }
  3345. if !didDial {
  3346. t.Error("didn't use dial hook")
  3347. }
  3348. }
  3349. func TestTransportDialContext(t *testing.T) {
  3350. setParallel(t)
  3351. defer afterTest(t)
  3352. var mu sync.Mutex // guards following
  3353. var gotReq bool
  3354. var receivedContext context.Context
  3355. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3356. mu.Lock()
  3357. gotReq = true
  3358. mu.Unlock()
  3359. }))
  3360. defer ts.Close()
  3361. c := ts.Client()
  3362. c.Transport.(*Transport).DialContext = func(ctx context.Context, netw, addr string) (net.Conn, error) {
  3363. mu.Lock()
  3364. receivedContext = ctx
  3365. mu.Unlock()
  3366. return net.Dial(netw, addr)
  3367. }
  3368. req, err := NewRequest("GET", ts.URL, nil)
  3369. if err != nil {
  3370. t.Fatal(err)
  3371. }
  3372. ctx := context.WithValue(context.Background(), "some-key", "some-value")
  3373. res, err := c.Do(req.WithContext(ctx))
  3374. if err != nil {
  3375. t.Fatal(err)
  3376. }
  3377. res.Body.Close()
  3378. mu.Lock()
  3379. if !gotReq {
  3380. t.Error("didn't get request")
  3381. }
  3382. if receivedContext != ctx {
  3383. t.Error("didn't receive correct context")
  3384. }
  3385. }
  3386. func TestTransportDialTLSContext(t *testing.T) {
  3387. setParallel(t)
  3388. defer afterTest(t)
  3389. var mu sync.Mutex // guards following
  3390. var gotReq bool
  3391. var receivedContext context.Context
  3392. ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3393. mu.Lock()
  3394. gotReq = true
  3395. mu.Unlock()
  3396. }))
  3397. defer ts.Close()
  3398. c := ts.Client()
  3399. c.Transport.(*Transport).DialTLSContext = func(ctx context.Context, netw, addr string) (net.Conn, error) {
  3400. mu.Lock()
  3401. receivedContext = ctx
  3402. mu.Unlock()
  3403. c, err := tls.Dial(netw, addr, c.Transport.(*Transport).TLSClientConfig)
  3404. if err != nil {
  3405. return nil, err
  3406. }
  3407. return c, c.HandshakeContext(ctx)
  3408. }
  3409. req, err := NewRequest("GET", ts.URL, nil)
  3410. if err != nil {
  3411. t.Fatal(err)
  3412. }
  3413. ctx := context.WithValue(context.Background(), "some-key", "some-value")
  3414. res, err := c.Do(req.WithContext(ctx))
  3415. if err != nil {
  3416. t.Fatal(err)
  3417. }
  3418. res.Body.Close()
  3419. mu.Lock()
  3420. if !gotReq {
  3421. t.Error("didn't get request")
  3422. }
  3423. if receivedContext != ctx {
  3424. t.Error("didn't receive correct context")
  3425. }
  3426. }
  3427. // Test for issue 8755
  3428. // Ensure that if a proxy returns an error, it is exposed by RoundTrip
  3429. func TestRoundTripReturnsProxyError(t *testing.T) {
  3430. badProxy := func(*Request) (*url.URL, error) {
  3431. return nil, errors.New("errorMessage")
  3432. }
  3433. tr := &Transport{Proxy: badProxy}
  3434. req, _ := NewRequest("GET", "http://example.com", nil)
  3435. _, err := tr.RoundTrip(req)
  3436. if err == nil {
  3437. t.Error("Expected proxy error to be returned by RoundTrip")
  3438. }
  3439. }
  3440. // tests that putting an idle conn after a call to CloseIdleConns does return it
  3441. func TestTransportCloseIdleConnsThenReturn(t *testing.T) {
  3442. tr := &Transport{}
  3443. wantIdle := func(when string, n int) bool {
  3444. got := tr.IdleConnCountForTesting("http", "example.com") // key used by PutIdleTestConn
  3445. if got == n {
  3446. return true
  3447. }
  3448. t.Errorf("%s: idle conns = %d; want %d", when, got, n)
  3449. return false
  3450. }
  3451. wantIdle("start", 0)
  3452. if !tr.PutIdleTestConn("http", "example.com") {
  3453. t.Fatal("put failed")
  3454. }
  3455. if !tr.PutIdleTestConn("http", "example.com") {
  3456. t.Fatal("second put failed")
  3457. }
  3458. wantIdle("after put", 2)
  3459. tr.CloseIdleConnections()
  3460. if !tr.IsIdleForTesting() {
  3461. t.Error("should be idle after CloseIdleConnections")
  3462. }
  3463. wantIdle("after close idle", 0)
  3464. if tr.PutIdleTestConn("http", "example.com") {
  3465. t.Fatal("put didn't fail")
  3466. }
  3467. wantIdle("after second put", 0)
  3468. tr.QueueForIdleConnForTesting() // should toggle the transport out of idle mode
  3469. if tr.IsIdleForTesting() {
  3470. t.Error("shouldn't be idle after QueueForIdleConnForTesting")
  3471. }
  3472. if !tr.PutIdleTestConn("http", "example.com") {
  3473. t.Fatal("after re-activation")
  3474. }
  3475. wantIdle("after final put", 1)
  3476. }
  3477. // Test for issue 34282
  3478. // Ensure that getConn doesn't call the GotConn trace hook on a HTTP/2 idle conn
  3479. func TestTransportTraceGotConnH2IdleConns(t *testing.T) {
  3480. tr := &Transport{}
  3481. wantIdle := func(when string, n int) bool {
  3482. got := tr.IdleConnCountForTesting("https", "example.com:443") // key used by PutIdleTestConnH2
  3483. if got == n {
  3484. return true
  3485. }
  3486. t.Errorf("%s: idle conns = %d; want %d", when, got, n)
  3487. return false
  3488. }
  3489. wantIdle("start", 0)
  3490. alt := funcRoundTripper(func() {})
  3491. if !tr.PutIdleTestConnH2("https", "example.com:443", alt) {
  3492. t.Fatal("put failed")
  3493. }
  3494. wantIdle("after put", 1)
  3495. ctx := httptrace.WithClientTrace(context.Background(), &httptrace.ClientTrace{
  3496. GotConn: func(httptrace.GotConnInfo) {
  3497. // tr.getConn should leave it for the HTTP/2 alt to call GotConn.
  3498. t.Error("GotConn called")
  3499. },
  3500. })
  3501. req, _ := NewRequestWithContext(ctx, MethodGet, "https://example.com", nil)
  3502. _, err := tr.RoundTrip(req)
  3503. if err != errFakeRoundTrip {
  3504. t.Errorf("got error: %v; want %q", err, errFakeRoundTrip)
  3505. }
  3506. wantIdle("after round trip", 1)
  3507. }
  3508. func TestTransportRemovesH2ConnsAfterIdle(t *testing.T) {
  3509. if testing.Short() {
  3510. t.Skip("skipping in short mode")
  3511. }
  3512. trFunc := func(tr *Transport) {
  3513. tr.MaxConnsPerHost = 1
  3514. tr.MaxIdleConnsPerHost = 1
  3515. tr.IdleConnTimeout = 10 * time.Millisecond
  3516. }
  3517. cst := newClientServerTest(t, h2Mode, HandlerFunc(func(w ResponseWriter, r *Request) {}), trFunc)
  3518. defer cst.close()
  3519. if _, err := cst.c.Get(cst.ts.URL); err != nil {
  3520. t.Fatalf("got error: %s", err)
  3521. }
  3522. time.Sleep(100 * time.Millisecond)
  3523. got := make(chan error)
  3524. go func() {
  3525. if _, err := cst.c.Get(cst.ts.URL); err != nil {
  3526. got <- err
  3527. }
  3528. close(got)
  3529. }()
  3530. timeout := time.NewTimer(5 * time.Second)
  3531. defer timeout.Stop()
  3532. select {
  3533. case err := <-got:
  3534. if err != nil {
  3535. t.Fatalf("got error: %s", err)
  3536. }
  3537. case <-timeout.C:
  3538. t.Fatal("request never completed")
  3539. }
  3540. }
  3541. // This tests that a client requesting a content range won't also
  3542. // implicitly ask for gzip support. If they want that, they need to do it
  3543. // on their own.
  3544. // golang.org/issue/8923
  3545. func TestTransportRangeAndGzip(t *testing.T) {
  3546. defer afterTest(t)
  3547. reqc := make(chan *Request, 1)
  3548. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3549. reqc <- r
  3550. }))
  3551. defer ts.Close()
  3552. c := ts.Client()
  3553. req, _ := NewRequest("GET", ts.URL, nil)
  3554. req.Header.Set("Range", "bytes=7-11")
  3555. res, err := c.Do(req)
  3556. if err != nil {
  3557. t.Fatal(err)
  3558. }
  3559. select {
  3560. case r := <-reqc:
  3561. if strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
  3562. t.Error("Transport advertised gzip support in the Accept header")
  3563. }
  3564. if r.Header.Get("Range") == "" {
  3565. t.Error("no Range in request")
  3566. }
  3567. case <-time.After(10 * time.Second):
  3568. t.Fatal("timeout")
  3569. }
  3570. res.Body.Close()
  3571. }
  3572. // Test for issue 10474
  3573. func TestTransportResponseCancelRace(t *testing.T) {
  3574. defer afterTest(t)
  3575. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3576. // important that this response has a body.
  3577. var b [1024]byte
  3578. w.Write(b[:])
  3579. }))
  3580. defer ts.Close()
  3581. tr := ts.Client().Transport.(*Transport)
  3582. req, err := NewRequest("GET", ts.URL, nil)
  3583. if err != nil {
  3584. t.Fatal(err)
  3585. }
  3586. res, err := tr.RoundTrip(req)
  3587. if err != nil {
  3588. t.Fatal(err)
  3589. }
  3590. // If we do an early close, Transport just throws the connection away and
  3591. // doesn't reuse it. In order to trigger the bug, it has to reuse the connection
  3592. // so read the body
  3593. if _, err := io.Copy(io.Discard, res.Body); err != nil {
  3594. t.Fatal(err)
  3595. }
  3596. req2, err := NewRequest("GET", ts.URL, nil)
  3597. if err != nil {
  3598. t.Fatal(err)
  3599. }
  3600. tr.CancelRequest(req)
  3601. res, err = tr.RoundTrip(req2)
  3602. if err != nil {
  3603. t.Fatal(err)
  3604. }
  3605. res.Body.Close()
  3606. }
  3607. // Test for issue 19248: Content-Encoding's value is case insensitive.
  3608. func TestTransportContentEncodingCaseInsensitive(t *testing.T) {
  3609. setParallel(t)
  3610. defer afterTest(t)
  3611. for _, ce := range []string{"gzip", "GZIP"} {
  3612. ce := ce
  3613. t.Run(ce, func(t *testing.T) {
  3614. const encodedString = "Hello Gopher"
  3615. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3616. w.Header().Set("Content-Encoding", ce)
  3617. gz := gzip.NewWriter(w)
  3618. gz.Write([]byte(encodedString))
  3619. gz.Close()
  3620. }))
  3621. defer ts.Close()
  3622. res, err := ts.Client().Get(ts.URL)
  3623. if err != nil {
  3624. t.Fatal(err)
  3625. }
  3626. body, err := io.ReadAll(res.Body)
  3627. res.Body.Close()
  3628. if err != nil {
  3629. t.Fatal(err)
  3630. }
  3631. if string(body) != encodedString {
  3632. t.Fatalf("Expected body %q, got: %q\n", encodedString, string(body))
  3633. }
  3634. })
  3635. }
  3636. }
  3637. func TestTransportDialCancelRace(t *testing.T) {
  3638. defer afterTest(t)
  3639. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
  3640. defer ts.Close()
  3641. tr := ts.Client().Transport.(*Transport)
  3642. req, err := NewRequest("GET", ts.URL, nil)
  3643. if err != nil {
  3644. t.Fatal(err)
  3645. }
  3646. SetEnterRoundTripHook(func() {
  3647. tr.CancelRequest(req)
  3648. })
  3649. defer SetEnterRoundTripHook(nil)
  3650. res, err := tr.RoundTrip(req)
  3651. if err != ExportErrRequestCanceled {
  3652. t.Errorf("expected canceled request error; got %v", err)
  3653. if err == nil {
  3654. res.Body.Close()
  3655. }
  3656. }
  3657. }
  3658. // logWritesConn is a net.Conn that logs each Write call to writes
  3659. // and then proxies to w.
  3660. // It proxies Read calls to a reader it receives from rch.
  3661. type logWritesConn struct {
  3662. net.Conn // nil. crash on use.
  3663. w io.Writer
  3664. rch <-chan io.Reader
  3665. r io.Reader // nil until received by rch
  3666. mu sync.Mutex
  3667. writes []string
  3668. }
  3669. func (c *logWritesConn) Write(p []byte) (n int, err error) {
  3670. c.mu.Lock()
  3671. defer c.mu.Unlock()
  3672. c.writes = append(c.writes, string(p))
  3673. return c.w.Write(p)
  3674. }
  3675. func (c *logWritesConn) Read(p []byte) (n int, err error) {
  3676. if c.r == nil {
  3677. c.r = <-c.rch
  3678. }
  3679. return c.r.Read(p)
  3680. }
  3681. func (c *logWritesConn) Close() error { return nil }
  3682. // Issue 6574
  3683. func TestTransportFlushesBodyChunks(t *testing.T) {
  3684. defer afterTest(t)
  3685. resBody := make(chan io.Reader, 1)
  3686. connr, connw := io.Pipe() // connection pipe pair
  3687. lw := &logWritesConn{
  3688. rch: resBody,
  3689. w: connw,
  3690. }
  3691. tr := &Transport{
  3692. Dial: func(network, addr string) (net.Conn, error) {
  3693. return lw, nil
  3694. },
  3695. }
  3696. bodyr, bodyw := io.Pipe() // body pipe pair
  3697. go func() {
  3698. defer bodyw.Close()
  3699. for i := 0; i < 3; i++ {
  3700. fmt.Fprintf(bodyw, "num%d\n", i)
  3701. }
  3702. }()
  3703. resc := make(chan *Response)
  3704. go func() {
  3705. req, _ := NewRequest("POST", "http://localhost:8080", bodyr)
  3706. req.Header.Set("User-Agent", "x") // known value for test
  3707. res, err := tr.RoundTrip(req)
  3708. if err != nil {
  3709. t.Errorf("RoundTrip: %v", err)
  3710. close(resc)
  3711. return
  3712. }
  3713. resc <- res
  3714. }()
  3715. // Fully consume the request before checking the Write log vs. want.
  3716. req, err := ReadRequest(bufio.NewReader(connr))
  3717. if err != nil {
  3718. t.Fatal(err)
  3719. }
  3720. io.Copy(io.Discard, req.Body)
  3721. // Unblock the transport's roundTrip goroutine.
  3722. resBody <- strings.NewReader("HTTP/1.1 204 No Content\r\nConnection: close\r\n\r\n")
  3723. res, ok := <-resc
  3724. if !ok {
  3725. return
  3726. }
  3727. defer res.Body.Close()
  3728. want := []string{
  3729. "POST / HTTP/1.1\r\nHost: localhost:8080\r\nUser-Agent: x\r\nTransfer-Encoding: chunked\r\nAccept-Encoding: gzip\r\n\r\n",
  3730. "5\r\nnum0\n\r\n",
  3731. "5\r\nnum1\n\r\n",
  3732. "5\r\nnum2\n\r\n",
  3733. "0\r\n\r\n",
  3734. }
  3735. if !reflect.DeepEqual(lw.writes, want) {
  3736. t.Errorf("Writes differed.\n Got: %q\nWant: %q\n", lw.writes, want)
  3737. }
  3738. }
  3739. // Issue 22088: flush Transport request headers if we're not sure the body won't block on read.
  3740. func TestTransportFlushesRequestHeader(t *testing.T) {
  3741. defer afterTest(t)
  3742. gotReq := make(chan struct{})
  3743. cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  3744. close(gotReq)
  3745. }))
  3746. defer cst.close()
  3747. pr, pw := io.Pipe()
  3748. req, err := NewRequest("POST", cst.ts.URL, pr)
  3749. if err != nil {
  3750. t.Fatal(err)
  3751. }
  3752. gotRes := make(chan struct{})
  3753. go func() {
  3754. defer close(gotRes)
  3755. res, err := cst.tr.RoundTrip(req)
  3756. if err != nil {
  3757. t.Error(err)
  3758. return
  3759. }
  3760. res.Body.Close()
  3761. }()
  3762. select {
  3763. case <-gotReq:
  3764. pw.Close()
  3765. case <-time.After(5 * time.Second):
  3766. t.Fatal("timeout waiting for handler to get request")
  3767. }
  3768. <-gotRes
  3769. }
  3770. // Issue 11745.
  3771. func TestTransportPrefersResponseOverWriteError(t *testing.T) {
  3772. if testing.Short() {
  3773. t.Skip("skipping in short mode")
  3774. }
  3775. defer afterTest(t)
  3776. const contentLengthLimit = 1024 * 1024 // 1MB
  3777. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3778. if r.ContentLength >= contentLengthLimit {
  3779. w.WriteHeader(StatusBadRequest)
  3780. r.Body.Close()
  3781. return
  3782. }
  3783. w.WriteHeader(StatusOK)
  3784. }))
  3785. defer ts.Close()
  3786. c := ts.Client()
  3787. fail := 0
  3788. count := 100
  3789. bigBody := strings.Repeat("a", contentLengthLimit*2)
  3790. for i := 0; i < count; i++ {
  3791. req, err := NewRequest("PUT", ts.URL, strings.NewReader(bigBody))
  3792. if err != nil {
  3793. t.Fatal(err)
  3794. }
  3795. resp, err := c.Do(req)
  3796. if err != nil {
  3797. fail++
  3798. t.Logf("%d = %#v", i, err)
  3799. if ue, ok := err.(*url.Error); ok {
  3800. t.Logf("urlErr = %#v", ue.Err)
  3801. if ne, ok := ue.Err.(*net.OpError); ok {
  3802. t.Logf("netOpError = %#v", ne.Err)
  3803. }
  3804. }
  3805. } else {
  3806. resp.Body.Close()
  3807. if resp.StatusCode != 400 {
  3808. t.Errorf("Expected status code 400, got %v", resp.Status)
  3809. }
  3810. }
  3811. }
  3812. if fail > 0 {
  3813. t.Errorf("Failed %v out of %v\n", fail, count)
  3814. }
  3815. }
  3816. func TestTransportAutomaticHTTP2(t *testing.T) {
  3817. testTransportAutoHTTP(t, &Transport{}, true)
  3818. }
  3819. func TestTransportAutomaticHTTP2_DialerAndTLSConfigSupportsHTTP2AndTLSConfig(t *testing.T) {
  3820. testTransportAutoHTTP(t, &Transport{
  3821. ForceAttemptHTTP2: true,
  3822. TLSClientConfig: new(tls.Config),
  3823. }, true)
  3824. }
  3825. // golang.org/issue/14391: also check DefaultTransport
  3826. func TestTransportAutomaticHTTP2_DefaultTransport(t *testing.T) {
  3827. testTransportAutoHTTP(t, DefaultTransport.(*Transport), true)
  3828. }
  3829. func TestTransportAutomaticHTTP2_TLSNextProto(t *testing.T) {
  3830. testTransportAutoHTTP(t, &Transport{
  3831. TLSNextProto: make(map[string]func(string, *tls.Conn) RoundTripper),
  3832. }, false)
  3833. }
  3834. func TestTransportAutomaticHTTP2_TLSConfig(t *testing.T) {
  3835. testTransportAutoHTTP(t, &Transport{
  3836. TLSClientConfig: new(tls.Config),
  3837. }, false)
  3838. }
  3839. func TestTransportAutomaticHTTP2_ExpectContinueTimeout(t *testing.T) {
  3840. testTransportAutoHTTP(t, &Transport{
  3841. ExpectContinueTimeout: 1 * time.Second,
  3842. }, true)
  3843. }
  3844. func TestTransportAutomaticHTTP2_Dial(t *testing.T) {
  3845. var d net.Dialer
  3846. testTransportAutoHTTP(t, &Transport{
  3847. Dial: d.Dial,
  3848. }, false)
  3849. }
  3850. func TestTransportAutomaticHTTP2_DialContext(t *testing.T) {
  3851. var d net.Dialer
  3852. testTransportAutoHTTP(t, &Transport{
  3853. DialContext: d.DialContext,
  3854. }, false)
  3855. }
  3856. func TestTransportAutomaticHTTP2_DialTLS(t *testing.T) {
  3857. testTransportAutoHTTP(t, &Transport{
  3858. DialTLS: func(network, addr string) (net.Conn, error) {
  3859. panic("unused")
  3860. },
  3861. }, false)
  3862. }
  3863. func testTransportAutoHTTP(t *testing.T, tr *Transport, wantH2 bool) {
  3864. CondSkipHTTP2(t)
  3865. _, err := tr.RoundTrip(new(Request))
  3866. if err == nil {
  3867. t.Error("expected error from RoundTrip")
  3868. }
  3869. if reg := tr.TLSNextProto["h2"] != nil; reg != wantH2 {
  3870. t.Errorf("HTTP/2 registered = %v; want %v", reg, wantH2)
  3871. }
  3872. }
  3873. // Issue 13633: there was a race where we returned bodyless responses
  3874. // to callers before recycling the persistent connection, which meant
  3875. // a client doing two subsequent requests could end up on different
  3876. // connections. It's somewhat harmless but enough tests assume it's
  3877. // not true in order to test other things that it's worth fixing.
  3878. // Plus it's nice to be consistent and not have timing-dependent
  3879. // behavior.
  3880. func TestTransportReuseConnEmptyResponseBody(t *testing.T) {
  3881. defer afterTest(t)
  3882. cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  3883. w.Header().Set("X-Addr", r.RemoteAddr)
  3884. // Empty response body.
  3885. }))
  3886. defer cst.close()
  3887. n := 100
  3888. if testing.Short() {
  3889. n = 10
  3890. }
  3891. var firstAddr string
  3892. for i := 0; i < n; i++ {
  3893. res, err := cst.c.Get(cst.ts.URL)
  3894. if err != nil {
  3895. log.Fatal(err)
  3896. }
  3897. addr := res.Header.Get("X-Addr")
  3898. if i == 0 {
  3899. firstAddr = addr
  3900. } else if addr != firstAddr {
  3901. t.Fatalf("On request %d, addr %q != original addr %q", i+1, addr, firstAddr)
  3902. }
  3903. res.Body.Close()
  3904. }
  3905. }
  3906. // Issue 13839
  3907. func TestNoCrashReturningTransportAltConn(t *testing.T) {
  3908. cert, err := tls.X509KeyPair(testcert.LocalhostCert, testcert.LocalhostKey)
  3909. if err != nil {
  3910. t.Fatal(err)
  3911. }
  3912. ln := newLocalListener(t)
  3913. defer ln.Close()
  3914. var wg sync.WaitGroup
  3915. SetPendingDialHooks(func() { wg.Add(1) }, wg.Done)
  3916. defer SetPendingDialHooks(nil, nil)
  3917. testDone := make(chan struct{})
  3918. defer close(testDone)
  3919. go func() {
  3920. tln := tls.NewListener(ln, &tls.Config{
  3921. NextProtos: []string{"foo"},
  3922. Certificates: []tls.Certificate{cert},
  3923. })
  3924. sc, err := tln.Accept()
  3925. if err != nil {
  3926. t.Error(err)
  3927. return
  3928. }
  3929. if err := sc.(*tls.Conn).Handshake(); err != nil {
  3930. t.Error(err)
  3931. return
  3932. }
  3933. <-testDone
  3934. sc.Close()
  3935. }()
  3936. addr := ln.Addr().String()
  3937. req, _ := NewRequest("GET", "https://fake.tld/", nil)
  3938. cancel := make(chan struct{})
  3939. req.Cancel = cancel
  3940. doReturned := make(chan bool, 1)
  3941. madeRoundTripper := make(chan bool, 1)
  3942. tr := &Transport{
  3943. DisableKeepAlives: true,
  3944. TLSNextProto: map[string]func(string, *tls.Conn) RoundTripper{
  3945. "foo": func(authority string, c *tls.Conn) RoundTripper {
  3946. madeRoundTripper <- true
  3947. return funcRoundTripper(func() {
  3948. t.Error("foo RoundTripper should not be called")
  3949. })
  3950. },
  3951. },
  3952. Dial: func(_, _ string) (net.Conn, error) {
  3953. panic("shouldn't be called")
  3954. },
  3955. DialTLS: func(_, _ string) (net.Conn, error) {
  3956. tc, err := tls.Dial("tcp", addr, &tls.Config{
  3957. InsecureSkipVerify: true,
  3958. NextProtos: []string{"foo"},
  3959. })
  3960. if err != nil {
  3961. return nil, err
  3962. }
  3963. if err := tc.Handshake(); err != nil {
  3964. return nil, err
  3965. }
  3966. close(cancel)
  3967. <-doReturned
  3968. return tc, nil
  3969. },
  3970. }
  3971. c := &Client{Transport: tr}
  3972. _, err = c.Do(req)
  3973. if ue, ok := err.(*url.Error); !ok || ue.Err != ExportErrRequestCanceledConn {
  3974. t.Fatalf("Do error = %v; want url.Error with errRequestCanceledConn", err)
  3975. }
  3976. doReturned <- true
  3977. <-madeRoundTripper
  3978. wg.Wait()
  3979. }
  3980. func TestTransportReuseConnection_Gzip_Chunked(t *testing.T) {
  3981. testTransportReuseConnection_Gzip(t, true)
  3982. }
  3983. func TestTransportReuseConnection_Gzip_ContentLength(t *testing.T) {
  3984. testTransportReuseConnection_Gzip(t, false)
  3985. }
  3986. // Make sure we re-use underlying TCP connection for gzipped responses too.
  3987. func testTransportReuseConnection_Gzip(t *testing.T, chunked bool) {
  3988. setParallel(t)
  3989. defer afterTest(t)
  3990. addr := make(chan string, 2)
  3991. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3992. addr <- r.RemoteAddr
  3993. w.Header().Set("Content-Encoding", "gzip")
  3994. if chunked {
  3995. w.(Flusher).Flush()
  3996. }
  3997. w.Write(rgz) // arbitrary gzip response
  3998. }))
  3999. defer ts.Close()
  4000. c := ts.Client()
  4001. for i := 0; i < 2; i++ {
  4002. res, err := c.Get(ts.URL)
  4003. if err != nil {
  4004. t.Fatal(err)
  4005. }
  4006. buf := make([]byte, len(rgz))
  4007. if n, err := io.ReadFull(res.Body, buf); err != nil {
  4008. t.Errorf("%d. ReadFull = %v, %v", i, n, err)
  4009. }
  4010. // Note: no res.Body.Close call. It should work without it,
  4011. // since the flate.Reader's internal buffering will hit EOF
  4012. // and that should be sufficient.
  4013. }
  4014. a1, a2 := <-addr, <-addr
  4015. if a1 != a2 {
  4016. t.Fatalf("didn't reuse connection")
  4017. }
  4018. }
  4019. func TestTransportResponseHeaderLength(t *testing.T) {
  4020. setParallel(t)
  4021. defer afterTest(t)
  4022. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  4023. if r.URL.Path == "/long" {
  4024. w.Header().Set("Long", strings.Repeat("a", 1<<20))
  4025. }
  4026. }))
  4027. defer ts.Close()
  4028. c := ts.Client()
  4029. c.Transport.(*Transport).MaxResponseHeaderBytes = 512 << 10
  4030. if res, err := c.Get(ts.URL); err != nil {
  4031. t.Fatal(err)
  4032. } else {
  4033. res.Body.Close()
  4034. }
  4035. res, err := c.Get(ts.URL + "/long")
  4036. if err == nil {
  4037. defer res.Body.Close()
  4038. var n int64
  4039. for k, vv := range res.Header {
  4040. for _, v := range vv {
  4041. n += int64(len(k)) + int64(len(v))
  4042. }
  4043. }
  4044. t.Fatalf("Unexpected success. Got %v and %d bytes of response headers", res.Status, n)
  4045. }
  4046. if want := "server response headers exceeded 524288 bytes"; !strings.Contains(err.Error(), want) {
  4047. t.Errorf("got error: %v; want %q", err, want)
  4048. }
  4049. }
  4050. func TestTransportEventTrace(t *testing.T) { testTransportEventTrace(t, h1Mode, false) }
  4051. func TestTransportEventTrace_h2(t *testing.T) { testTransportEventTrace(t, h2Mode, false) }
  4052. // test a non-nil httptrace.ClientTrace but with all hooks set to zero.
  4053. func TestTransportEventTrace_NoHooks(t *testing.T) { testTransportEventTrace(t, h1Mode, true) }
  4054. func TestTransportEventTrace_NoHooks_h2(t *testing.T) { testTransportEventTrace(t, h2Mode, true) }
  4055. func testTransportEventTrace(t *testing.T, h2 bool, noHooks bool) {
  4056. defer afterTest(t)
  4057. const resBody = "some body"
  4058. gotWroteReqEvent := make(chan struct{}, 500)
  4059. cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
  4060. if r.Method == "GET" {
  4061. // Do nothing for the second request.
  4062. return
  4063. }
  4064. if _, err := io.ReadAll(r.Body); err != nil {
  4065. t.Error(err)
  4066. }
  4067. if !noHooks {
  4068. select {
  4069. case <-gotWroteReqEvent:
  4070. case <-time.After(5 * time.Second):
  4071. t.Error("timeout waiting for WroteRequest event")
  4072. }
  4073. }
  4074. io.WriteString(w, resBody)
  4075. }))
  4076. defer cst.close()
  4077. cst.tr.ExpectContinueTimeout = 1 * time.Second
  4078. var mu sync.Mutex // guards buf
  4079. var buf bytes.Buffer
  4080. logf := func(format string, args ...any) {
  4081. mu.Lock()
  4082. defer mu.Unlock()
  4083. fmt.Fprintf(&buf, format, args...)
  4084. buf.WriteByte('\n')
  4085. }
  4086. addrStr := cst.ts.Listener.Addr().String()
  4087. ip, port, err := net.SplitHostPort(addrStr)
  4088. if err != nil {
  4089. t.Fatal(err)
  4090. }
  4091. // Install a fake DNS server.
  4092. ctx := context.WithValue(context.Background(), nettrace.LookupIPAltResolverKey{}, func(ctx context.Context, network, host string) ([]net.IPAddr, error) {
  4093. if host != "dns-is-faked.golang" {
  4094. t.Errorf("unexpected DNS host lookup for %q/%q", network, host)
  4095. return nil, nil
  4096. }
  4097. return []net.IPAddr{{IP: net.ParseIP(ip)}}, nil
  4098. })
  4099. body := "some body"
  4100. req, _ := NewRequest("POST", cst.scheme()+"://dns-is-faked.golang:"+port, strings.NewReader(body))
  4101. req.Header["X-Foo-Multiple-Vals"] = []string{"bar", "baz"}
  4102. trace := &httptrace.ClientTrace{
  4103. GetConn: func(hostPort string) { logf("Getting conn for %v ...", hostPort) },
  4104. GotConn: func(ci httptrace.GotConnInfo) { logf("got conn: %+v", ci) },
  4105. GotFirstResponseByte: func() { logf("first response byte") },
  4106. PutIdleConn: func(err error) { logf("PutIdleConn = %v", err) },
  4107. DNSStart: func(e httptrace.DNSStartInfo) { logf("DNS start: %+v", e) },
  4108. DNSDone: func(e httptrace.DNSDoneInfo) { logf("DNS done: %+v", e) },
  4109. ConnectStart: func(network, addr string) { logf("ConnectStart: Connecting to %s %s ...", network, addr) },
  4110. ConnectDone: func(network, addr string, err error) {
  4111. if err != nil {
  4112. t.Errorf("ConnectDone: %v", err)
  4113. }
  4114. logf("ConnectDone: connected to %s %s = %v", network, addr, err)
  4115. },
  4116. WroteHeaderField: func(key string, value []string) {
  4117. logf("WroteHeaderField: %s: %v", key, value)
  4118. },
  4119. WroteHeaders: func() {
  4120. logf("WroteHeaders")
  4121. },
  4122. Wait100Continue: func() { logf("Wait100Continue") },
  4123. Got100Continue: func() { logf("Got100Continue") },
  4124. WroteRequest: func(e httptrace.WroteRequestInfo) {
  4125. logf("WroteRequest: %+v", e)
  4126. gotWroteReqEvent <- struct{}{}
  4127. },
  4128. }
  4129. if h2 {
  4130. trace.TLSHandshakeStart = func() { logf("tls handshake start") }
  4131. trace.TLSHandshakeDone = func(s tls.ConnectionState, err error) {
  4132. logf("tls handshake done. ConnectionState = %v \n err = %v", s, err)
  4133. }
  4134. }
  4135. if noHooks {
  4136. // zero out all func pointers, trying to get some path to crash
  4137. *trace = httptrace.ClientTrace{}
  4138. }
  4139. req = req.WithContext(httptrace.WithClientTrace(ctx, trace))
  4140. req.Header.Set("Expect", "100-continue")
  4141. res, err := cst.c.Do(req)
  4142. if err != nil {
  4143. t.Fatal(err)
  4144. }
  4145. logf("got roundtrip.response")
  4146. slurp, err := io.ReadAll(res.Body)
  4147. if err != nil {
  4148. t.Fatal(err)
  4149. }
  4150. logf("consumed body")
  4151. if string(slurp) != resBody || res.StatusCode != 200 {
  4152. t.Fatalf("Got %q, %v; want %q, 200 OK", slurp, res.Status, resBody)
  4153. }
  4154. res.Body.Close()
  4155. if noHooks {
  4156. // Done at this point. Just testing a full HTTP
  4157. // requests can happen with a trace pointing to a zero
  4158. // ClientTrace, full of nil func pointers.
  4159. return
  4160. }
  4161. mu.Lock()
  4162. got := buf.String()
  4163. mu.Unlock()
  4164. wantOnce := func(sub string) {
  4165. if strings.Count(got, sub) != 1 {
  4166. t.Errorf("expected substring %q exactly once in output.", sub)
  4167. }
  4168. }
  4169. wantOnceOrMore := func(sub string) {
  4170. if strings.Count(got, sub) == 0 {
  4171. t.Errorf("expected substring %q at least once in output.", sub)
  4172. }
  4173. }
  4174. wantOnce("Getting conn for dns-is-faked.golang:" + port)
  4175. wantOnce("DNS start: {Host:dns-is-faked.golang}")
  4176. wantOnce("DNS done: {Addrs:[{IP:" + ip + " Zone:}] Err:<nil> Coalesced:false}")
  4177. wantOnce("got conn: {")
  4178. wantOnceOrMore("Connecting to tcp " + addrStr)
  4179. wantOnceOrMore("connected to tcp " + addrStr + " = <nil>")
  4180. wantOnce("Reused:false WasIdle:false IdleTime:0s")
  4181. wantOnce("first response byte")
  4182. if h2 {
  4183. wantOnce("tls handshake start")
  4184. wantOnce("tls handshake done")
  4185. } else {
  4186. wantOnce("PutIdleConn = <nil>")
  4187. wantOnce("WroteHeaderField: User-Agent: [Go-http-client/1.1]")
  4188. // TODO(meirf): issue 19761. Make these agnostic to h1/h2. (These are not h1 specific, but the
  4189. // WroteHeaderField hook is not yet implemented in h2.)
  4190. wantOnce(fmt.Sprintf("WroteHeaderField: Host: [dns-is-faked.golang:%s]", port))
  4191. wantOnce(fmt.Sprintf("WroteHeaderField: Content-Length: [%d]", len(body)))
  4192. wantOnce("WroteHeaderField: X-Foo-Multiple-Vals: [bar baz]")
  4193. wantOnce("WroteHeaderField: Accept-Encoding: [gzip]")
  4194. }
  4195. wantOnce("WroteHeaders")
  4196. wantOnce("Wait100Continue")
  4197. wantOnce("Got100Continue")
  4198. wantOnce("WroteRequest: {Err:<nil>}")
  4199. if strings.Contains(got, " to udp ") {
  4200. t.Errorf("should not see UDP (DNS) connections")
  4201. }
  4202. if t.Failed() {
  4203. t.Errorf("Output:\n%s", got)
  4204. }
  4205. // And do a second request:
  4206. req, _ = NewRequest("GET", cst.scheme()+"://dns-is-faked.golang:"+port, nil)
  4207. req = req.WithContext(httptrace.WithClientTrace(ctx, trace))
  4208. res, err = cst.c.Do(req)
  4209. if err != nil {
  4210. t.Fatal(err)
  4211. }
  4212. if res.StatusCode != 200 {
  4213. t.Fatal(res.Status)
  4214. }
  4215. res.Body.Close()
  4216. mu.Lock()
  4217. got = buf.String()
  4218. mu.Unlock()
  4219. sub := "Getting conn for dns-is-faked.golang:"
  4220. if gotn, want := strings.Count(got, sub), 2; gotn != want {
  4221. t.Errorf("substring %q appeared %d times; want %d. Log:\n%s", sub, gotn, want, got)
  4222. }
  4223. }
  4224. func TestTransportEventTraceTLSVerify(t *testing.T) {
  4225. var mu sync.Mutex
  4226. var buf bytes.Buffer
  4227. logf := func(format string, args ...any) {
  4228. mu.Lock()
  4229. defer mu.Unlock()
  4230. fmt.Fprintf(&buf, format, args...)
  4231. buf.WriteByte('\n')
  4232. }
  4233. ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  4234. t.Error("Unexpected request")
  4235. }))
  4236. defer ts.Close()
  4237. ts.Config.ErrorLog = log.New(funcWriter(func(p []byte) (int, error) {
  4238. logf("%s", p)
  4239. return len(p), nil
  4240. }), "", 0)
  4241. certpool := x509.NewCertPool()
  4242. certpool.AddCert(ts.Certificate())
  4243. c := &Client{Transport: &Transport{
  4244. TLSClientConfig: &tls.Config{
  4245. ServerName: "dns-is-faked.golang",
  4246. RootCAs: certpool,
  4247. },
  4248. }}
  4249. trace := &httptrace.ClientTrace{
  4250. TLSHandshakeStart: func() { logf("TLSHandshakeStart") },
  4251. TLSHandshakeDone: func(s tls.ConnectionState, err error) {
  4252. logf("TLSHandshakeDone: ConnectionState = %v \n err = %v", s, err)
  4253. },
  4254. }
  4255. req, _ := NewRequest("GET", ts.URL, nil)
  4256. req = req.WithContext(httptrace.WithClientTrace(context.Background(), trace))
  4257. _, err := c.Do(req)
  4258. if err == nil {
  4259. t.Error("Expected request to fail TLS verification")
  4260. }
  4261. mu.Lock()
  4262. got := buf.String()
  4263. mu.Unlock()
  4264. wantOnce := func(sub string) {
  4265. if strings.Count(got, sub) != 1 {
  4266. t.Errorf("expected substring %q exactly once in output.", sub)
  4267. }
  4268. }
  4269. wantOnce("TLSHandshakeStart")
  4270. wantOnce("TLSHandshakeDone")
  4271. wantOnce("err = x509: certificate is valid for example.com")
  4272. if t.Failed() {
  4273. t.Errorf("Output:\n%s", got)
  4274. }
  4275. }
  4276. var (
  4277. isDNSHijackedOnce sync.Once
  4278. isDNSHijacked bool
  4279. )
  4280. func skipIfDNSHijacked(t *testing.T) {
  4281. // Skip this test if the user is using a shady/ISP
  4282. // DNS server hijacking queries.
  4283. // See issues 16732, 16716.
  4284. isDNSHijackedOnce.Do(func() {
  4285. addrs, _ := net.LookupHost("dns-should-not-resolve.golang")
  4286. isDNSHijacked = len(addrs) != 0
  4287. })
  4288. if isDNSHijacked {
  4289. t.Skip("skipping; test requires non-hijacking DNS server")
  4290. }
  4291. }
  4292. func TestTransportEventTraceRealDNS(t *testing.T) {
  4293. skipIfDNSHijacked(t)
  4294. defer afterTest(t)
  4295. tr := &Transport{}
  4296. defer tr.CloseIdleConnections()
  4297. c := &Client{Transport: tr}
  4298. var mu sync.Mutex // guards buf
  4299. var buf bytes.Buffer
  4300. logf := func(format string, args ...any) {
  4301. mu.Lock()
  4302. defer mu.Unlock()
  4303. fmt.Fprintf(&buf, format, args...)
  4304. buf.WriteByte('\n')
  4305. }
  4306. req, _ := NewRequest("GET", "http://dns-should-not-resolve.golang:80", nil)
  4307. trace := &httptrace.ClientTrace{
  4308. DNSStart: func(e httptrace.DNSStartInfo) { logf("DNSStart: %+v", e) },
  4309. DNSDone: func(e httptrace.DNSDoneInfo) { logf("DNSDone: %+v", e) },
  4310. ConnectStart: func(network, addr string) { logf("ConnectStart: %s %s", network, addr) },
  4311. ConnectDone: func(network, addr string, err error) { logf("ConnectDone: %s %s %v", network, addr, err) },
  4312. }
  4313. req = req.WithContext(httptrace.WithClientTrace(context.Background(), trace))
  4314. resp, err := c.Do(req)
  4315. if err == nil {
  4316. resp.Body.Close()
  4317. t.Fatal("expected error during DNS lookup")
  4318. }
  4319. mu.Lock()
  4320. got := buf.String()
  4321. mu.Unlock()
  4322. wantSub := func(sub string) {
  4323. if !strings.Contains(got, sub) {
  4324. t.Errorf("expected substring %q in output.", sub)
  4325. }
  4326. }
  4327. wantSub("DNSStart: {Host:dns-should-not-resolve.golang}")
  4328. wantSub("DNSDone: {Addrs:[] Err:")
  4329. if strings.Contains(got, "ConnectStart") || strings.Contains(got, "ConnectDone") {
  4330. t.Errorf("should not see Connect events")
  4331. }
  4332. if t.Failed() {
  4333. t.Errorf("Output:\n%s", got)
  4334. }
  4335. }
  4336. // Issue 14353: port can only contain digits.
  4337. func TestTransportRejectsAlphaPort(t *testing.T) {
  4338. res, err := Get("http://dummy.tld:123foo/bar")
  4339. if err == nil {
  4340. res.Body.Close()
  4341. t.Fatal("unexpected success")
  4342. }
  4343. ue, ok := err.(*url.Error)
  4344. if !ok {
  4345. t.Fatalf("got %#v; want *url.Error", err)
  4346. }
  4347. got := ue.Err.Error()
  4348. want := `invalid port ":123foo" after host`
  4349. if got != want {
  4350. t.Errorf("got error %q; want %q", got, want)
  4351. }
  4352. }
  4353. // Test the httptrace.TLSHandshake{Start,Done} hooks with a https http1
  4354. // connections. The http2 test is done in TestTransportEventTrace_h2
  4355. func TestTLSHandshakeTrace(t *testing.T) {
  4356. defer afterTest(t)
  4357. ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
  4358. defer ts.Close()
  4359. var mu sync.Mutex
  4360. var start, done bool
  4361. trace := &httptrace.ClientTrace{
  4362. TLSHandshakeStart: func() {
  4363. mu.Lock()
  4364. defer mu.Unlock()
  4365. start = true
  4366. },
  4367. TLSHandshakeDone: func(s tls.ConnectionState, err error) {
  4368. mu.Lock()
  4369. defer mu.Unlock()
  4370. done = true
  4371. if err != nil {
  4372. t.Fatal("Expected error to be nil but was:", err)
  4373. }
  4374. },
  4375. }
  4376. c := ts.Client()
  4377. req, err := NewRequest("GET", ts.URL, nil)
  4378. if err != nil {
  4379. t.Fatal("Unable to construct test request:", err)
  4380. }
  4381. req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
  4382. r, err := c.Do(req)
  4383. if err != nil {
  4384. t.Fatal("Unexpected error making request:", err)
  4385. }
  4386. r.Body.Close()
  4387. mu.Lock()
  4388. defer mu.Unlock()
  4389. if !start {
  4390. t.Fatal("Expected TLSHandshakeStart to be called, but wasn't")
  4391. }
  4392. if !done {
  4393. t.Fatal("Expected TLSHandshakeDone to be called, but wasnt't")
  4394. }
  4395. }
  4396. func TestTransportMaxIdleConns(t *testing.T) {
  4397. defer afterTest(t)
  4398. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  4399. // No body for convenience.
  4400. }))
  4401. defer ts.Close()
  4402. c := ts.Client()
  4403. tr := c.Transport.(*Transport)
  4404. tr.MaxIdleConns = 4
  4405. ip, port, err := net.SplitHostPort(ts.Listener.Addr().String())
  4406. if err != nil {
  4407. t.Fatal(err)
  4408. }
  4409. ctx := context.WithValue(context.Background(), nettrace.LookupIPAltResolverKey{}, func(ctx context.Context, _, host string) ([]net.IPAddr, error) {
  4410. return []net.IPAddr{{IP: net.ParseIP(ip)}}, nil
  4411. })
  4412. hitHost := func(n int) {
  4413. req, _ := NewRequest("GET", fmt.Sprintf("http://host-%d.dns-is-faked.golang:"+port, n), nil)
  4414. req = req.WithContext(ctx)
  4415. res, err := c.Do(req)
  4416. if err != nil {
  4417. t.Fatal(err)
  4418. }
  4419. res.Body.Close()
  4420. }
  4421. for i := 0; i < 4; i++ {
  4422. hitHost(i)
  4423. }
  4424. want := []string{
  4425. "|http|host-0.dns-is-faked.golang:" + port,
  4426. "|http|host-1.dns-is-faked.golang:" + port,
  4427. "|http|host-2.dns-is-faked.golang:" + port,
  4428. "|http|host-3.dns-is-faked.golang:" + port,
  4429. }
  4430. if got := tr.IdleConnKeysForTesting(); !reflect.DeepEqual(got, want) {
  4431. t.Fatalf("idle conn keys mismatch.\n got: %q\nwant: %q\n", got, want)
  4432. }
  4433. // Now hitting the 5th host should kick out the first host:
  4434. hitHost(4)
  4435. want = []string{
  4436. "|http|host-1.dns-is-faked.golang:" + port,
  4437. "|http|host-2.dns-is-faked.golang:" + port,
  4438. "|http|host-3.dns-is-faked.golang:" + port,
  4439. "|http|host-4.dns-is-faked.golang:" + port,
  4440. }
  4441. if got := tr.IdleConnKeysForTesting(); !reflect.DeepEqual(got, want) {
  4442. t.Fatalf("idle conn keys mismatch after 5th host.\n got: %q\nwant: %q\n", got, want)
  4443. }
  4444. }
  4445. func TestTransportIdleConnTimeout_h1(t *testing.T) { testTransportIdleConnTimeout(t, h1Mode) }
  4446. func TestTransportIdleConnTimeout_h2(t *testing.T) { testTransportIdleConnTimeout(t, h2Mode) }
  4447. func testTransportIdleConnTimeout(t *testing.T, h2 bool) {
  4448. if testing.Short() {
  4449. t.Skip("skipping in short mode")
  4450. }
  4451. defer afterTest(t)
  4452. const timeout = 1 * time.Second
  4453. cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
  4454. // No body for convenience.
  4455. }))
  4456. defer cst.close()
  4457. tr := cst.tr
  4458. tr.IdleConnTimeout = timeout
  4459. defer tr.CloseIdleConnections()
  4460. c := &Client{Transport: tr}
  4461. idleConns := func() []string {
  4462. if h2 {
  4463. return tr.IdleConnStrsForTesting_h2()
  4464. } else {
  4465. return tr.IdleConnStrsForTesting()
  4466. }
  4467. }
  4468. var conn string
  4469. doReq := func(n int) {
  4470. req, _ := NewRequest("GET", cst.ts.URL, nil)
  4471. req = req.WithContext(httptrace.WithClientTrace(context.Background(), &httptrace.ClientTrace{
  4472. PutIdleConn: func(err error) {
  4473. if err != nil {
  4474. t.Errorf("failed to keep idle conn: %v", err)
  4475. }
  4476. },
  4477. }))
  4478. res, err := c.Do(req)
  4479. if err != nil {
  4480. t.Fatal(err)
  4481. }
  4482. res.Body.Close()
  4483. conns := idleConns()
  4484. if len(conns) != 1 {
  4485. t.Fatalf("req %v: unexpected number of idle conns: %q", n, conns)
  4486. }
  4487. if conn == "" {
  4488. conn = conns[0]
  4489. }
  4490. if conn != conns[0] {
  4491. t.Fatalf("req %v: cached connection changed; expected the same one throughout the test", n)
  4492. }
  4493. }
  4494. for i := 0; i < 3; i++ {
  4495. doReq(i)
  4496. time.Sleep(timeout / 2)
  4497. }
  4498. time.Sleep(timeout * 3 / 2)
  4499. if got := idleConns(); len(got) != 0 {
  4500. t.Errorf("idle conns = %q; want none", got)
  4501. }
  4502. }
  4503. // Issue 16208: Go 1.7 crashed after Transport.IdleConnTimeout if an
  4504. // HTTP/2 connection was established but its caller no longer
  4505. // wanted it. (Assuming the connection cache was enabled, which it is
  4506. // by default)
  4507. //
  4508. // This test reproduced the crash by setting the IdleConnTimeout low
  4509. // (to make the test reasonable) and then making a request which is
  4510. // canceled by the DialTLS hook, which then also waits to return the
  4511. // real connection until after the RoundTrip saw the error. Then we
  4512. // know the successful tls.Dial from DialTLS will need to go into the
  4513. // idle pool. Then we give it a of time to explode.
  4514. func TestIdleConnH2Crash(t *testing.T) {
  4515. setParallel(t)
  4516. cst := newClientServerTest(t, h2Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  4517. // nothing
  4518. }))
  4519. defer cst.close()
  4520. ctx, cancel := context.WithCancel(context.Background())
  4521. defer cancel()
  4522. sawDoErr := make(chan bool, 1)
  4523. testDone := make(chan struct{})
  4524. defer close(testDone)
  4525. cst.tr.IdleConnTimeout = 5 * time.Millisecond
  4526. cst.tr.DialTLS = func(network, addr string) (net.Conn, error) {
  4527. c, err := tls.Dial(network, addr, &tls.Config{
  4528. InsecureSkipVerify: true,
  4529. NextProtos: []string{"h2"},
  4530. })
  4531. if err != nil {
  4532. t.Error(err)
  4533. return nil, err
  4534. }
  4535. if cs := c.ConnectionState(); cs.NegotiatedProtocol != "h2" {
  4536. t.Errorf("protocol = %q; want %q", cs.NegotiatedProtocol, "h2")
  4537. c.Close()
  4538. return nil, errors.New("bogus")
  4539. }
  4540. cancel()
  4541. failTimer := time.NewTimer(5 * time.Second)
  4542. defer failTimer.Stop()
  4543. select {
  4544. case <-sawDoErr:
  4545. case <-testDone:
  4546. case <-failTimer.C:
  4547. t.Error("timeout in DialTLS, waiting too long for cst.c.Do to fail")
  4548. }
  4549. return c, nil
  4550. }
  4551. req, _ := NewRequest("GET", cst.ts.URL, nil)
  4552. req = req.WithContext(ctx)
  4553. res, err := cst.c.Do(req)
  4554. if err == nil {
  4555. res.Body.Close()
  4556. t.Fatal("unexpected success")
  4557. }
  4558. sawDoErr <- true
  4559. // Wait for the explosion.
  4560. time.Sleep(cst.tr.IdleConnTimeout * 10)
  4561. }
  4562. type funcConn struct {
  4563. net.Conn
  4564. read func([]byte) (int, error)
  4565. write func([]byte) (int, error)
  4566. }
  4567. func (c funcConn) Read(p []byte) (int, error) { return c.read(p) }
  4568. func (c funcConn) Write(p []byte) (int, error) { return c.write(p) }
  4569. func (c funcConn) Close() error { return nil }
  4570. // Issue 16465: Transport.RoundTrip should return the raw net.Conn.Read error from Peek
  4571. // back to the caller.
  4572. func TestTransportReturnsPeekError(t *testing.T) {
  4573. errValue := errors.New("specific error value")
  4574. wrote := make(chan struct{})
  4575. var wroteOnce sync.Once
  4576. tr := &Transport{
  4577. Dial: func(network, addr string) (net.Conn, error) {
  4578. c := funcConn{
  4579. read: func([]byte) (int, error) {
  4580. <-wrote
  4581. return 0, errValue
  4582. },
  4583. write: func(p []byte) (int, error) {
  4584. wroteOnce.Do(func() { close(wrote) })
  4585. return len(p), nil
  4586. },
  4587. }
  4588. return c, nil
  4589. },
  4590. }
  4591. _, err := tr.RoundTrip(httptest.NewRequest("GET", "http://fake.tld/", nil))
  4592. if err != errValue {
  4593. t.Errorf("error = %#v; want %v", err, errValue)
  4594. }
  4595. }
  4596. // Issue 13835: international domain names should work
  4597. func TestTransportIDNA_h1(t *testing.T) { testTransportIDNA(t, h1Mode) }
  4598. func TestTransportIDNA_h2(t *testing.T) { testTransportIDNA(t, h2Mode) }
  4599. func testTransportIDNA(t *testing.T, h2 bool) {
  4600. defer afterTest(t)
  4601. const uniDomain = "гофер.го"
  4602. const punyDomain = "xn--c1ae0ajs.xn--c1aw"
  4603. var port string
  4604. cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
  4605. want := punyDomain + ":" + port
  4606. if r.Host != want {
  4607. t.Errorf("Host header = %q; want %q", r.Host, want)
  4608. }
  4609. if h2 {
  4610. if r.TLS == nil {
  4611. t.Errorf("r.TLS == nil")
  4612. } else if r.TLS.ServerName != punyDomain {
  4613. t.Errorf("TLS.ServerName = %q; want %q", r.TLS.ServerName, punyDomain)
  4614. }
  4615. }
  4616. w.Header().Set("Hit-Handler", "1")
  4617. }))
  4618. defer cst.close()
  4619. ip, port, err := net.SplitHostPort(cst.ts.Listener.Addr().String())
  4620. if err != nil {
  4621. t.Fatal(err)
  4622. }
  4623. // Install a fake DNS server.
  4624. ctx := context.WithValue(context.Background(), nettrace.LookupIPAltResolverKey{}, func(ctx context.Context, network, host string) ([]net.IPAddr, error) {
  4625. if host != punyDomain {
  4626. t.Errorf("got DNS host lookup for %q/%q; want %q", network, host, punyDomain)
  4627. return nil, nil
  4628. }
  4629. return []net.IPAddr{{IP: net.ParseIP(ip)}}, nil
  4630. })
  4631. req, _ := NewRequest("GET", cst.scheme()+"://"+uniDomain+":"+port, nil)
  4632. trace := &httptrace.ClientTrace{
  4633. GetConn: func(hostPort string) {
  4634. want := net.JoinHostPort(punyDomain, port)
  4635. if hostPort != want {
  4636. t.Errorf("getting conn for %q; want %q", hostPort, want)
  4637. }
  4638. },
  4639. DNSStart: func(e httptrace.DNSStartInfo) {
  4640. if e.Host != punyDomain {
  4641. t.Errorf("DNSStart Host = %q; want %q", e.Host, punyDomain)
  4642. }
  4643. },
  4644. }
  4645. req = req.WithContext(httptrace.WithClientTrace(ctx, trace))
  4646. res, err := cst.tr.RoundTrip(req)
  4647. if err != nil {
  4648. t.Fatal(err)
  4649. }
  4650. defer res.Body.Close()
  4651. if res.Header.Get("Hit-Handler") != "1" {
  4652. out, err := httputil.DumpResponse(res, true)
  4653. if err != nil {
  4654. t.Fatal(err)
  4655. }
  4656. t.Errorf("Response body wasn't from Handler. Got:\n%s\n", out)
  4657. }
  4658. }
  4659. // Issue 13290: send User-Agent in proxy CONNECT
  4660. func TestTransportProxyConnectHeader(t *testing.T) {
  4661. defer afterTest(t)
  4662. reqc := make(chan *Request, 1)
  4663. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  4664. if r.Method != "CONNECT" {
  4665. t.Errorf("method = %q; want CONNECT", r.Method)
  4666. }
  4667. reqc <- r
  4668. c, _, err := w.(Hijacker).Hijack()
  4669. if err != nil {
  4670. t.Errorf("Hijack: %v", err)
  4671. return
  4672. }
  4673. c.Close()
  4674. }))
  4675. defer ts.Close()
  4676. c := ts.Client()
  4677. c.Transport.(*Transport).Proxy = func(r *Request) (*url.URL, error) {
  4678. return url.Parse(ts.URL)
  4679. }
  4680. c.Transport.(*Transport).ProxyConnectHeader = Header{
  4681. "User-Agent": {"foo"},
  4682. "Other": {"bar"},
  4683. }
  4684. res, err := c.Get("https://dummy.tld/") // https to force a CONNECT
  4685. if err == nil {
  4686. res.Body.Close()
  4687. t.Errorf("unexpected success")
  4688. }
  4689. select {
  4690. case <-time.After(3 * time.Second):
  4691. t.Fatal("timeout")
  4692. case r := <-reqc:
  4693. if got, want := r.Header.Get("User-Agent"), "foo"; got != want {
  4694. t.Errorf("CONNECT request User-Agent = %q; want %q", got, want)
  4695. }
  4696. if got, want := r.Header.Get("Other"), "bar"; got != want {
  4697. t.Errorf("CONNECT request Other = %q; want %q", got, want)
  4698. }
  4699. }
  4700. }
  4701. func TestTransportProxyGetConnectHeader(t *testing.T) {
  4702. defer afterTest(t)
  4703. reqc := make(chan *Request, 1)
  4704. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  4705. if r.Method != "CONNECT" {
  4706. t.Errorf("method = %q; want CONNECT", r.Method)
  4707. }
  4708. reqc <- r
  4709. c, _, err := w.(Hijacker).Hijack()
  4710. if err != nil {
  4711. t.Errorf("Hijack: %v", err)
  4712. return
  4713. }
  4714. c.Close()
  4715. }))
  4716. defer ts.Close()
  4717. c := ts.Client()
  4718. c.Transport.(*Transport).Proxy = func(r *Request) (*url.URL, error) {
  4719. return url.Parse(ts.URL)
  4720. }
  4721. // These should be ignored:
  4722. c.Transport.(*Transport).ProxyConnectHeader = Header{
  4723. "User-Agent": {"foo"},
  4724. "Other": {"bar"},
  4725. }
  4726. c.Transport.(*Transport).GetProxyConnectHeader = func(ctx context.Context, proxyURL *url.URL, target string) (Header, error) {
  4727. return Header{
  4728. "User-Agent": {"foo2"},
  4729. "Other": {"bar2"},
  4730. }, nil
  4731. }
  4732. res, err := c.Get("https://dummy.tld/") // https to force a CONNECT
  4733. if err == nil {
  4734. res.Body.Close()
  4735. t.Errorf("unexpected success")
  4736. }
  4737. select {
  4738. case <-time.After(3 * time.Second):
  4739. t.Fatal("timeout")
  4740. case r := <-reqc:
  4741. if got, want := r.Header.Get("User-Agent"), "foo2"; got != want {
  4742. t.Errorf("CONNECT request User-Agent = %q; want %q", got, want)
  4743. }
  4744. if got, want := r.Header.Get("Other"), "bar2"; got != want {
  4745. t.Errorf("CONNECT request Other = %q; want %q", got, want)
  4746. }
  4747. }
  4748. }
  4749. var errFakeRoundTrip = errors.New("fake roundtrip")
  4750. type funcRoundTripper func()
  4751. func (fn funcRoundTripper) RoundTrip(*Request) (*Response, error) {
  4752. fn()
  4753. return nil, errFakeRoundTrip
  4754. }
  4755. func wantBody(res *Response, err error, want string) error {
  4756. if err != nil {
  4757. return err
  4758. }
  4759. slurp, err := io.ReadAll(res.Body)
  4760. if err != nil {
  4761. return fmt.Errorf("error reading body: %v", err)
  4762. }
  4763. if string(slurp) != want {
  4764. return fmt.Errorf("body = %q; want %q", slurp, want)
  4765. }
  4766. if err := res.Body.Close(); err != nil {
  4767. return fmt.Errorf("body Close = %v", err)
  4768. }
  4769. return nil
  4770. }
  4771. func newLocalListener(t *testing.T) net.Listener {
  4772. ln, err := net.Listen("tcp", "127.0.0.1:0")
  4773. if err != nil {
  4774. ln, err = net.Listen("tcp6", "[::1]:0")
  4775. }
  4776. if err != nil {
  4777. t.Fatal(err)
  4778. }
  4779. return ln
  4780. }
  4781. type countCloseReader struct {
  4782. n *int
  4783. io.Reader
  4784. }
  4785. func (cr countCloseReader) Close() error {
  4786. (*cr.n)++
  4787. return nil
  4788. }
  4789. // rgz is a gzip quine that uncompresses to itself.
  4790. var rgz = []byte{
  4791. 0x1f, 0x8b, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,
  4792. 0x00, 0x00, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73,
  4793. 0x69, 0x76, 0x65, 0x00, 0x92, 0xef, 0xe6, 0xe0,
  4794. 0x60, 0x00, 0x83, 0xa2, 0xd4, 0xe4, 0xd2, 0xa2,
  4795. 0xe2, 0xcc, 0xb2, 0x54, 0x06, 0x00, 0x00, 0x17,
  4796. 0x00, 0xe8, 0xff, 0x92, 0xef, 0xe6, 0xe0, 0x60,
  4797. 0x00, 0x83, 0xa2, 0xd4, 0xe4, 0xd2, 0xa2, 0xe2,
  4798. 0xcc, 0xb2, 0x54, 0x06, 0x00, 0x00, 0x17, 0x00,
  4799. 0xe8, 0xff, 0x42, 0x12, 0x46, 0x16, 0x06, 0x00,
  4800. 0x05, 0x00, 0xfa, 0xff, 0x42, 0x12, 0x46, 0x16,
  4801. 0x06, 0x00, 0x05, 0x00, 0xfa, 0xff, 0x00, 0x05,
  4802. 0x00, 0xfa, 0xff, 0x00, 0x14, 0x00, 0xeb, 0xff,
  4803. 0x42, 0x12, 0x46, 0x16, 0x06, 0x00, 0x05, 0x00,
  4804. 0xfa, 0xff, 0x00, 0x05, 0x00, 0xfa, 0xff, 0x00,
  4805. 0x14, 0x00, 0xeb, 0xff, 0x42, 0x88, 0x21, 0xc4,
  4806. 0x00, 0x00, 0x14, 0x00, 0xeb, 0xff, 0x42, 0x88,
  4807. 0x21, 0xc4, 0x00, 0x00, 0x14, 0x00, 0xeb, 0xff,
  4808. 0x42, 0x88, 0x21, 0xc4, 0x00, 0x00, 0x14, 0x00,
  4809. 0xeb, 0xff, 0x42, 0x88, 0x21, 0xc4, 0x00, 0x00,
  4810. 0x14, 0x00, 0xeb, 0xff, 0x42, 0x88, 0x21, 0xc4,
  4811. 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
  4812. 0x00, 0xff, 0xff, 0x00, 0x17, 0x00, 0xe8, 0xff,
  4813. 0x42, 0x88, 0x21, 0xc4, 0x00, 0x00, 0x00, 0x00,
  4814. 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
  4815. 0x17, 0x00, 0xe8, 0xff, 0x42, 0x12, 0x46, 0x16,
  4816. 0x06, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x08,
  4817. 0x00, 0xf7, 0xff, 0x3d, 0xb1, 0x20, 0x85, 0xfa,
  4818. 0x00, 0x00, 0x00, 0x42, 0x12, 0x46, 0x16, 0x06,
  4819. 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x08, 0x00,
  4820. 0xf7, 0xff, 0x3d, 0xb1, 0x20, 0x85, 0xfa, 0x00,
  4821. 0x00, 0x00, 0x3d, 0xb1, 0x20, 0x85, 0xfa, 0x00,
  4822. 0x00, 0x00,
  4823. }
  4824. // Ensure that a missing status doesn't make the server panic
  4825. // See Issue https://golang.org/issues/21701
  4826. func TestMissingStatusNoPanic(t *testing.T) {
  4827. t.Parallel()
  4828. const want = "unknown status code"
  4829. ln := newLocalListener(t)
  4830. addr := ln.Addr().String()
  4831. done := make(chan bool)
  4832. fullAddrURL := fmt.Sprintf("http://%s", addr)
  4833. raw := "HTTP/1.1 400\r\n" +
  4834. "Date: Wed, 30 Aug 2017 19:09:27 GMT\r\n" +
  4835. "Content-Type: text/html; charset=utf-8\r\n" +
  4836. "Content-Length: 10\r\n" +
  4837. "Last-Modified: Wed, 30 Aug 2017 19:02:02 GMT\r\n" +
  4838. "Vary: Accept-Encoding\r\n\r\n" +
  4839. "Aloha Olaa"
  4840. go func() {
  4841. defer close(done)
  4842. conn, _ := ln.Accept()
  4843. if conn != nil {
  4844. io.WriteString(conn, raw)
  4845. io.ReadAll(conn)
  4846. conn.Close()
  4847. }
  4848. }()
  4849. proxyURL, err := url.Parse(fullAddrURL)
  4850. if err != nil {
  4851. t.Fatalf("proxyURL: %v", err)
  4852. }
  4853. tr := &Transport{Proxy: ProxyURL(proxyURL)}
  4854. req, _ := NewRequest("GET", "https://golang.org/", nil)
  4855. res, err, panicked := doFetchCheckPanic(tr, req)
  4856. if panicked {
  4857. t.Error("panicked, expecting an error")
  4858. }
  4859. if res != nil && res.Body != nil {
  4860. io.Copy(io.Discard, res.Body)
  4861. res.Body.Close()
  4862. }
  4863. if err == nil || !strings.Contains(err.Error(), want) {
  4864. t.Errorf("got=%v want=%q", err, want)
  4865. }
  4866. ln.Close()
  4867. <-done
  4868. }
  4869. func doFetchCheckPanic(tr *Transport, req *Request) (res *Response, err error, panicked bool) {
  4870. defer func() {
  4871. if r := recover(); r != nil {
  4872. panicked = true
  4873. }
  4874. }()
  4875. res, err = tr.RoundTrip(req)
  4876. return
  4877. }
  4878. // Issue 22330: do not allow the response body to be read when the status code
  4879. // forbids a response body.
  4880. func TestNoBodyOnChunked304Response(t *testing.T) {
  4881. defer afterTest(t)
  4882. cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  4883. conn, buf, _ := w.(Hijacker).Hijack()
  4884. buf.Write([]byte("HTTP/1.1 304 NOT MODIFIED\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n"))
  4885. buf.Flush()
  4886. conn.Close()
  4887. }))
  4888. defer cst.close()
  4889. // Our test server above is sending back bogus data after the
  4890. // response (the "0\r\n\r\n" part), which causes the Transport
  4891. // code to log spam. Disable keep-alives so we never even try
  4892. // to reuse the connection.
  4893. cst.tr.DisableKeepAlives = true
  4894. res, err := cst.c.Get(cst.ts.URL)
  4895. if err != nil {
  4896. t.Fatal(err)
  4897. }
  4898. if res.Body != NoBody {
  4899. t.Errorf("Unexpected body on 304 response")
  4900. }
  4901. }
  4902. type funcWriter func([]byte) (int, error)
  4903. func (f funcWriter) Write(p []byte) (int, error) { return f(p) }
  4904. type doneContext struct {
  4905. context.Context
  4906. err error
  4907. }
  4908. func (doneContext) Done() <-chan struct{} {
  4909. c := make(chan struct{})
  4910. close(c)
  4911. return c
  4912. }
  4913. func (d doneContext) Err() error { return d.err }
  4914. // Issue 25852: Transport should check whether Context is done early.
  4915. func TestTransportCheckContextDoneEarly(t *testing.T) {
  4916. tr := &Transport{}
  4917. req, _ := NewRequest("GET", "http://fake.example/", nil)
  4918. wantErr := errors.New("some error")
  4919. req = req.WithContext(doneContext{context.Background(), wantErr})
  4920. _, err := tr.RoundTrip(req)
  4921. if err != wantErr {
  4922. t.Errorf("error = %v; want %v", err, wantErr)
  4923. }
  4924. }
  4925. // Issue 23399: verify that if a client request times out, the Transport's
  4926. // conn is closed so that it's not reused.
  4927. //
  4928. // This is the test variant that times out before the server replies with
  4929. // any response headers.
  4930. func TestClientTimeoutKillsConn_BeforeHeaders(t *testing.T) {
  4931. setParallel(t)
  4932. defer afterTest(t)
  4933. inHandler := make(chan net.Conn, 1)
  4934. handlerReadReturned := make(chan bool, 1)
  4935. cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  4936. conn, _, err := w.(Hijacker).Hijack()
  4937. if err != nil {
  4938. t.Error(err)
  4939. return
  4940. }
  4941. inHandler <- conn
  4942. n, err := conn.Read([]byte{0})
  4943. if n != 0 || err != io.EOF {
  4944. t.Errorf("unexpected Read result: %v, %v", n, err)
  4945. }
  4946. handlerReadReturned <- true
  4947. }))
  4948. defer cst.close()
  4949. const timeout = 50 * time.Millisecond
  4950. cst.c.Timeout = timeout
  4951. _, err := cst.c.Get(cst.ts.URL)
  4952. if err == nil {
  4953. t.Fatal("unexpected Get succeess")
  4954. }
  4955. select {
  4956. case c := <-inHandler:
  4957. select {
  4958. case <-handlerReadReturned:
  4959. // Success.
  4960. return
  4961. case <-time.After(5 * time.Second):
  4962. t.Error("Handler's conn.Read seems to be stuck in Read")
  4963. c.Close() // close it to unblock Handler
  4964. }
  4965. case <-time.After(timeout * 10):
  4966. // If we didn't get into the Handler in 50ms, that probably means
  4967. // the builder was just slow and the Get failed in that time
  4968. // but never made it to the server. That's fine. We'll usually
  4969. // test the part above on faster machines.
  4970. t.Skip("skipping test on slow builder")
  4971. }
  4972. }
  4973. // Issue 23399: verify that if a client request times out, the Transport's
  4974. // conn is closed so that it's not reused.
  4975. //
  4976. // This is the test variant that has the server send response headers
  4977. // first, and time out during the write of the response body.
  4978. func TestClientTimeoutKillsConn_AfterHeaders(t *testing.T) {
  4979. setParallel(t)
  4980. defer afterTest(t)
  4981. inHandler := make(chan net.Conn, 1)
  4982. handlerResult := make(chan error, 1)
  4983. cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  4984. w.Header().Set("Content-Length", "100")
  4985. w.(Flusher).Flush()
  4986. conn, _, err := w.(Hijacker).Hijack()
  4987. if err != nil {
  4988. t.Error(err)
  4989. return
  4990. }
  4991. conn.Write([]byte("foo"))
  4992. inHandler <- conn
  4993. n, err := conn.Read([]byte{0})
  4994. // The error should be io.EOF or "read tcp
  4995. // 127.0.0.1:35827->127.0.0.1:40290: read: connection
  4996. // reset by peer" depending on timing. Really we just
  4997. // care that it returns at all. But if it returns with
  4998. // data, that's weird.
  4999. if n != 0 || err == nil {
  5000. handlerResult <- fmt.Errorf("unexpected Read result: %v, %v", n, err)
  5001. return
  5002. }
  5003. handlerResult <- nil
  5004. }))
  5005. defer cst.close()
  5006. // Set Timeout to something very long but non-zero to exercise
  5007. // the codepaths that check for it. But rather than wait for it to fire
  5008. // (which would make the test slow), we send on the req.Cancel channel instead,
  5009. // which happens to exercise the same code paths.
  5010. cst.c.Timeout = time.Minute // just to be non-zero, not to hit it.
  5011. req, _ := NewRequest("GET", cst.ts.URL, nil)
  5012. cancel := make(chan struct{})
  5013. req.Cancel = cancel
  5014. res, err := cst.c.Do(req)
  5015. if err != nil {
  5016. select {
  5017. case <-inHandler:
  5018. t.Fatalf("Get error: %v", err)
  5019. default:
  5020. // Failed before entering handler. Ignore result.
  5021. t.Skip("skipping test on slow builder")
  5022. }
  5023. }
  5024. close(cancel)
  5025. got, err := io.ReadAll(res.Body)
  5026. if err == nil {
  5027. t.Fatalf("unexpected success; read %q, nil", got)
  5028. }
  5029. select {
  5030. case c := <-inHandler:
  5031. select {
  5032. case err := <-handlerResult:
  5033. if err != nil {
  5034. t.Errorf("handler: %v", err)
  5035. }
  5036. return
  5037. case <-time.After(5 * time.Second):
  5038. t.Error("Handler's conn.Read seems to be stuck in Read")
  5039. c.Close() // close it to unblock Handler
  5040. }
  5041. case <-time.After(5 * time.Second):
  5042. t.Fatal("timeout")
  5043. }
  5044. }
  5045. func TestTransportResponseBodyWritableOnProtocolSwitch(t *testing.T) {
  5046. setParallel(t)
  5047. defer afterTest(t)
  5048. done := make(chan struct{})
  5049. defer close(done)
  5050. cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  5051. conn, _, err := w.(Hijacker).Hijack()
  5052. if err != nil {
  5053. t.Error(err)
  5054. return
  5055. }
  5056. defer conn.Close()
  5057. io.WriteString(conn, "HTTP/1.1 101 Switching Protocols Hi\r\nConnection: upgRADe\r\nUpgrade: foo\r\n\r\nSome buffered data\n")
  5058. bs := bufio.NewScanner(conn)
  5059. bs.Scan()
  5060. fmt.Fprintf(conn, "%s\n", strings.ToUpper(bs.Text()))
  5061. <-done
  5062. }))
  5063. defer cst.close()
  5064. req, _ := NewRequest("GET", cst.ts.URL, nil)
  5065. req.Header.Set("Upgrade", "foo")
  5066. req.Header.Set("Connection", "upgrade")
  5067. res, err := cst.c.Do(req)
  5068. if err != nil {
  5069. t.Fatal(err)
  5070. }
  5071. if res.StatusCode != 101 {
  5072. t.Fatalf("expected 101 switching protocols; got %v, %v", res.Status, res.Header)
  5073. }
  5074. rwc, ok := res.Body.(io.ReadWriteCloser)
  5075. if !ok {
  5076. t.Fatalf("expected a ReadWriteCloser; got a %T", res.Body)
  5077. }
  5078. defer rwc.Close()
  5079. bs := bufio.NewScanner(rwc)
  5080. if !bs.Scan() {
  5081. t.Fatalf("expected readable input")
  5082. }
  5083. if got, want := bs.Text(), "Some buffered data"; got != want {
  5084. t.Errorf("read %q; want %q", got, want)
  5085. }
  5086. io.WriteString(rwc, "echo\n")
  5087. if !bs.Scan() {
  5088. t.Fatalf("expected another line")
  5089. }
  5090. if got, want := bs.Text(), "ECHO"; got != want {
  5091. t.Errorf("read %q; want %q", got, want)
  5092. }
  5093. }
  5094. func TestTransportCONNECTBidi(t *testing.T) {
  5095. defer afterTest(t)
  5096. const target = "backend:443"
  5097. cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  5098. if r.Method != "CONNECT" {
  5099. t.Errorf("unexpected method %q", r.Method)
  5100. w.WriteHeader(500)
  5101. return
  5102. }
  5103. if r.RequestURI != target {
  5104. t.Errorf("unexpected CONNECT target %q", r.RequestURI)
  5105. w.WriteHeader(500)
  5106. return
  5107. }
  5108. nc, brw, err := w.(Hijacker).Hijack()
  5109. if err != nil {
  5110. t.Error(err)
  5111. return
  5112. }
  5113. defer nc.Close()
  5114. nc.Write([]byte("HTTP/1.1 200 OK\r\n\r\n"))
  5115. // Switch to a little protocol that capitalize its input lines:
  5116. for {
  5117. line, err := brw.ReadString('\n')
  5118. if err != nil {
  5119. if err != io.EOF {
  5120. t.Error(err)
  5121. }
  5122. return
  5123. }
  5124. io.WriteString(brw, strings.ToUpper(line))
  5125. brw.Flush()
  5126. }
  5127. }))
  5128. defer cst.close()
  5129. pr, pw := io.Pipe()
  5130. defer pw.Close()
  5131. req, err := NewRequest("CONNECT", cst.ts.URL, pr)
  5132. if err != nil {
  5133. t.Fatal(err)
  5134. }
  5135. req.URL.Opaque = target
  5136. res, err := cst.c.Do(req)
  5137. if err != nil {
  5138. t.Fatal(err)
  5139. }
  5140. defer res.Body.Close()
  5141. if res.StatusCode != 200 {
  5142. t.Fatalf("status code = %d; want 200", res.StatusCode)
  5143. }
  5144. br := bufio.NewReader(res.Body)
  5145. for _, str := range []string{"foo", "bar", "baz"} {
  5146. fmt.Fprintf(pw, "%s\n", str)
  5147. got, err := br.ReadString('\n')
  5148. if err != nil {
  5149. t.Fatal(err)
  5150. }
  5151. got = strings.TrimSpace(got)
  5152. want := strings.ToUpper(str)
  5153. if got != want {
  5154. t.Fatalf("got %q; want %q", got, want)
  5155. }
  5156. }
  5157. }
  5158. func TestTransportRequestReplayable(t *testing.T) {
  5159. someBody := io.NopCloser(strings.NewReader(""))
  5160. tests := []struct {
  5161. name string
  5162. req *Request
  5163. want bool
  5164. }{
  5165. {
  5166. name: "GET",
  5167. req: &Request{Method: "GET"},
  5168. want: true,
  5169. },
  5170. {
  5171. name: "GET_http.NoBody",
  5172. req: &Request{Method: "GET", Body: NoBody},
  5173. want: true,
  5174. },
  5175. {
  5176. name: "GET_body",
  5177. req: &Request{Method: "GET", Body: someBody},
  5178. want: false,
  5179. },
  5180. {
  5181. name: "POST",
  5182. req: &Request{Method: "POST"},
  5183. want: false,
  5184. },
  5185. {
  5186. name: "POST_idempotency-key",
  5187. req: &Request{Method: "POST", Header: Header{"Idempotency-Key": {"x"}}},
  5188. want: true,
  5189. },
  5190. {
  5191. name: "POST_x-idempotency-key",
  5192. req: &Request{Method: "POST", Header: Header{"X-Idempotency-Key": {"x"}}},
  5193. want: true,
  5194. },
  5195. {
  5196. name: "POST_body",
  5197. req: &Request{Method: "POST", Header: Header{"Idempotency-Key": {"x"}}, Body: someBody},
  5198. want: false,
  5199. },
  5200. }
  5201. for _, tt := range tests {
  5202. t.Run(tt.name, func(t *testing.T) {
  5203. got := tt.req.ExportIsReplayable()
  5204. if got != tt.want {
  5205. t.Errorf("replyable = %v; want %v", got, tt.want)
  5206. }
  5207. })
  5208. }
  5209. }
  5210. // testMockTCPConn is a mock TCP connection used to test that
  5211. // ReadFrom is called when sending the request body.
  5212. type testMockTCPConn struct {
  5213. *net.TCPConn
  5214. ReadFromCalled bool
  5215. }
  5216. func (c *testMockTCPConn) ReadFrom(r io.Reader) (int64, error) {
  5217. c.ReadFromCalled = true
  5218. return c.TCPConn.ReadFrom(r)
  5219. }
  5220. func TestTransportRequestWriteRoundTrip(t *testing.T) {
  5221. nBytes := int64(1 << 10)
  5222. newFileFunc := func() (r io.Reader, done func(), err error) {
  5223. f, err := os.CreateTemp("", "net-http-newfilefunc")
  5224. if err != nil {
  5225. return nil, nil, err
  5226. }
  5227. // Write some bytes to the file to enable reading.
  5228. if _, err := io.CopyN(f, rand.Reader, nBytes); err != nil {
  5229. return nil, nil, fmt.Errorf("failed to write data to file: %v", err)
  5230. }
  5231. if _, err := f.Seek(0, 0); err != nil {
  5232. return nil, nil, fmt.Errorf("failed to seek to front: %v", err)
  5233. }
  5234. done = func() {
  5235. f.Close()
  5236. os.Remove(f.Name())
  5237. }
  5238. return f, done, nil
  5239. }
  5240. newBufferFunc := func() (io.Reader, func(), error) {
  5241. return bytes.NewBuffer(make([]byte, nBytes)), func() {}, nil
  5242. }
  5243. cases := []struct {
  5244. name string
  5245. readerFunc func() (io.Reader, func(), error)
  5246. contentLength int64
  5247. expectedReadFrom bool
  5248. }{
  5249. {
  5250. name: "file, length",
  5251. readerFunc: newFileFunc,
  5252. contentLength: nBytes,
  5253. expectedReadFrom: true,
  5254. },
  5255. {
  5256. name: "file, no length",
  5257. readerFunc: newFileFunc,
  5258. },
  5259. {
  5260. name: "file, negative length",
  5261. readerFunc: newFileFunc,
  5262. contentLength: -1,
  5263. },
  5264. {
  5265. name: "buffer",
  5266. contentLength: nBytes,
  5267. readerFunc: newBufferFunc,
  5268. },
  5269. {
  5270. name: "buffer, no length",
  5271. readerFunc: newBufferFunc,
  5272. },
  5273. {
  5274. name: "buffer, length -1",
  5275. contentLength: -1,
  5276. readerFunc: newBufferFunc,
  5277. },
  5278. }
  5279. for _, tc := range cases {
  5280. t.Run(tc.name, func(t *testing.T) {
  5281. r, cleanup, err := tc.readerFunc()
  5282. if err != nil {
  5283. t.Fatal(err)
  5284. }
  5285. defer cleanup()
  5286. tConn := &testMockTCPConn{}
  5287. trFunc := func(tr *Transport) {
  5288. tr.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
  5289. var d net.Dialer
  5290. conn, err := d.DialContext(ctx, network, addr)
  5291. if err != nil {
  5292. return nil, err
  5293. }
  5294. tcpConn, ok := conn.(*net.TCPConn)
  5295. if !ok {
  5296. return nil, fmt.Errorf("%s/%s does not provide a *net.TCPConn", network, addr)
  5297. }
  5298. tConn.TCPConn = tcpConn
  5299. return tConn, nil
  5300. }
  5301. }
  5302. cst := newClientServerTest(
  5303. t,
  5304. h1Mode,
  5305. HandlerFunc(func(w ResponseWriter, r *Request) {
  5306. io.Copy(io.Discard, r.Body)
  5307. r.Body.Close()
  5308. w.WriteHeader(200)
  5309. }),
  5310. trFunc,
  5311. )
  5312. defer cst.close()
  5313. req, err := NewRequest("PUT", cst.ts.URL, r)
  5314. if err != nil {
  5315. t.Fatal(err)
  5316. }
  5317. req.ContentLength = tc.contentLength
  5318. req.Header.Set("Content-Type", "application/octet-stream")
  5319. resp, err := cst.c.Do(req)
  5320. if err != nil {
  5321. t.Fatal(err)
  5322. }
  5323. defer resp.Body.Close()
  5324. if resp.StatusCode != 200 {
  5325. t.Fatalf("status code = %d; want 200", resp.StatusCode)
  5326. }
  5327. if !tConn.ReadFromCalled && tc.expectedReadFrom {
  5328. t.Fatalf("did not call ReadFrom")
  5329. }
  5330. if tConn.ReadFromCalled && !tc.expectedReadFrom {
  5331. t.Fatalf("ReadFrom was unexpectedly invoked")
  5332. }
  5333. })
  5334. }
  5335. }
  5336. func TestTransportClone(t *testing.T) {
  5337. tr := &Transport{
  5338. Proxy: func(*Request) (*url.URL, error) { panic("") },
  5339. DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { panic("") },
  5340. Dial: func(network, addr string) (net.Conn, error) { panic("") },
  5341. DialTLS: func(network, addr string) (net.Conn, error) { panic("") },
  5342. DialTLSContext: func(ctx context.Context, network, addr string) (net.Conn, error) { panic("") },
  5343. TLSClientConfig: new(tls.Config),
  5344. TLSHandshakeTimeout: time.Second,
  5345. DisableKeepAlives: true,
  5346. DisableCompression: true,
  5347. MaxIdleConns: 1,
  5348. MaxIdleConnsPerHost: 1,
  5349. MaxConnsPerHost: 1,
  5350. IdleConnTimeout: time.Second,
  5351. ResponseHeaderTimeout: time.Second,
  5352. ExpectContinueTimeout: time.Second,
  5353. ProxyConnectHeader: Header{},
  5354. GetProxyConnectHeader: func(context.Context, *url.URL, string) (Header, error) { return nil, nil },
  5355. MaxResponseHeaderBytes: 1,
  5356. ForceAttemptHTTP2: true,
  5357. TLSNextProto: map[string]func(authority string, c *tls.Conn) RoundTripper{
  5358. "foo": func(authority string, c *tls.Conn) RoundTripper { panic("") },
  5359. },
  5360. ReadBufferSize: 1,
  5361. WriteBufferSize: 1,
  5362. }
  5363. tr2 := tr.Clone()
  5364. rv := reflect.ValueOf(tr2).Elem()
  5365. rt := rv.Type()
  5366. for i := 0; i < rt.NumField(); i++ {
  5367. sf := rt.Field(i)
  5368. if !token.IsExported(sf.Name) {
  5369. continue
  5370. }
  5371. if rv.Field(i).IsZero() {
  5372. t.Errorf("cloned field t2.%s is zero", sf.Name)
  5373. }
  5374. }
  5375. if _, ok := tr2.TLSNextProto["foo"]; !ok {
  5376. t.Errorf("cloned Transport lacked TLSNextProto 'foo' key")
  5377. }
  5378. // But test that a nil TLSNextProto is kept nil:
  5379. tr = new(Transport)
  5380. tr2 = tr.Clone()
  5381. if tr2.TLSNextProto != nil {
  5382. t.Errorf("Transport.TLSNextProto unexpected non-nil")
  5383. }
  5384. }
  5385. func TestIs408(t *testing.T) {
  5386. tests := []struct {
  5387. in string
  5388. want bool
  5389. }{
  5390. {"HTTP/1.0 408", true},
  5391. {"HTTP/1.1 408", true},
  5392. {"HTTP/1.8 408", true},
  5393. {"HTTP/2.0 408", false}, // maybe h2c would do this? but false for now.
  5394. {"HTTP/1.1 408 ", true},
  5395. {"HTTP/1.1 40", false},
  5396. {"http/1.0 408", false},
  5397. {"HTTP/1-1 408", false},
  5398. }
  5399. for _, tt := range tests {
  5400. if got := Export_is408Message([]byte(tt.in)); got != tt.want {
  5401. t.Errorf("is408Message(%q) = %v; want %v", tt.in, got, tt.want)
  5402. }
  5403. }
  5404. }
  5405. func TestTransportIgnores408(t *testing.T) {
  5406. // Not parallel. Relies on mutating the log package's global Output.
  5407. defer log.SetOutput(log.Writer())
  5408. var logout bytes.Buffer
  5409. log.SetOutput(&logout)
  5410. defer afterTest(t)
  5411. const target = "backend:443"
  5412. cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  5413. nc, _, err := w.(Hijacker).Hijack()
  5414. if err != nil {
  5415. t.Error(err)
  5416. return
  5417. }
  5418. defer nc.Close()
  5419. nc.Write([]byte("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nok"))
  5420. nc.Write([]byte("HTTP/1.1 408 bye\r\n")) // changing 408 to 409 makes test fail
  5421. }))
  5422. defer cst.close()
  5423. req, err := NewRequest("GET", cst.ts.URL, nil)
  5424. if err != nil {
  5425. t.Fatal(err)
  5426. }
  5427. res, err := cst.c.Do(req)
  5428. if err != nil {
  5429. t.Fatal(err)
  5430. }
  5431. slurp, err := io.ReadAll(res.Body)
  5432. if err != nil {
  5433. t.Fatal(err)
  5434. }
  5435. if err != nil {
  5436. t.Fatal(err)
  5437. }
  5438. if string(slurp) != "ok" {
  5439. t.Fatalf("got %q; want ok", slurp)
  5440. }
  5441. t0 := time.Now()
  5442. for i := 0; i < 50; i++ {
  5443. time.Sleep(time.Duration(i) * 5 * time.Millisecond)
  5444. if cst.tr.IdleConnKeyCountForTesting() == 0 {
  5445. if got := logout.String(); got != "" {
  5446. t.Fatalf("expected no log output; got: %s", got)
  5447. }
  5448. return
  5449. }
  5450. }
  5451. t.Fatalf("timeout after %v waiting for Transport connections to die off", time.Since(t0))
  5452. }
  5453. func TestInvalidHeaderResponse(t *testing.T) {
  5454. setParallel(t)
  5455. defer afterTest(t)
  5456. cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  5457. conn, buf, _ := w.(Hijacker).Hijack()
  5458. buf.Write([]byte("HTTP/1.1 200 OK\r\n" +
  5459. "Date: Wed, 30 Aug 2017 19:09:27 GMT\r\n" +
  5460. "Content-Type: text/html; charset=utf-8\r\n" +
  5461. "Content-Length: 0\r\n" +
  5462. "Foo : bar\r\n\r\n"))
  5463. buf.Flush()
  5464. conn.Close()
  5465. }))
  5466. defer cst.close()
  5467. res, err := cst.c.Get(cst.ts.URL)
  5468. if err != nil {
  5469. t.Fatal(err)
  5470. }
  5471. defer res.Body.Close()
  5472. if v := res.Header.Get("Foo"); v != "" {
  5473. t.Errorf(`unexpected "Foo" header: %q`, v)
  5474. }
  5475. if v := res.Header.Get("Foo "); v != "bar" {
  5476. t.Errorf(`bad "Foo " header value: %q, want %q`, v, "bar")
  5477. }
  5478. }
  5479. type bodyCloser bool
  5480. func (bc *bodyCloser) Close() error {
  5481. *bc = true
  5482. return nil
  5483. }
  5484. func (bc *bodyCloser) Read(b []byte) (n int, err error) {
  5485. return 0, io.EOF
  5486. }
  5487. // Issue 35015: ensure that Transport closes the body on any error
  5488. // with an invalid request, as promised by Client.Do docs.
  5489. func TestTransportClosesBodyOnInvalidRequests(t *testing.T) {
  5490. cst := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  5491. t.Errorf("Should not have been invoked")
  5492. }))
  5493. defer cst.Close()
  5494. u, _ := url.Parse(cst.URL)
  5495. tests := []struct {
  5496. name string
  5497. req *Request
  5498. wantErr string
  5499. }{
  5500. {
  5501. name: "invalid method",
  5502. req: &Request{
  5503. Method: " ",
  5504. URL: u,
  5505. },
  5506. wantErr: "invalid method",
  5507. },
  5508. {
  5509. name: "nil URL",
  5510. req: &Request{
  5511. Method: "GET",
  5512. },
  5513. wantErr: "nil Request.URL",
  5514. },
  5515. {
  5516. name: "invalid header key",
  5517. req: &Request{
  5518. Method: "GET",
  5519. Header: Header{"💡": {"emoji"}},
  5520. URL: u,
  5521. },
  5522. wantErr: "invalid header field name",
  5523. },
  5524. {
  5525. name: "invalid header value",
  5526. req: &Request{
  5527. Method: "POST",
  5528. Header: Header{"key": {"\x19"}},
  5529. URL: u,
  5530. },
  5531. wantErr: "invalid header field value",
  5532. },
  5533. {
  5534. name: "non HTTP(s) scheme",
  5535. req: &Request{
  5536. Method: "POST",
  5537. URL: &url.URL{Scheme: "faux"},
  5538. },
  5539. wantErr: "unsupported protocol scheme",
  5540. },
  5541. {
  5542. name: "no Host in URL",
  5543. req: &Request{
  5544. Method: "POST",
  5545. URL: &url.URL{Scheme: "http"},
  5546. },
  5547. wantErr: "no Host",
  5548. },
  5549. }
  5550. for _, tt := range tests {
  5551. t.Run(tt.name, func(t *testing.T) {
  5552. var bc bodyCloser
  5553. req := tt.req
  5554. req.Body = &bc
  5555. _, err := DefaultClient.Do(tt.req)
  5556. if err == nil {
  5557. t.Fatal("Expected an error")
  5558. }
  5559. if !bc {
  5560. t.Fatal("Expected body to have been closed")
  5561. }
  5562. if g, w := err.Error(), tt.wantErr; !strings.Contains(g, w) {
  5563. t.Fatalf("Error mismatch\n\t%q\ndoes not contain\n\t%q", g, w)
  5564. }
  5565. })
  5566. }
  5567. }
  5568. // breakableConn is a net.Conn wrapper with a Write method
  5569. // that will fail when its brokenState is true.
  5570. type breakableConn struct {
  5571. net.Conn
  5572. *brokenState
  5573. }
  5574. type brokenState struct {
  5575. sync.Mutex
  5576. broken bool
  5577. }
  5578. func (w *breakableConn) Write(b []byte) (n int, err error) {
  5579. w.Lock()
  5580. defer w.Unlock()
  5581. if w.broken {
  5582. return 0, errors.New("some write error")
  5583. }
  5584. return w.Conn.Write(b)
  5585. }
  5586. // Issue 34978: don't cache a broken HTTP/2 connection
  5587. func TestDontCacheBrokenHTTP2Conn(t *testing.T) {
  5588. cst := newClientServerTest(t, h2Mode, HandlerFunc(func(w ResponseWriter, r *Request) {}), optQuietLog)
  5589. defer cst.close()
  5590. var brokenState brokenState
  5591. const numReqs = 5
  5592. var numDials, gotConns uint32 // atomic
  5593. cst.tr.Dial = func(netw, addr string) (net.Conn, error) {
  5594. atomic.AddUint32(&numDials, 1)
  5595. c, err := net.Dial(netw, addr)
  5596. if err != nil {
  5597. t.Errorf("unexpected Dial error: %v", err)
  5598. return nil, err
  5599. }
  5600. return &breakableConn{c, &brokenState}, err
  5601. }
  5602. for i := 1; i <= numReqs; i++ {
  5603. brokenState.Lock()
  5604. brokenState.broken = false
  5605. brokenState.Unlock()
  5606. // doBreak controls whether we break the TCP connection after the TLS
  5607. // handshake (before the HTTP/2 handshake). We test a few failures
  5608. // in a row followed by a final success.
  5609. doBreak := i != numReqs
  5610. ctx := httptrace.WithClientTrace(context.Background(), &httptrace.ClientTrace{
  5611. GotConn: func(info httptrace.GotConnInfo) {
  5612. t.Logf("got conn: %v, reused=%v, wasIdle=%v, idleTime=%v", info.Conn.LocalAddr(), info.Reused, info.WasIdle, info.IdleTime)
  5613. atomic.AddUint32(&gotConns, 1)
  5614. },
  5615. TLSHandshakeDone: func(cfg tls.ConnectionState, err error) {
  5616. brokenState.Lock()
  5617. defer brokenState.Unlock()
  5618. if doBreak {
  5619. brokenState.broken = true
  5620. }
  5621. },
  5622. })
  5623. req, err := NewRequestWithContext(ctx, "GET", cst.ts.URL, nil)
  5624. if err != nil {
  5625. t.Fatal(err)
  5626. }
  5627. _, err = cst.c.Do(req)
  5628. if doBreak != (err != nil) {
  5629. t.Errorf("for iteration %d, doBreak=%v; unexpected error %v", i, doBreak, err)
  5630. }
  5631. }
  5632. if got, want := atomic.LoadUint32(&gotConns), 1; int(got) != want {
  5633. t.Errorf("GotConn calls = %v; want %v", got, want)
  5634. }
  5635. if got, want := atomic.LoadUint32(&numDials), numReqs; int(got) != want {
  5636. t.Errorf("Dials = %v; want %v", got, want)
  5637. }
  5638. }
  5639. // Issue 34941
  5640. // When the client has too many concurrent requests on a single connection,
  5641. // http.http2noCachedConnError is reported on multiple requests. There should
  5642. // only be one decrement regardless of the number of failures.
  5643. func TestTransportDecrementConnWhenIdleConnRemoved(t *testing.T) {
  5644. defer afterTest(t)
  5645. CondSkipHTTP2(t)
  5646. h := HandlerFunc(func(w ResponseWriter, r *Request) {
  5647. _, err := w.Write([]byte("foo"))
  5648. if err != nil {
  5649. t.Fatalf("Write: %v", err)
  5650. }
  5651. })
  5652. ts := httptest.NewUnstartedServer(h)
  5653. ts.EnableHTTP2 = true
  5654. ts.StartTLS()
  5655. defer ts.Close()
  5656. c := ts.Client()
  5657. tr := c.Transport.(*Transport)
  5658. tr.MaxConnsPerHost = 1
  5659. if err := ExportHttp2ConfigureTransport(tr); err != nil {
  5660. t.Fatalf("ExportHttp2ConfigureTransport: %v", err)
  5661. }
  5662. errCh := make(chan error, 300)
  5663. doReq := func() {
  5664. resp, err := c.Get(ts.URL)
  5665. if err != nil {
  5666. errCh <- fmt.Errorf("request failed: %v", err)
  5667. return
  5668. }
  5669. defer resp.Body.Close()
  5670. _, err = io.ReadAll(resp.Body)
  5671. if err != nil {
  5672. errCh <- fmt.Errorf("read body failed: %v", err)
  5673. }
  5674. }
  5675. var wg sync.WaitGroup
  5676. for i := 0; i < 300; i++ {
  5677. wg.Add(1)
  5678. go func() {
  5679. defer wg.Done()
  5680. doReq()
  5681. }()
  5682. }
  5683. wg.Wait()
  5684. close(errCh)
  5685. for err := range errCh {
  5686. t.Errorf("error occurred: %v", err)
  5687. }
  5688. }
  5689. // Issue 36820
  5690. // Test that we use the older backward compatible cancellation protocol
  5691. // when a RoundTripper is registered via RegisterProtocol.
  5692. func TestAltProtoCancellation(t *testing.T) {
  5693. defer afterTest(t)
  5694. tr := &Transport{}
  5695. c := &Client{
  5696. Transport: tr,
  5697. Timeout: time.Millisecond,
  5698. }
  5699. tr.RegisterProtocol("timeout", timeoutProto{})
  5700. _, err := c.Get("timeout://bar.com/path")
  5701. if err == nil {
  5702. t.Error("request unexpectedly succeeded")
  5703. } else if !strings.Contains(err.Error(), timeoutProtoErr.Error()) {
  5704. t.Errorf("got error %q, does not contain expected string %q", err, timeoutProtoErr)
  5705. }
  5706. }
  5707. var timeoutProtoErr = errors.New("canceled as expected")
  5708. type timeoutProto struct{}
  5709. func (timeoutProto) RoundTrip(req *Request) (*Response, error) {
  5710. select {
  5711. case <-req.Cancel:
  5712. return nil, timeoutProtoErr
  5713. case <-time.After(5 * time.Second):
  5714. return nil, errors.New("request was not canceled")
  5715. }
  5716. }
  5717. type roundTripFunc func(r *Request) (*Response, error)
  5718. func (f roundTripFunc) RoundTrip(r *Request) (*Response, error) { return f(r) }
  5719. // Issue 32441: body is not reset after ErrSkipAltProtocol
  5720. func TestIssue32441(t *testing.T) {
  5721. defer afterTest(t)
  5722. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  5723. if n, _ := io.Copy(io.Discard, r.Body); n == 0 {
  5724. t.Error("body length is zero")
  5725. }
  5726. }))
  5727. defer ts.Close()
  5728. c := ts.Client()
  5729. c.Transport.(*Transport).RegisterProtocol("http", roundTripFunc(func(r *Request) (*Response, error) {
  5730. // Draining body to trigger failure condition on actual request to server.
  5731. if n, _ := io.Copy(io.Discard, r.Body); n == 0 {
  5732. t.Error("body length is zero during round trip")
  5733. }
  5734. return nil, ErrSkipAltProtocol
  5735. }))
  5736. if _, err := c.Post(ts.URL, "application/octet-stream", bytes.NewBufferString("data")); err != nil {
  5737. t.Error(err)
  5738. }
  5739. }
  5740. // Issue 39017. Ensure that HTTP/1 transports reject Content-Length headers
  5741. // that contain a sign (eg. "+3"), per RFC 2616, Section 14.13.
  5742. func TestTransportRejectsSignInContentLength(t *testing.T) {
  5743. cst := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  5744. w.Header().Set("Content-Length", "+3")
  5745. w.Write([]byte("abc"))
  5746. }))
  5747. defer cst.Close()
  5748. c := cst.Client()
  5749. res, err := c.Get(cst.URL)
  5750. if err == nil || res != nil {
  5751. t.Fatal("Expected a non-nil error and a nil http.Response")
  5752. }
  5753. if got, want := err.Error(), `bad Content-Length "+3"`; !strings.Contains(got, want) {
  5754. t.Fatalf("Error mismatch\nGot: %q\nWanted substring: %q", got, want)
  5755. }
  5756. }
  5757. // dumpConn is a net.Conn which writes to Writer and reads from Reader
  5758. type dumpConn struct {
  5759. io.Writer
  5760. io.Reader
  5761. }
  5762. func (c *dumpConn) Close() error { return nil }
  5763. func (c *dumpConn) LocalAddr() net.Addr { return nil }
  5764. func (c *dumpConn) RemoteAddr() net.Addr { return nil }
  5765. func (c *dumpConn) SetDeadline(t time.Time) error { return nil }
  5766. func (c *dumpConn) SetReadDeadline(t time.Time) error { return nil }
  5767. func (c *dumpConn) SetWriteDeadline(t time.Time) error { return nil }
  5768. // delegateReader is a reader that delegates to another reader,
  5769. // once it arrives on a channel.
  5770. type delegateReader struct {
  5771. c chan io.Reader
  5772. r io.Reader // nil until received from c
  5773. }
  5774. func (r *delegateReader) Read(p []byte) (int, error) {
  5775. if r.r == nil {
  5776. var ok bool
  5777. if r.r, ok = <-r.c; !ok {
  5778. return 0, errors.New("delegate closed")
  5779. }
  5780. }
  5781. return r.r.Read(p)
  5782. }
  5783. func testTransportRace(req *Request) {
  5784. save := req.Body
  5785. pr, pw := io.Pipe()
  5786. defer pr.Close()
  5787. defer pw.Close()
  5788. dr := &delegateReader{c: make(chan io.Reader)}
  5789. t := &Transport{
  5790. Dial: func(net, addr string) (net.Conn, error) {
  5791. return &dumpConn{pw, dr}, nil
  5792. },
  5793. }
  5794. defer t.CloseIdleConnections()
  5795. quitReadCh := make(chan struct{})
  5796. // Wait for the request before replying with a dummy response:
  5797. go func() {
  5798. defer close(quitReadCh)
  5799. req, err := ReadRequest(bufio.NewReader(pr))
  5800. if err == nil {
  5801. // Ensure all the body is read; otherwise
  5802. // we'll get a partial dump.
  5803. io.Copy(io.Discard, req.Body)
  5804. req.Body.Close()
  5805. }
  5806. select {
  5807. case dr.c <- strings.NewReader("HTTP/1.1 204 No Content\r\nConnection: close\r\n\r\n"):
  5808. case quitReadCh <- struct{}{}:
  5809. // Ensure delegate is closed so Read doesn't block forever.
  5810. close(dr.c)
  5811. }
  5812. }()
  5813. t.RoundTrip(req)
  5814. // Ensure the reader returns before we reset req.Body to prevent
  5815. // a data race on req.Body.
  5816. pw.Close()
  5817. <-quitReadCh
  5818. req.Body = save
  5819. }
  5820. // Issue 37669
  5821. // Test that a cancellation doesn't result in a data race due to the writeLoop
  5822. // goroutine being left running, if the caller mutates the processed Request
  5823. // upon completion.
  5824. func TestErrorWriteLoopRace(t *testing.T) {
  5825. if testing.Short() {
  5826. return
  5827. }
  5828. t.Parallel()
  5829. for i := 0; i < 1000; i++ {
  5830. delay := time.Duration(mrand.Intn(5)) * time.Millisecond
  5831. ctx, cancel := context.WithTimeout(context.Background(), delay)
  5832. defer cancel()
  5833. r := bytes.NewBuffer(make([]byte, 10000))
  5834. req, err := NewRequestWithContext(ctx, MethodPost, "http://example.com", r)
  5835. if err != nil {
  5836. t.Fatal(err)
  5837. }
  5838. testTransportRace(req)
  5839. }
  5840. }
  5841. // Issue 41600
  5842. // Test that a new request which uses the connection of an active request
  5843. // cannot cause it to be canceled as well.
  5844. func TestCancelRequestWhenSharingConnection(t *testing.T) {
  5845. reqc := make(chan chan struct{}, 2)
  5846. ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, req *Request) {
  5847. ch := make(chan struct{}, 1)
  5848. reqc <- ch
  5849. <-ch
  5850. w.Header().Add("Content-Length", "0")
  5851. }))
  5852. defer ts.Close()
  5853. client := ts.Client()
  5854. transport := client.Transport.(*Transport)
  5855. transport.MaxIdleConns = 1
  5856. transport.MaxConnsPerHost = 1
  5857. var wg sync.WaitGroup
  5858. wg.Add(1)
  5859. putidlec := make(chan chan struct{})
  5860. go func() {
  5861. defer wg.Done()
  5862. ctx := httptrace.WithClientTrace(context.Background(), &httptrace.ClientTrace{
  5863. PutIdleConn: func(error) {
  5864. // Signal that the idle conn has been returned to the pool,
  5865. // and wait for the order to proceed.
  5866. ch := make(chan struct{})
  5867. putidlec <- ch
  5868. <-ch
  5869. },
  5870. })
  5871. req, _ := NewRequestWithContext(ctx, "GET", ts.URL, nil)
  5872. res, err := client.Do(req)
  5873. if err == nil {
  5874. res.Body.Close()
  5875. }
  5876. if err != nil {
  5877. t.Errorf("request 1: got err %v, want nil", err)
  5878. }
  5879. }()
  5880. // Wait for the first request to receive a response and return the
  5881. // connection to the idle pool.
  5882. r1c := <-reqc
  5883. close(r1c)
  5884. idlec := <-putidlec
  5885. wg.Add(1)
  5886. cancelctx, cancel := context.WithCancel(context.Background())
  5887. go func() {
  5888. defer wg.Done()
  5889. req, _ := NewRequestWithContext(cancelctx, "GET", ts.URL, nil)
  5890. res, err := client.Do(req)
  5891. if err == nil {
  5892. res.Body.Close()
  5893. }
  5894. if !errors.Is(err, context.Canceled) {
  5895. t.Errorf("request 2: got err %v, want Canceled", err)
  5896. }
  5897. }()
  5898. // Wait for the second request to arrive at the server, and then cancel
  5899. // the request context.
  5900. r2c := <-reqc
  5901. cancel()
  5902. // Give the cancelation a moment to take effect, and then unblock the first request.
  5903. time.Sleep(1 * time.Millisecond)
  5904. close(idlec)
  5905. close(r2c)
  5906. wg.Wait()
  5907. }
  5908. func TestHandlerAbortRacesBodyRead(t *testing.T) {
  5909. setParallel(t)
  5910. defer afterTest(t)
  5911. ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
  5912. go io.Copy(io.Discard, req.Body)
  5913. panic(ErrAbortHandler)
  5914. }))
  5915. defer ts.Close()
  5916. var wg sync.WaitGroup
  5917. for i := 0; i < 2; i++ {
  5918. wg.Add(1)
  5919. go func() {
  5920. defer wg.Done()
  5921. for j := 0; j < 10; j++ {
  5922. const reqLen = 6 * 1024 * 1024
  5923. req, _ := NewRequest("POST", ts.URL, &io.LimitedReader{R: neverEnding('x'), N: reqLen})
  5924. req.ContentLength = reqLen
  5925. resp, _ := ts.Client().Transport.RoundTrip(req)
  5926. if resp != nil {
  5927. resp.Body.Close()
  5928. }
  5929. }
  5930. }()
  5931. }
  5932. wg.Wait()
  5933. }