5 // Marek Safar <marek.safar@gmail.com>
7 // Copyright (C) 2011 Xamarin Inc (http://www.xamarin.com)
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:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
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.
30 using System.Collections;
31 using System.Collections.Generic;
32 using NUnit.Framework;
33 using System.Net.Http;
34 using System.Net.Http.Headers;
35 using System.Threading;
36 using System.Threading.Tasks;
41 namespace MonoTests.System.Net.Http
44 public class HttpClientTest
46 class HttpMessageHandlerMock : HttpMessageHandler
48 public Func<HttpRequestMessage, Task<HttpResponseMessage>> OnSend;
49 public Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> OnSendFull;
51 public HttpMessageHandlerMock ()
55 protected override Task<HttpResponseMessage> SendAsync (HttpRequestMessage request, CancellationToken cancellationToken)
58 return OnSend (request);
60 if (OnSendFull != null)
61 return OnSendFull (request, cancellationToken);
68 class HttpClientHandlerMock : HttpClientHandler
70 public Func<HttpRequestMessage, Task<HttpResponseMessage>> OnSend;
71 public Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> OnSendFull;
73 protected override Task<HttpResponseMessage> SendAsync (HttpRequestMessage request, CancellationToken cancellationToken)
76 return OnSend (request);
78 if (OnSendFull != null)
79 return OnSendFull (request, cancellationToken);
86 const int WaitTimeout = 5000;
88 string port, TestHost, LocalServer;
91 public void SetupFixture ()
93 if (Environment.OSVersion.Platform == PlatformID.Win32NT) {
99 TestHost = "localhost:" + port;
100 LocalServer = string.Format ("http://{0}/", TestHost);
104 public void Ctor_Default ()
106 var client = new HttpClient ();
107 Assert.IsNull (client.BaseAddress, "#1");
108 Assert.IsNotNull (client.DefaultRequestHeaders, "#2"); // TODO: full check
109 Assert.AreEqual (int.MaxValue, client.MaxResponseContentBufferSize, "#3");
110 Assert.AreEqual (TimeSpan.FromSeconds (100), client.Timeout, "#4");
114 public void CancelPendingRequests ()
116 var mh = new HttpMessageHandlerMock ();
118 var client = new HttpClient (mh);
119 var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
120 var mre = new ManualResetEvent (false);
122 mh.OnSendFull = (l, c) => {
124 Assert.IsTrue (c.WaitHandle.WaitOne (1000), "#20");
125 Assert.IsTrue (c.IsCancellationRequested, "#21");
127 return Task.FromResult (new HttpResponseMessage ());
130 var t = Task.Factory.StartNew (() => {
131 client.SendAsync (request).Wait (WaitTimeout);
134 Assert.IsTrue (mre.WaitOne (500), "#1");
136 client.CancelPendingRequests ();
137 Assert.IsTrue (t.Wait (500), "#2");
139 request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
140 mh.OnSendFull = (l, c) => {
141 Assert.IsFalse (c.IsCancellationRequested, "#30");
142 return Task.FromResult (new HttpResponseMessage ());
145 client.SendAsync (request).Wait (WaitTimeout);
149 public void CancelPendingRequests_BeforeSend ()
151 var ct = new CancellationTokenSource ();
153 var rr = CancellationTokenSource.CreateLinkedTokenSource (new CancellationToken (), ct.Token);
156 var mh = new HttpMessageHandlerMock ();
158 var client = new HttpClient (mh);
159 var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
160 client.CancelPendingRequests ();
162 mh.OnSendFull = (l, c) => {
163 Assert.IsFalse (c.IsCancellationRequested, "#30");
164 return Task.FromResult (new HttpResponseMessage ());
167 client.SendAsync (request).Wait (WaitTimeout);
169 request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
170 client.SendAsync (request).Wait (WaitTimeout);
175 public void CancelRequestViaProxy ()
177 var handler = new HttpClientHandler {
178 Proxy = new WebProxy ("192.168.10.25:8888/"), // proxy that doesn't exist
180 AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
183 var httpClient = new HttpClient (handler) {
184 BaseAddress = new Uri ("https://google.com"),
185 Timeout = TimeSpan.FromSeconds (1)
189 var restRequest = new HttpRequestMessage {
190 Method = HttpMethod.Post,
191 RequestUri = new Uri("foo", UriKind.Relative),
192 Content = new StringContent("", null, "application/json")
195 httpClient.PostAsync (restRequest.RequestUri, restRequest.Content).Wait (WaitTimeout);
197 } catch (AggregateException e) {
198 Assert.IsTrue (e.InnerException is TaskCanceledException, "#2");
203 public void Properties ()
205 var client = new HttpClient ();
206 client.BaseAddress = null;
207 client.MaxResponseContentBufferSize = int.MaxValue;
208 client.Timeout = Timeout.InfiniteTimeSpan;
210 Assert.IsNull (client.BaseAddress, "#1");
211 Assert.AreEqual (int.MaxValue, client.MaxResponseContentBufferSize, "#2");
212 Assert.AreEqual (Timeout.InfiniteTimeSpan, client.Timeout, "#3");
216 public void Properties_Invalid ()
218 var client = new HttpClient ();
220 client.MaxResponseContentBufferSize = 0;
222 } catch (ArgumentOutOfRangeException) {
226 client.Timeout = TimeSpan.MinValue;
228 } catch (ArgumentOutOfRangeException) {
235 var mh = new HttpMessageHandlerMock ();
237 var client = new HttpClient (mh);
238 client.BaseAddress = new Uri ("http://xamarin.com");
239 var request = new HttpRequestMessage ();
240 var response = new HttpResponseMessage ();
243 Assert.AreEqual (l, request, "#2");
244 Assert.AreEqual (client.BaseAddress, l.RequestUri, "#2");
245 return Task.FromResult (response);
248 Assert.AreEqual (response, client.SendAsync (request).Result, "#1");
252 public void Send_DefaultRequestHeaders ()
254 var mh = new HttpMessageHandlerMock ();
256 var client = new HttpClient (mh);
257 client.DefaultRequestHeaders.Referrer = new Uri ("http://google.com");
259 var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
260 var response = new HttpResponseMessage ();
263 Assert.AreEqual (client.DefaultRequestHeaders.Referrer, l.Headers.Referrer, "#2");
264 Assert.IsNotNull (l.Headers.Referrer, "#3");
265 return Task.FromResult (response);
268 Assert.AreEqual (response, client.SendAsync (request).Result, "#1");
272 public void Send_Complete_Default ()
275 var listener = CreateListener (l => {
277 var request = l.Request;
279 Assert.IsNull (request.AcceptTypes, "#1");
280 Assert.AreEqual (0, request.ContentLength64, "#2");
281 Assert.IsNull (request.ContentType, "#3");
282 Assert.AreEqual (0, request.Cookies.Count, "#4");
283 Assert.IsFalse (request.HasEntityBody, "#5");
284 Assert.AreEqual (TestHost, request.Headers["Host"], "#6b");
285 Assert.AreEqual ("GET", request.HttpMethod, "#7");
286 Assert.IsFalse (request.IsAuthenticated, "#8");
287 Assert.IsTrue (request.IsLocal, "#9");
288 Assert.IsFalse (request.IsSecureConnection, "#10");
289 Assert.IsFalse (request.IsWebSocketRequest, "#11");
290 Assert.IsTrue (request.KeepAlive, "#12");
291 Assert.AreEqual (HttpVersion.Version11, request.ProtocolVersion, "#13");
292 Assert.IsNull (request.ServiceName, "#14");
293 Assert.IsNull (request.UrlReferrer, "#15");
294 Assert.IsNull (request.UserAgent, "#16");
295 Assert.IsNull (request.UserLanguages, "#17");
303 var client = new HttpClient ();
304 var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
305 var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
307 Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
308 Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
309 Assert.AreEqual (false, failed, "#102");
316 public void Send_Complete_Version_1_0 ()
320 var listener = CreateListener (l => {
322 var request = l.Request;
324 Assert.IsNull (request.AcceptTypes, "#1");
325 Assert.AreEqual (0, request.ContentLength64, "#2");
326 Assert.IsNull (request.ContentType, "#3");
327 Assert.AreEqual (0, request.Cookies.Count, "#4");
328 Assert.IsFalse (request.HasEntityBody, "#5");
329 Assert.AreEqual (1, request.Headers.Count, "#6");
330 Assert.AreEqual (TestHost, request.Headers["Host"], "#6a");
331 Assert.AreEqual ("GET", request.HttpMethod, "#7");
332 Assert.IsFalse (request.IsAuthenticated, "#8");
333 Assert.IsTrue (request.IsLocal, "#9");
334 Assert.IsFalse (request.IsSecureConnection, "#10");
335 Assert.IsFalse (request.IsWebSocketRequest, "#11");
336 Assert.IsFalse (request.KeepAlive, "#12");
337 Assert.AreEqual (HttpVersion.Version10, request.ProtocolVersion, "#13");
338 Assert.IsNull (request.ServiceName, "#14");
339 Assert.IsNull (request.UrlReferrer, "#15");
340 Assert.IsNull (request.UserAgent, "#16");
341 Assert.IsNull (request.UserLanguages, "#17");
349 var client = new HttpClient ();
350 var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
351 request.Version = HttpVersion.Version10;
352 var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
354 Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
355 Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
356 Assert.AreEqual (false, failed, "#102");
363 public void Send_Complete_ClientHandlerSettings ()
367 var listener = CreateListener (l => {
368 var request = l.Request;
371 Assert.IsNull (request.AcceptTypes, "#1");
372 Assert.AreEqual (0, request.ContentLength64, "#2");
373 Assert.IsNull (request.ContentType, "#3");
374 Assert.AreEqual (1, request.Cookies.Count, "#4");
375 Assert.AreEqual (new Cookie ("mycookie", "vv"), request.Cookies[0], "#4a");
376 Assert.IsFalse (request.HasEntityBody, "#5");
377 Assert.AreEqual (4, request.Headers.Count, "#6");
378 Assert.AreEqual (TestHost, request.Headers["Host"], "#6a");
379 Assert.AreEqual ("gzip", request.Headers["Accept-Encoding"], "#6b");
380 Assert.AreEqual ("mycookie=vv", request.Headers["Cookie"], "#6c");
381 Assert.AreEqual ("GET", request.HttpMethod, "#7");
382 Assert.IsFalse (request.IsAuthenticated, "#8");
383 Assert.IsTrue (request.IsLocal, "#9");
384 Assert.IsFalse (request.IsSecureConnection, "#10");
385 Assert.IsFalse (request.IsWebSocketRequest, "#11");
386 Assert.IsTrue (request.KeepAlive, "#12");
387 Assert.AreEqual (HttpVersion.Version10, request.ProtocolVersion, "#13");
388 Assert.IsNull (request.ServiceName, "#14");
389 Assert.IsNull (request.UrlReferrer, "#15");
390 Assert.IsNull (request.UserAgent, "#16");
391 Assert.IsNull (request.UserLanguages, "#17");
399 var chandler = new HttpClientHandler ();
400 chandler.AllowAutoRedirect = true;
401 chandler.AutomaticDecompression = DecompressionMethods.GZip;
402 chandler.MaxAutomaticRedirections = 33;
403 chandler.MaxRequestContentBufferSize = 5555;
404 chandler.PreAuthenticate = true;
405 chandler.CookieContainer.Add (new Uri (LocalServer), new Cookie ( "mycookie", "vv"));
406 chandler.UseCookies = true;
407 chandler.UseDefaultCredentials = true;
408 chandler.Proxy = new WebProxy ("ee");
409 chandler.UseProxy = true;
411 var client = new HttpClient (chandler);
412 var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
413 request.Version = HttpVersion.Version10;
414 request.Headers.Add ("Keep-Alive", "false");
415 var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
417 Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
418 Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
419 Assert.AreEqual (false, failed, "#102");
427 public void Send_Complete_CustomHeaders ()
431 var listener = CreateListener (l => {
432 var request = l.Request;
434 Assert.AreEqual ("vv", request.Headers["aa"], "#1");
436 var response = l.Response;
437 response.Headers.Add ("rsp", "rrr");
438 response.Headers.Add ("upgrade", "vvvvaa");
439 response.Headers.Add ("Date", "aa");
440 response.Headers.Add ("cache-control", "audio");
442 response.StatusDescription = "test description";
443 response.ProtocolVersion = HttpVersion.Version10;
444 response.SendChunked = true;
445 response.RedirectLocation = "w3.org";
454 var client = new HttpClient ();
455 var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
456 Assert.IsTrue (request.Headers.TryAddWithoutValidation ("aa", "vv"), "#0");
457 var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
459 Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
460 Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
462 IEnumerable<string> values;
463 Assert.IsTrue (response.Headers.TryGetValues ("rsp", out values), "#102");
464 Assert.AreEqual ("rrr", values.First (), "#102a");
466 Assert.IsTrue (response.Headers.TryGetValues ("Transfer-Encoding", out values), "#103");
467 Assert.AreEqual ("chunked", values.First (), "#103a");
468 Assert.AreEqual (true, response.Headers.TransferEncodingChunked, "#103b");
470 Assert.IsTrue (response.Headers.TryGetValues ("Date", out values), "#104");
471 Assert.AreEqual (1, values.Count (), "#104b");
472 // .NET overwrites Date, Mono does not
473 // Assert.IsNotNull (response.Headers.Date, "#104c");
475 Assert.AreEqual (new ProductHeaderValue ("vvvvaa"), response.Headers.Upgrade.First (), "#105");
477 Assert.AreEqual ("audio", response.Headers.CacheControl.Extensions.First ().Name, "#106");
479 Assert.AreEqual ("w3.org", response.Headers.Location.OriginalString, "#107");
481 Assert.AreEqual ("test description", response.ReasonPhrase, "#110");
482 Assert.AreEqual (HttpVersion.Version11, response.Version, "#111");
484 Assert.AreEqual (false, failed, "#112");
491 public void Send_Complete_Content ()
493 var listener = CreateListener (l => {
494 var request = l.Request;
495 l.Response.OutputStream.WriteByte (55);
496 l.Response.OutputStream.WriteByte (75);
500 var client = new HttpClient ();
501 var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
502 Assert.IsTrue (request.Headers.TryAddWithoutValidation ("aa", "vv"), "#0");
503 var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
505 Assert.AreEqual ("7K", response.Content.ReadAsStringAsync ().Result, "#100");
506 Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
508 IEnumerable<string> values;
509 Assert.IsTrue (response.Headers.TryGetValues ("Transfer-Encoding", out values), "#102");
510 Assert.AreEqual ("chunked", values.First (), "#102a");
511 Assert.AreEqual (true, response.Headers.TransferEncodingChunked, "#102b");
518 public void Send_Complete_Content_MaxResponseContentBufferSize ()
520 var listener = CreateListener (l => {
521 var request = l.Request;
522 var b = new byte[4000];
523 l.Response.OutputStream.Write (b, 0, b.Length);
527 var client = new HttpClient ();
528 client.MaxResponseContentBufferSize = 1000;
529 var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
530 var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
532 Assert.AreEqual (4000, response.Content.ReadAsStringAsync ().Result.Length, "#100");
533 Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
540 public void Send_Complete_Content_MaxResponseContentBufferSize_Error ()
542 var listener = CreateListener (l => {
543 var request = l.Request;
544 var b = new byte[4000];
545 l.Response.OutputStream.Write (b, 0, b.Length);
549 var client = new HttpClient ();
550 client.MaxResponseContentBufferSize = 1000;
551 var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
554 client.SendAsync (request, HttpCompletionOption.ResponseContentRead).Wait (WaitTimeout);
556 } catch (AggregateException e) {
557 Assert.IsTrue (e.InnerException is HttpRequestException, "#3");
566 public void Send_Complete_NoContent ()
568 foreach (var method in new HttpMethod[] { HttpMethod.Post, HttpMethod.Put, HttpMethod.Delete }) {
570 var listener = CreateListener (l => {
572 var request = l.Request;
574 Assert.AreEqual (2, request.Headers.Count, "#1");
575 Assert.AreEqual ("0", request.Headers ["Content-Length"], "#1b");
576 Assert.AreEqual (method.Method, request.HttpMethod, "#2");
584 var client = new HttpClient ();
585 var request = new HttpRequestMessage (method, LocalServer);
586 var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
588 Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
589 Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
590 Assert.AreEqual (false, failed, "#102");
598 public void Send_Complete_Error ()
600 var listener = CreateListener (l => {
601 var response = l.Response;
602 response.StatusCode = 500;
606 var client = new HttpClient ();
607 var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
608 var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
610 Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
611 Assert.AreEqual (HttpStatusCode.InternalServerError, response.StatusCode, "#101");
618 public void Send_Content_Get ()
620 var listener = CreateListener (l => {
621 var request = l.Request;
622 l.Response.OutputStream.WriteByte (72);
626 var client = new HttpClient ();
627 var r = new HttpRequestMessage (HttpMethod.Get, LocalServer);
628 var response = client.SendAsync (r).Result;
630 Assert.AreEqual ("H", response.Content.ReadAsStringAsync ().Result);
637 public void Send_Content_BomEncoding ()
639 var listener = CreateListener (l => {
640 var request = l.Request;
642 var str = l.Response.OutputStream;
643 str.WriteByte (0xEF);
644 str.WriteByte (0xBB);
645 str.WriteByte (0xBF);
650 var client = new HttpClient ();
651 var r = new HttpRequestMessage (HttpMethod.Get, LocalServer);
652 var response = client.SendAsync (r).Result;
654 Assert.AreEqual ("G", response.Content.ReadAsStringAsync ().Result);
661 public void Send_Content_Put ()
664 var listener = CreateListener (l => {
665 var request = l.Request;
666 passed = 7 == request.ContentLength64;
667 passed &= request.ContentType == "text/plain; charset=utf-8";
668 passed &= request.InputStream.ReadByte () == 'm';
672 var client = new HttpClient ();
673 var r = new HttpRequestMessage (HttpMethod.Put, LocalServer);
674 r.Content = new StringContent ("my text");
675 var response = client.SendAsync (r).Result;
677 Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#1");
678 Assert.IsTrue (passed, "#2");
686 public void Send_Timeout ()
688 var mh = new HttpMessageHandlerMock ();
690 var client = new HttpClient (mh);
691 client.Timeout = TimeSpan.FromMilliseconds (100);
692 var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
693 var response = new HttpResponseMessage ();
695 mh.OnSendFull = (l, c) => {
696 Assert.IsTrue (c.WaitHandle.WaitOne (500), "#2");
697 return Task.FromResult (response);
700 Assert.AreEqual (response, client.SendAsync (request).Result, "#1");
704 public void Send_Invalid ()
706 var client = new HttpClient ();
708 client.SendAsync (null).Wait (WaitTimeout);
710 } catch (ArgumentNullException) {
714 var request = new HttpRequestMessage ();
715 client.SendAsync (request).Wait (WaitTimeout);
717 } catch (InvalidOperationException) {
722 public void Send_InvalidHandler ()
724 var mh = new HttpMessageHandlerMock ();
726 var client = new HttpClient (mh);
727 client.BaseAddress = new Uri ("http://xamarin.com");
728 var request = new HttpRequestMessage ();
731 Assert.AreEqual (l, request, "#1");
737 client.SendAsync (request).Wait (WaitTimeout);
739 } catch (Exception) {
744 public void Send_SameMessage ()
746 var mh = new HttpMessageHandlerMock ();
748 var client = new HttpClient (mh);
749 var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com");
751 mh.OnSend = l => Task.FromResult (new HttpResponseMessage ());
753 client.SendAsync (request).Wait (WaitTimeout);
755 client.SendAsync (request).Wait (WaitTimeout);
757 } catch (InvalidOperationException) {
762 public void GetString_RelativeUri ()
764 var client = new HttpClient ();
765 client.BaseAddress = new Uri ("http://en.wikipedia.org/wiki/");
766 var uri = new Uri ("Computer", UriKind.Relative);
768 Assert.That (client.GetStringAsync (uri).Result != null);
769 Assert.That (client.GetStringAsync ("Computer").Result != null);
773 [Category ("MobileNotWorking")] // Missing encoding
774 public void GetString_Many ()
776 var client = new HttpClient ();
777 var t1 = client.GetStringAsync ("http://www.google.com");
778 var t2 = client.GetStringAsync ("http://www.google.com");
779 Assert.IsTrue (Task.WaitAll (new [] { t1, t2 }, WaitTimeout));
783 public void GetByteArray_ServerError ()
785 var listener = CreateListener (l => {
786 var response = l.Response;
787 response.StatusCode = 500;
788 l.Response.OutputStream.WriteByte (72);
792 var client = new HttpClient ();
794 client.GetByteArrayAsync (LocalServer).Wait (WaitTimeout);
796 } catch (AggregateException e) {
797 Assert.IsTrue (e.InnerException is HttpRequestException , "#2");
805 public void DisallowAutoRedirect ()
807 var listener = CreateListener (l => {
808 var request = l.Request;
809 var response = l.Response;
811 response.StatusCode = (int)HttpStatusCode.Moved;
812 response.RedirectLocation = "http://xamarin.com/";
816 var chandler = new HttpClientHandler ();
817 chandler.AllowAutoRedirect = false;
818 var client = new HttpClient (chandler);
821 client.GetStringAsync (LocalServer).Wait (WaitTimeout);
823 } catch (AggregateException e) {
824 Assert.IsTrue (e.InnerException is HttpRequestException, "#2");
833 public void RequestUriAfterRedirect ()
835 var listener = CreateListener (l => {
836 var request = l.Request;
837 var response = l.Response;
839 response.StatusCode = (int)HttpStatusCode.Moved;
840 response.RedirectLocation = "http://xamarin.com/";
844 var chandler = new HttpClientHandler ();
845 chandler.AllowAutoRedirect = true;
846 var client = new HttpClient (chandler);
848 var resp = client.GetAsync (LocalServer).Result;
849 Assert.AreEqual ("http://xamarin.com/", resp.RequestMessage.RequestUri.AbsoluteUri, "#1");
858 * Properties may only be modified before sending the first request.
860 public void ModifyHandlerAfterFirstRequest ()
862 var chandler = new HttpClientHandler ();
863 chandler.AllowAutoRedirect = true;
864 var client = new HttpClient (chandler, true);
866 var listener = CreateListener (l => {
867 var response = l.Response;
868 response.StatusCode = 200;
869 response.OutputStream.WriteByte (55);
873 client.GetStringAsync (LocalServer).Wait (WaitTimeout);
875 chandler.AllowAutoRedirect = false;
877 } catch (InvalidOperationException) {
888 * However, this policy is not enforced for custom handlers and there
889 * is also no way a derived class could tell its HttpClientHandler parent
890 * that it just sent a request.
893 public void ModifyHandlerAfterFirstRequest_Mock ()
895 var ch = new HttpClientHandlerMock ();
896 ch.AllowAutoRedirect = true;
898 var client = new HttpClient (ch);
901 return Task.FromResult (new HttpResponseMessage ());
904 client.GetAsync ("http://xamarin.com").Wait (WaitTimeout);
905 ch.AllowAutoRedirect = false;
908 HttpListener CreateListener (Action<HttpListenerContext> contextAssert)
910 var l = new HttpListener ();
911 l.Prefixes.Add (string.Format ("http://+:{0}/", port));
913 l.BeginGetContext (ar => {
914 var ctx = l.EndGetContext (ar);
917 if (contextAssert != null)
920 ctx.Response.Close ();