HttpWebRequestTest.cs 101 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379
  1. //
  2. // HttpWebRequestTest.cs - NUnit Test Cases for System.Net.HttpWebRequest
  3. //
  4. // Authors:
  5. // Lawrence Pit ([email protected])
  6. // Martin Willemoes Hansen ([email protected])
  7. // Gonzalo Paniagua Javier ([email protected])
  8. // Andres G. Aragoneses ([email protected])
  9. //
  10. // (C) 2003 Martin Willemoes Hansen
  11. // Copyright (c) 2005 Novell, Inc. (http://www.novell.com
  12. // Copyright (c) 2013 7digital Media Ltd (http://www.7digital.com)
  13. //
  14. using NUnit.Framework;
  15. using System;
  16. using System.Collections;
  17. using System.Collections.Specialized;
  18. using System.Globalization;
  19. using System.IO;
  20. using System.Net;
  21. using System.Net.Sockets;
  22. using System.Security.Cryptography;
  23. using System.Security.Cryptography.X509Certificates;
  24. using System.Text;
  25. using System.Threading;
  26. using Mono.Security.Authenticode;
  27. #if !MOBILE
  28. using Mono.Security.Protocol.Tls;
  29. #endif
  30. using MonoTests.Helpers;
  31. namespace MonoTests.System.Net
  32. {
  33. [TestFixture]
  34. public class HttpWebRequestTest
  35. {
  36. private Random rand = new Random ();
  37. private byte [] data64KB = new byte [64 * 1024];
  38. [TestFixtureSetUp]
  39. public void Setup ()
  40. {
  41. ServicePointManager.Expect100Continue = false;
  42. rand.NextBytes (data64KB);
  43. }
  44. [Test]
  45. public void Proxy_Null ()
  46. {
  47. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://www.google.com");
  48. Assert.IsNotNull (req.Proxy, "#1");
  49. req.Proxy = null;
  50. Assert.IsNull (req.Proxy, "#2");
  51. }
  52. [Test]
  53. [Category("InetAccess")]
  54. public void Sync ()
  55. {
  56. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://www.google.com");
  57. Assert.IsNotNull (req.IfModifiedSince, "req:If Modified Since: ");
  58. req.UserAgent = "MonoClient v1.0";
  59. Assert.AreEqual ("User-Agent", req.Headers.GetKey (0), "#A1");
  60. Assert.AreEqual ("MonoClient v1.0", req.Headers.Get (0), "#A2");
  61. HttpWebResponse res = (HttpWebResponse) req.GetResponse ();
  62. Assert.AreEqual ("OK", res.StatusCode.ToString (), "#B1");
  63. Assert.AreEqual ("OK", res.StatusDescription, "#B2");
  64. Assert.AreEqual ("text/html; charset=ISO-8859-1", res.Headers.Get ("Content-Type"), "#C1");
  65. Assert.IsNotNull (res.LastModified, "#C2");
  66. Assert.AreEqual (0, res.Cookies.Count, "#C3");
  67. res.Close ();
  68. }
  69. [Test]
  70. public void AddRange ()
  71. {
  72. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://www.google.com");
  73. req.AddRange (10);
  74. req.AddRange (50, 90);
  75. req.AddRange ("bytes", 100);
  76. req.AddRange ("bytes", 100, 120);
  77. Assert.AreEqual ("bytes=10-,50-90,100-,100-120", req.Headers ["Range"], "#1");
  78. try {
  79. req.AddRange ("bits", 2000);
  80. Assert.Fail ("#2");
  81. } catch (InvalidOperationException) {}
  82. }
  83. [Test] // bug #471782
  84. public void CloseRequestStreamAfterReadingResponse ()
  85. {
  86. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  87. string url = "http://" + ep.ToString () + "/test/";
  88. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  89. responder.Start ();
  90. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  91. req.Method = "POST";
  92. req.Timeout = 2000;
  93. req.ReadWriteTimeout = 2000;
  94. byte [] data = new byte [128];
  95. req.ContentLength = data.Length;
  96. Stream rs = req.GetRequestStream ();
  97. rs.Write (data, 0, data.Length);
  98. rs.Flush ();
  99. HttpWebResponse response = (HttpWebResponse) req.GetResponse ();
  100. response.Close ();
  101. rs.Close ();
  102. responder.Stop ();
  103. }
  104. }
  105. [Test]
  106. [Category("InetAccess")]
  107. public void Cookies1 ()
  108. {
  109. // The purpose of this test is to ensure that the cookies we get from a request
  110. // are stored in both, the CookieCollection in HttpWebResponse and the CookieContainer
  111. // in HttpWebRequest.
  112. // If this URL stops sending *one* and only one cookie, replace it.
  113. string url = "http://www.elmundo.es";
  114. CookieContainer cookies = new CookieContainer ();
  115. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  116. req.KeepAlive = false;
  117. req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv; 1.7.6) Gecko/20050317 Firefox/1.0.2";
  118. req.CookieContainer = cookies;
  119. Assert.AreEqual (0, cookies.Count, "#01");
  120. using (HttpWebResponse res = (HttpWebResponse) req.GetResponse()) {
  121. CookieCollection coll = req.CookieContainer.GetCookies (new Uri (url));
  122. Assert.AreEqual (1, coll.Count, "#02");
  123. Assert.AreEqual (1, res.Cookies.Count, "#03");
  124. Cookie one = coll [0];
  125. Cookie two = res.Cookies [0];
  126. Assert.AreEqual (true, object.ReferenceEquals (one, two), "#04");
  127. }
  128. }
  129. #if !MOBILE
  130. [Test]
  131. [Ignore ("Fails on MS.NET")]
  132. public void SslClientBlock ()
  133. {
  134. // This tests that the write request/initread/write body sequence does not hang
  135. // when using SSL.
  136. // If there's a regression for this, the test will hang.
  137. ServicePointManager.CertificatePolicy = new AcceptAllPolicy ();
  138. try {
  139. SslHttpServer server = new SslHttpServer ();
  140. server.Start ();
  141. string url = String.Format ("https://{0}:{1}/nothing.html", server.IPAddress, server.Port);
  142. HttpWebRequest request = (HttpWebRequest) WebRequest.Create (url);
  143. request.Method = "POST";
  144. Stream stream = request.GetRequestStream ();
  145. byte [] bytes = new byte [100];
  146. stream.Write (bytes, 0, bytes.Length);
  147. stream.Close ();
  148. HttpWebResponse resp = (HttpWebResponse) request.GetResponse ();
  149. Assert.AreEqual (200, (int) resp.StatusCode, "StatusCode");
  150. StreamReader sr = new StreamReader (resp.GetResponseStream (), Encoding.UTF8);
  151. sr.ReadToEnd ();
  152. sr.Close ();
  153. resp.Close ();
  154. server.Stop ();
  155. if (server.Error != null)
  156. throw server.Error;
  157. } finally {
  158. ServicePointManager.CertificatePolicy = null;
  159. }
  160. }
  161. #endif
  162. [Test]
  163. public void Missing_ContentEncoding ()
  164. {
  165. ServicePointManager.CertificatePolicy = new AcceptAllPolicy ();
  166. try {
  167. BadChunkedServer server = new BadChunkedServer ();
  168. server.Start ();
  169. string url = String.Format ("http://{0}:{1}/nothing.html", server.IPAddress, server.Port);
  170. HttpWebRequest request = (HttpWebRequest) WebRequest.Create (url);
  171. request.Method = "GET";
  172. HttpWebResponse resp = (HttpWebResponse) request.GetResponse ();
  173. Assert.AreEqual ("", resp.ContentEncoding);
  174. resp.Close ();
  175. server.Stop ();
  176. if (server.Error != null)
  177. throw server.Error;
  178. } finally {
  179. ServicePointManager.CertificatePolicy = null;
  180. }
  181. }
  182. [Test]
  183. public void BadServer_ChunkedClose ()
  184. {
  185. // The server will send a chunked response without a 'last-chunked' mark
  186. // and then shutdown the socket for sending.
  187. BadChunkedServer server = new BadChunkedServer ();
  188. server.Start ();
  189. string url = String.Format ("http://{0}:{1}/nothing.html", server.IPAddress, server.Port);
  190. HttpWebRequest request = (HttpWebRequest) WebRequest.Create (url);
  191. HttpWebResponse resp = (HttpWebResponse) request.GetResponse ();
  192. string x = null;
  193. try {
  194. byte [] bytes = new byte [32];
  195. // Using StreamReader+UTF8Encoding here fails on MS runtime
  196. Stream stream = resp.GetResponseStream ();
  197. int nread = stream.Read (bytes, 0, 32);
  198. Assert.AreEqual (16, nread, "#01");
  199. x = Encoding.ASCII.GetString (bytes, 0, 16);
  200. } finally {
  201. resp.Close ();
  202. server.Stop ();
  203. }
  204. if (server.Error != null)
  205. throw server.Error;
  206. Assert.AreEqual ("1234567890123456", x);
  207. }
  208. [Test]
  209. [Ignore ("This test asserts that our code violates RFC 2616")]
  210. public void MethodCase ()
  211. {
  212. ListDictionary methods = new ListDictionary ();
  213. methods.Add ("post", "POST");
  214. methods.Add ("puT", "PUT");
  215. methods.Add ("POST", "POST");
  216. methods.Add ("whatever", "whatever");
  217. methods.Add ("PUT", "PUT");
  218. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  219. string url = "http://" + ep.ToString () + "/test/";
  220. foreach (DictionaryEntry de in methods) {
  221. SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler));
  222. responder.Start ();
  223. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  224. req.Method = (string) de.Key;
  225. req.Timeout = 2000;
  226. req.ReadWriteTimeout = 2000;
  227. req.KeepAlive = false;
  228. Stream rs = req.GetRequestStream ();
  229. rs.Close ();
  230. using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
  231. StreamReader sr = new StreamReader (resp.GetResponseStream (),
  232. Encoding.UTF8);
  233. string line = sr.ReadLine ();
  234. sr.Close ();
  235. Assert.AreEqual (((string) de.Value) + " /test/ HTTP/1.1",
  236. line, req.Method);
  237. resp.Close ();
  238. }
  239. responder.Stop ();
  240. }
  241. }
  242. [Test]
  243. public void BeginGetRequestStream_Body_NotAllowed ()
  244. {
  245. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  246. string url = "http://" + ep.ToString () + "/test/";
  247. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  248. responder.Start ();
  249. HttpWebRequest request;
  250. request = (HttpWebRequest) WebRequest.Create (url);
  251. request.Method = "GET";
  252. try {
  253. request.BeginGetRequestStream (null, null);
  254. Assert.Fail ("#A1");
  255. } catch (ProtocolViolationException ex) {
  256. // Cannot send a content-body with this
  257. // verb-type
  258. Assert.IsNull (ex.InnerException, "#A2");
  259. Assert.IsNotNull (ex.Message, "#A3");
  260. }
  261. request = (HttpWebRequest) WebRequest.Create (url);
  262. request.Method = "HEAD";
  263. try {
  264. request.BeginGetRequestStream (null, null);
  265. Assert.Fail ("#B1");
  266. } catch (ProtocolViolationException ex) {
  267. // Cannot send a content-body with this
  268. // verb-type
  269. Assert.IsNull (ex.InnerException, "#B2");
  270. Assert.IsNotNull (ex.Message, "#B3");
  271. }
  272. }
  273. }
  274. [Test] // bug #465613
  275. public void BeginGetRequestStream_NoBuffering ()
  276. {
  277. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  278. string url = "http://" + ep.ToString () + "/test/";
  279. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  280. responder.Start ();
  281. HttpWebRequest req;
  282. Stream rs;
  283. IAsyncResult ar;
  284. req = (HttpWebRequest) WebRequest.Create (url);
  285. req.Method = "POST";
  286. req.SendChunked = false;
  287. req.KeepAlive = false;
  288. req.AllowWriteStreamBuffering = false;
  289. ar = req.BeginGetRequestStream (null, null);
  290. rs = req.EndGetRequestStream (ar);
  291. rs.Close ();
  292. req = (HttpWebRequest) WebRequest.Create (url);
  293. req.Method = "POST";
  294. req.SendChunked = false;
  295. req.KeepAlive = true;
  296. req.AllowWriteStreamBuffering = false;
  297. try {
  298. req.BeginGetRequestStream (null, null);
  299. Assert.Fail ("#A1");
  300. } catch (ProtocolViolationException ex) {
  301. // When performing a write operation with
  302. // AllowWriteStreamBuffering set to false,
  303. // you must either set ContentLength to a
  304. // non-negative number or set SendChunked
  305. // to true
  306. Assert.IsNull (ex.InnerException, "#A2");
  307. Assert.IsNotNull (ex.Message, "#A3");
  308. }
  309. req = (HttpWebRequest) WebRequest.Create (url);
  310. req.Method = "POST";
  311. req.SendChunked = false;
  312. req.KeepAlive = true;
  313. req.AllowWriteStreamBuffering = false;
  314. req.ContentLength = 0;
  315. ar = req.BeginGetRequestStream (null, null);
  316. rs = req.EndGetRequestStream (ar);
  317. rs.Close ();
  318. }
  319. }
  320. [Test] // bug #508027
  321. [Category ("NotWorking")] // #5842
  322. public void BeginGetResponse ()
  323. {
  324. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  325. string url = "http://" + ep.ToString () + "/test/";
  326. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  327. responder.Start ();
  328. HttpWebRequest req;
  329. req = (HttpWebRequest) WebRequest.Create (url);
  330. req.Timeout = 5000;
  331. req.Method = "POST";
  332. req.SendChunked = false;
  333. req.KeepAlive = false;
  334. req.AllowWriteStreamBuffering = false;
  335. req.BeginGetResponse (null, null);
  336. req.Abort ();
  337. req = (HttpWebRequest) WebRequest.Create (url);
  338. req.Timeout = 5000;
  339. req.Method = "POST";
  340. req.SendChunked = true;
  341. req.KeepAlive = false;
  342. req.AllowWriteStreamBuffering = false;
  343. req.GetRequestStream ().WriteByte (1);
  344. req.BeginGetResponse (null, null);
  345. req.Abort ();
  346. req = (HttpWebRequest) WebRequest.Create (url);
  347. req.Timeout = 5000;
  348. req.Method = "POST";
  349. req.ContentLength = 5;
  350. req.SendChunked = false;
  351. req.KeepAlive = false;
  352. req.AllowWriteStreamBuffering = false;
  353. req.GetRequestStream ().WriteByte (5);
  354. req.BeginGetResponse (null, null);
  355. req.Abort ();
  356. req = (HttpWebRequest) WebRequest.Create (url);
  357. req.Timeout = 5000;
  358. req.Method = "POST";
  359. req.SendChunked = false;
  360. req.KeepAlive = true;
  361. req.AllowWriteStreamBuffering = false;
  362. req.BeginGetResponse (null, null);
  363. req.Abort ();
  364. req = (HttpWebRequest) WebRequest.Create (url);
  365. req.Timeout = 5000;
  366. req.Method = "POST";
  367. req.SendChunked = false;
  368. req.KeepAlive = false;
  369. req.AllowWriteStreamBuffering = false;
  370. req.ContentLength = 5;
  371. req.BeginGetResponse (null, null);
  372. req.Abort ();
  373. req = (HttpWebRequest) WebRequest.Create (url);
  374. req.Timeout = 5000;
  375. req.Method = "POST";
  376. req.SendChunked = false;
  377. req.KeepAlive = true;
  378. req.AllowWriteStreamBuffering = false;
  379. req.ContentLength = 5;
  380. req.BeginGetResponse (null, null);
  381. req.Abort ();
  382. req = (HttpWebRequest) WebRequest.Create (url);
  383. req.Timeout = 5000;
  384. req.Method = "GET";
  385. req.SendChunked = true;
  386. req.BeginGetResponse (null, null);
  387. req.Abort ();
  388. req = (HttpWebRequest) WebRequest.Create (url);
  389. req.Timeout = 5000;
  390. req.Method = "GET";
  391. req.ContentLength = 5;
  392. req.BeginGetResponse (null, null);
  393. req.Abort ();
  394. req = (HttpWebRequest) WebRequest.Create (url);
  395. req.Timeout = 5000;
  396. req.Method = "GET";
  397. req.ContentLength = 0;
  398. req.BeginGetResponse (null, null);
  399. req.Abort ();
  400. }
  401. }
  402. [Test] // bug #511851
  403. public void BeginGetRequestStream_Request_Aborted ()
  404. {
  405. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  406. string url = "http://" + ep.ToString () + "/test/";
  407. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  408. responder.Start ();
  409. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  410. req.Method = "POST";
  411. req.Abort ();
  412. try {
  413. req.BeginGetRequestStream (null, null);
  414. Assert.Fail ("#1");
  415. } catch (WebException ex) {
  416. // The request was aborted: The request was canceled
  417. Assert.AreEqual (typeof (WebException), ex.GetType (), "#2");
  418. Assert.IsNull (ex.InnerException, "#3");
  419. Assert.IsNotNull (ex.Message, "#4");
  420. Assert.IsNull (ex.Response, "#5");
  421. Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6");
  422. }
  423. }
  424. }
  425. [Test] // bug #511851
  426. public void BeginGetResponse_Request_Aborted ()
  427. {
  428. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  429. string url = "http://" + ep.ToString () + "/test/";
  430. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  431. responder.Start ();
  432. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  433. req.Method = "POST";
  434. req.Abort ();
  435. try {
  436. req.BeginGetResponse (null, null);
  437. Assert.Fail ("#1");
  438. } catch (WebException ex) {
  439. // The request was aborted: The request was canceled
  440. Assert.AreEqual (typeof (WebException), ex.GetType (), "#2");
  441. Assert.IsNull (ex.InnerException, "#3");
  442. Assert.IsNotNull (ex.Message, "#4");
  443. Assert.IsNull (ex.Response, "#5");
  444. Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6");
  445. }
  446. }
  447. }
  448. [Test]
  449. public void EndGetRequestStream_AsyncResult_Null ()
  450. {
  451. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  452. string url = "http://" + ep.ToString () + "/test/";
  453. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  454. responder.Start ();
  455. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  456. req.Method = "POST";
  457. req.BeginGetRequestStream (null, null);
  458. try {
  459. req.EndGetRequestStream (null);
  460. Assert.Fail ("#1");
  461. } catch (ArgumentNullException ex) {
  462. Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
  463. Assert.IsNull (ex.InnerException, "#3");
  464. Assert.IsNotNull (ex.Message, "#4");
  465. Assert.AreEqual ("asyncResult", ex.ParamName, "#5");
  466. } finally {
  467. req.Abort ();
  468. }
  469. }
  470. }
  471. [Test]
  472. [Category ("NotWorking")] // do not get consistent result on MS
  473. public void EndGetRequestStream_Request_Aborted ()
  474. {
  475. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  476. string url = "http://" + ep.ToString () + "/test/";
  477. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  478. responder.Start ();
  479. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  480. req.Method = "POST";
  481. IAsyncResult ar = req.BeginGetRequestStream (null, null);
  482. req.Abort ();
  483. Thread.Sleep (500);
  484. try {
  485. req.EndGetRequestStream (ar);
  486. Assert.Fail ("#1");
  487. } catch (WebException ex) {
  488. // The request was aborted: The request was canceled
  489. Assert.AreEqual (typeof (WebException), ex.GetType (), "#2");
  490. Assert.IsNull (ex.InnerException, "#3");
  491. Assert.IsNotNull (ex.Message, "#4");
  492. Assert.IsNull (ex.Response, "#5");
  493. Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6");
  494. }
  495. }
  496. }
  497. [Test] // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=471522
  498. [Category ("NotWorking")]
  499. public void EndGetResponse_AsyncResult_Invalid ()
  500. {
  501. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  502. string url = "http://" + ep.ToString () + "/test/";
  503. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  504. responder.Start ();
  505. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  506. req.Method = "POST";
  507. req.Timeout = 2000;
  508. req.ReadWriteTimeout = 2000;
  509. IAsyncResult ar = req.BeginGetRequestStream (null, null);
  510. // AsyncResult was not returned from call to BeginGetResponse
  511. try {
  512. req.EndGetResponse (ar);
  513. Assert.Fail ();
  514. } catch (InvalidCastException) {
  515. } finally {
  516. req.Abort ();
  517. }
  518. }
  519. }
  520. [Test]
  521. public void EndGetResponse_AsyncResult_Null ()
  522. {
  523. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  524. string url = "http://" + ep.ToString () + "/test/";
  525. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  526. responder.Start ();
  527. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  528. req.Timeout = 2000;
  529. req.ReadWriteTimeout = 2000;
  530. req.Method = "POST";
  531. IAsyncResult ar = req.BeginGetResponse (null, null);
  532. try {
  533. req.EndGetResponse (null);
  534. Assert.Fail ("#1");
  535. } catch (ArgumentNullException ex) {
  536. Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
  537. Assert.IsNull (ex.InnerException, "#3");
  538. Assert.IsNotNull (ex.Message, "#4");
  539. Assert.AreEqual ("asyncResult", ex.ParamName, "#5");
  540. } finally {
  541. req.Abort ();
  542. /*
  543. using (HttpWebResponse resp = (HttpWebResponse) req.EndGetResponse (ar)) {
  544. resp.Close ();
  545. }*/
  546. }
  547. }
  548. }
  549. [Test] // bug #429200
  550. public void GetRequestStream ()
  551. {
  552. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  553. string url = "http://" + ep.ToString () + "/test/";
  554. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  555. responder.Start ();
  556. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  557. req.Method = "POST";
  558. req.Timeout = 2000;
  559. req.ReadWriteTimeout = 2000;
  560. Stream rs1 = req.GetRequestStream ();
  561. Stream rs2 = req.GetRequestStream ();
  562. Assert.IsNotNull (rs1, "#1");
  563. Assert.AreSame (rs1, rs2, "#2");
  564. rs1.Close ();
  565. }
  566. }
  567. [Test] // bug #511851
  568. public void GetRequestStream_Request_Aborted ()
  569. {
  570. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  571. string url = "http://" + ep.ToString () + "/test/";
  572. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  573. responder.Start ();
  574. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  575. req.Method = "POST";
  576. req.Abort ();
  577. try {
  578. req.GetRequestStream ();
  579. Assert.Fail ("#1");
  580. } catch (WebException ex) {
  581. // The request was aborted: The request was canceled
  582. Assert.AreEqual (typeof (WebException), ex.GetType (), "#2");
  583. Assert.IsNull (ex.InnerException, "#3");
  584. Assert.IsNotNull (ex.Message, "#4");
  585. Assert.IsNull (ex.Response, "#5");
  586. Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6");
  587. }
  588. }
  589. }
  590. [Test] // bug #510661
  591. [Category ("NotWorking")] // #5842
  592. public void GetRequestStream_Close_NotAllBytesWritten ()
  593. {
  594. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  595. string url = "http://" + ep.ToString () + "/test/";
  596. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  597. responder.Start ();
  598. HttpWebRequest req;
  599. Stream rs;
  600. req = (HttpWebRequest) WebRequest.Create (url);
  601. req.Method = "POST";
  602. req.ContentLength = 2;
  603. rs = req.GetRequestStream ();
  604. try {
  605. rs.Close ();
  606. Assert.Fail ("#A1");
  607. } catch (WebException ex) {
  608. // The request was aborted: The request was canceled
  609. Assert.AreEqual (typeof (WebException), ex.GetType (), "#A2");
  610. Assert.IsNotNull (ex.Message, "#A3");
  611. Assert.IsNull (ex.Response, "#A4");
  612. Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#A5");
  613. // Cannot close stream until all bytes are written
  614. Exception inner = ex.InnerException;
  615. Assert.IsNotNull (inner, "#A6");
  616. Assert.AreEqual (typeof (IOException), inner.GetType (), "#A7");
  617. Assert.IsNull (inner.InnerException, "#A8");
  618. Assert.IsNotNull (inner.Message, "#A9");
  619. }
  620. req = (HttpWebRequest) WebRequest.Create (url);
  621. req.Method = "POST";
  622. req.ContentLength = 2;
  623. rs = req.GetRequestStream ();
  624. rs.WriteByte (0x0d);
  625. try {
  626. rs.Close ();
  627. Assert.Fail ("#B1");
  628. } catch (WebException ex) {
  629. // The request was aborted: The request was canceled
  630. Assert.AreEqual (typeof (WebException), ex.GetType (), "#B2");
  631. Assert.IsNotNull (ex.Message, "#B3");
  632. Assert.IsNull (ex.Response, "#B4");
  633. Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#B5");
  634. // Cannot close stream until all bytes are written
  635. Exception inner = ex.InnerException;
  636. Assert.IsNotNull (inner, "#B6");
  637. Assert.AreEqual (typeof (IOException), inner.GetType (), "#B7");
  638. Assert.IsNull (inner.InnerException, "#B8");
  639. Assert.IsNotNull (inner.Message, "#B9");
  640. }
  641. req = (HttpWebRequest) WebRequest.Create (url);
  642. req.Method = "POST";
  643. req.ContentLength = 2;
  644. rs = req.GetRequestStream ();
  645. rs.WriteByte (0x0d);
  646. rs.WriteByte (0x0d);
  647. rs.Close ();
  648. }
  649. }
  650. [Test] // bug #510642
  651. [Category ("NotWorking")] // #5842
  652. public void GetRequestStream_Write_Overflow ()
  653. {
  654. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  655. string url = "http://" + ep.ToString () + "/test/";
  656. // buffered, non-chunked
  657. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  658. responder.Start ();
  659. HttpWebRequest req;
  660. Stream rs;
  661. byte [] buffer;
  662. req = (HttpWebRequest) WebRequest.Create (url);
  663. req.Method = "POST";
  664. req.Timeout = 1000;
  665. req.ReadWriteTimeout = 2000;
  666. req.ContentLength = 2;
  667. rs = req.GetRequestStream ();
  668. rs.WriteByte (0x2c);
  669. buffer = new byte [] { 0x2a, 0x1d };
  670. try {
  671. rs.Write (buffer, 0, buffer.Length);
  672. Assert.Fail ("#A1");
  673. } catch (ProtocolViolationException ex) {
  674. // Bytes to be written to the stream exceed
  675. // Content-Length bytes size specified
  676. Assert.IsNull (ex.InnerException, "#A2");
  677. Assert.IsNotNull (ex.Message, "#A3");
  678. } finally {
  679. req.Abort ();
  680. }
  681. req = (HttpWebRequest) WebRequest.Create (url);
  682. req.Method = "POST";
  683. req.Timeout = 1000;
  684. req.ReadWriteTimeout = 2000;
  685. req.ContentLength = 2;
  686. rs = req.GetRequestStream ();
  687. buffer = new byte [] { 0x2a, 0x2c, 0x1d };
  688. try {
  689. rs.Write (buffer, 0, buffer.Length);
  690. Assert.Fail ("#B1");
  691. } catch (ProtocolViolationException ex) {
  692. // Bytes to be written to the stream exceed
  693. // Content-Length bytes size specified
  694. Assert.IsNull (ex.InnerException, "#B2");
  695. Assert.IsNotNull (ex.Message, "#B3");
  696. } finally {
  697. req.Abort ();
  698. }
  699. }
  700. // buffered, chunked
  701. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  702. responder.Start ();
  703. HttpWebRequest req;
  704. Stream rs;
  705. byte [] buffer;
  706. /*
  707. req = (HttpWebRequest) WebRequest.Create (url);
  708. req.Method = "POST";
  709. req.SendChunked = true;
  710. req.Timeout = 1000;
  711. req.ReadWriteTimeout = 2000;
  712. req.ContentLength = 2;
  713. rs = req.GetRequestStream ();
  714. rs.WriteByte (0x2c);
  715. buffer = new byte [] { 0x2a, 0x1d };
  716. rs.Write (buffer, 0, buffer.Length);
  717. req.Abort ();
  718. */
  719. req = (HttpWebRequest) WebRequest.Create (url);
  720. req.Method = "POST";
  721. req.SendChunked = true;
  722. req.Timeout = 1000;
  723. req.ReadWriteTimeout = 2000;
  724. req.ContentLength = 2;
  725. rs = req.GetRequestStream ();
  726. buffer = new byte [] { 0x2a, 0x2c, 0x1d };
  727. rs.Write (buffer, 0, buffer.Length);
  728. req.Abort ();
  729. }
  730. // non-buffered, non-chunked
  731. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  732. responder.Start ();
  733. HttpWebRequest req;
  734. Stream rs;
  735. byte [] buffer;
  736. req = (HttpWebRequest) WebRequest.Create (url);
  737. req.AllowWriteStreamBuffering = false;
  738. req.Method = "POST";
  739. req.Timeout = 1000;
  740. req.ReadWriteTimeout = 2000;
  741. req.ContentLength = 2;
  742. rs = req.GetRequestStream ();
  743. rs.WriteByte (0x2c);
  744. buffer = new byte [] { 0x2a, 0x1d };
  745. try {
  746. rs.Write (buffer, 0, buffer.Length);
  747. Assert.Fail ("#C1");
  748. } catch (ProtocolViolationException ex) {
  749. // Bytes to be written to the stream exceed
  750. // Content-Length bytes size specified
  751. Assert.IsNull (ex.InnerException, "#C2");
  752. Assert.IsNotNull (ex.Message, "#3");
  753. } finally {
  754. req.Abort ();
  755. }
  756. req = (HttpWebRequest) WebRequest.Create (url);
  757. req.AllowWriteStreamBuffering = false;
  758. req.Method = "POST";
  759. req.Timeout = 1000;
  760. req.ReadWriteTimeout = 2000;
  761. req.ContentLength = 2;
  762. rs = req.GetRequestStream ();
  763. buffer = new byte [] { 0x2a, 0x2c, 0x1d };
  764. try {
  765. rs.Write (buffer, 0, buffer.Length);
  766. Assert.Fail ("#D1");
  767. } catch (ProtocolViolationException ex) {
  768. // Bytes to be written to the stream exceed
  769. // Content-Length bytes size specified
  770. Assert.IsNull (ex.InnerException, "#D2");
  771. Assert.IsNotNull (ex.Message, "#D3");
  772. } finally {
  773. req.Abort ();
  774. }
  775. }
  776. // non-buffered, chunked
  777. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  778. responder.Start ();
  779. HttpWebRequest req;
  780. Stream rs;
  781. byte [] buffer;
  782. req = (HttpWebRequest) WebRequest.Create (url);
  783. req.AllowWriteStreamBuffering = false;
  784. req.Method = "POST";
  785. req.SendChunked = true;
  786. req.Timeout = 1000;
  787. req.ReadWriteTimeout = 2000;
  788. req.ContentLength = 2;
  789. rs = req.GetRequestStream ();
  790. rs.WriteByte (0x2c);
  791. buffer = new byte [] { 0x2a, 0x1d };
  792. rs.Write (buffer, 0, buffer.Length);
  793. req.Abort ();
  794. req = (HttpWebRequest) WebRequest.Create (url);
  795. req.AllowWriteStreamBuffering = false;
  796. req.Method = "POST";
  797. req.SendChunked = true;
  798. req.Timeout = 1000;
  799. req.ReadWriteTimeout = 2000;
  800. req.ContentLength = 2;
  801. rs = req.GetRequestStream ();
  802. buffer = new byte [] { 0x2a, 0x2c, 0x1d };
  803. rs.Write (buffer, 0, buffer.Length);
  804. req.Abort ();
  805. }
  806. }
  807. [Test]
  808. [Ignore ("This test asserts that our code violates RFC 2616")]
  809. public void GetRequestStream_Body_NotAllowed ()
  810. {
  811. string [] methods = new string [] { "GET", "HEAD", "CONNECT",
  812. "get", "HeAd", "ConNect" };
  813. foreach (string method in methods) {
  814. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (
  815. "http://localhost:8000");
  816. req.Method = method;
  817. try {
  818. req.GetRequestStream ();
  819. Assert.Fail ("#1:" + method);
  820. } catch (ProtocolViolationException ex) {
  821. Assert.AreEqual (typeof (ProtocolViolationException), ex.GetType (), "#2:" + method);
  822. Assert.IsNull (ex.InnerException, "#3:" + method);
  823. Assert.IsNotNull (ex.Message, "#4:" + method);
  824. }
  825. }
  826. }
  827. [Test] // bug #511851
  828. public void GetResponse_Request_Aborted ()
  829. {
  830. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  831. string url = "http://" + ep.ToString () + "/test/";
  832. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
  833. responder.Start ();
  834. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  835. req.Method = "POST";
  836. req.Abort ();
  837. try {
  838. req.GetResponse ();
  839. Assert.Fail ("#1");
  840. } catch (WebException ex) {
  841. // The request was aborted: The request was canceled
  842. Assert.AreEqual (typeof (WebException), ex.GetType (), "#2");
  843. Assert.IsNull (ex.InnerException, "#3");
  844. Assert.IsNotNull (ex.Message, "#4");
  845. Assert.IsNull (ex.Response, "#5");
  846. Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6");
  847. }
  848. }
  849. }
  850. [Test]
  851. [Ignore ("This does not timeout any more. That's how MS works when reading small responses")]
  852. public void ReadTimeout ()
  853. {
  854. IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8764);
  855. string url = "http://" + localEP.ToString () + "/original/";
  856. using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) {
  857. responder.Start ();
  858. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  859. req.Method = "POST";
  860. req.AllowAutoRedirect = false;
  861. req.Timeout = 200;
  862. req.ReadWriteTimeout = 2000;
  863. req.KeepAlive = false;
  864. Stream rs = req.GetRequestStream ();
  865. rs.Close ();
  866. using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
  867. try {
  868. Stream s = resp.GetResponseStream ();
  869. s.ReadByte ();
  870. Assert.Fail ("#1");
  871. } catch (WebException ex) {
  872. Assert.AreEqual (typeof (WebException), ex.GetType (), "#2");
  873. Assert.IsNull (ex.InnerException, "#3");
  874. Assert.IsNull (ex.Response, "#4");
  875. Assert.AreEqual (WebExceptionStatus.Timeout, ex.Status, "#5");
  876. }
  877. }
  878. responder.Stop ();
  879. }
  880. }
  881. [Test] // bug #324300
  882. public void AllowAutoRedirect ()
  883. {
  884. IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8765);
  885. string url = "http://" + localEP.ToString () + "/original/";
  886. // allow autoredirect
  887. using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) {
  888. responder.Start ();
  889. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  890. req.Method = "POST";
  891. req.Timeout = 2000;
  892. req.ReadWriteTimeout = 2000;
  893. req.KeepAlive = false;
  894. Stream rs = req.GetRequestStream ();
  895. rs.Close ();
  896. using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
  897. StreamReader sr = new StreamReader (resp.GetResponseStream (),
  898. Encoding.UTF8);
  899. string body = sr.ReadToEnd ();
  900. Assert.AreEqual (resp.StatusCode, HttpStatusCode.OK, "#A1");
  901. Assert.AreEqual (resp.ResponseUri.ToString (), "http://" +
  902. localEP.ToString () + "/moved/", "#A2");
  903. Assert.AreEqual ("GET", resp.Method, "#A3");
  904. Assert.AreEqual ("LOOKS OK", body, "#A4");
  905. }
  906. responder.Stop ();
  907. }
  908. // do not allow autoredirect
  909. using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) {
  910. responder.Start ();
  911. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  912. req.Method = "POST";
  913. req.AllowAutoRedirect = false;
  914. req.Timeout = 1000;
  915. req.ReadWriteTimeout = 1000;
  916. req.KeepAlive = false;
  917. Stream rs = req.GetRequestStream ();
  918. rs.Close ();
  919. using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
  920. Assert.AreEqual (resp.StatusCode, HttpStatusCode.Found, "#B1");
  921. Assert.AreEqual (url, resp.ResponseUri.ToString (), "#B2");
  922. Assert.AreEqual ("POST", resp.Method, "#B3");
  923. }
  924. responder.Stop ();
  925. }
  926. }
  927. [Test]
  928. public void PostAndRedirect_NoCL ()
  929. {
  930. IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8769);
  931. string url = "http://" + localEP.ToString () + "/original/";
  932. using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) {
  933. responder.Start ();
  934. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  935. req.Method = "POST";
  936. req.Timeout = 2000;
  937. req.ReadWriteTimeout = 2000;
  938. Stream rs = req.GetRequestStream ();
  939. rs.WriteByte (10);
  940. rs.Close ();
  941. using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
  942. StreamReader sr = new StreamReader (resp.GetResponseStream (),
  943. Encoding.UTF8);
  944. string body = sr.ReadToEnd ();
  945. Assert.AreEqual (resp.StatusCode, HttpStatusCode.OK, "#A1");
  946. Assert.AreEqual (resp.ResponseUri.ToString (), "http://" +
  947. localEP.ToString () + "/moved/", "#A2");
  948. Assert.AreEqual ("GET", resp.Method, "#A3");
  949. Assert.AreEqual ("LOOKS OK", body, "#A4");
  950. }
  951. responder.Stop ();
  952. }
  953. }
  954. [Test]
  955. public void PostAndRedirect_CL ()
  956. {
  957. IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8770);
  958. string url = "http://" + localEP.ToString () + "/original/";
  959. using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) {
  960. responder.Start ();
  961. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  962. req.Method = "POST";
  963. req.Timeout = 2000;
  964. req.ReadWriteTimeout = 2000;
  965. req.ContentLength = 1;
  966. Stream rs = req.GetRequestStream ();
  967. rs.WriteByte (10);
  968. using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
  969. StreamReader sr = new StreamReader (resp.GetResponseStream (),
  970. Encoding.UTF8);
  971. string body = sr.ReadToEnd ();
  972. Assert.AreEqual (resp.StatusCode, HttpStatusCode.OK, "#A1");
  973. Assert.AreEqual (resp.ResponseUri.ToString (), "http://" +
  974. localEP.ToString () + "/moved/", "#A2");
  975. Assert.AreEqual ("GET", resp.Method, "#A3");
  976. Assert.AreEqual ("LOOKS OK", body, "#A4");
  977. }
  978. responder.Stop ();
  979. }
  980. }
  981. [Test]
  982. public void PostAnd401 ()
  983. {
  984. IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8771);
  985. string url = "http://" + localEP.ToString () + "/original/";
  986. using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) {
  987. responder.Start ();
  988. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  989. req.Method = "POST";
  990. req.Timeout = 2000;
  991. req.ReadWriteTimeout = 2000;
  992. req.ContentLength = 1;
  993. Stream rs = req.GetRequestStream ();
  994. rs.WriteByte (10);
  995. using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
  996. StreamReader sr = new StreamReader (resp.GetResponseStream (),
  997. Encoding.UTF8);
  998. string body = sr.ReadToEnd ();
  999. Assert.AreEqual (resp.StatusCode, HttpStatusCode.OK, "#A1");
  1000. Assert.AreEqual (resp.ResponseUri.ToString (), "http://" +
  1001. localEP.ToString () + "/moved/", "#A2");
  1002. Assert.AreEqual ("GET", resp.Method, "#A3");
  1003. Assert.AreEqual ("LOOKS OK", body, "#A4");
  1004. }
  1005. responder.Stop ();
  1006. }
  1007. }
  1008. [Test] // bug #324347
  1009. [Category ("NotWorking")]
  1010. public void InternalServerError ()
  1011. {
  1012. IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8766);
  1013. string url = "http://" + localEP.ToString () + "/original/";
  1014. // POST
  1015. using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (InternalErrorHandler))) {
  1016. responder.Start ();
  1017. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  1018. req.Method = "POST";
  1019. req.Timeout = 2000;
  1020. req.ReadWriteTimeout = 2000;
  1021. req.KeepAlive = false;
  1022. Stream rs = req.GetRequestStream ();
  1023. rs.Close ();
  1024. try {
  1025. req.GetResponse ();
  1026. Assert.Fail ("#A1");
  1027. } catch (WebException ex) {
  1028. Assert.AreEqual (typeof (WebException), ex.GetType (), "#A2");
  1029. Assert.IsNull (ex.InnerException, "#A3");
  1030. Assert.IsNotNull (ex.Message, "#A4");
  1031. Assert.AreEqual (WebExceptionStatus.ProtocolError, ex.Status, "#A5");
  1032. HttpWebResponse webResponse = ex.Response as HttpWebResponse;
  1033. Assert.IsNotNull (webResponse, "#A6");
  1034. Assert.AreEqual ("POST", webResponse.Method, "#A7");
  1035. webResponse.Close ();
  1036. }
  1037. responder.Stop ();
  1038. }
  1039. // GET
  1040. using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (InternalErrorHandler))) {
  1041. responder.Start ();
  1042. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  1043. req.Method = "GET";
  1044. req.Timeout = 2000;
  1045. req.ReadWriteTimeout = 2000;
  1046. req.KeepAlive = false;
  1047. try {
  1048. req.GetResponse ();
  1049. Assert.Fail ("#B1");
  1050. } catch (WebException ex) {
  1051. Assert.AreEqual (typeof (WebException), ex.GetType (), "#B2");
  1052. Assert.IsNull (ex.InnerException, "#B3");
  1053. Assert.AreEqual (WebExceptionStatus.ProtocolError, ex.Status, "#B4");
  1054. HttpWebResponse webResponse = ex.Response as HttpWebResponse;
  1055. Assert.IsNotNull (webResponse, "#B5");
  1056. Assert.AreEqual ("GET", webResponse.Method, "#B6");
  1057. webResponse.Close ();
  1058. }
  1059. responder.Stop ();
  1060. }
  1061. }
  1062. [Test]
  1063. [Category ("NotWorking")] // #B3 fails; we get a SocketException: An existing connection was forcibly closed by the remote host
  1064. public void NoContentLength ()
  1065. {
  1066. IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8767);
  1067. string url = "http://" + localEP.ToString () + "/original/";
  1068. // POST
  1069. using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (NoContentLengthHandler))) {
  1070. responder.Start ();
  1071. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  1072. req.Method = "POST";
  1073. req.Timeout = 2000;
  1074. req.ReadWriteTimeout = 2000;
  1075. req.KeepAlive = false;
  1076. Stream rs = req.GetRequestStream ();
  1077. rs.Close ();
  1078. try {
  1079. req.GetResponse ();
  1080. Assert.Fail ("#A1");
  1081. } catch (WebException ex) {
  1082. // The underlying connection was closed:
  1083. // An unexpected error occurred on a
  1084. // receive
  1085. Assert.AreEqual (typeof (WebException), ex.GetType (), "#A2");
  1086. Assert.IsNotNull (ex.InnerException, "#A3");
  1087. Assert.AreEqual (WebExceptionStatus.ReceiveFailure, ex.Status, "#A4");
  1088. Assert.AreEqual (typeof (IOException), ex.InnerException.GetType (), "#A5");
  1089. // Unable to read data from the transport connection:
  1090. // A connection attempt failed because the connected party
  1091. // did not properly respond after a period of time, or
  1092. // established connection failed because connected host has
  1093. // failed to respond
  1094. IOException ioe = (IOException) ex.InnerException;
  1095. Assert.IsNotNull (ioe.InnerException, "#A6");
  1096. Assert.IsNotNull (ioe.Message, "#A7");
  1097. Assert.AreEqual (typeof (SocketException), ioe.InnerException.GetType (), "#A8");
  1098. // An existing connection was forcibly
  1099. // closed by the remote host
  1100. SocketException soe = (SocketException) ioe.InnerException;
  1101. Assert.IsNull (soe.InnerException, "#A9");
  1102. Assert.IsNotNull (soe.Message, "#A10");
  1103. HttpWebResponse webResponse = ex.Response as HttpWebResponse;
  1104. Assert.IsNull (webResponse, "#A11");
  1105. }
  1106. responder.Stop ();
  1107. }
  1108. // GET
  1109. using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (NoContentLengthHandler))) {
  1110. responder.Start ();
  1111. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  1112. req.Method = "GET";
  1113. req.Timeout = 2000;
  1114. req.ReadWriteTimeout = 2000;
  1115. req.KeepAlive = false;
  1116. try {
  1117. req.GetResponse ();
  1118. Assert.Fail ("#B1");
  1119. } catch (WebException ex) {
  1120. // The remote server returned an error:
  1121. // (500) Internal Server Error
  1122. Assert.AreEqual (typeof (WebException), ex.GetType (), "#B2");
  1123. Assert.IsNull (ex.InnerException, "#B3");
  1124. Assert.AreEqual (WebExceptionStatus.ProtocolError, ex.Status, "#B4");
  1125. HttpWebResponse webResponse = ex.Response as HttpWebResponse;
  1126. Assert.IsNotNull (webResponse, "#B5");
  1127. Assert.AreEqual ("GET", webResponse.Method, "#B6");
  1128. webResponse.Close ();
  1129. }
  1130. responder.Stop ();
  1131. }
  1132. }
  1133. [Test] // bug #513087
  1134. public void NonStandardVerb ()
  1135. {
  1136. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  1137. string url = "http://" + ep.ToString () + "/moved/";
  1138. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (VerbEchoHandler))) {
  1139. responder.Start ();
  1140. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  1141. req.Method = "WhatEver";
  1142. req.KeepAlive = false;
  1143. req.Timeout = 20000;
  1144. req.ReadWriteTimeout = 20000;
  1145. Stream rs = req.GetRequestStream ();
  1146. rs.Close ();
  1147. using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
  1148. StreamReader sr = new StreamReader (resp.GetResponseStream (),
  1149. Encoding.UTF8);
  1150. string body = sr.ReadToEnd ();
  1151. Assert.AreEqual (resp.StatusCode, HttpStatusCode.OK, "#1");
  1152. Assert.AreEqual (resp.ResponseUri.ToString (), "http://" +
  1153. ep.ToString () + "/moved/", "#2");
  1154. Assert.AreEqual ("WhatEver", resp.Method, "#3");
  1155. Assert.AreEqual ("WhatEver", body, "#4");
  1156. }
  1157. responder.Stop ();
  1158. }
  1159. }
  1160. [Test]
  1161. [Category ("NotWorking")] // Assert #2 fails
  1162. public void NotModifiedSince ()
  1163. {
  1164. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  1165. string url = "http://" + ep.ToString () + "/test/";
  1166. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (NotModifiedSinceHandler))) {
  1167. responder.Start ();
  1168. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  1169. req.Method = "GET";
  1170. req.KeepAlive = false;
  1171. req.Timeout = 20000;
  1172. req.ReadWriteTimeout = 20000;
  1173. req.Headers.Add (HttpRequestHeader.IfNoneMatch, "898bbr2347056cc2e096afc66e104653");
  1174. req.IfModifiedSince = new DateTime (2010, 01, 04);
  1175. DateTime start = DateTime.Now;
  1176. HttpWebResponse response = null;
  1177. try {
  1178. req.GetResponse ();
  1179. Assert.Fail ("#1");
  1180. } catch (WebException e) {
  1181. response = (HttpWebResponse) e.Response;
  1182. }
  1183. Assert.IsNotNull (response, "#2");
  1184. using (Stream stream = response.GetResponseStream ()) {
  1185. byte [] buffer = new byte [4096];
  1186. int bytesRead = stream.Read (buffer, 0, buffer.Length);
  1187. Assert.AreEqual (0, bytesRead, "#3");
  1188. }
  1189. TimeSpan elapsed = DateTime.Now - start;
  1190. Assert.IsTrue (elapsed.TotalMilliseconds < 2000, "#4");
  1191. responder.Stop ();
  1192. }
  1193. }
  1194. [Test] // bug #353495
  1195. [Category ("NotWorking")]
  1196. public void LastModifiedKind ()
  1197. {
  1198. const string reqURL = "http://coffeefaq.com/site/node/25";
  1199. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (reqURL);
  1200. HttpWebResponse resp = (HttpWebResponse) req.GetResponse ();
  1201. DateTime lastMod = resp.LastModified;
  1202. //string rawLastMod = resp.Headers ["Last-Modified"];
  1203. resp.Close ();
  1204. //Assert.AreEqual ("Tue, 15 Jan 2008 08:59:59 GMT", rawLastMod, "#1");
  1205. Assert.AreEqual (DateTimeKind.Local, lastMod.Kind, "#2");
  1206. req = (HttpWebRequest) WebRequest.Create (reqURL);
  1207. req.IfModifiedSince = lastMod;
  1208. try {
  1209. resp = (HttpWebResponse) req.GetResponse ();
  1210. resp.Close ();
  1211. Assert.Fail ("Should result in 304");
  1212. } catch (WebException ex) {
  1213. Assert.AreEqual (WebExceptionStatus.ProtocolError, ex.Status, "#3");
  1214. Assert.AreEqual (((HttpWebResponse) ex.Response).StatusCode, HttpStatusCode.NotModified, "#4");
  1215. }
  1216. }
  1217. #region Timeout_Bug // https://bugzilla.novell.com/show_bug.cgi?id=317553
  1218. class TimeoutTestHelper {
  1219. string url_to_test;
  1220. internal DateTime? Start { get; private set; }
  1221. internal DateTime? End { get; private set; }
  1222. internal Exception Exception { get; private set; }
  1223. internal string Body { get; private set; }
  1224. internal int TimeOutInMilliSeconds { get; private set; }
  1225. internal TimeoutTestHelper (string url, int timeoutInMilliseconds)
  1226. {
  1227. url_to_test = url;
  1228. TimeOutInMilliSeconds = timeoutInMilliseconds;
  1229. }
  1230. internal void LaunchWebRequest ()
  1231. {
  1232. var req = (HttpWebRequest) WebRequest.Create (url_to_test);
  1233. req.Timeout = TimeOutInMilliSeconds;
  1234. Start = DateTime.Now;
  1235. try {
  1236. using (var resp = (HttpWebResponse) req.GetResponse ())
  1237. {
  1238. var sr = new StreamReader (resp.GetResponseStream (), Encoding.UTF8);
  1239. Body = sr.ReadToEnd ();
  1240. }
  1241. } catch (Exception e) {
  1242. End = DateTime.Now;
  1243. Exception = e;
  1244. }
  1245. }
  1246. }
  1247. void TestTimeOut (string url, WebExceptionStatus expectedExceptionStatus)
  1248. {
  1249. var timeoutWorker = new TimeoutTestHelper (url, three_seconds_in_milliseconds);
  1250. var threadStart = new ThreadStart (timeoutWorker.LaunchWebRequest);
  1251. var thread = new Thread (threadStart);
  1252. thread.Start ();
  1253. Thread.Sleep (three_seconds_in_milliseconds * 3);
  1254. if (timeoutWorker.End == null) {
  1255. thread.Abort ();
  1256. Assert.Fail ("Thread finished after triple the timeout specified has passed");
  1257. }
  1258. if (!String.IsNullOrEmpty (timeoutWorker.Body)) {
  1259. if (timeoutWorker.Body == response_of_timeout_handler) {
  1260. Assert.Fail ("Should not be reached, timeout exception was not thrown and webrequest managed to retrieve proper body");
  1261. }
  1262. Assert.Fail ("Should not be reached, timeout exception was not thrown and webrequest managed to retrieve an incorrect body: " + timeoutWorker.Body);
  1263. }
  1264. Assert.IsNotNull (timeoutWorker.Exception, "Exception was not thrown");
  1265. var webEx = timeoutWorker.Exception as WebException;
  1266. Assert.IsNotNull (webEx, "Exception thrown should be WebException, but was: " +
  1267. timeoutWorker.Exception.GetType ().FullName);
  1268. Assert.AreEqual (expectedExceptionStatus, webEx.Status,
  1269. "WebException was thrown, but with a wrong status (should be " + expectedExceptionStatus + "): " + webEx.Status);
  1270. Assert.IsFalse (timeoutWorker.End > (timeoutWorker.Start + TimeSpan.FromMilliseconds (three_seconds_in_milliseconds + 500)),
  1271. "Timeout exception should have been thrown shortly after timeout is reached, however it was at least half-second late");
  1272. }
  1273. [Test] // 1st possible case of https://bugzilla.novell.com/show_bug.cgi?id=MONO74177
  1274. public void TestTimeoutPropertyWithServerThatExistsAndRespondsButTooLate ()
  1275. {
  1276. var ep = new IPEndPoint (IPAddress.Loopback, 8123);
  1277. string url = "http://" + ep + "/foobar/";
  1278. using (var responder = new SocketResponder (ep, TimeOutHandler))
  1279. {
  1280. responder.Start ();
  1281. TestTimeOut (url, WebExceptionStatus.Timeout);
  1282. responder.Stop ();
  1283. }
  1284. }
  1285. [Test] // 2nd possible case of https://bugzilla.novell.com/show_bug.cgi?id=MONO74177
  1286. public void TestTimeoutWithEndpointThatDoesntExistThrowsConnectFailureBeforeTimeout ()
  1287. {
  1288. string url = "http://127.0.0.1:8271/"; // some endpoint that is unlikely to exist
  1289. // connecting to a non-existing endpoint should throw a ConnectFailure before the timeout is reached
  1290. TestTimeOut (url, WebExceptionStatus.ConnectFailure);
  1291. }
  1292. const string response_of_timeout_handler = "RESPONSE_OF_TIMEOUT_HANDLER";
  1293. const int three_seconds_in_milliseconds = 3000;
  1294. private static byte[] TimeOutHandler (Socket socket)
  1295. {
  1296. socket.Receive (new byte[4096]);
  1297. Thread.Sleep (three_seconds_in_milliseconds * 2);
  1298. var sw = new StringWriter ();
  1299. sw.WriteLine ("HTTP/1.1 200 OK");
  1300. sw.WriteLine ("Content-Type: text/plain");
  1301. sw.WriteLine ("Content-Length: " + response_of_timeout_handler.Length);
  1302. sw.WriteLine ();
  1303. sw.Write (response_of_timeout_handler);
  1304. sw.Flush ();
  1305. return Encoding.UTF8.GetBytes (sw.ToString ());
  1306. }
  1307. #endregion
  1308. internal static byte [] EchoRequestHandler (Socket socket)
  1309. {
  1310. MemoryStream ms = new MemoryStream ();
  1311. byte [] buffer = new byte [4096];
  1312. int bytesReceived = socket.Receive (buffer);
  1313. while (bytesReceived > 0) {
  1314. ms.Write (buffer, 0, bytesReceived);
  1315. // We don't check for Content-Length or anything else here, so we give the client a little time to write
  1316. // after sending the headers
  1317. Thread.Sleep (200);
  1318. if (socket.Available > 0) {
  1319. bytesReceived = socket.Receive (buffer);
  1320. } else {
  1321. bytesReceived = 0;
  1322. }
  1323. }
  1324. ms.Flush ();
  1325. ms.Position = 0;
  1326. StreamReader sr = new StreamReader (ms, Encoding.UTF8);
  1327. string request = sr.ReadToEnd ();
  1328. StringWriter sw = new StringWriter ();
  1329. sw.WriteLine ("HTTP/1.1 200 OK");
  1330. sw.WriteLine ("Content-Type: text/xml");
  1331. sw.WriteLine ("Content-Length: " + request.Length.ToString (CultureInfo.InvariantCulture));
  1332. sw.WriteLine ();
  1333. sw.Write (request);
  1334. sw.Flush ();
  1335. return Encoding.UTF8.GetBytes (sw.ToString ());
  1336. }
  1337. static byte [] RedirectRequestHandler (Socket socket)
  1338. {
  1339. MemoryStream ms = new MemoryStream ();
  1340. byte [] buffer = new byte [4096];
  1341. int bytesReceived = socket.Receive (buffer);
  1342. while (bytesReceived > 0) {
  1343. ms.Write (buffer, 0, bytesReceived);
  1344. // We don't check for Content-Length or anything else here, so we give the client a little time to write
  1345. // after sending the headers
  1346. Thread.Sleep (200);
  1347. if (socket.Available > 0) {
  1348. bytesReceived = socket.Receive (buffer);
  1349. } else {
  1350. bytesReceived = 0;
  1351. }
  1352. }
  1353. ms.Flush ();
  1354. ms.Position = 0;
  1355. string statusLine = null;
  1356. using (StreamReader sr = new StreamReader (ms, Encoding.UTF8)) {
  1357. statusLine = sr.ReadLine ();
  1358. }
  1359. StringWriter sw = new StringWriter ();
  1360. if (statusLine.StartsWith ("POST /original/")) {
  1361. sw.WriteLine ("HTTP/1.0 302 Found");
  1362. EndPoint ep = socket.LocalEndPoint;
  1363. sw.WriteLine ("Location: " + "http://" + ep.ToString () + "/moved/");
  1364. sw.WriteLine ();
  1365. sw.Flush ();
  1366. } else if (statusLine.StartsWith ("GET /moved/")) {
  1367. sw.WriteLine ("HTTP/1.0 200 OK");
  1368. sw.WriteLine ("Content-Type: text/plain");
  1369. sw.WriteLine ("Content-Length: 8");
  1370. sw.WriteLine ();
  1371. sw.Write ("LOOKS OK");
  1372. sw.Flush ();
  1373. } else {
  1374. sw.WriteLine ("HTTP/1.0 500 Too Lazy");
  1375. sw.WriteLine ();
  1376. sw.Flush ();
  1377. }
  1378. return Encoding.UTF8.GetBytes (sw.ToString ());
  1379. }
  1380. static byte [] InternalErrorHandler (Socket socket)
  1381. {
  1382. byte [] buffer = new byte [4096];
  1383. int bytesReceived = socket.Receive (buffer);
  1384. while (bytesReceived > 0) {
  1385. // We don't check for Content-Length or anything else here, so we give the client a little time to write
  1386. // after sending the headers
  1387. Thread.Sleep (200);
  1388. if (socket.Available > 0) {
  1389. bytesReceived = socket.Receive (buffer);
  1390. } else {
  1391. bytesReceived = 0;
  1392. }
  1393. }
  1394. StringWriter sw = new StringWriter ();
  1395. sw.WriteLine ("HTTP/1.1 500 Too Lazy");
  1396. sw.WriteLine ("Content-Length: 0");
  1397. sw.WriteLine ();
  1398. sw.Flush ();
  1399. return Encoding.UTF8.GetBytes (sw.ToString ());
  1400. }
  1401. static byte [] NoContentLengthHandler (Socket socket)
  1402. {
  1403. StringWriter sw = new StringWriter ();
  1404. sw.WriteLine ("HTTP/1.1 500 Too Lazy");
  1405. sw.WriteLine ();
  1406. sw.Flush ();
  1407. return Encoding.UTF8.GetBytes (sw.ToString ());
  1408. }
  1409. static byte [] NotModifiedSinceHandler (Socket socket)
  1410. {
  1411. StringWriter sw = new StringWriter ();
  1412. sw.WriteLine ("HTTP/1.1 304 Not Modified");
  1413. sw.WriteLine ("Date: Fri, 06 Feb 2009 12:50:26 GMT");
  1414. sw.WriteLine ("Server: Apache/2.2.6 (Debian) PHP/5.2.6-2+b1 with Suhosin-Patch mod_ssl/2.2.6 OpenSSL/0.9.8g");
  1415. sw.WriteLine ("Not-Modified-Since: Sun, 08 Feb 2009 08:49:26 GMT");
  1416. sw.WriteLine ("ETag: 898bbr2347056cc2e096afc66e104653");
  1417. sw.WriteLine ("Connection: close");
  1418. sw.WriteLine ();
  1419. sw.Flush ();
  1420. return Encoding.UTF8.GetBytes (sw.ToString ());
  1421. }
  1422. static byte [] VerbEchoHandler (Socket socket)
  1423. {
  1424. MemoryStream ms = new MemoryStream ();
  1425. byte [] buffer = new byte [4096];
  1426. int bytesReceived = socket.Receive (buffer);
  1427. while (bytesReceived > 0) {
  1428. ms.Write (buffer, 0, bytesReceived);
  1429. // We don't check for Content-Length or anything else here, so we give the client a little time to write
  1430. // after sending the headers
  1431. Thread.Sleep (200);
  1432. if (socket.Available > 0) {
  1433. bytesReceived = socket.Receive (buffer);
  1434. } else {
  1435. bytesReceived = 0;
  1436. }
  1437. }
  1438. ms.Flush ();
  1439. ms.Position = 0;
  1440. string statusLine = null;
  1441. using (StreamReader sr = new StreamReader (ms, Encoding.UTF8)) {
  1442. statusLine = sr.ReadLine ();
  1443. }
  1444. string verb = "DEFAULT";
  1445. if (statusLine != null) {
  1446. string [] parts = statusLine.Split (' ');
  1447. if (parts.Length > 0)
  1448. verb = parts [0];
  1449. }
  1450. StringWriter sw = new StringWriter ();
  1451. sw.WriteLine ("HTTP/1.1 200 OK");
  1452. sw.WriteLine ("Content-Type: text/plain");
  1453. sw.WriteLine ("Content-Length: " + verb.Length);
  1454. sw.WriteLine ();
  1455. sw.Write (verb);
  1456. sw.Flush ();
  1457. return Encoding.UTF8.GetBytes (sw.ToString ());
  1458. }
  1459. static byte [] PostAnd401Handler (Socket socket)
  1460. {
  1461. MemoryStream ms = new MemoryStream ();
  1462. byte [] buffer = new byte [4096];
  1463. int bytesReceived = socket.Receive (buffer);
  1464. while (bytesReceived > 0) {
  1465. ms.Write (buffer, 0, bytesReceived);
  1466. // We don't check for Content-Length or anything else here, so we give the client a little time to write
  1467. // after sending the headers
  1468. Thread.Sleep (200);
  1469. if (socket.Available > 0) {
  1470. bytesReceived = socket.Receive (buffer);
  1471. } else {
  1472. bytesReceived = 0;
  1473. }
  1474. }
  1475. ms.Flush ();
  1476. ms.Position = 0;
  1477. string statusLine = null;
  1478. bool have_auth = false;
  1479. int cl = -1;
  1480. using (StreamReader sr = new StreamReader (ms, Encoding.UTF8)) {
  1481. string l;
  1482. while ((l = sr.ReadLine ()) != null) {
  1483. if (statusLine == null) {
  1484. statusLine = l;
  1485. } else if (l.StartsWith ("Authorization:")) {
  1486. have_auth = true;
  1487. } else if (l.StartsWith ("Content-Length:")) {
  1488. cl = Int32.Parse (l.Substring ("content-length: ".Length));
  1489. }
  1490. }
  1491. }
  1492. StringWriter sw = new StringWriter ();
  1493. if (!have_auth) {
  1494. sw.WriteLine ("HTTP/1.0 401 Invalid Credentials");
  1495. sw.WriteLine ("WWW-Authenticate: basic Yeah");
  1496. sw.WriteLine ();
  1497. sw.Flush ();
  1498. } else if (cl > 0 && statusLine.StartsWith ("POST ")) {
  1499. sw.WriteLine ("HTTP/1.0 200 OK");
  1500. sw.WriteLine ("Content-Type: text/plain");
  1501. sw.WriteLine ("Content-Length: 8");
  1502. sw.WriteLine ();
  1503. sw.Write ("LOOKS OK");
  1504. sw.Flush ();
  1505. } else {
  1506. sw.WriteLine ("HTTP/1.0 500 test failed");
  1507. sw.WriteLine ("Content-Length: 0");
  1508. sw.WriteLine ();
  1509. sw.Flush ();
  1510. }
  1511. return Encoding.UTF8.GetBytes (sw.ToString ());
  1512. }
  1513. [Test]
  1514. public void NtlmAuthentication ()
  1515. {
  1516. NtlmServer server = new NtlmServer ();
  1517. server.Start ();
  1518. string url = String.Format ("http://{0}:{1}/nothing.html", server.IPAddress, server.Port);
  1519. HttpWebRequest request = (HttpWebRequest) WebRequest.Create (url);
  1520. request.Timeout = 5000;
  1521. request.Credentials = new NetworkCredential ("user", "password", "domain");
  1522. HttpWebResponse resp = (HttpWebResponse) request.GetResponse ();
  1523. string res = null;
  1524. using (StreamReader reader = new StreamReader (resp.GetResponseStream ())) {
  1525. res = reader.ReadToEnd ();
  1526. }
  1527. resp.Close ();
  1528. server.Stop ();
  1529. Assert.AreEqual ("OK", res);
  1530. }
  1531. class NtlmServer : HttpServer {
  1532. public string Where = "";
  1533. protected override void Run ()
  1534. {
  1535. Where = "before accept";
  1536. Socket client = sock.Accept ();
  1537. NetworkStream ns = new NetworkStream (client, false);
  1538. StreamReader reader = new StreamReader (ns, Encoding.ASCII);
  1539. string line;
  1540. Where = "first read";
  1541. while ((line = reader.ReadLine ()) != null) {
  1542. if (line.Trim () == String.Empty) {
  1543. break;
  1544. }
  1545. }
  1546. Where = "first write";
  1547. StreamWriter writer = new StreamWriter (ns, Encoding.ASCII);
  1548. writer.Write ( "HTTP/1.1 401 Unauthorized\r\n" +
  1549. "WWW-Authenticate: NTLM\r\n" +
  1550. "Content-Length: 5\r\n\r\nWRONG");
  1551. writer.Flush ();
  1552. Where = "second read";
  1553. while ((line = reader.ReadLine ()) != null) {
  1554. if (line.Trim () == String.Empty) {
  1555. break;
  1556. }
  1557. }
  1558. Where = "second write";
  1559. writer.Write ( "HTTP/1.1 401 Unauthorized\r\n" +
  1560. "WWW-Authenticate: NTLM TlRMTVNTUAACAAAAAAAAADgAAAABggAC8GDhqIONH3sAAAAAAAAAAAAAAAA4AAAABQLODgAAAA8=\r\n" +
  1561. "Content-Length: 5\r\n\r\nWRONG");
  1562. writer.Flush ();
  1563. Where = "third read";
  1564. while ((line = reader.ReadLine ()) != null) {
  1565. if (line.Trim () == String.Empty) {
  1566. break;
  1567. }
  1568. }
  1569. Where = "third write";
  1570. writer.Write ( "HTTP/1.1 200 OK\r\n" +
  1571. "Keep-Alive: true\r\n" +
  1572. "Content-Length: 2\r\n\r\nOK");
  1573. writer.Flush ();
  1574. Thread.Sleep (1000);
  1575. writer.Close ();
  1576. reader.Close ();
  1577. client.Close ();
  1578. }
  1579. }
  1580. class BadChunkedServer : HttpServer {
  1581. protected override void Run ()
  1582. {
  1583. Socket client = sock.Accept ();
  1584. NetworkStream ns = new NetworkStream (client, true);
  1585. StreamWriter writer = new StreamWriter (ns, Encoding.ASCII);
  1586. writer.Write ( "HTTP/1.1 200 OK\r\n" +
  1587. "Transfer-Encoding: chunked\r\n" +
  1588. "Connection: close\r\n" +
  1589. "Content-Type: text/plain; charset=UTF-8\r\n\r\n");
  1590. // This body lacks a 'last-chunk' (see RFC 2616)
  1591. writer.Write ("10\r\n1234567890123456\r\n");
  1592. writer.Flush ();
  1593. client.Shutdown (SocketShutdown.Send);
  1594. Thread.Sleep (1000);
  1595. writer.Close ();
  1596. }
  1597. }
  1598. class AcceptAllPolicy : ICertificatePolicy {
  1599. public bool CheckValidationResult (ServicePoint sp, X509Certificate certificate, WebRequest request, int error)
  1600. {
  1601. return true;
  1602. }
  1603. }
  1604. abstract class HttpServer
  1605. {
  1606. protected Socket sock;
  1607. protected Exception error;
  1608. protected ManualResetEvent evt;
  1609. public HttpServer ()
  1610. {
  1611. sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  1612. sock.Bind (new IPEndPoint (IPAddress.Loopback, 0));
  1613. sock.Listen (1);
  1614. }
  1615. public void Start ()
  1616. {
  1617. evt = new ManualResetEvent (false);
  1618. Thread th = new Thread (new ThreadStart (Run));
  1619. th.Start ();
  1620. }
  1621. public void Stop ()
  1622. {
  1623. evt.Set ();
  1624. sock.Close ();
  1625. }
  1626. public IPAddress IPAddress {
  1627. get { return ((IPEndPoint) sock.LocalEndPoint).Address; }
  1628. }
  1629. public int Port {
  1630. get { return ((IPEndPoint) sock.LocalEndPoint).Port; }
  1631. }
  1632. public Exception Error {
  1633. get { return error; }
  1634. }
  1635. protected abstract void Run ();
  1636. }
  1637. [Test]
  1638. public void BeginGetRequestStream ()
  1639. {
  1640. this.DoRequest (
  1641. (r, c) =>
  1642. {
  1643. r.Method = "POST";
  1644. r.ContentLength = 0;
  1645. r.BeginGetRequestStream ((a) =>
  1646. {
  1647. using (Stream s = r.EndGetRequestStream (a)) { };
  1648. c.Set();
  1649. },
  1650. null);
  1651. },
  1652. (c) => { });
  1653. }
  1654. [Test]
  1655. public void BeginGetRequestStreamNoClose ()
  1656. {
  1657. this.DoRequest (
  1658. (r, c) => {
  1659. r.Method = "POST";
  1660. r.ContentLength = 1;
  1661. r.BeginGetRequestStream ((a) =>
  1662. {
  1663. r.EndGetRequestStream (a);
  1664. c.Set ();
  1665. },
  1666. null);
  1667. },
  1668. (c) => {});
  1669. }
  1670. [Test]
  1671. public void BeginGetRequestStreamCancelIfNotAllBytesWritten ()
  1672. {
  1673. this.DoRequest (
  1674. (r, c) =>
  1675. {
  1676. r.Method = "POST";
  1677. r.ContentLength = 10;
  1678. r.BeginGetRequestStream ((a) =>
  1679. {
  1680. WebException ex = ExceptionAssert.Throws<WebException> (() =>
  1681. {
  1682. using (Stream s = r.EndGetRequestStream (a)) {
  1683. }
  1684. }
  1685. );
  1686. Assert.AreEqual (ex.Status, WebExceptionStatus.RequestCanceled);
  1687. c.Set();
  1688. },
  1689. null);
  1690. },
  1691. (c) => { });
  1692. }
  1693. [Test]
  1694. public void GetRequestStream2 ()
  1695. {
  1696. this.DoRequest (
  1697. (r, c) =>
  1698. {
  1699. r.Method = "POST";
  1700. r.ContentLength = data64KB.Length;
  1701. using (Stream s = r.GetRequestStream ()) {
  1702. s.Write (data64KB, 0, data64KB.Length);
  1703. }
  1704. c.Set ();
  1705. },
  1706. (c) => { });
  1707. }
  1708. [Test]
  1709. public void GetRequestStreamNotAllBytesWritten ()
  1710. {
  1711. this.DoRequest (
  1712. (r, c) =>
  1713. {
  1714. r.Method = "POST";
  1715. r.ContentLength = data64KB.Length;
  1716. WebException ex = ExceptionAssert.Throws<WebException> (() => r.GetRequestStream ().Close ());
  1717. Assert.AreEqual (ex.Status, WebExceptionStatus.RequestCanceled);
  1718. c.Set ();
  1719. },
  1720. (c) => {});
  1721. }
  1722. [Test]
  1723. public void GetRequestStreamTimeout ()
  1724. {
  1725. this.DoRequest (
  1726. (r, c) =>
  1727. {
  1728. r.Method = "POST";
  1729. r.ContentLength = data64KB.Length;
  1730. r.Timeout = 100;
  1731. WebException ex = ExceptionAssert.Throws<WebException> (() => r.GetRequestStream ());
  1732. Assert.IsTrue (ex.Status == WebExceptionStatus.Timeout || ex.Status == WebExceptionStatus.ConnectFailure);
  1733. c.Set();
  1734. });
  1735. }
  1736. [Test]
  1737. public void BeginWrite ()
  1738. {
  1739. byte[] received = new byte[data64KB.Length];
  1740. this.DoRequest (
  1741. (r, c) =>
  1742. {
  1743. r.Method = "POST";
  1744. r.ContentLength = data64KB.Length;
  1745. Stream s = r.GetRequestStream ();
  1746. s.BeginWrite (data64KB, 0, data64KB.Length,
  1747. (a) =>
  1748. {
  1749. s.EndWrite (a);
  1750. s.Close ();
  1751. r.GetResponse ().Close ();
  1752. c.Set();
  1753. },
  1754. null);
  1755. },
  1756. (c) =>
  1757. {
  1758. c.Request.InputStream.ReadAll (received, 0, received.Length);
  1759. c.Response.StatusCode = 204;
  1760. c.Response.Close ();
  1761. });
  1762. Assert.AreEqual (data64KB, received);
  1763. }
  1764. [Test]
  1765. public void BeginWriteAfterAbort ()
  1766. {
  1767. byte [] received = new byte [data64KB.Length];
  1768. this.DoRequest (
  1769. (r, c) =>
  1770. {
  1771. r.Method = "POST";
  1772. r.ContentLength = data64KB.Length;
  1773. Stream s = r.GetRequestStream ();
  1774. r.Abort();
  1775. WebException ex = ExceptionAssert.Throws<WebException> (() => s.BeginWrite (data64KB, 0, data64KB.Length, null, null));
  1776. Assert.AreEqual (ex.Status, WebExceptionStatus.RequestCanceled);
  1777. c.Set();
  1778. },
  1779. (c) =>
  1780. {
  1781. //c.Request.InputStream.ReadAll (received, 0, received.Length);
  1782. //c.Response.StatusCode = 204;
  1783. //c.Response.Close();
  1784. });
  1785. }
  1786. [Test]
  1787. public void PrematureStreamCloseAborts ()
  1788. {
  1789. byte [] received = new byte [data64KB.Length];
  1790. this.DoRequest (
  1791. (r, c) =>
  1792. {
  1793. r.Method = "POST";
  1794. r.ContentLength = data64KB.Length * 2;
  1795. Stream s = r.GetRequestStream ();
  1796. s.Write (data64KB, 0, data64KB.Length);
  1797. WebException ex = ExceptionAssert.Throws<WebException>(() => s.Close());
  1798. Assert.AreEqual(ex.Status, WebExceptionStatus.RequestCanceled);
  1799. c.Set();
  1800. },
  1801. (c) =>
  1802. {
  1803. c.Request.InputStream.ReadAll (received, 0, received.Length);
  1804. // c.Response.StatusCode = 204;
  1805. // c.Response.Close ();
  1806. });
  1807. }
  1808. [Test]
  1809. public void Write ()
  1810. {
  1811. byte [] received = new byte [data64KB.Length];
  1812. this.DoRequest (
  1813. (r, c) =>
  1814. {
  1815. r.Method = "POST";
  1816. r.ContentLength = data64KB.Length;
  1817. using (Stream s = r.GetRequestStream ()) {
  1818. s.Write (data64KB, 0, data64KB.Length);
  1819. }
  1820. r.GetResponse ().Close ();
  1821. c.Set ();
  1822. },
  1823. (c) =>
  1824. {
  1825. c.Request.InputStream.ReadAll (received, 0, received.Length);
  1826. c.Response.StatusCode = 204;
  1827. c.Response.Close ();
  1828. });
  1829. Assert.AreEqual(data64KB, received);
  1830. }
  1831. /*
  1832. Invalid test: it does not work on linux.
  1833. [pid 30973] send(9, "POST / HTTP/1.1\r\nContent-Length:"..., 89, 0) = 89
  1834. Abort set
  1835. [pid 30970] send(16, "HTTP/1.1 200 OK\r\nServer: Mono-HT"..., 133, 0) = 133
  1836. Calling abort
  1837. [pid 30970] close(16) = 0
  1838. Closing!!!
  1839. [pid 30980] send(9, "\213t\326\350\312u\36n\234\351\225L\r\243a\200\226\371\350F\271~oZ\32\270\24\226z4\211\345"..., 65536, 0) = 65536
  1840. Writing...
  1841. [pid 30966] close(4) = 0
  1842. OK
  1843. *
  1844. The server sideis closed (FD 16) and the send on the client side (FD 9) succeeds.
  1845. [Test]
  1846. [Category("NotWorking")]
  1847. public void WriteServerAborts ()
  1848. {
  1849. ManualResetEvent abort = new ManualResetEvent (false);
  1850. byte [] received = new byte [data64KB.Length];
  1851. this.DoRequest (
  1852. (r, c) =>
  1853. {
  1854. r.Method = "POST";
  1855. r.ContentLength = data64KB.Length;
  1856. using (Stream s = r.GetRequestStream()) {
  1857. abort.Set();
  1858. Thread.Sleep(100);
  1859. IOException ex = ExceptionAssert.Throws<IOException> (() => s.Write(data64KB, 0, data64KB.Length));
  1860. }
  1861. c.Set();
  1862. },
  1863. (c) =>
  1864. {
  1865. abort.WaitOne();
  1866. c.Response.Abort();
  1867. });
  1868. }
  1869. **/
  1870. [Test]
  1871. public void Read ()
  1872. {
  1873. byte [] received = new byte [data64KB.Length];
  1874. this.DoRequest (
  1875. (r, c) =>
  1876. {
  1877. using (HttpWebResponse x = (HttpWebResponse) r.GetResponse ())
  1878. using (Stream s = x.GetResponseStream()) {
  1879. s.ReadAll (received, 0, received.Length);
  1880. }
  1881. c.Set ();
  1882. },
  1883. (c) =>
  1884. {
  1885. c.Response.StatusCode = 200;
  1886. c.Response.ContentLength64 = data64KB.Length;
  1887. c.Response.OutputStream.Write (data64KB, 0, data64KB.Length);
  1888. c.Response.OutputStream.Close ();
  1889. c.Response.Close ();
  1890. });
  1891. Assert.AreEqual (data64KB, received);
  1892. }
  1893. [Test]
  1894. public void ReadTimeout2 ()
  1895. {
  1896. byte [] received = new byte [data64KB.Length];
  1897. this.DoRequest (
  1898. (r, c) =>
  1899. {
  1900. r.ReadWriteTimeout = 10;
  1901. using (HttpWebResponse x = (HttpWebResponse) r.GetResponse ())
  1902. using (Stream s = x.GetResponseStream ()) {
  1903. WebException ex = ExceptionAssert.Throws<WebException> (() => s.ReadAll (received, 0, received.Length));
  1904. Assert.AreEqual (ex.Status, WebExceptionStatus.Timeout);
  1905. }
  1906. c.Set();
  1907. },
  1908. (c) =>
  1909. {
  1910. c.Response.StatusCode = 200;
  1911. c.Response.ContentLength64 = data64KB.Length;
  1912. c.Response.OutputStream.Write (data64KB, 0, data64KB.Length / 2);
  1913. Thread.Sleep (1000);
  1914. // c.Response.OutputStream.Write (data64KB, data64KB.Length / 2, data64KB.Length / 2);
  1915. c.Response.OutputStream.Close ();
  1916. c.Response.Close ();
  1917. });
  1918. }
  1919. [Test]
  1920. public void ReadServerAborted ()
  1921. {
  1922. byte [] received = new byte [data64KB.Length];
  1923. this.DoRequest (
  1924. (r, c) =>
  1925. {
  1926. using (HttpWebResponse x = (HttpWebResponse) r.GetResponse ())
  1927. using (Stream s = x.GetResponseStream ()) {
  1928. Assert.AreEqual (1, s.ReadAll (received, 0, received.Length));
  1929. }
  1930. c.Set();
  1931. },
  1932. (c) =>
  1933. {
  1934. c.Response.StatusCode = 200;
  1935. c.Response.ContentLength64 = data64KB.Length;
  1936. c.Response.OutputStream.Write (data64KB, 0, 1);
  1937. c.Response.Abort ();
  1938. });
  1939. }
  1940. [Test]
  1941. public void BeginGetResponse2 ()
  1942. {
  1943. byte [] received = new byte [data64KB.Length];
  1944. this.DoRequest (
  1945. (r, c) =>
  1946. {
  1947. r.BeginGetResponse ((a) =>
  1948. {
  1949. using (HttpWebResponse x = (HttpWebResponse) r.EndGetResponse (a))
  1950. using (Stream s = x.GetResponseStream ()) {
  1951. s.ReadAll (received, 0, received.Length);
  1952. }
  1953. c.Set();
  1954. }, null);
  1955. },
  1956. (c) =>
  1957. {
  1958. c.Response.StatusCode = 200;
  1959. c.Response.ContentLength64 = data64KB.Length;
  1960. c.Response.OutputStream.Write (data64KB, 0, data64KB.Length);
  1961. c.Response.OutputStream.Close ();
  1962. c.Response.Close ();
  1963. });
  1964. Assert.AreEqual (data64KB, received);
  1965. }
  1966. [Test]
  1967. public void BeginGetResponseAborts ()
  1968. {
  1969. ManualResetEvent aborted = new ManualResetEvent(false);
  1970. this.DoRequest (
  1971. (r, c) =>
  1972. {
  1973. r.BeginGetResponse((a) =>
  1974. {
  1975. WebException ex = ExceptionAssert.Throws<WebException> (() => r.EndGetResponse (a));
  1976. Assert.AreEqual (ex.Status, WebExceptionStatus.RequestCanceled);
  1977. c.Set ();
  1978. }, null);
  1979. aborted.WaitOne ();
  1980. r.Abort ();
  1981. },
  1982. (c) =>
  1983. {
  1984. aborted.Set ();
  1985. // Thread.Sleep (100);
  1986. // c.Response.StatusCode = 200;
  1987. // c.Response.ContentLength64 = 0;
  1988. // c.Response.Close ();
  1989. });
  1990. return;
  1991. }
  1992. void DoRequest (Action<HttpWebRequest, EventWaitHandle> request)
  1993. {
  1994. int port = NetworkHelpers.FindFreePort ();
  1995. ManualResetEvent completed = new ManualResetEvent (false);
  1996. Uri address = new Uri (string.Format ("http://localhost:{0}", port));
  1997. HttpWebRequest client = (HttpWebRequest) WebRequest.Create (address);
  1998. request (client, completed);
  1999. if (!completed.WaitOne (10000))
  2000. Assert.Fail ("Test hung");
  2001. }
  2002. void DoRequest (Action<HttpWebRequest, EventWaitHandle> request, Action<HttpListenerContext> processor)
  2003. {
  2004. int port = NetworkHelpers.FindFreePort ();
  2005. ManualResetEvent [] completed = new ManualResetEvent [2];
  2006. completed [0] = new ManualResetEvent (false);
  2007. completed [1] = new ManualResetEvent (false);
  2008. using (ListenerScope scope = new ListenerScope (processor, port, completed [0])) {
  2009. ManualResetEvent clientCompleted = new ManualResetEvent (false);
  2010. Uri address = new Uri (string.Format ("http://localhost:{0}", port));
  2011. HttpWebRequest client = (HttpWebRequest) WebRequest.Create (address);
  2012. ThreadPool.QueueUserWorkItem ((o) => request (client, completed [1]));
  2013. if (!WaitHandle.WaitAll (completed, 10000))
  2014. Assert.Fail ("Test hung.");
  2015. }
  2016. }
  2017. #if NET_4_0
  2018. [Test]
  2019. [ExpectedException (typeof (ArgumentNullException))]
  2020. public void NullHost ()
  2021. {
  2022. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://go-mono.com");
  2023. req.Host = null;
  2024. }
  2025. [Test]
  2026. public void NoHost ()
  2027. {
  2028. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://go-mono.com");
  2029. Assert.AreEqual (req.Host, "go-mono.com");
  2030. }
  2031. [Test]
  2032. [ExpectedException (typeof (ArgumentException))]
  2033. public void EmptyHost ()
  2034. {
  2035. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://go-mono.com");
  2036. req.Host = "";
  2037. }
  2038. [Test]
  2039. public void HostAndPort ()
  2040. {
  2041. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://go-mono.com:80");
  2042. Assert.AreEqual ("go-mono.com", req.Host, "#01");
  2043. req = (HttpWebRequest) WebRequest.Create ("http://go-mono.com:9000");
  2044. Assert.AreEqual ("go-mono.com:9000", req.Host, "#02");
  2045. }
  2046. [Test]
  2047. public void PortRange ()
  2048. {
  2049. for (int i = 0; i < 65536; i++) {
  2050. if (i == 80)
  2051. continue;
  2052. string s = i.ToString ();
  2053. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://go-mono.com:" + s);
  2054. Assert.AreEqual ("go-mono.com:" + s, req.Host, "#" + s);
  2055. }
  2056. }
  2057. [Test]
  2058. [ExpectedException (typeof (ArgumentException))]
  2059. public void PortBelow ()
  2060. {
  2061. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://go-mono.com");
  2062. req.Host = "go-mono.com:-1";
  2063. }
  2064. [Test]
  2065. [ExpectedException (typeof (ArgumentException))]
  2066. public void PortAbove ()
  2067. {
  2068. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://go-mono.com");
  2069. req.Host = "go-mono.com:65536";
  2070. }
  2071. [Test]
  2072. [ExpectedException (typeof (ArgumentException))]
  2073. public void HostTooLong ()
  2074. {
  2075. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://go-mono.com");
  2076. string s = new string ('a', 100);
  2077. req.Host = s + "." + s + "." + s + "." + s + "." + s + "." + s; // Over 255 bytes
  2078. }
  2079. [Test]
  2080. [Category ("NotWorking")] // #5490
  2081. public void InvalidNamesThatWork ()
  2082. {
  2083. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://go-mono.com");
  2084. req.Host = "-";
  2085. req.Host = "-.-";
  2086. req.Host = "á";
  2087. req.Host = new string ('a', 64); // Should fail. Max. is 63.
  2088. }
  2089. [Test]
  2090. public void NoDate ()
  2091. {
  2092. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://go-mono.com");
  2093. Assert.AreEqual (DateTime.MinValue, req.Date);
  2094. }
  2095. [Test]
  2096. public void UtcDate ()
  2097. {
  2098. HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://go-mono.com");
  2099. req.Date = DateTime.UtcNow;
  2100. DateTime date = req.Date;
  2101. Assert.AreEqual (DateTimeKind.Local, date.Kind);
  2102. }
  2103. [Test]
  2104. public void AddAndRemoveDate ()
  2105. {
  2106. // Neil Armstrong set his foot on Moon
  2107. var landing = new DateTime (1969, 7, 21, 2, 56, 0, DateTimeKind.Utc);
  2108. Assert.AreEqual (621214377600000000, landing.Ticks);
  2109. var unspecified = new DateTime (1969, 7, 21, 2, 56, 0);
  2110. var local = landing.ToLocalTime ();
  2111. var req = (HttpWebRequest)WebRequest.Create ("http://www.mono-project.com/");
  2112. req.Date = landing;
  2113. Assert.AreEqual (DateTimeKind.Local, req.Date.Kind);
  2114. Assert.AreEqual (local.Ticks, req.Date.Ticks);
  2115. Assert.AreEqual (local, req.Date);
  2116. req.Date = unspecified;
  2117. Assert.AreEqual (DateTimeKind.Local, req.Date.Kind);
  2118. Assert.AreEqual (unspecified.Ticks, req.Date.Ticks);
  2119. Assert.AreEqual (unspecified, req.Date);
  2120. req.Date = local;
  2121. Assert.AreEqual (DateTimeKind.Local, req.Date.Kind);
  2122. Assert.AreEqual (local.Ticks, req.Date.Ticks);
  2123. Assert.AreEqual (local, req.Date);
  2124. req.Date = DateTime.MinValue;
  2125. Assert.AreEqual (DateTimeKind.Unspecified, DateTime.MinValue.Kind);
  2126. Assert.AreEqual (DateTimeKind.Unspecified, req.Date.Kind);
  2127. Assert.AreEqual (0, req.Date.Ticks);
  2128. Assert.AreEqual (null, req.Headers.Get ("Date"));
  2129. }
  2130. [Test]
  2131. // Bug #12393
  2132. public void TestIPv6Host ()
  2133. {
  2134. var address = "2001:0000:0000:0001:0001:0001:0157:0000";
  2135. var address2 = '[' + address + ']';
  2136. var uri = new Uri (string.Format ("http://{0}/test.css", address2));
  2137. var hwr = (HttpWebRequest)WebRequest.Create (uri);
  2138. hwr.Host = address2;
  2139. Assert.AreEqual (address2, hwr.Host, "#1");
  2140. }
  2141. [Test]
  2142. // Bug #12393
  2143. [Category ("NotWorking")]
  2144. public void TestIPv6Host2 ()
  2145. {
  2146. var address = "2001:0000:0000:0001:0001:0001:0157:0000";
  2147. var address2 = '[' + address + ']';
  2148. var uri = new Uri (string.Format ("http://{0}/test.css", address2));
  2149. var hwr = (HttpWebRequest)WebRequest.Create (uri);
  2150. try {
  2151. hwr.Host = address;
  2152. Assert.Fail ("#1");
  2153. } catch (ArgumentException) {
  2154. ;
  2155. }
  2156. }
  2157. #endif
  2158. #if NET_4_5
  2159. [Test]
  2160. public void AllowReadStreamBuffering ()
  2161. {
  2162. var hr = WebRequest.CreateHttp ("http://www.google.com");
  2163. Assert.IsFalse (hr.AllowReadStreamBuffering, "#1");
  2164. try {
  2165. hr.AllowReadStreamBuffering = true;
  2166. Assert.Fail ("#2");
  2167. } catch (InvalidOperationException) {
  2168. }
  2169. }
  2170. #endif
  2171. class ListenerScope : IDisposable {
  2172. EventWaitHandle completed;
  2173. public HttpListener listener;
  2174. Action<HttpListenerContext> processor;
  2175. public ListenerScope (Action<HttpListenerContext> processor, int port, EventWaitHandle completed)
  2176. {
  2177. this.processor = processor;
  2178. this.completed = completed;
  2179. this.listener = new HttpListener ();
  2180. this.listener.Prefixes.Add (string.Format ("http://localhost:{0}/", port));
  2181. this.listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
  2182. this.listener.Start ();
  2183. this.listener.BeginGetContext (this.RequestHandler, null);
  2184. }
  2185. void RequestHandler (IAsyncResult result)
  2186. {
  2187. HttpListenerContext context = null;
  2188. try {
  2189. context = this.listener.EndGetContext (result);
  2190. } catch (HttpListenerException ex) {
  2191. // check if the thread has been aborted as in the case when we are shutting down.
  2192. if (ex.ErrorCode == 995)
  2193. return;
  2194. } catch (ObjectDisposedException) {
  2195. return;
  2196. }
  2197. ThreadPool.QueueUserWorkItem ((o) =>
  2198. {
  2199. try {
  2200. this.processor (context);
  2201. } catch (HttpListenerException) {
  2202. }
  2203. });
  2204. this.completed.Set ();
  2205. }
  2206. public void Dispose ()
  2207. {
  2208. this.listener.Stop ();
  2209. }
  2210. }
  2211. #if !MOBILE
  2212. class SslHttpServer : HttpServer {
  2213. X509Certificate _certificate;
  2214. protected override void Run ()
  2215. {
  2216. try {
  2217. Socket client = sock.Accept ();
  2218. NetworkStream ns = new NetworkStream (client, true);
  2219. SslServerStream s = new SslServerStream (ns, Certificate, false, false);
  2220. s.PrivateKeyCertSelectionDelegate += new PrivateKeySelectionCallback (GetPrivateKey);
  2221. StreamReader reader = new StreamReader (s);
  2222. StreamWriter writer = new StreamWriter (s, Encoding.ASCII);
  2223. string line;
  2224. string hello = "<html><body><h1>Hello World!</h1></body></html>";
  2225. string answer = "HTTP/1.0 200\r\n" +
  2226. "Connection: close\r\n" +
  2227. "Content-Type: text/html\r\n" +
  2228. "Content-Encoding: " + Encoding.ASCII.WebName + "\r\n" +
  2229. "Content-Length: " + hello.Length + "\r\n" +
  2230. "\r\n" + hello;
  2231. // Read the headers
  2232. do {
  2233. line = reader.ReadLine ();
  2234. } while (line != "" && line != null && line.Length > 0);
  2235. // Now the content. We know it's 100 bytes.
  2236. // This makes BeginRead in sslclientstream block.
  2237. char [] cs = new char [100];
  2238. reader.Read (cs, 0, 100);
  2239. writer.Write (answer);
  2240. writer.Flush ();
  2241. if (evt.WaitOne (5000, false))
  2242. error = new Exception ("Timeout when stopping the server");
  2243. } catch (Exception e) {
  2244. error = e;
  2245. }
  2246. }
  2247. X509Certificate Certificate {
  2248. get {
  2249. if (_certificate == null)
  2250. _certificate = new X509Certificate (CertData.Certificate);
  2251. return _certificate;
  2252. }
  2253. }
  2254. AsymmetricAlgorithm GetPrivateKey (X509Certificate certificate, string targetHost)
  2255. {
  2256. PrivateKey key = new PrivateKey (CertData.PrivateKey, null);
  2257. return key.RSA;
  2258. }
  2259. }
  2260. class CertData {
  2261. public readonly static byte [] Certificate = {
  2262. 48, 130, 1, 191, 48, 130, 1, 40, 160, 3, 2, 1, 2, 2, 16, 36,
  2263. 14, 97, 190, 146, 132, 208, 71, 175, 6, 87, 168, 185, 175, 55, 43, 48,
  2264. 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 4, 5, 0, 48, 18,
  2265. 49, 16, 48, 14, 6, 3, 85, 4, 3, 19, 7, 103, 111, 110, 122, 97,
  2266. 108, 111, 48, 30, 23, 13, 48, 53, 48, 54, 50, 50, 49, 57, 51, 48,
  2267. 52, 54, 90, 23, 13, 51, 57, 49, 50, 51, 49, 50, 51, 53, 57, 53,
  2268. 57, 90, 48, 18, 49, 16, 48, 14, 6, 3, 85, 4, 3, 19, 7, 103,
  2269. 111, 110, 122, 97, 108, 111, 48, 129, 158, 48, 13, 6, 9, 42, 134, 72,
  2270. 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 140, 0, 48, 129, 136, 2,
  2271. 129, 129, 0, 138, 9, 38, 25, 166, 252, 59, 26, 39, 184, 128, 216, 38,
  2272. 73, 41, 86, 30, 228, 160, 205, 41, 135, 115, 223, 44, 62, 42, 198, 178,
  2273. 190, 81, 11, 25, 21, 216, 49, 179, 130, 246, 52, 97, 175, 212, 94, 157,
  2274. 231, 162, 66, 161, 103, 63, 204, 83, 141, 172, 119, 97, 225, 206, 98, 101,
  2275. 210, 106, 2, 206, 81, 90, 173, 47, 41, 199, 209, 241, 177, 177, 96, 207,
  2276. 254, 220, 190, 66, 180, 153, 0, 209, 14, 178, 69, 194, 3, 37, 116, 239,
  2277. 49, 23, 185, 245, 255, 126, 35, 85, 246, 56, 244, 107, 117, 24, 14, 57,
  2278. 9, 111, 147, 189, 220, 142, 57, 104, 153, 193, 205, 19, 14, 22, 157, 16,
  2279. 24, 80, 201, 2, 2, 0, 17, 163, 23, 48, 21, 48, 19, 6, 3, 85,
  2280. 29, 37, 4, 12, 48, 10, 6, 8, 43, 6, 1, 5, 5, 7, 3, 1,
  2281. 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 4, 5, 0, 3,
  2282. 129, 129, 0, 64, 49, 57, 253, 218, 198, 229, 51, 189, 12, 154, 225, 183,
  2283. 160, 147, 90, 113, 172, 69, 122, 28, 77, 97, 215, 231, 194, 150, 29, 196,
  2284. 65, 95, 218, 99, 142, 111, 79, 205, 109, 76, 32, 92, 220, 76, 88, 53,
  2285. 237, 80, 11, 85, 44, 91, 21, 210, 12, 34, 223, 234, 18, 187, 136, 62,
  2286. 26, 240, 103, 180, 12, 226, 221, 250, 247, 129, 51, 23, 129, 165, 56, 67,
  2287. 43, 83, 244, 110, 207, 24, 253, 195, 16, 46, 80, 113, 80, 18, 2, 254,
  2288. 120, 147, 151, 164, 23, 210, 230, 100, 19, 197, 179, 28, 194, 48, 106, 159,
  2289. 155, 144, 37, 82, 44, 160, 40, 52, 146, 174, 77, 188, 160, 230, 75, 172,
  2290. 123, 3, 254,
  2291. };
  2292. public readonly static byte [] PrivateKey = {
  2293. 30, 241, 181, 176, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
  2294. 0, 0, 0, 0, 84, 2, 0, 0, 7, 2, 0, 0, 0, 36, 0, 0,
  2295. 82, 83, 65, 50, 0, 4, 0, 0, 17, 0, 0, 0, 201, 80, 24, 16,
  2296. 157, 22, 14, 19, 205, 193, 153, 104, 57, 142, 220, 189, 147, 111, 9, 57,
  2297. 14, 24, 117, 107, 244, 56, 246, 85, 35, 126, 255, 245, 185, 23, 49, 239,
  2298. 116, 37, 3, 194, 69, 178, 14, 209, 0, 153, 180, 66, 190, 220, 254, 207,
  2299. 96, 177, 177, 241, 209, 199, 41, 47, 173, 90, 81, 206, 2, 106, 210, 101,
  2300. 98, 206, 225, 97, 119, 172, 141, 83, 204, 63, 103, 161, 66, 162, 231, 157,
  2301. 94, 212, 175, 97, 52, 246, 130, 179, 49, 216, 21, 25, 11, 81, 190, 178,
  2302. 198, 42, 62, 44, 223, 115, 135, 41, 205, 160, 228, 30, 86, 41, 73, 38,
  2303. 216, 128, 184, 39, 26, 59, 252, 166, 25, 38, 9, 138, 175, 88, 190, 223,
  2304. 27, 24, 224, 123, 190, 69, 164, 234, 129, 59, 108, 229, 248, 62, 187, 15,
  2305. 235, 147, 162, 83, 47, 123, 170, 190, 224, 31, 215, 110, 143, 31, 227, 216,
  2306. 85, 88, 154, 83, 207, 229, 41, 28, 237, 116, 181, 17, 37, 141, 224, 185,
  2307. 164, 144, 141, 233, 164, 138, 177, 241, 115, 181, 230, 150, 7, 92, 139, 141,
  2308. 113, 95, 57, 191, 211, 165, 217, 250, 197, 68, 164, 184, 168, 43, 48, 65,
  2309. 177, 237, 173, 144, 148, 221, 62, 189, 147, 63, 216, 188, 206, 103, 226, 171,
  2310. 32, 20, 230, 116, 144, 192, 1, 39, 202, 87, 74, 250, 6, 142, 188, 23,
  2311. 45, 4, 112, 191, 253, 67, 69, 70, 128, 143, 44, 234, 41, 96, 195, 82,
  2312. 202, 35, 158, 149, 240, 151, 23, 25, 166, 179, 85, 144, 58, 120, 149, 229,
  2313. 205, 34, 8, 110, 86, 119, 130, 210, 37, 173, 65, 71, 169, 67, 8, 51,
  2314. 20, 96, 51, 155, 3, 39, 85, 187, 40, 193, 57, 19, 99, 78, 173, 28,
  2315. 129, 154, 108, 175, 8, 138, 237, 71, 27, 148, 129, 35, 47, 57, 101, 237,
  2316. 168, 178, 227, 221, 212, 63, 124, 254, 253, 215, 183, 159, 49, 103, 74, 49,
  2317. 67, 160, 171, 72, 194, 215, 108, 251, 178, 18, 184, 100, 211, 105, 21, 186,
  2318. 39, 66, 218, 154, 72, 222, 90, 237, 179, 251, 51, 224, 212, 56, 251, 6,
  2319. 209, 151, 198, 176, 89, 110, 35, 141, 248, 237, 223, 68, 135, 206, 207, 169,
  2320. 254, 219, 243, 130, 71, 11, 94, 113, 233, 92, 63, 156, 169, 72, 215, 110,
  2321. 95, 94, 191, 50, 59, 89, 187, 59, 183, 99, 161, 146, 233, 245, 219, 80,
  2322. 87, 113, 251, 50, 144, 195, 158, 46, 189, 232, 119, 91, 75, 22, 6, 176,
  2323. 39, 206, 25, 196, 213, 195, 219, 24, 28, 103, 104, 36, 137, 128, 4, 119,
  2324. 163, 40, 126, 87, 18, 86, 128, 243, 213, 101, 2, 237, 78, 64, 160, 55,
  2325. 199, 93, 90, 126, 175, 199, 55, 89, 234, 190, 5, 16, 196, 88, 28, 208,
  2326. 28, 92, 32, 115, 204, 9, 202, 101, 15, 123, 43, 75, 90, 144, 95, 179,
  2327. 102, 249, 57, 150, 204, 99, 147, 203, 16, 63, 81, 244, 226, 237, 82, 204,
  2328. 20, 200, 140, 65, 83, 217, 161, 23, 123, 37, 115, 12, 100, 73, 70, 190,
  2329. 32, 235, 174, 140, 148, 157, 47, 238, 40, 208, 228, 80, 54, 187, 156, 252,
  2330. 253, 230, 231, 156, 138, 125, 96, 79, 3, 27, 143, 55, 146, 169, 165, 61,
  2331. 238, 60, 227, 77, 217, 93, 117, 122, 111, 46, 173, 113,
  2332. };
  2333. }
  2334. #endif
  2335. [Test]
  2336. public void CookieContainerTest ()
  2337. {
  2338. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2339. string url = "http://" + ep.ToString ();
  2340. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (CookieRequestHandler))) {
  2341. responder.Start ();
  2342. CookieContainer container = new CookieContainer ();
  2343. container.Add(new Uri (url), new Cookie ("foo", "bar"));
  2344. HttpWebRequest request = (HttpWebRequest) WebRequest.Create (url);
  2345. request.CookieContainer = container;
  2346. WebHeaderCollection headers = request.Headers;
  2347. headers.Add("Cookie", "foo=baz");
  2348. HttpWebResponse response = (HttpWebResponse) request.GetResponse ();
  2349. string responseString = null;
  2350. using (StreamReader reader = new StreamReader (response.GetResponseStream ())) {
  2351. responseString = reader.ReadToEnd ();
  2352. }
  2353. response.Close ();
  2354. Assert.AreEqual (1, response.Cookies.Count, "#01");
  2355. Assert.AreEqual ("foo=bar", response.Headers.Get("Set-Cookie"), "#02");
  2356. }
  2357. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (CookieRequestHandler))) {
  2358. responder.Start ();
  2359. CookieContainer container = new CookieContainer ();
  2360. HttpWebRequest request = (HttpWebRequest) WebRequest.Create (url);
  2361. request.CookieContainer = container;
  2362. WebHeaderCollection headers = request.Headers;
  2363. headers.Add("Cookie", "foo=baz");
  2364. HttpWebResponse response = (HttpWebResponse) request.GetResponse ();
  2365. string responseString = null;
  2366. using (StreamReader reader = new StreamReader (response.GetResponseStream ())) {
  2367. responseString = reader.ReadToEnd ();
  2368. }
  2369. response.Close ();
  2370. Assert.AreEqual (0, response.Cookies.Count, "#03");
  2371. Assert.AreEqual ("", response.Headers.Get("Set-Cookie"), "#04");
  2372. }
  2373. }
  2374. internal static byte[] CookieRequestHandler (Socket socket)
  2375. {
  2376. MemoryStream ms = new MemoryStream ();
  2377. byte[] buffer = new byte[4096];
  2378. int bytesReceived = socket.Receive (buffer);
  2379. while (bytesReceived > 0) {
  2380. ms.Write(buffer, 0, bytesReceived);
  2381. // We don't check for Content-Length or anything else here, so we give the client a little time to write
  2382. // after sending the headers
  2383. Thread.Sleep(200);
  2384. if (socket.Available > 0) {
  2385. bytesReceived = socket.Receive (buffer);
  2386. } else {
  2387. bytesReceived = 0;
  2388. }
  2389. }
  2390. ms.Flush();
  2391. ms.Position = 0;
  2392. string cookies = string.Empty;
  2393. using (StreamReader sr = new StreamReader (ms, Encoding.UTF8)) {
  2394. string line;
  2395. while ((line = sr.ReadLine ()) != null) {
  2396. if (line.StartsWith ("Cookie:")) {
  2397. cookies = line.Substring ("cookie: ".Length);
  2398. }
  2399. }
  2400. }
  2401. StringWriter sw = new StringWriter ();
  2402. sw.WriteLine ("HTTP/1.1 200 OK");
  2403. sw.WriteLine ("Content-Type: text/xml");
  2404. sw.WriteLine ("Set-Cookie: " + cookies);
  2405. sw.WriteLine ("Content-Length: " + cookies.Length.ToString (CultureInfo.InvariantCulture));
  2406. sw.WriteLine ();
  2407. sw.Write (cookies);
  2408. sw.Flush ();
  2409. return Encoding.UTF8.GetBytes (sw.ToString ());
  2410. }
  2411. }
  2412. [TestFixture]
  2413. public class HttpRequestStreamTest
  2414. {
  2415. [Test]
  2416. public void BeginRead ()
  2417. {
  2418. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2419. string url = "http://" + ep.ToString () + "/test/";
  2420. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2421. responder.Start ();
  2422. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2423. req.Method = "POST";
  2424. using (Stream rs = req.GetRequestStream ()) {
  2425. byte [] buffer = new byte [10];
  2426. try {
  2427. rs.BeginRead (buffer, 0, buffer.Length, null, null);
  2428. Assert.Fail ("#1");
  2429. } catch (NotSupportedException ex) {
  2430. // The stream does not support reading
  2431. Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
  2432. Assert.IsNull (ex.InnerException, "#3");
  2433. Assert.IsNotNull (ex.Message, "#4");
  2434. } finally {
  2435. req.Abort ();
  2436. }
  2437. }
  2438. }
  2439. }
  2440. [Test]
  2441. public void BeginWrite_Request_Aborted ()
  2442. {
  2443. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2444. string url = "http://" + ep.ToString () + "/test/";
  2445. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2446. responder.Start ();
  2447. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2448. req.Method = "POST";
  2449. using (Stream rs = req.GetRequestStream ()) {
  2450. req.Abort ();
  2451. try {
  2452. rs.BeginWrite (new byte [] { 0x2a, 0x2f }, 0, 2, null, null);
  2453. Assert.Fail ("#1");
  2454. } catch (WebException ex) {
  2455. // The request was aborted: The request was canceled
  2456. Assert.AreEqual (typeof (WebException), ex.GetType (), "#2");
  2457. Assert.IsNull (ex.InnerException, "#3");
  2458. Assert.IsNotNull (ex.Message, "#4");
  2459. Assert.IsNull (ex.Response, "#5");
  2460. Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6");
  2461. }
  2462. }
  2463. }
  2464. }
  2465. [Test]
  2466. public void CanRead ()
  2467. {
  2468. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2469. string url = "http://" + ep.ToString () + "/test/";
  2470. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2471. responder.Start ();
  2472. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2473. req.Method = "POST";
  2474. Stream rs = req.GetRequestStream ();
  2475. try {
  2476. Assert.IsFalse (rs.CanRead, "#1");
  2477. rs.Close ();
  2478. Assert.IsFalse (rs.CanRead, "#2");
  2479. } finally {
  2480. rs.Close ();
  2481. req.Abort ();
  2482. }
  2483. }
  2484. }
  2485. [Test]
  2486. public void CanSeek ()
  2487. {
  2488. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2489. string url = "http://" + ep.ToString () + "/test/";
  2490. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2491. responder.Start ();
  2492. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2493. req.Method = "POST";
  2494. Stream rs = req.GetRequestStream ();
  2495. try {
  2496. Assert.IsFalse (rs.CanSeek, "#1");
  2497. rs.Close ();
  2498. Assert.IsFalse (rs.CanSeek, "#2");
  2499. } finally {
  2500. rs.Close ();
  2501. req.Abort ();
  2502. }
  2503. }
  2504. }
  2505. [Test] // bug #324182
  2506. public void CanTimeout ()
  2507. {
  2508. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2509. string url = "http://" + ep.ToString () + "/test/";
  2510. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2511. responder.Start ();
  2512. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2513. req.Method = "POST";
  2514. Stream rs = req.GetRequestStream ();
  2515. try {
  2516. Assert.IsTrue (rs.CanTimeout, "#1");
  2517. rs.Close ();
  2518. Assert.IsTrue (rs.CanTimeout, "#2");
  2519. } finally {
  2520. rs.Close ();
  2521. req.Abort ();
  2522. }
  2523. }
  2524. }
  2525. [Test]
  2526. public void CanWrite ()
  2527. {
  2528. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2529. string url = "http://" + ep.ToString () + "/test/";
  2530. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2531. responder.Start ();
  2532. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2533. req.Method = "POST";
  2534. Stream rs = req.GetRequestStream ();
  2535. try {
  2536. Assert.IsTrue (rs.CanWrite, "#1");
  2537. rs.Close ();
  2538. Assert.IsFalse (rs.CanWrite, "#2");
  2539. } finally {
  2540. rs.Close ();
  2541. req.Abort ();
  2542. }
  2543. }
  2544. }
  2545. [Test]
  2546. public void Read ()
  2547. {
  2548. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2549. string url = "http://" + ep.ToString () + "/test/";
  2550. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2551. responder.Start ();
  2552. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2553. req.Method = "POST";
  2554. using (Stream rs = req.GetRequestStream ()) {
  2555. byte [] buffer = new byte [10];
  2556. try {
  2557. rs.Read (buffer, 0, buffer.Length);
  2558. Assert.Fail ("#1");
  2559. } catch (NotSupportedException ex) {
  2560. // The stream does not support reading
  2561. Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
  2562. Assert.IsNull (ex.InnerException, "#3");
  2563. Assert.IsNotNull (ex.Message, "#4");
  2564. } finally {
  2565. req.Abort ();
  2566. }
  2567. }
  2568. }
  2569. }
  2570. [Test]
  2571. public void ReadByte ()
  2572. {
  2573. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2574. string url = "http://" + ep.ToString () + "/test/";
  2575. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2576. responder.Start ();
  2577. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2578. req.Method = "POST";
  2579. using (Stream rs = req.GetRequestStream ()) {
  2580. try {
  2581. rs.ReadByte ();
  2582. Assert.Fail ("#1");
  2583. } catch (NotSupportedException ex) {
  2584. // The stream does not support reading
  2585. Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
  2586. Assert.IsNull (ex.InnerException, "#3");
  2587. Assert.IsNotNull (ex.Message, "#4");
  2588. } finally {
  2589. req.Abort ();
  2590. }
  2591. }
  2592. }
  2593. }
  2594. [Test]
  2595. public void ReadTimeout ()
  2596. {
  2597. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2598. string url = "http://" + ep.ToString () + "/test/";
  2599. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2600. responder.Start ();
  2601. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2602. req.Method = "POST";
  2603. Stream rs = req.GetRequestStream ();
  2604. try {
  2605. Assert.AreEqual (300000, rs.ReadTimeout, "#1");
  2606. rs.Close ();
  2607. Assert.AreEqual (300000, rs.ReadTimeout, "#2");
  2608. } finally {
  2609. rs.Close ();
  2610. req.Abort ();
  2611. }
  2612. }
  2613. }
  2614. [Test]
  2615. public void Seek ()
  2616. {
  2617. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2618. string url = "http://" + ep.ToString () + "/test/";
  2619. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2620. responder.Start ();
  2621. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2622. req.Method = "POST";
  2623. using (Stream rs = req.GetRequestStream ()) {
  2624. try {
  2625. rs.Seek (0, SeekOrigin.Current);
  2626. Assert.Fail ("#1");
  2627. } catch (NotSupportedException ex) {
  2628. // This stream does not support seek operations
  2629. Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
  2630. Assert.IsNull (ex.InnerException, "#3");
  2631. Assert.IsNotNull (ex.Message, "#4");
  2632. } finally {
  2633. req.Abort ();
  2634. }
  2635. }
  2636. }
  2637. }
  2638. [Test]
  2639. public void Write_Buffer_Null ()
  2640. {
  2641. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2642. string url = "http://" + ep.ToString () + "/test/";
  2643. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2644. responder.Start ();
  2645. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2646. req.Method = "POST";
  2647. using (Stream rs = req.GetRequestStream ()) {
  2648. try {
  2649. rs.Write ((byte []) null, -1, -1);
  2650. Assert.Fail ("#1");
  2651. } catch (ArgumentNullException ex) {
  2652. Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
  2653. Assert.IsNull (ex.InnerException, "#3");
  2654. Assert.IsNotNull (ex.Message, "#4");
  2655. Assert.AreEqual ("buffer", ex.ParamName, "#5");
  2656. }
  2657. }
  2658. req.Abort ();
  2659. }
  2660. }
  2661. [Test]
  2662. public void Write_Count_Negative ()
  2663. {
  2664. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2665. string url = "http://" + ep.ToString () + "/test/";
  2666. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2667. responder.Start ();
  2668. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2669. req.Method = "POST";
  2670. using (Stream rs = req.GetRequestStream ()) {
  2671. byte [] buffer = new byte [] { 0x2a, 0x2c, 0x1d, 0x00, 0x0f };
  2672. try {
  2673. rs.Write (buffer, 1, -1);
  2674. Assert.Fail ("#1");
  2675. } catch (ArgumentOutOfRangeException ex) {
  2676. // Specified argument was out of the range of valid values
  2677. Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
  2678. Assert.IsNull (ex.InnerException, "#A3");
  2679. Assert.IsNotNull (ex.Message, "#A4");
  2680. Assert.AreEqual ("size", ex.ParamName, "#A5");
  2681. }
  2682. }
  2683. req.Abort ();
  2684. }
  2685. }
  2686. [Test]
  2687. public void Write_Count_Overflow ()
  2688. {
  2689. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2690. string url = "http://" + ep.ToString () + "/test/";
  2691. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2692. responder.Start ();
  2693. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2694. req.Method = "POST";
  2695. using (Stream rs = req.GetRequestStream ()) {
  2696. byte [] buffer = new byte [] { 0x2a, 0x2c, 0x1d, 0x00, 0x0f };
  2697. try {
  2698. rs.Write (buffer, buffer.Length - 2, 3);
  2699. Assert.Fail ("#1");
  2700. } catch (ArgumentOutOfRangeException ex) {
  2701. // Specified argument was out of the range of valid values
  2702. Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
  2703. Assert.IsNull (ex.InnerException, "#3");
  2704. Assert.IsNotNull (ex.Message, "#4");
  2705. Assert.AreEqual ("size", ex.ParamName, "#5");
  2706. }
  2707. }
  2708. req.Abort ();
  2709. }
  2710. }
  2711. [Test]
  2712. public void Write_Offset_Negative ()
  2713. {
  2714. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2715. string url = "http://" + ep.ToString () + "/test/";
  2716. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2717. responder.Start ();
  2718. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2719. req.Method = "POST";
  2720. using (Stream rs = req.GetRequestStream ()) {
  2721. byte [] buffer = new byte [] { 0x2a, 0x2c, 0x1d, 0x00, 0x0f };
  2722. try {
  2723. rs.Write (buffer, -1, 0);
  2724. Assert.Fail ("#1");
  2725. } catch (ArgumentOutOfRangeException ex) {
  2726. // Specified argument was out of the range of valid values
  2727. Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
  2728. Assert.IsNull (ex.InnerException, "#3");
  2729. Assert.IsNotNull (ex.Message, "#4");
  2730. Assert.AreEqual ("offset", ex.ParamName, "#5");
  2731. }
  2732. }
  2733. req.Abort ();
  2734. }
  2735. }
  2736. [Test]
  2737. public void Write_Offset_Overflow ()
  2738. {
  2739. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2740. string url = "http://" + ep.ToString () + "/test/";
  2741. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2742. responder.Start ();
  2743. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2744. req.Method = "POST";
  2745. using (Stream rs = req.GetRequestStream ()) {
  2746. byte [] buffer = new byte [] { 0x2a, 0x2c, 0x1d, 0x00, 0x0f };
  2747. try {
  2748. rs.Write (buffer, buffer.Length + 1, 0);
  2749. Assert.Fail ("#1");
  2750. } catch (ArgumentOutOfRangeException ex) {
  2751. // Specified argument was out of the range of valid values
  2752. Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
  2753. Assert.IsNull (ex.InnerException, "#3");
  2754. Assert.IsNotNull (ex.Message, "#4");
  2755. Assert.AreEqual ("offset", ex.ParamName, "#5");
  2756. }
  2757. }
  2758. req.Abort ();
  2759. }
  2760. }
  2761. [Test]
  2762. public void Write_Request_Aborted ()
  2763. {
  2764. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2765. string url = "http://" + ep.ToString () + "/test/";
  2766. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2767. responder.Start ();
  2768. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2769. req.Method = "POST";
  2770. using (Stream rs = req.GetRequestStream ()) {
  2771. req.Abort ();
  2772. try {
  2773. rs.Write (new byte [0], 0, 0);
  2774. Assert.Fail ("#1");
  2775. } catch (WebException ex) {
  2776. // The request was aborted: The request was canceled
  2777. Assert.AreEqual (typeof (WebException), ex.GetType (), "#2");
  2778. Assert.IsNull (ex.InnerException, "#3");
  2779. Assert.IsNotNull (ex.Message, "#4");
  2780. Assert.IsNull (ex.Response, "#5");
  2781. Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6");
  2782. }
  2783. }
  2784. }
  2785. }
  2786. [Test]
  2787. [Category ("NotWorking")]
  2788. public void Write_Stream_Closed ()
  2789. {
  2790. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2791. string url = "http://" + ep.ToString () + "/test/";
  2792. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2793. responder.Start ();
  2794. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2795. req.Method = "POST";
  2796. using (Stream rs = req.GetRequestStream ()) {
  2797. rs.Close ();
  2798. try {
  2799. rs.Write (new byte [0], 0, 0);
  2800. Assert.Fail ("#1");
  2801. } catch (WebException ex) {
  2802. // The request was aborted: The connection was closed unexpectedly
  2803. Assert.AreEqual (typeof (WebException), ex.GetType (), "#2");
  2804. Assert.IsNull (ex.InnerException, "#3");
  2805. Assert.IsNotNull (ex.Message, "#4");
  2806. Assert.IsNull (ex.Response, "#5");
  2807. Assert.AreEqual (WebExceptionStatus.ConnectionClosed, ex.Status, "#6");
  2808. }
  2809. }
  2810. }
  2811. }
  2812. [Test]
  2813. public void WriteByte_Request_Aborted ()
  2814. {
  2815. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2816. string url = "http://" + ep.ToString () + "/test/";
  2817. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2818. responder.Start ();
  2819. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2820. req.Method = "POST";
  2821. using (Stream rs = req.GetRequestStream ()) {
  2822. req.Abort ();
  2823. try {
  2824. rs.WriteByte (0x2a);
  2825. Assert.Fail ("#1");
  2826. } catch (WebException ex) {
  2827. // The request was aborted: The request was canceled
  2828. Assert.AreEqual (typeof (WebException), ex.GetType (), "#2");
  2829. Assert.IsNull (ex.InnerException, "#3");
  2830. Assert.IsNotNull (ex.Message, "#4");
  2831. Assert.IsNull (ex.Response, "#5");
  2832. Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6");
  2833. }
  2834. }
  2835. }
  2836. }
  2837. [Test]
  2838. public void WriteTimeout ()
  2839. {
  2840. IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
  2841. string url = "http://" + ep.ToString () + "/test/";
  2842. using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
  2843. responder.Start ();
  2844. HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  2845. req.Method = "POST";
  2846. Stream rs = req.GetRequestStream ();
  2847. try {
  2848. Assert.AreEqual (300000, rs.WriteTimeout, "#1");
  2849. rs.Close ();
  2850. Assert.AreEqual (300000, rs.WriteTimeout, "#2");
  2851. } finally {
  2852. rs.Close ();
  2853. req.Abort ();
  2854. }
  2855. }
  2856. }
  2857. #if NET_4_0
  2858. [Test]
  2859. // Bug6737
  2860. // This test is supposed to fail prior to .NET 4.0
  2861. public void Post_EmptyRequestStream ()
  2862. {
  2863. var wr = HttpWebRequest.Create ("http://google.com");
  2864. wr.Method = "POST";
  2865. wr.GetRequestStream ();
  2866. var gr = wr.BeginGetResponse (delegate { }, null);
  2867. Assert.AreEqual (true, gr.AsyncWaitHandle.WaitOne (5000), "#1");
  2868. }
  2869. #endif
  2870. }
  2871. static class StreamExtensions {
  2872. public static int ReadAll(this Stream stream, byte[] buffer, int offset, int count)
  2873. {
  2874. int totalRead = 0;
  2875. while (totalRead < count) {
  2876. int bytesRead = stream.Read (buffer, offset + totalRead, count - totalRead);
  2877. if (bytesRead == 0)
  2878. break;
  2879. totalRead += bytesRead;
  2880. }
  2881. return totalRead;
  2882. }
  2883. }
  2884. static class ExceptionAssert {
  2885. /// <summary>
  2886. /// Asserts that the function throws an exception.
  2887. /// </summary>
  2888. /// <param name="f">A function execute that is expected to raise an exception.</param>
  2889. /// <typeparam name="T">The type of exception that is expected.</typeparam>
  2890. /// <returns>The exception thrown.</returns>
  2891. /// <exception cref="AssertFailedException">If the function does not throw an exception
  2892. /// or throws a different exception.</exception>
  2893. /// <example><![CDATA[
  2894. /// ExceptionAssert.Throws(typeof(ArgumentNullException), delegate {
  2895. /// myObject.myFunction(null); });
  2896. /// ]]></example>
  2897. public static T Throws<T> (Action f) where T : Exception {
  2898. Exception actualException = null;
  2899. try {
  2900. f ();
  2901. } catch (Exception ex) {
  2902. actualException = ex;
  2903. }
  2904. if (actualException == null)
  2905. throw new AssertionException (string.Format (
  2906. "No exception thrown. Expected '{0}'",
  2907. typeof (T).FullName));
  2908. else if (typeof(T) != actualException.GetType())
  2909. throw new AssertionException (string.Format (
  2910. "Caught exception of type '{0}'. Expected '{1}':{2}",
  2911. actualException.GetType().FullName,
  2912. typeof (T).FullName,
  2913. Environment.NewLine + actualException));
  2914. return (T) actualException;
  2915. }
  2916. }
  2917. }