HttpClientTest.cs 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318
  1. //
  2. // HttpClientTest.cs
  3. //
  4. // Authors:
  5. // Marek Safar <[email protected]>
  6. //
  7. // Copyright (C) 2011 Xamarin Inc (http://www.xamarin.com)
  8. //
  9. // Permission is hereby granted, free of charge, to any person obtaining
  10. // a copy of this software and associated documentation files (the
  11. // "Software"), to deal in the Software without restriction, including
  12. // without limitation the rights to use, copy, modify, merge, publish,
  13. // distribute, sublicense, and/or sell copies of the Software, and to
  14. // permit persons to whom the Software is furnished to do so, subject to
  15. // the following conditions:
  16. //
  17. // The above copyright notice and this permission notice shall be
  18. // included in all copies or substantial portions of the Software.
  19. //
  20. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  21. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  23. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  24. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  25. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27. //
  28. using System;
  29. using System.Collections;
  30. using System.Collections.Generic;
  31. using NUnit.Framework;
  32. using System.Net.Http;
  33. using System.Net.Http.Headers;
  34. using System.Threading;
  35. using System.Threading.Tasks;
  36. using System.Net;
  37. using System.Linq;
  38. using System.IO;
  39. namespace MonoTests.System.Net.Http
  40. {
  41. [TestFixture]
  42. public class HttpClientTest
  43. {
  44. class HttpMessageHandlerMock : HttpMessageHandler
  45. {
  46. public Func<HttpRequestMessage, Task<HttpResponseMessage>> OnSend;
  47. public Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> OnSendFull;
  48. public HttpMessageHandlerMock ()
  49. {
  50. }
  51. protected override Task<HttpResponseMessage> SendAsync (HttpRequestMessage request, CancellationToken cancellationToken)
  52. {
  53. if (OnSend != null)
  54. return OnSend (request);
  55. if (OnSendFull != null)
  56. return OnSendFull (request, cancellationToken);
  57. Assert.Fail ("Send");
  58. return null;
  59. }
  60. }
  61. class HttpClientHandlerMock : HttpClientHandler
  62. {
  63. public Func<HttpRequestMessage, Task<HttpResponseMessage>> OnSend;
  64. public Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> OnSendFull;
  65. protected override Task<HttpResponseMessage> SendAsync (HttpRequestMessage request, CancellationToken cancellationToken)
  66. {
  67. if (OnSend != null)
  68. return OnSend (request);
  69. if (OnSendFull != null)
  70. return OnSendFull (request, cancellationToken);
  71. Assert.Fail ("Send");
  72. return null;
  73. }
  74. }
  75. class CustomStream : Stream
  76. {
  77. public override void Flush ()
  78. {
  79. throw new NotImplementedException ();
  80. }
  81. int pos;
  82. public override int Read (byte[] buffer, int offset, int count)
  83. {
  84. ++pos;
  85. if (pos > 4)
  86. return 0;
  87. return 11;
  88. }
  89. public override long Seek (long offset, SeekOrigin origin)
  90. {
  91. throw new NotImplementedException ();
  92. }
  93. public override void SetLength (long value)
  94. {
  95. throw new NotImplementedException ();
  96. }
  97. public override void Write (byte[] buffer, int offset, int count)
  98. {
  99. throw new NotImplementedException ();
  100. }
  101. public override bool CanRead {
  102. get {
  103. return true;
  104. }
  105. }
  106. public override bool CanSeek {
  107. get {
  108. return false;
  109. }
  110. }
  111. public override bool CanWrite {
  112. get {
  113. throw new NotImplementedException ();
  114. }
  115. }
  116. public override long Length {
  117. get {
  118. throw new NotImplementedException ();
  119. }
  120. }
  121. public override long Position {
  122. get {
  123. throw new NotImplementedException ();
  124. }
  125. set {
  126. throw new NotImplementedException ();
  127. }
  128. }
  129. }
  130. class ThrowOnlyProxy : IWebProxy
  131. {
  132. public ICredentials Credentials {
  133. get {
  134. throw new NotImplementedException ();
  135. }
  136. set {
  137. throw new NotImplementedException ();
  138. }
  139. }
  140. public Uri GetProxy (Uri destination)
  141. {
  142. throw new NotImplementedException ();
  143. }
  144. public bool IsBypassed (Uri host)
  145. {
  146. throw new NotImplementedException ();
  147. }
  148. }
  149. const int WaitTimeout = 5000;
  150. string TestHost, LocalServer;
  151. int port;
  152. [SetUp]
  153. public void SetupFixture ()
  154. {
  155. if (Environment.OSVersion.Platform == PlatformID.Win32NT) {
  156. port = 810;
  157. } else {
  158. port = 8810;
  159. }
  160. TestHost = "localhost:" + port;
  161. LocalServer = string.Format ("http://{0}/", TestHost);
  162. }
  163. [Test]
  164. public void Ctor_Default ()
  165. {
  166. var client = new HttpClient ();
  167. Assert.IsNull (client.BaseAddress, "#1");
  168. Assert.IsNotNull (client.DefaultRequestHeaders, "#2"); // TODO: full check
  169. Assert.AreEqual (int.MaxValue, client.MaxResponseContentBufferSize, "#3");
  170. Assert.AreEqual (TimeSpan.FromSeconds (100), client.Timeout, "#4");
  171. }
  172. [Test]
  173. public void CancelPendingRequests ()
  174. {
  175. var mh = new HttpMessageHandlerMock ();
  176. var client = new HttpClient (mh);
  177. var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
  178. var mre = new ManualResetEvent (false);
  179. mh.OnSendFull = (l, c) => {
  180. mre.Set ();
  181. Assert.IsTrue (c.WaitHandle.WaitOne (1000), "#20");
  182. Assert.IsTrue (c.IsCancellationRequested, "#21");
  183. mre.Set ();
  184. return Task.FromResult (new HttpResponseMessage ());
  185. };
  186. var t = Task.Factory.StartNew (() => {
  187. client.SendAsync (request).Wait (WaitTimeout);
  188. });
  189. Assert.IsTrue (mre.WaitOne (500), "#1");
  190. mre.Reset ();
  191. client.CancelPendingRequests ();
  192. Assert.IsTrue (t.Wait (500), "#2");
  193. request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
  194. mh.OnSendFull = (l, c) => {
  195. Assert.IsFalse (c.IsCancellationRequested, "#30");
  196. return Task.FromResult (new HttpResponseMessage ());
  197. };
  198. client.SendAsync (request).Wait (WaitTimeout);
  199. }
  200. [Test]
  201. public void CancelPendingRequests_BeforeSend ()
  202. {
  203. var ct = new CancellationTokenSource ();
  204. ct.Cancel ();
  205. var rr = CancellationTokenSource.CreateLinkedTokenSource (new CancellationToken (), ct.Token);
  206. var mh = new HttpMessageHandlerMock ();
  207. var client = new HttpClient (mh);
  208. var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
  209. client.CancelPendingRequests ();
  210. mh.OnSendFull = (l, c) => {
  211. Assert.IsFalse (c.IsCancellationRequested, "#30");
  212. return Task.FromResult (new HttpResponseMessage ());
  213. };
  214. client.SendAsync (request).Wait (WaitTimeout);
  215. request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
  216. client.SendAsync (request).Wait (WaitTimeout);
  217. }
  218. [Test]
  219. #if FEATURE_NO_BSD_SOCKETS
  220. // Using HttpClientHandler, which indirectly requires BSD sockets.
  221. [ExpectedException (typeof (PlatformNotSupportedException))]
  222. #endif
  223. public void CancelRequestViaProxy ()
  224. {
  225. var handler = new HttpClientHandler {
  226. Proxy = new WebProxy ("192.168.10.25:8888/"), // proxy that doesn't exist
  227. UseProxy = true,
  228. AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
  229. };
  230. var httpClient = new HttpClient (handler) {
  231. BaseAddress = new Uri ("https://google.com"),
  232. Timeout = TimeSpan.FromMilliseconds (1)
  233. };
  234. try {
  235. var restRequest = new HttpRequestMessage {
  236. Method = HttpMethod.Post,
  237. RequestUri = new Uri("foo", UriKind.Relative),
  238. Content = new StringContent("", null, "application/json")
  239. };
  240. httpClient.PostAsync (restRequest.RequestUri, restRequest.Content).Wait (WaitTimeout);
  241. Assert.Fail ("#1");
  242. } catch (AggregateException e) {
  243. Assert.IsTrue (e.InnerException is TaskCanceledException, "#2");
  244. }
  245. }
  246. [Test]
  247. public void Properties ()
  248. {
  249. var client = new HttpClient ();
  250. client.BaseAddress = null;
  251. client.MaxResponseContentBufferSize = int.MaxValue;
  252. client.Timeout = Timeout.InfiniteTimeSpan;
  253. Assert.IsNull (client.BaseAddress, "#1");
  254. Assert.AreEqual (int.MaxValue, client.MaxResponseContentBufferSize, "#2");
  255. Assert.AreEqual (Timeout.InfiniteTimeSpan, client.Timeout, "#3");
  256. }
  257. [Test]
  258. public void Properties_Invalid ()
  259. {
  260. var client = new HttpClient ();
  261. try {
  262. client.MaxResponseContentBufferSize = 0;
  263. Assert.Fail ("#1");
  264. } catch (ArgumentOutOfRangeException) {
  265. }
  266. try {
  267. client.Timeout = TimeSpan.MinValue;
  268. Assert.Fail ("#2");
  269. } catch (ArgumentOutOfRangeException) {
  270. }
  271. }
  272. [Test]
  273. #if FEATURE_NO_BSD_SOCKETS
  274. [ExpectedException (typeof (PlatformNotSupportedException))]
  275. #endif
  276. public void Proxy_Disabled ()
  277. {
  278. var pp = WebRequest.DefaultWebProxy;
  279. try {
  280. WebRequest.DefaultWebProxy = new ThrowOnlyProxy ();
  281. var request = new HttpClientHandler {
  282. UseProxy = false
  283. };
  284. var client = new HttpClient (request);
  285. Assert.IsTrue (client.GetAsync ("http://google.com").Wait (5000), "needs internet access");
  286. } finally {
  287. WebRequest.DefaultWebProxy = pp;
  288. }
  289. }
  290. [Test]
  291. public void Send ()
  292. {
  293. var mh = new HttpMessageHandlerMock ();
  294. var client = new HttpClient (mh);
  295. client.BaseAddress = new Uri ("http://xamarin.com");
  296. var request = new HttpRequestMessage ();
  297. var response = new HttpResponseMessage ();
  298. mh.OnSend = l => {
  299. Assert.AreEqual (l, request, "#2");
  300. Assert.AreEqual (client.BaseAddress, l.RequestUri, "#2");
  301. return Task.FromResult (response);
  302. };
  303. Assert.AreEqual (response, client.SendAsync (request).Result, "#1");
  304. }
  305. [Test]
  306. public void Send_BaseAddress ()
  307. {
  308. var mh = new HttpMessageHandlerMock ();
  309. var client = new HttpClient (mh);
  310. client.BaseAddress = new Uri ("http://localhost/");
  311. var response = new HttpResponseMessage ();
  312. mh.OnSend = l => {
  313. Assert.AreEqual ("http://localhost/relative", l.RequestUri.ToString (), "#2");
  314. return Task.FromResult (response);
  315. };
  316. Assert.AreEqual (response, client.GetAsync ("relative").Result, "#1");
  317. Assert.AreEqual (response, client.GetAsync ("/relative").Result, "#2");
  318. }
  319. [Test]
  320. public void Send_DefaultRequestHeaders ()
  321. {
  322. var mh = new HttpMessageHandlerMock ();
  323. var client = new HttpClient (mh);
  324. client.DefaultRequestHeaders.Referrer = new Uri ("http://google.com");
  325. var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
  326. var response = new HttpResponseMessage ();
  327. mh.OnSend = l => {
  328. Assert.AreEqual (client.DefaultRequestHeaders.Referrer, l.Headers.Referrer, "#2");
  329. Assert.IsNotNull (l.Headers.Referrer, "#3");
  330. return Task.FromResult (response);
  331. };
  332. Assert.AreEqual (response, client.SendAsync (request).Result, "#1");
  333. }
  334. [Test]
  335. #if FEATURE_NO_BSD_SOCKETS
  336. [ExpectedException (typeof (PlatformNotSupportedException))]
  337. #endif
  338. public void Send_Complete_Default ()
  339. {
  340. bool? failed = null;
  341. var listener = CreateListener (l => {
  342. try {
  343. var request = l.Request;
  344. Assert.IsNull (request.AcceptTypes, "#1");
  345. Assert.AreEqual (0, request.ContentLength64, "#2");
  346. Assert.IsNull (request.ContentType, "#3");
  347. Assert.AreEqual (0, request.Cookies.Count, "#4");
  348. Assert.IsFalse (request.HasEntityBody, "#5");
  349. Assert.AreEqual (TestHost, request.Headers["Host"], "#6b");
  350. Assert.AreEqual ("GET", request.HttpMethod, "#7");
  351. Assert.IsFalse (request.IsAuthenticated, "#8");
  352. Assert.IsTrue (request.IsLocal, "#9");
  353. Assert.IsFalse (request.IsSecureConnection, "#10");
  354. Assert.IsFalse (request.IsWebSocketRequest, "#11");
  355. Assert.IsTrue (request.KeepAlive, "#12");
  356. Assert.AreEqual (HttpVersion.Version11, request.ProtocolVersion, "#13");
  357. Assert.IsNull (request.ServiceName, "#14");
  358. Assert.IsNull (request.UrlReferrer, "#15");
  359. Assert.IsNull (request.UserAgent, "#16");
  360. Assert.IsNull (request.UserLanguages, "#17");
  361. failed = false;
  362. } catch {
  363. failed = true;
  364. }
  365. });
  366. try {
  367. var client = new HttpClient ();
  368. var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
  369. var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
  370. Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
  371. Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
  372. Assert.AreEqual (false, failed, "#102");
  373. } finally {
  374. listener.Close ();
  375. }
  376. }
  377. [Test]
  378. #if FEATURE_NO_BSD_SOCKETS
  379. [ExpectedException (typeof (PlatformNotSupportedException))]
  380. #endif
  381. public void Send_Complete_Version_1_0 ()
  382. {
  383. bool? failed = null;
  384. var listener = CreateListener (l => {
  385. try {
  386. var request = l.Request;
  387. Assert.IsNull (request.AcceptTypes, "#1");
  388. Assert.AreEqual (0, request.ContentLength64, "#2");
  389. Assert.IsNull (request.ContentType, "#3");
  390. Assert.AreEqual (0, request.Cookies.Count, "#4");
  391. Assert.IsFalse (request.HasEntityBody, "#5");
  392. Assert.AreEqual (1, request.Headers.Count, "#6");
  393. Assert.AreEqual (TestHost, request.Headers["Host"], "#6a");
  394. Assert.AreEqual ("GET", request.HttpMethod, "#7");
  395. Assert.IsFalse (request.IsAuthenticated, "#8");
  396. Assert.IsTrue (request.IsLocal, "#9");
  397. Assert.IsFalse (request.IsSecureConnection, "#10");
  398. Assert.IsFalse (request.IsWebSocketRequest, "#11");
  399. Assert.IsFalse (request.KeepAlive, "#12");
  400. Assert.AreEqual (HttpVersion.Version10, request.ProtocolVersion, "#13");
  401. Assert.IsNull (request.ServiceName, "#14");
  402. Assert.IsNull (request.UrlReferrer, "#15");
  403. Assert.IsNull (request.UserAgent, "#16");
  404. Assert.IsNull (request.UserLanguages, "#17");
  405. failed = false;
  406. } catch {
  407. failed = true;
  408. }
  409. });
  410. try {
  411. var client = new HttpClient ();
  412. var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
  413. request.Version = HttpVersion.Version10;
  414. var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
  415. Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
  416. Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
  417. Assert.AreEqual (false, failed, "#102");
  418. } finally {
  419. listener.Close ();
  420. }
  421. }
  422. [Test]
  423. #if FEATURE_NO_BSD_SOCKETS
  424. [ExpectedException (typeof (PlatformNotSupportedException))]
  425. #endif
  426. public void Send_Complete_ClientHandlerSettings ()
  427. {
  428. bool? failed = null;
  429. var listener = CreateListener (l => {
  430. var request = l.Request;
  431. try {
  432. Assert.IsNull (request.AcceptTypes, "#1");
  433. Assert.AreEqual (0, request.ContentLength64, "#2");
  434. Assert.IsNull (request.ContentType, "#3");
  435. Assert.AreEqual (1, request.Cookies.Count, "#4");
  436. Assert.AreEqual (new Cookie ("mycookie", "vv"), request.Cookies[0], "#4a");
  437. Assert.IsFalse (request.HasEntityBody, "#5");
  438. Assert.AreEqual (4, request.Headers.Count, "#6");
  439. Assert.AreEqual (TestHost, request.Headers["Host"], "#6a");
  440. Assert.AreEqual ("gzip", request.Headers["Accept-Encoding"], "#6b");
  441. Assert.AreEqual ("mycookie=vv", request.Headers["Cookie"], "#6c");
  442. Assert.AreEqual ("GET", request.HttpMethod, "#7");
  443. Assert.IsFalse (request.IsAuthenticated, "#8");
  444. Assert.IsTrue (request.IsLocal, "#9");
  445. Assert.IsFalse (request.IsSecureConnection, "#10");
  446. Assert.IsFalse (request.IsWebSocketRequest, "#11");
  447. Assert.IsTrue (request.KeepAlive, "#12");
  448. Assert.AreEqual (HttpVersion.Version10, request.ProtocolVersion, "#13");
  449. Assert.IsNull (request.ServiceName, "#14");
  450. Assert.IsNull (request.UrlReferrer, "#15");
  451. Assert.IsNull (request.UserAgent, "#16");
  452. Assert.IsNull (request.UserLanguages, "#17");
  453. failed = false;
  454. } catch {
  455. failed = true;
  456. }
  457. });
  458. try {
  459. var chandler = new HttpClientHandler ();
  460. chandler.AllowAutoRedirect = true;
  461. chandler.AutomaticDecompression = DecompressionMethods.GZip;
  462. chandler.MaxAutomaticRedirections = 33;
  463. chandler.MaxRequestContentBufferSize = 5555;
  464. chandler.PreAuthenticate = true;
  465. chandler.CookieContainer.Add (new Uri (LocalServer), new Cookie ( "mycookie", "vv"));
  466. chandler.UseCookies = true;
  467. chandler.UseDefaultCredentials = true;
  468. chandler.Proxy = new WebProxy ("ee");
  469. chandler.UseProxy = true;
  470. var client = new HttpClient (chandler);
  471. var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
  472. request.Version = HttpVersion.Version10;
  473. request.Headers.Add ("Keep-Alive", "false");
  474. var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
  475. Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
  476. Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
  477. Assert.AreEqual (false, failed, "#102");
  478. } finally {
  479. listener.Abort ();
  480. listener.Close ();
  481. }
  482. }
  483. [Test]
  484. #if FEATURE_NO_BSD_SOCKETS
  485. [ExpectedException (typeof (PlatformNotSupportedException))]
  486. #endif
  487. public void Send_Complete_CustomHeaders ()
  488. {
  489. bool? failed = null;
  490. var listener = CreateListener (l => {
  491. var request = l.Request;
  492. try {
  493. Assert.AreEqual ("vv", request.Headers["aa"], "#1");
  494. var response = l.Response;
  495. response.Headers.Add ("rsp", "rrr");
  496. response.Headers.Add ("upgrade", "vvvvaa");
  497. response.Headers.Add ("Date", "aa");
  498. response.Headers.Add ("cache-control", "audio");
  499. response.StatusDescription = "test description";
  500. response.ProtocolVersion = HttpVersion.Version10;
  501. response.SendChunked = true;
  502. response.RedirectLocation = "w3.org";
  503. failed = false;
  504. } catch {
  505. failed = true;
  506. }
  507. });
  508. try {
  509. var client = new HttpClient ();
  510. var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
  511. Assert.IsTrue (request.Headers.TryAddWithoutValidation ("aa", "vv"), "#0");
  512. var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
  513. Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
  514. Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
  515. IEnumerable<string> values;
  516. Assert.IsTrue (response.Headers.TryGetValues ("rsp", out values), "#102");
  517. Assert.AreEqual ("rrr", values.First (), "#102a");
  518. Assert.IsTrue (response.Headers.TryGetValues ("Transfer-Encoding", out values), "#103");
  519. Assert.AreEqual ("chunked", values.First (), "#103a");
  520. Assert.AreEqual (true, response.Headers.TransferEncodingChunked, "#103b");
  521. Assert.IsTrue (response.Headers.TryGetValues ("Date", out values), "#104");
  522. Assert.AreEqual (1, values.Count (), "#104b");
  523. // .NET overwrites Date, Mono does not
  524. // Assert.IsNotNull (response.Headers.Date, "#104c");
  525. Assert.AreEqual (new ProductHeaderValue ("vvvvaa"), response.Headers.Upgrade.First (), "#105");
  526. Assert.AreEqual ("audio", response.Headers.CacheControl.Extensions.First ().Name, "#106");
  527. Assert.AreEqual ("w3.org", response.Headers.Location.OriginalString, "#107");
  528. Assert.AreEqual ("test description", response.ReasonPhrase, "#110");
  529. Assert.AreEqual (HttpVersion.Version11, response.Version, "#111");
  530. Assert.AreEqual (false, failed, "#112");
  531. } finally {
  532. listener.Close ();
  533. }
  534. }
  535. [Test]
  536. #if FEATURE_NO_BSD_SOCKETS
  537. [ExpectedException (typeof (PlatformNotSupportedException))]
  538. #endif
  539. public void Send_Complete_CustomHeaders_SpecialSeparators ()
  540. {
  541. bool? failed = null;
  542. var listener = CreateListener (l => {
  543. var request = l.Request;
  544. try {
  545. Assert.AreEqual ("MLK Android Phone 1.1.9", request.UserAgent, "#1");
  546. failed = false;
  547. } catch {
  548. failed = true;
  549. }
  550. });
  551. try {
  552. var client = new HttpClient ();
  553. client.DefaultRequestHeaders.Add("User-Agent", "MLK Android Phone 1.1.9");
  554. var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
  555. var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
  556. Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
  557. Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
  558. Assert.AreEqual (false, failed, "#102");
  559. } finally {
  560. listener.Abort ();
  561. listener.Close ();
  562. }
  563. }
  564. [Test]
  565. #if FEATURE_NO_BSD_SOCKETS
  566. [ExpectedException (typeof (PlatformNotSupportedException))]
  567. #endif
  568. public void Send_Complete_CustomHeaders_Host ()
  569. {
  570. bool? failed = null;
  571. var listener = CreateListener (l => {
  572. var request = l.Request;
  573. try {
  574. Assert.AreEqual ("customhost", request.Headers["Host"], "#1");
  575. failed = false;
  576. } catch {
  577. failed = true;
  578. }
  579. });
  580. try {
  581. var client = new HttpClient ();
  582. client.DefaultRequestHeaders.Add("Host", "customhost");
  583. var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
  584. var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
  585. Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
  586. Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
  587. Assert.AreEqual (false, failed, "#102");
  588. } finally {
  589. listener.Abort ();
  590. listener.Close ();
  591. }
  592. }
  593. [Test]
  594. #if FEATURE_NO_BSD_SOCKETS
  595. [ExpectedException (typeof (PlatformNotSupportedException))]
  596. #endif
  597. public void Send_Transfer_Encoding_Chunked ()
  598. {
  599. bool? failed = null;
  600. var listener = CreateListener (l => {
  601. var request = l.Request;
  602. try {
  603. Assert.AreEqual (1, request.Headers.Count, "#1");
  604. failed = false;
  605. } catch {
  606. failed = true;
  607. }
  608. });
  609. try {
  610. var client = new HttpClient ();
  611. client.DefaultRequestHeaders.TransferEncodingChunked = true;
  612. client.GetAsync (LocalServer).Wait ();
  613. Assert.AreEqual (false, failed, "#102");
  614. } finally {
  615. listener.Abort ();
  616. listener.Close ();
  617. }
  618. }
  619. [Test]
  620. #if FEATURE_NO_BSD_SOCKETS
  621. [ExpectedException (typeof (PlatformNotSupportedException))]
  622. #endif
  623. public void Send_Transfer_Encoding_Custom ()
  624. {
  625. bool? failed = null;
  626. var listener = CreateListener (l => {
  627. failed = true;
  628. });
  629. try {
  630. var client = new HttpClient ();
  631. client.DefaultRequestHeaders.TransferEncoding.Add (new TransferCodingHeaderValue ("chunked2"));
  632. var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
  633. try {
  634. client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Wait ();
  635. Assert.Fail ("#1");
  636. } catch (AggregateException e) {
  637. Assert.AreEqual (typeof (ProtocolViolationException), e.InnerException.GetType (), "#2");
  638. }
  639. Assert.IsNull (failed, "#102");
  640. } finally {
  641. listener.Abort ();
  642. listener.Close ();
  643. }
  644. }
  645. [Test]
  646. #if FEATURE_NO_BSD_SOCKETS
  647. [ExpectedException (typeof (PlatformNotSupportedException))]
  648. #endif
  649. public void Send_Complete_Content ()
  650. {
  651. var listener = CreateListener (l => {
  652. var request = l.Request;
  653. l.Response.OutputStream.WriteByte (55);
  654. l.Response.OutputStream.WriteByte (75);
  655. });
  656. try {
  657. var client = new HttpClient ();
  658. var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
  659. Assert.IsTrue (request.Headers.TryAddWithoutValidation ("aa", "vv"), "#0");
  660. var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
  661. Assert.AreEqual ("7K", response.Content.ReadAsStringAsync ().Result, "#100");
  662. Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
  663. IEnumerable<string> values;
  664. Assert.IsTrue (response.Headers.TryGetValues ("Transfer-Encoding", out values), "#102");
  665. Assert.AreEqual ("chunked", values.First (), "#102a");
  666. Assert.AreEqual (true, response.Headers.TransferEncodingChunked, "#102b");
  667. } finally {
  668. listener.Close ();
  669. }
  670. }
  671. [Test]
  672. #if FEATURE_NO_BSD_SOCKETS
  673. [ExpectedException (typeof (PlatformNotSupportedException))]
  674. #endif
  675. public void Send_Complete_Content_MaxResponseContentBufferSize ()
  676. {
  677. var listener = CreateListener (l => {
  678. var request = l.Request;
  679. var b = new byte[4000];
  680. l.Response.OutputStream.Write (b, 0, b.Length);
  681. });
  682. try {
  683. var client = new HttpClient ();
  684. client.MaxResponseContentBufferSize = 1000;
  685. var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
  686. var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
  687. Assert.AreEqual (4000, response.Content.ReadAsStringAsync ().Result.Length, "#100");
  688. Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
  689. } finally {
  690. listener.Close ();
  691. }
  692. }
  693. [Test]
  694. #if FEATURE_NO_BSD_SOCKETS
  695. [ExpectedException (typeof (PlatformNotSupportedException))]
  696. #endif
  697. public void Send_Complete_Content_MaxResponseContentBufferSize_Error ()
  698. {
  699. var listener = CreateListener (l => {
  700. var request = l.Request;
  701. var b = new byte[4000];
  702. l.Response.OutputStream.Write (b, 0, b.Length);
  703. });
  704. try {
  705. var client = new HttpClient ();
  706. client.MaxResponseContentBufferSize = 1000;
  707. var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
  708. try {
  709. client.SendAsync (request, HttpCompletionOption.ResponseContentRead).Wait (WaitTimeout);
  710. Assert.Fail ("#2");
  711. } catch (AggregateException e) {
  712. Assert.IsTrue (e.InnerException is HttpRequestException, "#3");
  713. }
  714. } finally {
  715. listener.Close ();
  716. }
  717. }
  718. [Test]
  719. #if FEATURE_NO_BSD_SOCKETS
  720. [ExpectedException (typeof (PlatformNotSupportedException))]
  721. #endif
  722. public void Send_Complete_NoContent ()
  723. {
  724. foreach (var method in new HttpMethod[] { HttpMethod.Post, HttpMethod.Put, HttpMethod.Delete }) {
  725. bool? failed = null;
  726. var listener = CreateListener (l => {
  727. try {
  728. var request = l.Request;
  729. Assert.AreEqual (2, request.Headers.Count, "#1");
  730. Assert.AreEqual ("0", request.Headers ["Content-Length"], "#1b");
  731. Assert.AreEqual (method.Method, request.HttpMethod, "#2");
  732. failed = false;
  733. } catch {
  734. failed = true;
  735. }
  736. });
  737. try {
  738. var client = new HttpClient ();
  739. var request = new HttpRequestMessage (method, LocalServer);
  740. var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
  741. Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
  742. Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
  743. Assert.AreEqual (false, failed, "#102");
  744. } finally {
  745. listener.Close ();
  746. }
  747. }
  748. }
  749. [Test]
  750. #if FEATURE_NO_BSD_SOCKETS
  751. [ExpectedException (typeof (PlatformNotSupportedException))]
  752. #endif
  753. public void Send_Complete_Error ()
  754. {
  755. var listener = CreateListener (l => {
  756. var response = l.Response;
  757. response.StatusCode = 500;
  758. });
  759. try {
  760. var client = new HttpClient ();
  761. var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
  762. var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
  763. Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
  764. Assert.AreEqual (HttpStatusCode.InternalServerError, response.StatusCode, "#101");
  765. } finally {
  766. listener.Close ();
  767. }
  768. }
  769. [Test]
  770. #if FEATURE_NO_BSD_SOCKETS
  771. [ExpectedException (typeof (PlatformNotSupportedException))]
  772. #endif
  773. public void Send_Content_Get ()
  774. {
  775. var listener = CreateListener (l => {
  776. var request = l.Request;
  777. l.Response.OutputStream.WriteByte (72);
  778. });
  779. try {
  780. var client = new HttpClient ();
  781. var r = new HttpRequestMessage (HttpMethod.Get, LocalServer);
  782. var response = client.SendAsync (r).Result;
  783. Assert.AreEqual ("H", response.Content.ReadAsStringAsync ().Result);
  784. } finally {
  785. listener.Close ();
  786. }
  787. }
  788. [Test]
  789. #if FEATURE_NO_BSD_SOCKETS
  790. [ExpectedException (typeof (PlatformNotSupportedException))]
  791. #endif
  792. public void Send_Content_BomEncoding ()
  793. {
  794. var listener = CreateListener (l => {
  795. var request = l.Request;
  796. var str = l.Response.OutputStream;
  797. str.WriteByte (0xEF);
  798. str.WriteByte (0xBB);
  799. str.WriteByte (0xBF);
  800. str.WriteByte (71);
  801. });
  802. try {
  803. var client = new HttpClient ();
  804. var r = new HttpRequestMessage (HttpMethod.Get, LocalServer);
  805. var response = client.SendAsync (r).Result;
  806. Assert.AreEqual ("G", response.Content.ReadAsStringAsync ().Result);
  807. } finally {
  808. listener.Close ();
  809. }
  810. }
  811. [Test]
  812. #if FEATURE_NO_BSD_SOCKETS
  813. [ExpectedException (typeof (PlatformNotSupportedException))]
  814. #endif
  815. public void Send_Content_Put ()
  816. {
  817. bool passed = false;
  818. var listener = CreateListener (l => {
  819. var request = l.Request;
  820. passed = 7 == request.ContentLength64;
  821. passed &= request.ContentType == "text/plain; charset=utf-8";
  822. passed &= request.InputStream.ReadByte () == 'm';
  823. });
  824. try {
  825. var client = new HttpClient ();
  826. var r = new HttpRequestMessage (HttpMethod.Put, LocalServer);
  827. r.Content = new StringContent ("my text");
  828. var response = client.SendAsync (r).Result;
  829. Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#1");
  830. Assert.IsTrue (passed, "#2");
  831. } finally {
  832. listener.Abort ();
  833. listener.Close ();
  834. }
  835. }
  836. [Test]
  837. #if FEATURE_NO_BSD_SOCKETS
  838. [ExpectedException (typeof (PlatformNotSupportedException))]
  839. #endif
  840. public void Send_Content_Put_CustomStream ()
  841. {
  842. bool passed = false;
  843. var listener = CreateListener (l => {
  844. var request = l.Request;
  845. passed = 44 == request.ContentLength64;
  846. passed &= request.ContentType == null;
  847. });
  848. try {
  849. var client = new HttpClient ();
  850. var r = new HttpRequestMessage (HttpMethod.Put, LocalServer);
  851. r.Content = new StreamContent (new CustomStream ());
  852. var response = client.SendAsync (r).Result;
  853. Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#1");
  854. Assert.IsTrue (passed, "#2");
  855. } finally {
  856. listener.Abort ();
  857. listener.Close ();
  858. }
  859. }
  860. [Test]
  861. public void Send_Timeout ()
  862. {
  863. var mh = new HttpMessageHandlerMock ();
  864. var client = new HttpClient (mh);
  865. client.Timeout = TimeSpan.FromMilliseconds (100);
  866. var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
  867. var response = new HttpResponseMessage ();
  868. mh.OnSendFull = (l, c) => {
  869. Assert.IsTrue (c.WaitHandle.WaitOne (500), "#2");
  870. return Task.FromResult (response);
  871. };
  872. Assert.AreEqual (response, client.SendAsync (request).Result, "#1");
  873. }
  874. [Test]
  875. public void Send_Invalid ()
  876. {
  877. var client = new HttpClient ();
  878. try {
  879. client.SendAsync (null).Wait (WaitTimeout);
  880. Assert.Fail ("#1");
  881. } catch (ArgumentNullException) {
  882. }
  883. try {
  884. var request = new HttpRequestMessage ();
  885. client.SendAsync (request).Wait (WaitTimeout);
  886. Assert.Fail ("#2");
  887. } catch (InvalidOperationException) {
  888. }
  889. }
  890. [Test]
  891. public void Send_InvalidHandler ()
  892. {
  893. var mh = new HttpMessageHandlerMock ();
  894. var client = new HttpClient (mh);
  895. client.BaseAddress = new Uri ("http://xamarin.com");
  896. var request = new HttpRequestMessage ();
  897. mh.OnSend = l => {
  898. Assert.AreEqual (l, request, "#1");
  899. return null;
  900. };
  901. try {
  902. // Broken by design
  903. client.SendAsync (request).Wait (WaitTimeout);
  904. Assert.Fail ("#2");
  905. } catch (Exception) {
  906. }
  907. }
  908. [Test]
  909. public void Send_SameMessage ()
  910. {
  911. var mh = new HttpMessageHandlerMock ();
  912. var client = new HttpClient (mh);
  913. var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
  914. mh.OnSend = l => Task.FromResult (new HttpResponseMessage ());
  915. client.SendAsync (request).Wait (WaitTimeout);
  916. try {
  917. client.SendAsync (request).Wait (WaitTimeout);
  918. Assert.Fail ("#1");
  919. } catch (InvalidOperationException) {
  920. }
  921. }
  922. [Test]
  923. [Category ("MobileNotWorking")] // Missing encoding
  924. #if FEATURE_NO_BSD_SOCKETS
  925. [ExpectedException (typeof (PlatformNotSupportedException))]
  926. #endif
  927. public void GetString_Many ()
  928. {
  929. Action<HttpListenerContext> context = (HttpListenerContext l) => {
  930. var response = l.Response;
  931. response.StatusCode = 200;
  932. response.OutputStream.WriteByte (0x68);
  933. response.OutputStream.WriteByte (0x65);
  934. response.OutputStream.WriteByte (0x6c);
  935. response.OutputStream.WriteByte (0x6c);
  936. response.OutputStream.WriteByte (0x6f);
  937. };
  938. var listener = CreateListener (context); // creates a default request handler
  939. AddListenerContext (listener, context); // add another request handler for the second request
  940. try {
  941. var client = new HttpClient ();
  942. var t1 = client.GetStringAsync (LocalServer);
  943. var t2 = client.GetStringAsync (LocalServer);
  944. Assert.IsTrue (Task.WaitAll (new [] { t1, t2 }, WaitTimeout));
  945. Assert.AreEqual ("hello", t1.Result, "#1");
  946. Assert.AreEqual ("hello", t2.Result, "#2");
  947. } finally {
  948. listener.Abort ();
  949. listener.Close ();
  950. }
  951. }
  952. [Test]
  953. #if FEATURE_NO_BSD_SOCKETS
  954. [ExpectedException (typeof (PlatformNotSupportedException))]
  955. #endif
  956. public void GetByteArray_ServerError ()
  957. {
  958. var listener = CreateListener (l => {
  959. var response = l.Response;
  960. response.StatusCode = 500;
  961. l.Response.OutputStream.WriteByte (72);
  962. });
  963. try {
  964. var client = new HttpClient ();
  965. try {
  966. client.GetByteArrayAsync (LocalServer).Wait (WaitTimeout);
  967. Assert.Fail ("#1");
  968. } catch (AggregateException e) {
  969. Assert.IsTrue (e.InnerException is HttpRequestException , "#2");
  970. }
  971. } finally {
  972. listener.Close ();
  973. }
  974. }
  975. [Test]
  976. #if FEATURE_NO_BSD_SOCKETS
  977. [ExpectedException (typeof (PlatformNotSupportedException))]
  978. #endif
  979. public void DisallowAutoRedirect ()
  980. {
  981. var listener = CreateListener (l => {
  982. var request = l.Request;
  983. var response = l.Response;
  984. response.StatusCode = (int)HttpStatusCode.Moved;
  985. response.RedirectLocation = "http://xamarin.com/";
  986. });
  987. try {
  988. var chandler = new HttpClientHandler ();
  989. chandler.AllowAutoRedirect = false;
  990. var client = new HttpClient (chandler);
  991. try {
  992. client.GetStringAsync (LocalServer).Wait (WaitTimeout);
  993. Assert.Fail ("#1");
  994. } catch (AggregateException e) {
  995. Assert.IsTrue (e.InnerException is HttpRequestException, "#2");
  996. }
  997. } finally {
  998. listener.Abort ();
  999. listener.Close ();
  1000. }
  1001. }
  1002. [Test]
  1003. #if FEATURE_NO_BSD_SOCKETS
  1004. [ExpectedException (typeof (PlatformNotSupportedException))]
  1005. #endif
  1006. public void RequestUriAfterRedirect ()
  1007. {
  1008. var listener = CreateListener (l => {
  1009. var request = l.Request;
  1010. var response = l.Response;
  1011. response.StatusCode = (int)HttpStatusCode.Moved;
  1012. response.RedirectLocation = "http://localhost:8811/";
  1013. });
  1014. var listener2 = CreateListener (l => {
  1015. var response = l.Response;
  1016. response.StatusCode = (int)HttpStatusCode.OK;
  1017. response.OutputStream.WriteByte (0x68);
  1018. response.OutputStream.WriteByte (0x65);
  1019. response.OutputStream.WriteByte (0x6c);
  1020. response.OutputStream.WriteByte (0x6c);
  1021. response.OutputStream.WriteByte (0x6f);
  1022. }, 8811);
  1023. try {
  1024. var chandler = new HttpClientHandler ();
  1025. chandler.AllowAutoRedirect = true;
  1026. var client = new HttpClient (chandler);
  1027. var r = client.GetAsync (LocalServer);
  1028. Assert.IsTrue (r.Wait (WaitTimeout), "#1");
  1029. var resp = r.Result;
  1030. Assert.AreEqual ("http://localhost:8811/", resp.RequestMessage.RequestUri.AbsoluteUri, "#2");
  1031. Assert.AreEqual ("hello", resp.Content.ReadAsStringAsync ().Result, "#3");
  1032. } finally {
  1033. listener.Abort ();
  1034. listener.Close ();
  1035. listener2.Abort ();
  1036. listener2.Close ();
  1037. }
  1038. }
  1039. [Test]
  1040. #if FEATURE_NO_BSD_SOCKETS
  1041. [ExpectedException (typeof (PlatformNotSupportedException))]
  1042. #endif
  1043. /*
  1044. * Properties may only be modified before sending the first request.
  1045. */
  1046. public void ModifyHandlerAfterFirstRequest ()
  1047. {
  1048. var chandler = new HttpClientHandler ();
  1049. chandler.AllowAutoRedirect = true;
  1050. var client = new HttpClient (chandler, true);
  1051. var listener = CreateListener (l => {
  1052. var response = l.Response;
  1053. response.StatusCode = 200;
  1054. response.OutputStream.WriteByte (55);
  1055. });
  1056. try {
  1057. client.GetStringAsync (LocalServer).Wait (WaitTimeout);
  1058. try {
  1059. chandler.AllowAutoRedirect = false;
  1060. Assert.Fail ("#1");
  1061. } catch (InvalidOperationException) {
  1062. ;
  1063. }
  1064. } finally {
  1065. listener.Abort ();
  1066. listener.Close ();
  1067. }
  1068. }
  1069. [Test]
  1070. #if FEATURE_NO_BSD_SOCKETS
  1071. // Using HttpClientHandler, which indirectly requires BSD sockets.
  1072. [ExpectedException (typeof (PlatformNotSupportedException))]
  1073. #endif
  1074. /*
  1075. * However, this policy is not enforced for custom handlers and there
  1076. * is also no way a derived class could tell its HttpClientHandler parent
  1077. * that it just sent a request.
  1078. *
  1079. */
  1080. public void ModifyHandlerAfterFirstRequest_Mock ()
  1081. {
  1082. var ch = new HttpClientHandlerMock ();
  1083. ch.AllowAutoRedirect = true;
  1084. var client = new HttpClient (ch);
  1085. ch.OnSend = (l) => {
  1086. return Task.FromResult (new HttpResponseMessage ());
  1087. };
  1088. client.GetAsync ("http://xamarin.com").Wait (WaitTimeout);
  1089. ch.AllowAutoRedirect = false;
  1090. }
  1091. HttpListener CreateListener (Action<HttpListenerContext> contextAssert)
  1092. {
  1093. return CreateListener (contextAssert, port);
  1094. }
  1095. HttpListener CreateListener (Action<HttpListenerContext> contextAssert, int port)
  1096. {
  1097. var l = new HttpListener ();
  1098. l.Prefixes.Add (string.Format ("http://+:{0}/", port));
  1099. l.Start ();
  1100. AddListenerContext(l, contextAssert);
  1101. return l;
  1102. }
  1103. HttpListener AddListenerContext (HttpListener l, Action<HttpListenerContext> contextAssert)
  1104. {
  1105. l.BeginGetContext (ar => {
  1106. var ctx = l.EndGetContext (ar);
  1107. try {
  1108. if (contextAssert != null)
  1109. contextAssert (ctx);
  1110. } finally {
  1111. ctx.Response.Close ();
  1112. }
  1113. }, null);
  1114. return l;
  1115. }
  1116. }
  1117. }