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 using MonoTests
.Helpers
;
43 namespace MonoTests
.System
.Net
.Http
46 public class HttpClientTest
48 class HttpMessageHandlerMock
: HttpMessageHandler
50 public Func
<HttpRequestMessage
, Task
<HttpResponseMessage
>> OnSend
;
51 public Func
<HttpRequestMessage
, CancellationToken
, Task
<HttpResponseMessage
>> OnSendFull
;
53 public HttpMessageHandlerMock ()
57 protected override Task
<HttpResponseMessage
> SendAsync (HttpRequestMessage request
, CancellationToken cancellationToken
)
60 return OnSend (request
);
62 if (OnSendFull
!= null)
63 return OnSendFull (request
, cancellationToken
);
70 class HttpClientHandlerMock
: HttpClientHandler
72 public Func
<HttpRequestMessage
, Task
<HttpResponseMessage
>> OnSend
;
73 public Func
<HttpRequestMessage
, CancellationToken
, Task
<HttpResponseMessage
>> OnSendFull
;
75 protected override Task
<HttpResponseMessage
> SendAsync (HttpRequestMessage request
, CancellationToken cancellationToken
)
78 return OnSend (request
);
80 if (OnSendFull
!= null)
81 return OnSendFull (request
, cancellationToken
);
88 class CustomStream
: Stream
90 public override void Flush ()
92 throw new NotImplementedException ();
97 public override int Read (byte[] buffer
, int offset
, int count
)
106 public override long Seek (long offset
, SeekOrigin origin
)
108 throw new NotImplementedException ();
111 public override void SetLength (long value)
113 throw new NotImplementedException ();
116 public override void Write (byte[] buffer
, int offset
, int count
)
118 throw new NotImplementedException ();
121 public override bool CanRead
{
127 public override bool CanSeek
{
133 public override bool CanWrite
{
135 throw new NotImplementedException ();
139 public override long Length
{
141 throw new NotImplementedException ();
145 public override long Position
{
147 throw new NotImplementedException ();
150 throw new NotImplementedException ();
155 class ThrowOnlyProxy
: IWebProxy
157 public ICredentials Credentials
{
159 throw new NotImplementedException ();
163 throw new NotImplementedException ();
167 public Uri
GetProxy (Uri destination
)
169 throw new NotImplementedException ();
172 public bool IsBypassed (Uri host
)
174 throw new NotImplementedException ();
178 const int WaitTimeout
= 10000;
183 var client
= new HttpClient ();
184 Assert
.IsNull (client
.BaseAddress
, "#1");
185 Assert
.IsNotNull (client
.DefaultRequestHeaders
, "#2"); // TODO: full check
186 Assert
.AreEqual (int.MaxValue
, client
.MaxResponseContentBufferSize
, "#3");
187 Assert
.AreEqual (TimeSpan
.FromSeconds (100), client
.Timeout
, "#4");
191 #if FEATURE_NO_BSD_SOCKETS
193 [ExpectedException (typeof (PlatformNotSupportedException
))]
196 public void Ctor_HttpClientHandler ()
198 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
199 Assert
.IsNull (client
.BaseAddress
, "#1");
200 Assert
.IsNotNull (client
.DefaultRequestHeaders
, "#2"); // TODO: full check
201 Assert
.AreEqual (int.MaxValue
, client
.MaxResponseContentBufferSize
, "#3");
202 Assert
.AreEqual (TimeSpan
.FromSeconds (100), client
.Timeout
, "#4");
206 public void CancelPendingRequests ()
208 var mh
= new HttpMessageHandlerMock ();
210 var client
= new HttpClient (mh
);
211 var request
= new HttpRequestMessage (HttpMethod
.Get
, "http://xamarin.com");
212 var mre
= new ManualResetEvent (false);
214 mh
.OnSendFull
= (l
, c
) => {
216 Assert
.IsTrue (c
.WaitHandle
.WaitOne (1000), "#20");
217 Assert
.IsTrue (c
.IsCancellationRequested
, "#21");
219 return Task
.FromResult (new HttpResponseMessage ());
222 var t
= Task
.Factory
.StartNew (() => {
223 client
.SendAsync (request
).Wait (WaitTimeout
);
226 Assert
.IsTrue (mre
.WaitOne (500), "#1");
228 client
.CancelPendingRequests ();
229 Assert
.IsTrue (t
.Wait (500), "#2");
231 request
= new HttpRequestMessage (HttpMethod
.Get
, "http://xamarin.com");
232 mh
.OnSendFull
= (l
, c
) => {
233 Assert
.IsFalse (c
.IsCancellationRequested
, "#30");
234 return Task
.FromResult (new HttpResponseMessage ());
237 client
.SendAsync (request
).Wait (WaitTimeout
);
241 public void CancelPendingRequests_BeforeSend ()
243 var ct
= new CancellationTokenSource ();
245 var rr
= CancellationTokenSource
.CreateLinkedTokenSource (new CancellationToken (), ct
.Token
);
248 var mh
= new HttpMessageHandlerMock ();
250 var client
= new HttpClient (mh
);
251 var request
= new HttpRequestMessage (HttpMethod
.Get
, "http://xamarin.com");
252 client
.CancelPendingRequests ();
254 mh
.OnSendFull
= (l
, c
) => {
255 Assert
.IsFalse (c
.IsCancellationRequested
, "#30");
256 return Task
.FromResult (new HttpResponseMessage ());
259 client
.SendAsync (request
).Wait (WaitTimeout
);
261 request
= new HttpRequestMessage (HttpMethod
.Get
, "http://xamarin.com");
262 client
.SendAsync (request
).Wait (WaitTimeout
);
268 #if FEATURE_NO_BSD_SOCKETS
269 // Using HttpClientHandler, which indirectly requires BSD sockets.
270 [ExpectedException (typeof (PlatformNotSupportedException
))]
272 public void CancelRequestViaProxy ()
274 var handler
= HttpClientTestHelpers
.CreateHttpClientHandler ();
275 handler
.Proxy
= new WebProxy ("192.168.10.25:8888/"); // proxy that doesn't exist
276 handler
.UseProxy
= true;
277 handler
.AutomaticDecompression
= DecompressionMethods
.GZip
| DecompressionMethods
.Deflate
;
279 var httpClient
= new HttpClient (handler
) {
280 BaseAddress
= new Uri ("https://www.example.com"),
281 Timeout
= TimeSpan
.FromMilliseconds (1)
285 var restRequest
= new HttpRequestMessage
{
286 Method
= HttpMethod
.Post
,
287 RequestUri
= new Uri("foo", UriKind
.Relative
),
288 Content
= new StringContent("", null, "application/json")
291 httpClient
.PostAsync (restRequest
.RequestUri
, restRequest
.Content
).Wait (WaitTimeout
);
293 } catch (AggregateException e
) {
294 Assert
.That (e
.InnerException
, Is
.InstanceOf
<TaskCanceledException
> (), $"#2: {e}");
299 public void Properties ()
301 var client
= new HttpClient ();
302 client
.BaseAddress
= null;
303 client
.MaxResponseContentBufferSize
= int.MaxValue
;
304 client
.Timeout
= Timeout
.InfiniteTimeSpan
;
306 Assert
.IsNull (client
.BaseAddress
, "#1");
307 Assert
.AreEqual (int.MaxValue
, client
.MaxResponseContentBufferSize
, "#2");
308 Assert
.AreEqual (Timeout
.InfiniteTimeSpan
, client
.Timeout
, "#3");
312 public void Properties_Invalid ()
314 var client
= new HttpClient ();
316 client
.MaxResponseContentBufferSize
= 0;
318 } catch (ArgumentOutOfRangeException
) {
322 client
.Timeout
= TimeSpan
.MinValue
;
324 } catch (ArgumentOutOfRangeException
) {
328 client
.Timeout
= TimeSpan
.Zero
;
330 } catch (ArgumentOutOfRangeException
) {
334 client
.Timeout
= TimeSpan
.FromMilliseconds (int.MaxValue
+ 1L);
336 } catch (ArgumentOutOfRangeException
) {
341 #if FEATURE_NO_BSD_SOCKETS
342 [ExpectedException (typeof (PlatformNotSupportedException
))]
344 [Category ("InetAccess")]
345 public void Proxy_Disabled ()
347 var pp
= WebRequest
.DefaultWebProxy
;
350 WebRequest
.DefaultWebProxy
= new ThrowOnlyProxy ();
352 var request
= HttpClientTestHelpers
.CreateHttpClientHandler ();
353 request
.UseProxy
= false;
355 var client
= new HttpClient (request
);
356 Assert
.IsTrue (client
.GetAsync ("http://www.example.com").Wait (5000), "needs internet access");
358 WebRequest
.DefaultWebProxy
= pp
;
365 var mh
= new HttpMessageHandlerMock ();
367 var client
= new HttpClient (mh
);
368 client
.BaseAddress
= new Uri ("http://www.example.com");
369 var request
= new HttpRequestMessage ();
370 var response
= new HttpResponseMessage ();
373 Assert
.AreEqual (l
, request
, "#2");
374 Assert
.AreEqual (client
.BaseAddress
, l
.RequestUri
, "#2");
375 return Task
.FromResult (response
);
378 Assert
.AreEqual (response
, client
.SendAsync (request
).Result
, "#1");
382 public void Send_BaseAddress ()
384 var mh
= new HttpMessageHandlerMock ();
386 var client
= new HttpClient (mh
);
387 client
.BaseAddress
= new Uri ("http://localhost/");
388 var response
= new HttpResponseMessage ();
391 Assert
.AreEqual ("http://localhost/relative", l
.RequestUri
.ToString (), "#2");
392 return Task
.FromResult (response
);
395 Assert
.AreEqual (response
, client
.GetAsync ("relative").Result
, "#1");
396 Assert
.AreEqual (response
, client
.GetAsync ("/relative").Result
, "#2");
400 public void Send_DefaultRequestHeaders ()
402 var mh
= new HttpMessageHandlerMock ();
404 var client
= new HttpClient (mh
);
405 client
.DefaultRequestHeaders
.Referrer
= new Uri ("http://www.example.com");
407 var request
= new HttpRequestMessage (HttpMethod
.Get
, "http://www.example.org");
408 var response
= new HttpResponseMessage ();
411 Assert
.AreEqual (client
.DefaultRequestHeaders
.Referrer
, l
.Headers
.Referrer
, "#2");
412 Assert
.IsNotNull (l
.Headers
.Referrer
, "#3");
413 return Task
.FromResult (response
);
416 Assert
.AreEqual (response
, client
.SendAsync (request
).Result
, "#1");
420 #if FEATURE_NO_BSD_SOCKETS
421 [ExpectedException (typeof (PlatformNotSupportedException
))]
423 public void Send_Complete_Default ()
426 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Complete_Default/");
427 AddListenerContext (listener
, l
=> {
429 var request
= l
.Request
;
431 Assert
.IsNull (request
.AcceptTypes
, "#1");
432 Assert
.AreEqual (0, request
.ContentLength64
, "#2");
433 Assert
.IsNull (request
.ContentType
, "#3");
434 Assert
.AreEqual (0, request
.Cookies
.Count
, "#4");
435 Assert
.IsFalse (request
.HasEntityBody
, "#5");
436 Assert
.AreEqual ($"localhost:{port}", request
.Headers
["Host"], "#6b");
437 Assert
.AreEqual ("GET", request
.HttpMethod
, "#7");
438 Assert
.IsFalse (request
.IsAuthenticated
, "#8");
439 Assert
.IsTrue (request
.IsLocal
, "#9");
440 Assert
.IsFalse (request
.IsSecureConnection
, "#10");
441 Assert
.IsFalse (request
.IsWebSocketRequest
, "#11");
442 Assert
.IsTrue (request
.KeepAlive
, "#12");
443 Assert
.AreEqual (HttpVersion
.Version11
, request
.ProtocolVersion
, "#13");
444 Assert
.IsNull (request
.ServiceName
, "#14");
445 Assert
.IsNull (request
.UrlReferrer
, "#15");
446 Assert
.IsNull (request
.UserAgent
, "#16");
447 Assert
.IsNull (request
.UserLanguages
, "#17");
455 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
456 var request
= new HttpRequestMessage (HttpMethod
.Get
, $"http://localhost:{port}/Send_Complete_Default/");
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");
461 Assert
.AreEqual (false, failed
, "#102");
468 #if FEATURE_NO_BSD_SOCKETS
469 [ExpectedException (typeof (PlatformNotSupportedException
))]
471 public void Send_Complete_Version_1_0 ()
475 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Complete_Version_1_0/");
476 AddListenerContext (listener
, l
=> {
478 var request
= l
.Request
;
480 Assert
.IsNull (request
.AcceptTypes
, "#1");
481 Assert
.AreEqual (0, request
.ContentLength64
, "#2");
482 Assert
.IsNull (request
.ContentType
, "#3");
483 Assert
.AreEqual (0, request
.Cookies
.Count
, "#4");
484 Assert
.IsFalse (request
.HasEntityBody
, "#5");
485 Assert
.AreEqual (1, request
.Headers
.Count
, "#6");
486 Assert
.AreEqual ($"localhost:{port}", request
.Headers
["Host"], "#6a");
487 Assert
.AreEqual ("GET", request
.HttpMethod
, "#7");
488 Assert
.IsFalse (request
.IsAuthenticated
, "#8");
489 Assert
.IsTrue (request
.IsLocal
, "#9");
490 Assert
.IsFalse (request
.IsSecureConnection
, "#10");
491 Assert
.IsFalse (request
.IsWebSocketRequest
, "#11");
492 Assert
.IsFalse (request
.KeepAlive
, "#12");
493 Assert
.AreEqual (HttpVersion
.Version10
, request
.ProtocolVersion
, "#13");
494 Assert
.IsNull (request
.ServiceName
, "#14");
495 Assert
.IsNull (request
.UrlReferrer
, "#15");
496 Assert
.IsNull (request
.UserAgent
, "#16");
497 Assert
.IsNull (request
.UserLanguages
, "#17");
505 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
506 var request
= new HttpRequestMessage (HttpMethod
.Get
, $"http://localhost:{port}/Send_Complete_Version_1_0/");
507 request
.Version
= HttpVersion
.Version10
;
508 var response
= client
.SendAsync (request
, HttpCompletionOption
.ResponseHeadersRead
).Result
;
510 Assert
.AreEqual ("", response
.Content
.ReadAsStringAsync ().Result
, "#100");
511 Assert
.AreEqual (HttpStatusCode
.OK
, response
.StatusCode
, "#101");
512 Assert
.AreEqual (false, failed
, "#102");
519 #if FEATURE_NO_BSD_SOCKETS
520 [ExpectedException (typeof (PlatformNotSupportedException
))]
522 public void Send_Complete_ClientHandlerSettings ()
526 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Complete_ClientHandlerSettings/");
527 AddListenerContext (listener
, l
=> {
528 var request
= l
.Request
;
531 Assert
.IsNull (request
.AcceptTypes
, "#1");
532 Assert
.AreEqual (0, request
.ContentLength64
, "#2");
533 Assert
.IsNull (request
.ContentType
, "#3");
534 Assert
.AreEqual (1, request
.Cookies
.Count
, "#4");
535 Assert
.AreEqual (new Cookie ("mycookie", "vv"), request
.Cookies
[0], "#4a");
536 Assert
.IsFalse (request
.HasEntityBody
, "#5");
537 Assert
.AreEqual (4, request
.Headers
.Count
, "#6");
538 Assert
.AreEqual ($"localhost:{port}", request
.Headers
["Host"], "#6a");
539 Assert
.AreEqual ("gzip", request
.Headers
["Accept-Encoding"], "#6b");
540 Assert
.AreEqual ("mycookie=vv", request
.Headers
["Cookie"], "#6c");
541 Assert
.AreEqual ("GET", request
.HttpMethod
, "#7");
542 Assert
.IsFalse (request
.IsAuthenticated
, "#8");
543 Assert
.IsTrue (request
.IsLocal
, "#9");
544 Assert
.IsFalse (request
.IsSecureConnection
, "#10");
545 Assert
.IsFalse (request
.IsWebSocketRequest
, "#11");
546 Assert
.IsTrue (request
.KeepAlive
, "#12");
547 Assert
.AreEqual (HttpVersion
.Version10
, request
.ProtocolVersion
, "#13");
548 Assert
.IsNull (request
.ServiceName
, "#14");
549 Assert
.IsNull (request
.UrlReferrer
, "#15");
550 Assert
.IsNull (request
.UserAgent
, "#16");
551 Assert
.IsNull (request
.UserLanguages
, "#17");
559 var chandler
= HttpClientTestHelpers
.CreateHttpClientHandler ();
560 chandler
.AllowAutoRedirect
= true;
561 chandler
.AutomaticDecompression
= DecompressionMethods
.GZip
;
562 chandler
.MaxAutomaticRedirections
= 33;
563 chandler
.MaxRequestContentBufferSize
= 5555;
564 chandler
.PreAuthenticate
= true;
565 chandler
.CookieContainer
.Add (new Uri ($"http://localhost:{port}/Send_Complete_ClientHandlerSettings/"), new Cookie ( "mycookie", "vv"));
566 chandler
.UseCookies
= true;
567 chandler
.UseDefaultCredentials
= true;
568 chandler
.Proxy
= new WebProxy ("ee");
569 chandler
.UseProxy
= true;
571 var client
= new HttpClient (chandler
);
572 var request
= new HttpRequestMessage (HttpMethod
.Get
, $"http://localhost:{port}/Send_Complete_ClientHandlerSettings/");
573 request
.Version
= HttpVersion
.Version10
;
574 request
.Headers
.Add ("Keep-Alive", "false");
575 var response
= client
.SendAsync (request
, HttpCompletionOption
.ResponseHeadersRead
).Result
;
577 Assert
.AreEqual ("", response
.Content
.ReadAsStringAsync ().Result
, "#100");
578 Assert
.AreEqual (HttpStatusCode
.OK
, response
.StatusCode
, "#101");
579 Assert
.AreEqual (false, failed
, "#102");
587 #if FEATURE_NO_BSD_SOCKETS
588 [ExpectedException (typeof (PlatformNotSupportedException
))]
590 public void Send_Complete_CustomHeaders ()
594 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Complete_CustomHeaders/");
595 AddListenerContext (listener
, l
=> {
596 var request
= l
.Request
;
598 Assert
.AreEqual ("vv", request
.Headers
["aa"], "#1");
600 var response
= l
.Response
;
601 response
.Headers
.Add ("rsp", "rrr");
602 response
.Headers
.Add ("upgrade", "vvvvaa");
603 response
.Headers
.Add ("Date", "aa");
604 response
.Headers
.Add ("cache-control", "audio");
606 response
.StatusDescription
= "test description";
607 response
.ProtocolVersion
= HttpVersion
.Version10
;
608 response
.SendChunked
= true;
609 response
.RedirectLocation
= "w3.org";
618 var handler
= HttpClientTestHelpers
.CreateHttpClientHandler ();
619 var client
= new HttpClient (handler
);
620 var request
= new HttpRequestMessage (HttpMethod
.Get
, $"http://localhost:{port}/Send_Complete_CustomHeaders/");
621 Assert
.IsTrue (request
.Headers
.TryAddWithoutValidation ("aa", "vv"), "#0");
622 var response
= client
.SendAsync (request
, HttpCompletionOption
.ResponseHeadersRead
).Result
;
624 Assert
.AreEqual ("", response
.Content
.ReadAsStringAsync ().Result
, "#100");
625 Assert
.AreEqual (HttpStatusCode
.OK
, response
.StatusCode
, "#101");
627 IEnumerable
<string> values
;
628 Assert
.IsTrue (response
.Headers
.TryGetValues ("rsp", out values
), "#102");
629 Assert
.AreEqual ("rrr", values
.First (), "#102a");
631 Assert
.IsTrue (response
.Headers
.TryGetValues ("Transfer-Encoding", out values
), "#103");
632 Assert
.AreEqual ("chunked", values
.First (), "#103a");
633 Assert
.AreEqual (true, response
.Headers
.TransferEncodingChunked
, "#103b");
635 Assert
.IsTrue (response
.Headers
.TryGetValues ("Date", out values
), "#104");
636 Assert
.AreEqual (1, values
.Count (), "#104b");
637 // .NET overwrites Date, Mono does not
638 // Assert.IsNotNull (response.Headers.Date, "#104c");
640 Assert
.AreEqual (new ProductHeaderValue ("vvvvaa"), response
.Headers
.Upgrade
.First (), "#105");
642 Assert
.AreEqual ("audio", response
.Headers
.CacheControl
.Extensions
.First ().Name
, "#106");
644 Assert
.AreEqual ("w3.org", response
.Headers
.Location
.OriginalString
, "#107");
646 Assert
.AreEqual ("test description", response
.ReasonPhrase
, "#110");
647 if (HttpClientTestHelpers
.IsSocketsHandler (handler
))
648 Assert
.AreEqual (HttpVersion
.Version10
, response
.Version
, "#111");
650 Assert
.AreEqual (HttpVersion
.Version11
, response
.Version
, "#111");
652 Assert
.AreEqual (false, failed
, "#112");
659 #if FEATURE_NO_BSD_SOCKETS
660 [ExpectedException (typeof (PlatformNotSupportedException
))]
662 public void Send_Complete_CustomHeaders_SpecialSeparators ()
666 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Complete_CustomHeaders_SpecialSeparators/");
667 AddListenerContext (listener
, l
=> {
668 var request
= l
.Request
;
671 Assert
.AreEqual ("MLK Android Phone 1.1.9", request
.UserAgent
, "#1");
679 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
681 client
.DefaultRequestHeaders
.Add("User-Agent", "MLK Android Phone 1.1.9");
683 var request
= new HttpRequestMessage (HttpMethod
.Get
, $"http://localhost:{port}/Send_Complete_CustomHeaders_SpecialSeparators/");
685 var response
= client
.SendAsync (request
, HttpCompletionOption
.ResponseHeadersRead
).Result
;
687 Assert
.AreEqual ("", response
.Content
.ReadAsStringAsync ().Result
, "#100");
688 Assert
.AreEqual (HttpStatusCode
.OK
, response
.StatusCode
, "#101");
689 Assert
.AreEqual (false, failed
, "#102");
697 #if FEATURE_NO_BSD_SOCKETS
698 [ExpectedException (typeof (PlatformNotSupportedException
))]
700 public void Send_Complete_CustomHeaders_Host ()
702 Exception error
= null;
703 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Complete_CustomHeaders_Host/");
704 AddListenerContext (listener
, l
=> {
705 var request
= l
.Request
;
708 Assert
.AreEqual ("customhost", request
.Headers
["Host"], "#1");
709 } catch (Exception ex
) {
715 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
717 client
.DefaultRequestHeaders
.Add("Host", "customhost");
719 var request
= new HttpRequestMessage (HttpMethod
.Get
, $"http://localhost:{port}/Send_Complete_CustomHeaders_Host/");
721 var response
= client
.SendAsync (request
, HttpCompletionOption
.ResponseHeadersRead
).Result
;
723 Assert
.AreEqual ("", response
.Content
.ReadAsStringAsync ().Result
, "#100");
724 Assert
.AreEqual (HttpStatusCode
.OK
, response
.StatusCode
, "#101");
725 Assert
.IsNull (error
, "#102");
733 #if FEATURE_NO_BSD_SOCKETS
734 [ExpectedException (typeof (PlatformNotSupportedException
))]
736 public void Send_Transfer_Encoding_Chunked_Needs_Content ()
738 if (!HttpClientTestHelpers
.UsingSocketsHandler
)
739 Assert
.Ignore ("Requires SocketsHttpHandler");
743 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Transfer_Encoding_Chunked_Needs_Content/");
744 AddListenerContext (listener
, l
=> {
750 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
751 client
.DefaultRequestHeaders
.TransferEncodingChunked
= true;
752 client
.GetAsync ($"http://localhost:{port}/Send_Transfer_Encoding_Chunked_Needs_Content/").Wait ();
754 // 'Transfer-Encoding: chunked' header can not be used when content object is not specified.
755 } catch (AggregateException e
) {
756 Assert
.AreEqual (typeof (HttpRequestException
), e
.InnerException
.GetType (), "#2");
758 Assert
.IsNull (failed
, "#102");
766 #if FEATURE_NO_BSD_SOCKETS
767 [ExpectedException (typeof (PlatformNotSupportedException
))]
769 public void Send_Transfer_Encoding_Chunked ()
771 if (HttpClientTestHelpers
.UsingSocketsHandler
)
772 Assert
.Ignore ("Requires LegacyHttpClient");
776 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Transfer_Encoding_Chunked/");
777 AddListenerContext (listener
, l
=> {
778 var request
= l
.Request
;
781 Assert
.AreEqual (2, request
.Headers
.Count
, "#1");
782 Assert
.AreEqual ("keep-alive", request
.Headers
["Connection"], "#2");
784 } catch (Exception ex
){
785 Console
.WriteLine (ex
);
786 Console
.WriteLine (String
.Join ("#", l
.Request
.Headers
.AllKeys
));
792 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
793 client
.DefaultRequestHeaders
.TransferEncodingChunked
= true;
795 client
.GetAsync ($"http://localhost:{port}/Send_Transfer_Encoding_Chunked/").Wait ();
797 Assert
.AreEqual (false, failed
, "#102");
805 #if FEATURE_NO_BSD_SOCKETS
806 [ExpectedException (typeof (PlatformNotSupportedException
))]
808 public void Send_Complete_Content ()
810 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Complete_Content/");
811 AddListenerContext (listener
, l
=> {
812 var request
= l
.Request
;
813 l
.Response
.OutputStream
.WriteByte (55);
814 l
.Response
.OutputStream
.WriteByte (75);
818 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
819 var request
= new HttpRequestMessage (HttpMethod
.Get
, $"http://localhost:{port}/Send_Complete_Content/");
820 Assert
.IsTrue (request
.Headers
.TryAddWithoutValidation ("aa", "vv"), "#0");
821 var response
= client
.SendAsync (request
, HttpCompletionOption
.ResponseHeadersRead
).Result
;
823 Assert
.AreEqual ("7K", response
.Content
.ReadAsStringAsync ().Result
, "#100");
824 Assert
.AreEqual (HttpStatusCode
.OK
, response
.StatusCode
, "#101");
826 IEnumerable
<string> values
;
827 Assert
.IsTrue (response
.Headers
.TryGetValues ("Transfer-Encoding", out values
), "#102");
828 Assert
.AreEqual ("chunked", values
.First (), "#102a");
829 Assert
.AreEqual (true, response
.Headers
.TransferEncodingChunked
, "#102b");
836 #if FEATURE_NO_BSD_SOCKETS
837 [ExpectedException (typeof (PlatformNotSupportedException
))]
839 public void Send_Complete_Content_MaxResponseContentBufferSize ()
841 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Complete_Content_MaxResponseContentBufferSize/");
842 AddListenerContext (listener
, l
=> {
843 var request
= l
.Request
;
844 var b
= new byte[4000];
845 l
.Response
.OutputStream
.Write (b
, 0, b
.Length
);
849 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
850 client
.MaxResponseContentBufferSize
= 1000;
851 var request
= new HttpRequestMessage (HttpMethod
.Get
, $"http://localhost:{port}/Send_Complete_Content_MaxResponseContentBufferSize/");
852 var response
= client
.SendAsync (request
, HttpCompletionOption
.ResponseHeadersRead
).Result
;
854 Assert
.AreEqual (4000, response
.Content
.ReadAsStringAsync ().Result
.Length
, "#100");
855 Assert
.AreEqual (HttpStatusCode
.OK
, response
.StatusCode
, "#101");
862 #if FEATURE_NO_BSD_SOCKETS
863 [ExpectedException (typeof (PlatformNotSupportedException
))]
865 public void Send_Complete_Content_MaxResponseContentBufferSize_Error ()
867 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Complete_Content_MaxResponseContentBufferSize_Error/");
868 AddListenerContext (listener
, l
=> {
869 var request
= l
.Request
;
870 var b
= new byte[4000];
871 l
.Response
.OutputStream
.Write (b
, 0, b
.Length
);
875 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
876 client
.MaxResponseContentBufferSize
= 1000;
877 var request
= new HttpRequestMessage (HttpMethod
.Get
, $"http://localhost:{port}/Send_Complete_Content_MaxResponseContentBufferSize_Error/");
880 client
.SendAsync (request
, HttpCompletionOption
.ResponseContentRead
).Wait (WaitTimeout
);
882 } catch (AggregateException e
) {
883 Assert
.That (e
.InnerException
, Is
.InstanceOf
<HttpRequestException
> (), $"#3: {e}");
892 #if FEATURE_NO_BSD_SOCKETS
893 [ExpectedException (typeof (PlatformNotSupportedException
))]
895 public void Send_Complete_NoContent_Post ()
897 Send_Complete_NoContent (HttpMethod
.Post
);
901 #if FEATURE_NO_BSD_SOCKETS
902 [ExpectedException (typeof (PlatformNotSupportedException
))]
904 public void Send_Complete_NoContent_Put ()
906 Send_Complete_NoContent (HttpMethod
.Put
);
910 #if FEATURE_NO_BSD_SOCKETS
911 [ExpectedException (typeof (PlatformNotSupportedException
))]
913 public void Send_Complete_NoContent_Delete ()
915 Send_Complete_NoContent (HttpMethod
.Delete
);
918 void Send_Complete_NoContent (HttpMethod method
)
921 var handler
= HttpClientTestHelpers
.CreateHttpClientHandler ();
922 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Complete_NoContent/");
923 AddListenerContext (listener
, l
=> {
925 var request
= l
.Request
;
927 if (HttpClientTestHelpers
.IsSocketsHandler (handler
)) {
928 Assert
.AreEqual (2, request
.Headers
.Count
, "#1");
929 Assert
.IsNull (request
.Headers
["Connection"], "#1c");
931 Assert
.AreEqual (3, request
.Headers
.Count
, "#1");
932 Assert
.AreEqual ("keep-alive", request
.Headers
["Connection"], "#1c");
934 Assert
.AreEqual ("0", request
.Headers
["Content-Length"], "#1b");
935 Assert
.AreEqual (method
.Method
, request
.HttpMethod
, "#2");
937 } catch (Exception ex
){
938 Console
.WriteLine (ex
);
939 Console
.WriteLine (String
.Join ("#", l
.Request
.Headers
.AllKeys
));
946 var client
= new HttpClient (handler
);
947 var request
= new HttpRequestMessage (method
, $"http://localhost:{port}/Send_Complete_NoContent/");
948 var response
= client
.SendAsync (request
, HttpCompletionOption
.ResponseHeadersRead
).Result
;
950 Assert
.AreEqual ("", response
.Content
.ReadAsStringAsync ().Result
, "#100");
951 Assert
.AreEqual (HttpStatusCode
.OK
, response
.StatusCode
, "#101");
952 Assert
.AreEqual (false, failed
, "#102");
959 #if FEATURE_NO_BSD_SOCKETS
960 [ExpectedException (typeof (PlatformNotSupportedException
))]
962 public void Send_Complete_Error ()
964 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Complete_Error/");
965 AddListenerContext (listener
, l
=> {
966 var response
= l
.Response
;
967 response
.StatusCode
= 500;
971 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
972 var request
= new HttpRequestMessage (HttpMethod
.Get
, $"http://localhost:{port}/Send_Complete_Error/");
973 var response
= client
.SendAsync (request
, HttpCompletionOption
.ResponseHeadersRead
).Result
;
975 Assert
.AreEqual ("", response
.Content
.ReadAsStringAsync ().Result
, "#100");
976 Assert
.AreEqual (HttpStatusCode
.InternalServerError
, response
.StatusCode
, "#101");
983 #if FEATURE_NO_BSD_SOCKETS
984 [ExpectedException (typeof (PlatformNotSupportedException
))]
986 public void Send_Content_Get ()
988 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Content_Get/");
989 AddListenerContext (listener
, l
=> {
990 var request
= l
.Request
;
991 l
.Response
.OutputStream
.WriteByte (72);
995 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
996 var r
= new HttpRequestMessage (HttpMethod
.Get
, $"http://localhost:{port}/Send_Content_Get/");
997 var response
= client
.SendAsync (r
).Result
;
999 Assert
.AreEqual ("H", response
.Content
.ReadAsStringAsync ().Result
);
1006 #if FEATURE_NO_BSD_SOCKETS
1007 [ExpectedException (typeof (PlatformNotSupportedException
))]
1009 public void Send_Content_BomEncoding ()
1011 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Content_BomEncoding/");
1012 AddListenerContext (listener
, l
=> {
1013 var request
= l
.Request
;
1015 var str
= l
.Response
.OutputStream
;
1016 str
.WriteByte (0xEF);
1017 str
.WriteByte (0xBB);
1018 str
.WriteByte (0xBF);
1023 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
1024 var r
= new HttpRequestMessage (HttpMethod
.Get
, $"http://localhost:{port}/Send_Content_BomEncoding/");
1025 var response
= client
.SendAsync (r
).Result
;
1027 Assert
.AreEqual ("G", response
.Content
.ReadAsStringAsync ().Result
);
1034 #if FEATURE_NO_BSD_SOCKETS
1035 [ExpectedException (typeof (PlatformNotSupportedException
))]
1037 public void Send_Content_Put ()
1039 bool passed
= false;
1040 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Content_Put/");
1041 AddListenerContext (listener
, l
=> {
1042 var request
= l
.Request
;
1043 passed
= 7 == request
.ContentLength64
;
1044 passed
&= request
.ContentType
== "text/plain; charset=utf-8";
1045 passed
&= request
.InputStream
.ReadByte () == 'm';
1049 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
1050 var r
= new HttpRequestMessage (HttpMethod
.Put
, $"http://localhost:{port}/Send_Content_Put/");
1051 r
.Content
= new StringContent ("my text");
1052 var response
= client
.SendAsync (r
).Result
;
1054 Assert
.AreEqual (HttpStatusCode
.OK
, response
.StatusCode
, "#1");
1055 Assert
.IsTrue (passed
, "#2");
1063 #if FEATURE_NO_BSD_SOCKETS
1064 [ExpectedException (typeof (PlatformNotSupportedException
))]
1066 public void Send_Content_Put_CustomStream ()
1068 bool passed
= false;
1069 var handler
= HttpClientTestHelpers
.CreateHttpClientHandler ();
1070 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Send_Content_Put_CustomStream/");
1071 AddListenerContext (listener
, l
=> {
1072 var request
= l
.Request
;
1073 if (HttpClientTestHelpers
.IsSocketsHandler (handler
))
1074 passed
= -1 == request
.ContentLength64
;
1076 passed
= 44 == request
.ContentLength64
;
1077 passed
&= request
.ContentType
== null;
1081 var client
= new HttpClient (handler
);
1082 var r
= new HttpRequestMessage (HttpMethod
.Put
, $"http://localhost:{port}/Send_Content_Put_CustomStream/");
1083 r
.Content
= new StreamContent (new CustomStream ());
1084 var response
= client
.SendAsync (r
).Result
;
1086 Assert
.AreEqual (HttpStatusCode
.OK
, response
.StatusCode
, "#1");
1087 Assert
.IsTrue (passed
, "#2");
1096 public void Send_Timeout ()
1098 var mh
= new HttpMessageHandlerMock ();
1100 var client
= new HttpClient (mh
);
1101 client
.Timeout
= TimeSpan
.FromMilliseconds (100);
1102 var request
= new HttpRequestMessage (HttpMethod
.Get
, "http://xamarin.com");
1103 var response
= new HttpResponseMessage ();
1105 mh
.OnSendFull
= (l
, c
) => {
1106 Assert
.IsTrue (c
.WaitHandle
.WaitOne (500), "#2");
1107 return Task
.FromResult (response
);
1110 Assert
.AreEqual (response
, client
.SendAsync (request
).Result
, "#1");
1114 #if FEATURE_NO_BSD_SOCKETS
1115 #if !MONOTOUCH_WATCH
1116 [ExpectedException (typeof (PlatformNotSupportedException
))]
1119 public void Send_Invalid ()
1121 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
1123 client
.SendAsync (null).Wait (WaitTimeout
);
1125 } catch (ArgumentNullException
) {
1129 var request
= new HttpRequestMessage ();
1130 client
.SendAsync (request
).Wait (WaitTimeout
);
1132 } catch (InvalidOperationException
) {
1137 public void Send_InvalidHandler ()
1139 var mh
= new HttpMessageHandlerMock ();
1141 var client
= new HttpClient (mh
);
1142 client
.BaseAddress
= new Uri ("http://xamarin.com");
1143 var request
= new HttpRequestMessage ();
1146 Assert
.AreEqual (l
, request
, "#1");
1152 client
.SendAsync (request
).Wait (WaitTimeout
);
1154 } catch (Exception
) {
1159 public void Send_SameMessage ()
1161 var mh
= new HttpMessageHandlerMock ();
1163 var client
= new HttpClient (mh
);
1164 var request
= new HttpRequestMessage (HttpMethod
.Get
, "http://xamarin.com");
1166 mh
.OnSend
= l
=> Task
.FromResult (new HttpResponseMessage ());
1168 client
.SendAsync (request
).Wait (WaitTimeout
);
1170 client
.SendAsync (request
).Wait (WaitTimeout
);
1172 } catch (InvalidOperationException
) {
1177 #if FEATURE_NO_BSD_SOCKETS
1178 [ExpectedException (typeof (PlatformNotSupportedException
))]
1180 public void Post_TransferEncodingChunked ()
1182 bool? failed
= null;
1183 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Post_TransferEncodingChunked/");
1184 AddListenerContext (listener
, l
=> {
1186 var request
= l
.Request
;
1188 Assert
.IsNull (request
.AcceptTypes
, "#1");
1189 Assert
.AreEqual (-1, request
.ContentLength64
, "#2");
1190 Assert
.IsNull (request
.ContentType
, "#3");
1191 Assert
.AreEqual (0, request
.Cookies
.Count
, "#4");
1192 Assert
.IsTrue (request
.HasEntityBody
, "#5");
1193 Assert
.AreEqual ($"localhost:{port}", request
.Headers
["Host"], "#6b");
1194 Assert
.AreEqual ("POST", request
.HttpMethod
, "#7");
1195 Assert
.IsFalse (request
.IsAuthenticated
, "#8");
1196 Assert
.IsTrue (request
.IsLocal
, "#9");
1197 Assert
.IsFalse (request
.IsSecureConnection
, "#10");
1198 Assert
.IsFalse (request
.IsWebSocketRequest
, "#11");
1199 Assert
.IsTrue (request
.KeepAlive
, "#12");
1200 Assert
.AreEqual (HttpVersion
.Version11
, request
.ProtocolVersion
, "#13");
1201 Assert
.IsNull (request
.ServiceName
, "#14");
1202 Assert
.IsNull (request
.UrlReferrer
, "#15");
1203 Assert
.IsNull (request
.UserAgent
, "#16");
1204 Assert
.IsNull (request
.UserLanguages
, "#17");
1205 Assert
.AreEqual ("chunked", request
.Headers
["Transfer-Encoding"], "#18");
1206 Assert
.IsNull (request
.Headers
["Content-Length"], "#19");
1208 } catch (Exception e
) {
1210 Console
.WriteLine (e
);
1215 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
1217 client
.DefaultRequestHeaders
.TransferEncodingChunked
= true;
1219 var imageContent
= new StreamContent (new MemoryStream ());
1221 var response
= client
.PostAsync ($"http://localhost:{port}/Post_TransferEncodingChunked/", imageContent
).Result
;
1223 Assert
.AreEqual(HttpStatusCode
.OK
, response
.StatusCode
, "#101");
1224 Assert
.AreEqual(false, failed
, "#102");
1231 #if FEATURE_NO_BSD_SOCKETS
1232 [ExpectedException (typeof (PlatformNotSupportedException
))]
1234 public void Post_StreamCaching ()
1236 bool? failed
= null;
1237 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/Post_StreamCaching/");
1238 AddListenerContext (listener
, l
=> {
1240 var request
= l
.Request
;
1242 Assert
.IsNull (request
.AcceptTypes
, "#1");
1243 Assert
.AreEqual (0, request
.ContentLength64
, "#2");
1244 Assert
.IsNull (request
.ContentType
, "#3");
1245 Assert
.AreEqual (0, request
.Cookies
.Count
, "#4");
1246 Assert
.IsFalse (request
.HasEntityBody
, "#5");
1247 Assert
.AreEqual ($"localhost:{port}", request
.Headers
["Host"], "#6b");
1248 Assert
.AreEqual ("POST", request
.HttpMethod
, "#7");
1249 Assert
.IsFalse (request
.IsAuthenticated
, "#8");
1250 Assert
.IsTrue (request
.IsLocal
, "#9");
1251 Assert
.IsFalse (request
.IsSecureConnection
, "#10");
1252 Assert
.IsFalse (request
.IsWebSocketRequest
, "#11");
1253 Assert
.IsTrue (request
.KeepAlive
, "#12");
1254 Assert
.AreEqual (HttpVersion
.Version11
, request
.ProtocolVersion
, "#13");
1255 Assert
.IsNull (request
.ServiceName
, "#14");
1256 Assert
.IsNull (request
.UrlReferrer
, "#15");
1257 Assert
.IsNull (request
.UserAgent
, "#16");
1258 Assert
.IsNull (request
.UserLanguages
, "#17");
1259 Assert
.IsNull (request
.Headers
["Transfer-Encoding"], "#18");
1260 Assert
.AreEqual ("0", request
.Headers
["Content-Length"], "#19");
1262 } catch (Exception e
) {
1264 Console
.WriteLine (e
);
1269 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
1271 var imageContent
= new StreamContent (new MemoryStream ());
1273 var response
= client
.PostAsync ($"http://localhost:{port}/Post_StreamCaching/", imageContent
).Result
;
1275 Assert
.AreEqual(HttpStatusCode
.OK
, response
.StatusCode
, "#101");
1276 Assert
.AreEqual(false, failed
, "#102");
1283 [Category ("MobileNotWorking")] // Missing encoding
1284 #if FEATURE_NO_BSD_SOCKETS
1285 [ExpectedException (typeof (PlatformNotSupportedException
))]
1287 public void GetString_Many ()
1289 Action
<HttpListenerContext
> context
= (HttpListenerContext l
) => {
1290 var response
= l
.Response
;
1291 response
.StatusCode
= 200;
1292 response
.OutputStream
.WriteByte (0x68);
1293 response
.OutputStream
.WriteByte (0x65);
1294 response
.OutputStream
.WriteByte (0x6c);
1295 response
.OutputStream
.WriteByte (0x6c);
1296 response
.OutputStream
.WriteByte (0x6f);
1299 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/GetString_Many/");
1300 AddListenerContext (listener
, context
); // creates a default request handler
1301 AddListenerContext (listener
, context
); // add another request handler for the second request
1304 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
1305 var t1
= client
.GetStringAsync ($"http://localhost:{port}/GetString_Many/");
1306 var t2
= client
.GetStringAsync ($"http://localhost:{port}/GetString_Many/");
1307 Assert
.IsTrue (Task
.WaitAll (new [] { t1, t2 }
, WaitTimeout
));
1308 Assert
.AreEqual ("hello", t1
.Result
, "#1");
1309 Assert
.AreEqual ("hello", t2
.Result
, "#2");
1317 #if FEATURE_NO_BSD_SOCKETS
1318 [ExpectedException (typeof (PlatformNotSupportedException
))]
1320 public void GetByteArray_ServerError ()
1322 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/GetByteArray_ServerError/");
1323 AddListenerContext (listener
, l
=> {
1324 var response
= l
.Response
;
1325 response
.StatusCode
= 500;
1326 l
.Response
.OutputStream
.WriteByte (72);
1330 var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ();
1332 client
.GetByteArrayAsync ($"http://localhost:{port}/GetByteArray_ServerError/").Wait (WaitTimeout
);
1334 } catch (AggregateException e
) {
1335 Assert
.That (e
.InnerException
, Is
.InstanceOf
<HttpRequestException
> (), $"#2: {e}");
1343 #if FEATURE_NO_BSD_SOCKETS
1344 [ExpectedException (typeof (PlatformNotSupportedException
))]
1346 public void DisallowAutoRedirect ()
1348 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/DisallowAutoRedirect/");
1349 AddListenerContext (listener
, l
=> {
1350 var request
= l
.Request
;
1351 var response
= l
.Response
;
1353 response
.StatusCode
= (int)HttpStatusCode
.Moved
;
1354 response
.RedirectLocation
= "http://xamarin.com/";
1358 var chandler
= HttpClientTestHelpers
.CreateHttpClientHandler ();
1359 chandler
.AllowAutoRedirect
= false;
1360 var client
= new HttpClient (chandler
);
1363 client
.GetStringAsync ($"http://localhost:{port}/DisallowAutoRedirect/").Wait (WaitTimeout
);
1365 } catch (AggregateException e
) {
1366 Assert
.That (e
.InnerException
, Is
.InstanceOf
<HttpRequestException
> (), $"#2: {e}");
1375 #if FEATURE_NO_BSD_SOCKETS
1376 [ExpectedException (typeof (PlatformNotSupportedException
))]
1378 public void RequestUriAfterRedirect ()
1380 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/RequestUriAfterRedirect/");
1381 var listener2
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int redirectPort
, "/RequestUriAfterRedirect/");
1383 AddListenerContext (listener
, l
=> {
1384 var request
= l
.Request
;
1385 var response
= l
.Response
;
1387 response
.StatusCode
= (int)HttpStatusCode
.Moved
;
1388 response
.RedirectLocation
= $"http://localhost:{redirectPort}/RequestUriAfterRedirect/";
1391 AddListenerContext (listener2
, l
=> {
1392 var response
= l
.Response
;
1394 response
.StatusCode
= (int)HttpStatusCode
.OK
;
1395 response
.OutputStream
.WriteByte (0x68);
1396 response
.OutputStream
.WriteByte (0x65);
1397 response
.OutputStream
.WriteByte (0x6c);
1398 response
.OutputStream
.WriteByte (0x6c);
1399 response
.OutputStream
.WriteByte (0x6f);
1403 var chandler
= HttpClientTestHelpers
.CreateHttpClientHandler ();
1404 chandler
.AllowAutoRedirect
= true;
1405 var client
= new HttpClient (chandler
);
1407 var r
= client
.GetAsync ($"http://localhost:{port}/RequestUriAfterRedirect/");
1408 Assert
.IsTrue (r
.Wait (WaitTimeout
), "#1");
1409 var resp
= r
.Result
;
1410 Assert
.AreEqual ($"http://localhost:{redirectPort}/RequestUriAfterRedirect/", resp
.RequestMessage
.RequestUri
.AbsoluteUri
, "#2");
1411 Assert
.AreEqual ("hello", resp
.Content
.ReadAsStringAsync ().Result
, "#3");
1421 #if FEATURE_NO_BSD_SOCKETS
1422 [ExpectedException (typeof (PlatformNotSupportedException
))]
1425 * Properties may only be modified before sending the first request.
1427 public void ModifyHandlerAfterFirstRequest ()
1429 var chandler
= HttpClientTestHelpers
.CreateHttpClientHandler ();
1430 chandler
.AllowAutoRedirect
= true;
1431 var client
= new HttpClient (chandler
, true);
1433 var listener
= NetworkHelpers
.CreateAndStartHttpListener("http://*:", out int port
, "/ModifyHandlerAfterFirstRequest/");
1434 AddListenerContext (listener
, l
=> {
1435 var response
= l
.Response
;
1436 response
.StatusCode
= 200;
1437 response
.OutputStream
.WriteByte (55);
1441 client
.GetStringAsync ($"http://localhost:{port}/ModifyHandlerAfterFirstRequest/").Wait (WaitTimeout
);
1443 chandler
.AllowAutoRedirect
= false;
1445 } catch (InvalidOperationException
) {
1455 #if FEATURE_NO_BSD_SOCKETS
1456 // Using HttpClientHandler, which indirectly requires BSD sockets.
1457 [ExpectedException (typeof (PlatformNotSupportedException
))]
1460 * However, this policy is not enforced for custom handlers and there
1461 * is also no way a derived class could tell its HttpClientHandler parent
1462 * that it just sent a request.
1465 public void ModifyHandlerAfterFirstRequest_Mock ()
1467 var ch
= new HttpClientHandlerMock ();
1468 ch
.AllowAutoRedirect
= true;
1470 var client
= new HttpClient (ch
);
1472 ch
.OnSend
= (l
) => {
1473 return Task
.FromResult (new HttpResponseMessage ());
1476 client
.GetAsync ("http://xamarin.com").Wait (WaitTimeout
);
1477 ch
.AllowAutoRedirect
= false;
1480 #if !FEATURE_NO_BSD_SOCKETS
1482 // https://github.com/mono/mono/issues/7355
1483 public void WildcardConnect ()
1485 if (HttpClientTestHelpers
.UsingSocketsHandler
)
1486 Assert
.Ignore ("Throws System.NullReferenceException");
1489 using (var client
= HttpClientTestHelpers
.CreateHttpClientWithHttpClientHandler ()) {
1490 client
.GetAsync ("http://255.255.255.255").Wait (WaitTimeout
);
1492 } catch (AggregateException e
) {
1493 Assert
.That (e
.InnerException
, Is
.InstanceOf
<HttpRequestException
> (), "#1");
1494 var rex
= (HttpRequestException
)e
.InnerException
;
1495 Assert
.That (rex
.InnerException
, Is
.InstanceOf
<WebException
> (), "#2");
1496 var wex
= (WebException
)rex
.InnerException
;
1497 Assert
.That (wex
.Status
, Is
.EqualTo (WebExceptionStatus
.ConnectFailure
), "#3");
1502 void AddListenerContext (HttpListener l
, Action
<HttpListenerContext
> contextAssert
)
1504 l
.BeginGetContext (ar
=> {
1505 var ctx
= l
.EndGetContext (ar
);
1508 if (contextAssert
!= null)
1509 contextAssert (ctx
);
1511 ctx
.Response
.Close ();