1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using System.Collections.Generic;
6 using System.Diagnostics;
7 using System.IO;
8 using System.Net.Cache;
9 using System.Net.Http;
10 using System.Net.Test.Common;
11 using System.Runtime.Serialization.Formatters.Binary;
12 using System.Text;
13 using System.Threading;
14 using System.Threading.Tasks;
15 
16 using Xunit;
17 using Xunit.Abstractions;
18 
19 namespace System.Net.Tests
20 {
21     public partial class HttpWebRequestTest : RemoteExecutorTestBase
22     {
23         private const string RequestBody = "This is data to POST.";
24         private readonly byte[] _requestBodyBytes = Encoding.UTF8.GetBytes(RequestBody);
25         private readonly NetworkCredential _explicitCredential = new NetworkCredential("user", "password", "domain");
26         private readonly ITestOutputHelper _output;
27 
28         public static readonly object[][] EchoServers = System.Net.Test.Common.Configuration.Http.EchoServers;
29 
HttpWebRequestTest(ITestOutputHelper output)30         public HttpWebRequestTest(ITestOutputHelper output)
31         {
32             _output = output;
33         }
34 
35         [Theory, MemberData(nameof(EchoServers))]
Ctor_VerifyDefaults_Success(Uri remoteServer)36         public void Ctor_VerifyDefaults_Success(Uri remoteServer)
37         {
38             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
39             Assert.Null(request.Accept);
40             Assert.True(request.AllowAutoRedirect);
41             Assert.False(request.AllowReadStreamBuffering);
42             Assert.True(request.AllowWriteStreamBuffering);
43             Assert.Null(request.ContentType);
44             Assert.Equal(350, request.ContinueTimeout);
45             Assert.NotNull(request.ClientCertificates);
46             Assert.Null(request.CookieContainer);
47             Assert.Null(request.Credentials);
48             Assert.False(request.HaveResponse);
49             Assert.NotNull(request.Headers);
50             Assert.True(request.KeepAlive);
51             Assert.Equal(0, request.Headers.Count);
52             Assert.Equal(HttpVersion.Version11, request.ProtocolVersion);
53             Assert.Equal("GET", request.Method);
54             Assert.Equal(HttpWebRequest.DefaultMaximumResponseHeadersLength, 64);
55             Assert.NotNull(HttpWebRequest.DefaultCachePolicy);
56             Assert.Equal(HttpWebRequest.DefaultCachePolicy.Level, RequestCacheLevel.BypassCache);
57             Assert.Equal(PlatformDetection.IsFullFramework ? 64 : 0, HttpWebRequest.DefaultMaximumErrorResponseLength);
58             Assert.NotNull(request.Proxy);
59             Assert.Equal(remoteServer, request.RequestUri);
60             Assert.True(request.SupportsCookieContainer);
61             Assert.Equal(100000, request.Timeout);
62             Assert.False(request.UseDefaultCredentials);
63         }
64 
65         [Theory, MemberData(nameof(EchoServers))]
Ctor_CreateHttpWithString_ExpectNotNull(Uri remoteServer)66         public void Ctor_CreateHttpWithString_ExpectNotNull(Uri remoteServer)
67         {
68             string remoteServerString = remoteServer.ToString();
69             HttpWebRequest request = WebRequest.CreateHttp(remoteServerString);
70             Assert.NotNull(request);
71         }
72 
73         [Theory, MemberData(nameof(EchoServers))]
Ctor_CreateHttpWithUri_ExpectNotNull(Uri remoteServer)74         public void Ctor_CreateHttpWithUri_ExpectNotNull(Uri remoteServer)
75         {
76             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
77             Assert.NotNull(request);
78         }
79 
80         [Theory, MemberData(nameof(EchoServers))]
Accept_SetThenGetValidValue_ExpectSameValue(Uri remoteServer)81         public void Accept_SetThenGetValidValue_ExpectSameValue(Uri remoteServer)
82         {
83             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
84             string acceptType = "*/*";
85             request.Accept = acceptType;
86             Assert.Equal(acceptType, request.Accept);
87         }
88 
89         [Theory, MemberData(nameof(EchoServers))]
Accept_SetThenGetEmptyValue_ExpectNull(Uri remoteServer)90         public void Accept_SetThenGetEmptyValue_ExpectNull(Uri remoteServer)
91         {
92             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
93             request.Accept = string.Empty;
94             Assert.Null(request.Accept);
95         }
96 
97         [Theory, MemberData(nameof(EchoServers))]
Accept_SetThenGetNullValue_ExpectNull(Uri remoteServer)98         public void Accept_SetThenGetNullValue_ExpectNull(Uri remoteServer)
99         {
100             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
101             request.Accept = null;
102             Assert.Null(request.Accept);
103         }
104 
105         [Theory, MemberData(nameof(EchoServers))]
AllowReadStreamBuffering_SetFalseThenGet_ExpectFalse(Uri remoteServer)106         public void AllowReadStreamBuffering_SetFalseThenGet_ExpectFalse(Uri remoteServer)
107         {
108             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
109             request.AllowReadStreamBuffering = false;
110             Assert.False(request.AllowReadStreamBuffering);
111         }
112 
113         [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "not supported on .NET Framework")]
114         [Theory, MemberData(nameof(EchoServers))]
AllowReadStreamBuffering_SetTrueThenGet_ExpectTrue(Uri remoteServer)115         public void AllowReadStreamBuffering_SetTrueThenGet_ExpectTrue(Uri remoteServer)
116         {
117             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
118             request.AllowReadStreamBuffering = true;
119             Assert.True(request.AllowReadStreamBuffering);
120         }
121 
122         [Theory, MemberData(nameof(EchoServers))]
ContentLength_Get_ExpectSameAsGetResponseStream(Uri remoteServer)123         public async Task ContentLength_Get_ExpectSameAsGetResponseStream(Uri remoteServer)
124         {
125             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
126             using (WebResponse response = await request.GetResponseAsync())
127             using (Stream myStream = response.GetResponseStream())
128             using (StreamReader sr = new StreamReader(myStream))
129             {
130                 string strContent = sr.ReadToEnd();
131                 long length = response.ContentLength;
132                 Assert.Equal(strContent.Length, length);
133             }
134         }
135 
136         [Theory, MemberData(nameof(EchoServers))]
ContentLength_SetNegativeOne_ThrowsArgumentOutOfRangeException(Uri remoteServer)137         public void ContentLength_SetNegativeOne_ThrowsArgumentOutOfRangeException(Uri remoteServer)
138         {
139             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
140             AssertExtensions.Throws<ArgumentOutOfRangeException>("value", () => request.ContentLength = -1);
141         }
142 
143         [Theory, MemberData(nameof(EchoServers))]
ContentLength_SetThenGetOne_Success(Uri remoteServer)144         public void ContentLength_SetThenGetOne_Success(Uri remoteServer)
145         {
146             const int ContentLength = 1;
147             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
148             request.ContentLength = ContentLength;
149             Assert.Equal(ContentLength, request.ContentLength);
150         }
151 
152         [Theory, MemberData(nameof(EchoServers))]
ContentType_SetThenGet_ExpectSameValue(Uri remoteServer)153         public void ContentType_SetThenGet_ExpectSameValue(Uri remoteServer)
154         {
155             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
156             string myContent = "application/x-www-form-urlencoded";
157             request.ContentType = myContent;
158             Assert.Equal(myContent, request.ContentType);
159         }
160 
161         [Theory, MemberData(nameof(EchoServers))]
ContentType_SetThenGetEmptyValue_ExpectNull(Uri remoteServer)162         public void ContentType_SetThenGetEmptyValue_ExpectNull(Uri remoteServer)
163         {
164             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
165             request.ContentType = string.Empty;
166             Assert.Null(request.ContentType);
167         }
168 
169         [Fact]
Headers_SetAfterRequestSubmitted_ThrowsInvalidOperationException()170         public async Task Headers_SetAfterRequestSubmitted_ThrowsInvalidOperationException()
171         {
172             await LoopbackServer.CreateServerAsync(async (server, uri) =>
173             {
174                 HttpWebRequest request = WebRequest.CreateHttp(uri);
175                 Task<WebResponse> getResponse = request.GetResponseAsync();
176                 await LoopbackServer.ReadRequestAndSendResponseAsync(server);
177                 using (WebResponse response = await getResponse)
178                 {
179                     Assert.Throws<InvalidOperationException>(() => request.AutomaticDecompression = DecompressionMethods.Deflate);
180                     Assert.Throws<InvalidOperationException>(() => request.ContentLength = 255);
181                     Assert.Throws<InvalidOperationException>(() => request.ContinueTimeout = 255);
182                     Assert.Throws<InvalidOperationException>(() => request.Host = "localhost");
183                     Assert.Throws<InvalidOperationException>(() => request.MaximumResponseHeadersLength = 255);
184                     Assert.Throws<InvalidOperationException>(() => request.SendChunked = true);
185                     Assert.Throws<InvalidOperationException>(() => request.Proxy = WebRequest.DefaultWebProxy);
186                     Assert.Throws<InvalidOperationException>(() => request.Headers = null);
187                 }
188             });
189         }
190 
191         [Theory, MemberData(nameof(EchoServers))]
MaximumResponseHeadersLength_SetNegativeTwo_ThrowsArgumentOutOfRangeException(Uri remoteServer)192         public void MaximumResponseHeadersLength_SetNegativeTwo_ThrowsArgumentOutOfRangeException(Uri remoteServer)
193         {
194             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
195             AssertExtensions.Throws<ArgumentOutOfRangeException>("value", () => request.MaximumResponseHeadersLength = -2);
196         }
197 
198         [Theory, MemberData(nameof(EchoServers))]
MaximumResponseHeadersLength_SetThenGetNegativeOne_Success(Uri remoteServer)199         public void MaximumResponseHeadersLength_SetThenGetNegativeOne_Success(Uri remoteServer)
200         {
201             const int MaximumResponseHeaderLength = -1;
202             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
203             request.MaximumResponseHeadersLength = MaximumResponseHeaderLength;
204             Assert.Equal(MaximumResponseHeaderLength, request.MaximumResponseHeadersLength);
205         }
206 
207         [Theory, MemberData(nameof(EchoServers))]
MaximumAutomaticRedirections_SetZeroOrNegative_ThrowsArgumentException(Uri remoteServer)208         public void MaximumAutomaticRedirections_SetZeroOrNegative_ThrowsArgumentException(Uri remoteServer)
209         {
210             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
211             AssertExtensions.Throws<ArgumentException>("value", () => request.MaximumAutomaticRedirections = 0);
212             AssertExtensions.Throws<ArgumentException>("value", () => request.MaximumAutomaticRedirections = -1);
213         }
214 
215         [Theory, MemberData(nameof(EchoServers))]
MaximumAutomaticRedirections_SetThenGetOne_Success(Uri remoteServer)216         public void MaximumAutomaticRedirections_SetThenGetOne_Success(Uri remoteServer)
217         {
218             const int MaximumAutomaticRedirections = 1;
219             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
220             request.MaximumAutomaticRedirections = MaximumAutomaticRedirections;
221             Assert.Equal(MaximumAutomaticRedirections, request.MaximumAutomaticRedirections);
222         }
223 
224         [Theory, MemberData(nameof(EchoServers))]
ContinueTimeout_SetThenGetZero_ExpectZero(Uri remoteServer)225         public void ContinueTimeout_SetThenGetZero_ExpectZero(Uri remoteServer)
226         {
227             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
228             request.ContinueTimeout = 0;
229             Assert.Equal(0, request.ContinueTimeout);
230         }
231 
232         [Theory, MemberData(nameof(EchoServers))]
ContinueTimeout_SetNegativeOne_Success(Uri remoteServer)233         public void ContinueTimeout_SetNegativeOne_Success(Uri remoteServer)
234         {
235             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
236             request.ContinueTimeout = -1;
237         }
238 
239         [Theory, MemberData(nameof(EchoServers))]
ContinueTimeout_SetNegativeTwo_ThrowsArgumentOutOfRangeException(Uri remoteServer)240         public void ContinueTimeout_SetNegativeTwo_ThrowsArgumentOutOfRangeException(Uri remoteServer)
241         {
242             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
243             AssertExtensions.Throws<ArgumentOutOfRangeException>("value", () => request.ContinueTimeout = -2);
244         }
245 
246         [Theory, MemberData(nameof(EchoServers))]
Timeout_SetThenGetZero_ExpectZero(Uri remoteServer)247         public void Timeout_SetThenGetZero_ExpectZero(Uri remoteServer)
248         {
249             const int Timeout = 0;
250             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
251             request.Timeout = Timeout;
252             Assert.Equal(Timeout, request.Timeout);
253         }
254 
255         [Theory, MemberData(nameof(EchoServers))]
Timeout_SetNegativeOne_Success(Uri remoteServer)256         public void Timeout_SetNegativeOne_Success(Uri remoteServer)
257         {
258             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
259             request.Timeout = -1;
260         }
261 
262         [Theory, MemberData(nameof(EchoServers))]
Timeout_SetNegativeTwo_ThrowsArgumentOutOfRangeException(Uri remoteServer)263         public void Timeout_SetNegativeTwo_ThrowsArgumentOutOfRangeException(Uri remoteServer)
264         {
265             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
266             AssertExtensions.Throws<ArgumentOutOfRangeException>("value", () => request.Timeout = -2);
267         }
268 
269         [Theory, MemberData(nameof(EchoServers))]
TimeOut_SetThenGet_ValuesMatch(Uri remoteServer)270         public void TimeOut_SetThenGet_ValuesMatch(Uri remoteServer)
271         {
272             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
273             request.Timeout = 100;
274             Assert.Equal(100, request.Timeout);
275 
276             request.Timeout = Threading.Timeout.Infinite;
277             Assert.Equal(Threading.Timeout.Infinite, request.Timeout);
278 
279             request.Timeout = int.MaxValue;
280             Assert.Equal(int.MaxValue, request.Timeout);
281         }
282 
283         [ActiveIssue(22627)]
284         [Fact]
Timeout_SetTenMillisecondsOnLoopback_ThrowsWebException()285         public async Task Timeout_SetTenMillisecondsOnLoopback_ThrowsWebException()
286         {
287             await LoopbackServer.CreateServerAsync((server, url) =>
288             {
289                 HttpWebRequest request = WebRequest.CreateHttp(url);
290                 request.Timeout = 10; // ms.
291 
292                 var sw = Stopwatch.StartNew();
293                 WebException exception = Assert.Throws<WebException>(() => request.GetResponse());
294                 sw.Stop();
295 
296                 Assert.InRange(sw.ElapsedMilliseconds, 1, 15 * 1000);
297                 Assert.Equal(WebExceptionStatus.Timeout, exception.Status);
298                 Assert.Equal(null, exception.InnerException);
299                 Assert.Equal(null, exception.Response);
300 
301                 return Task.FromResult<object>(null);
302             });
303         }
304 
305         [Theory, MemberData(nameof(EchoServers))]
Address_CtorAddress_ValuesMatch(Uri remoteServer)306         public void Address_CtorAddress_ValuesMatch(Uri remoteServer)
307         {
308             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
309             Assert.Equal(remoteServer, request.Address);
310         }
311 
312         [Theory, MemberData(nameof(EchoServers))]
UserAgent_SetThenGetWindows_ValuesMatch(Uri remoteServer)313         public void UserAgent_SetThenGetWindows_ValuesMatch(Uri remoteServer)
314         {
315             const string UserAgent = "Windows";
316             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
317             request.UserAgent = UserAgent;
318             Assert.Equal(UserAgent, request.UserAgent);
319         }
320 
321         [Theory, MemberData(nameof(EchoServers))]
Host_SetNullValue_ThrowsArgumentNullException(Uri remoteServer)322         public void Host_SetNullValue_ThrowsArgumentNullException(Uri remoteServer)
323         {
324             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
325             AssertExtensions.Throws<ArgumentNullException>("value", null, () => request.Host = null);
326         }
327 
328         [Theory, MemberData(nameof(EchoServers))]
Host_SetSlash_ThrowsArgumentException(Uri remoteServer)329         public void Host_SetSlash_ThrowsArgumentException(Uri remoteServer)
330         {
331             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
332             AssertExtensions.Throws<ArgumentException>("value", null, () => request.Host = "/localhost");
333         }
334 
335         [Theory, MemberData(nameof(EchoServers))]
Host_SetInvalidUri_ThrowsArgumentException(Uri remoteServer)336         public void Host_SetInvalidUri_ThrowsArgumentException(Uri remoteServer)
337         {
338             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
339             AssertExtensions.Throws<ArgumentException>("value", null, () => request.Host = "NoUri+-*");
340         }
341 
342         [Theory, MemberData(nameof(EchoServers))]
Host_SetThenGetCustomUri_ValuesMatch(Uri remoteServer)343         public void Host_SetThenGetCustomUri_ValuesMatch(Uri remoteServer)
344         {
345             const string Host = "localhost";
346             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
347             request.Host = Host;
348             Assert.Equal(Host, request.Host);
349         }
350 
351         [Theory, MemberData(nameof(EchoServers))]
Host_SetThenGetCustomUriWithPort_ValuesMatch(Uri remoteServer)352         public void Host_SetThenGetCustomUriWithPort_ValuesMatch(Uri remoteServer)
353         {
354             const string Host = "localhost:8080";
355             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
356             request.Host = Host;
357             Assert.Equal(Host, request.Host);
358         }
359 
360         [Theory, MemberData(nameof(EchoServers))]
Host_GetDefaultHostSameAsAddress_ValuesMatch(Uri remoteServer)361         public void Host_GetDefaultHostSameAsAddress_ValuesMatch(Uri remoteServer)
362         {
363             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
364             Assert.Equal(remoteServer.Host, request.Host);
365         }
366 
367         [Theory]
368         [InlineData("https://microsoft.com:8080")]
Host_GetDefaultHostWithCustomPortSameAsAddress_ValuesMatch(string endpoint)369         public void Host_GetDefaultHostWithCustomPortSameAsAddress_ValuesMatch(string endpoint)
370         {
371             Uri endpointUri = new Uri(endpoint);
372             HttpWebRequest request = WebRequest.CreateHttp(endpointUri);
373             Assert.Equal(endpointUri.Host + ":" + endpointUri.Port, request.Host);
374         }
375 
376         [Theory, MemberData(nameof(EchoServers))]
Pipelined_SetThenGetBoolean_ValuesMatch(Uri remoteServer)377         public void Pipelined_SetThenGetBoolean_ValuesMatch(Uri remoteServer)
378         {
379             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
380             request.Pipelined = true;
381             Assert.True(request.Pipelined);
382             request.Pipelined = false;
383             Assert.False(request.Pipelined);
384         }
385 
386         [Theory, MemberData(nameof(EchoServers))]
Referer_SetThenGetReferer_ValuesMatch(Uri remoteServer)387         public void Referer_SetThenGetReferer_ValuesMatch(Uri remoteServer)
388         {
389             const string Referer = "Referer";
390             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
391             request.Referer = Referer;
392             Assert.Equal(Referer, request.Referer);
393         }
394 
395         [Theory, MemberData(nameof(EchoServers))]
TransferEncoding_NullOrWhiteSpace_ValuesMatch(Uri remoteServer)396         public void TransferEncoding_NullOrWhiteSpace_ValuesMatch(Uri remoteServer)
397         {
398             const string TransferEncoding = "xml";
399             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
400             request.SendChunked = true;
401             request.TransferEncoding = TransferEncoding;
402             Assert.Equal(TransferEncoding, request.TransferEncoding);
403             request.TransferEncoding = null;
404             Assert.Equal(null, request.TransferEncoding);
405         }
406 
407         [Theory, MemberData(nameof(EchoServers))]
TransferEncoding_SetChunked_ThrowsArgumentException(Uri remoteServer)408         public void TransferEncoding_SetChunked_ThrowsArgumentException(Uri remoteServer)
409         {
410             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
411             AssertExtensions.Throws<ArgumentException>("value", () => request.TransferEncoding = "chunked");
412         }
413 
414         [Theory, MemberData(nameof(EchoServers))]
TransferEncoding_SetWithSendChunkedFalse_ThrowsInvalidOperationException(Uri remoteServer)415         public void TransferEncoding_SetWithSendChunkedFalse_ThrowsInvalidOperationException(Uri remoteServer)
416         {
417             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
418             Assert.Throws<InvalidOperationException>(() => request.TransferEncoding = "xml");
419         }
420 
421         [Theory, MemberData(nameof(EchoServers))]
KeepAlive_SetThenGetBoolean_ValuesMatch(Uri remoteServer)422         public void KeepAlive_SetThenGetBoolean_ValuesMatch(Uri remoteServer)
423         {
424             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
425             request.KeepAlive = true;
426             Assert.True(request.KeepAlive);
427             request.KeepAlive = false;
428             Assert.False(request.KeepAlive);
429         }
430 
431         [Theory]
432         [InlineData(null)]
433         [InlineData(false)]
434         [InlineData(true)]
435         [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "dotnet/corefx #19225")]
436         public void KeepAlive_CorrectConnectionHeaderSent(bool? keepAlive)
437         {
438             HttpWebRequest request = WebRequest.CreateHttp(Test.Common.Configuration.Http.RemoteEchoServer);
439 
440             if (keepAlive.HasValue)
441             {
442                 request.KeepAlive = keepAlive.Value;
443             }
444 
445             using (var response = (HttpWebResponse)request.GetResponse())
446             using (var body = new StreamReader(response.GetResponseStream()))
447             {
448                 string content = body.ReadToEnd();
449                 if (!keepAlive.HasValue || keepAlive.Value)
450                 {
451                     // Validate that the request doesn't contain Connection: "close", but we can't validate
452                     // that it does contain Connection: "keep-alive", as that's optional as of HTTP 1.1.
453                     Assert.DoesNotContain("\"Connection\": \"close\"", content, StringComparison.OrdinalIgnoreCase);
454                 }
455                 else
456                 {
457                     Assert.Contains("\"Connection\": \"close\"", content, StringComparison.OrdinalIgnoreCase);
458                     Assert.DoesNotContain("\"Keep-Alive\"", content, StringComparison.OrdinalIgnoreCase);
459                 }
460             }
461         }
462 
463         [Theory, MemberData(nameof(EchoServers))]
AutomaticDecompression_SetAndGetDeflate_ValuesMatch(Uri remoteServer)464         public void AutomaticDecompression_SetAndGetDeflate_ValuesMatch(Uri remoteServer)
465         {
466             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
467             request.AutomaticDecompression = DecompressionMethods.Deflate;
468             Assert.Equal(DecompressionMethods.Deflate, request.AutomaticDecompression);
469         }
470 
471         [Theory, MemberData(nameof(EchoServers))]
AllowWriteStreamBuffering_SetAndGetBoolean_ValuesMatch(Uri remoteServer)472         public void AllowWriteStreamBuffering_SetAndGetBoolean_ValuesMatch(Uri remoteServer)
473         {
474             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
475             request.AllowWriteStreamBuffering = true;
476             Assert.True(request.AllowWriteStreamBuffering);
477             request.AllowWriteStreamBuffering = false;
478             Assert.False(request.AllowWriteStreamBuffering);
479         }
480 
481         [Theory, MemberData(nameof(EchoServers))]
AllowAutoRedirect_SetAndGetBoolean_ValuesMatch(Uri remoteServer)482         public void AllowAutoRedirect_SetAndGetBoolean_ValuesMatch(Uri remoteServer)
483         {
484             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
485             request.AllowAutoRedirect = true;
486             Assert.True(request.AllowAutoRedirect);
487             request.AllowAutoRedirect = false;
488             Assert.False(request.AllowAutoRedirect);
489         }
490 
491         [Fact]
ConnectionGroupName_SetAndGetGroup_ValuesMatch()492         public void ConnectionGroupName_SetAndGetGroup_ValuesMatch()
493         {
494             // Note: In CoreFX changing this value will not have any effect on HTTP stack's behavior.
495             //       For app-compat reasons we allow applications to alter and read the property.
496             HttpWebRequest request = WebRequest.CreateHttp("http://test");
497             Assert.Null(request.ConnectionGroupName);
498             request.ConnectionGroupName = "Group";
499             Assert.Equal("Group", request.ConnectionGroupName);
500         }
501 
502         [Theory, MemberData(nameof(EchoServers))]
PreAuthenticate_SetAndGetBoolean_ValuesMatch(Uri remoteServer)503         public void PreAuthenticate_SetAndGetBoolean_ValuesMatch(Uri remoteServer)
504         {
505             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
506             request.PreAuthenticate = true;
507             Assert.True(request.PreAuthenticate);
508             request.PreAuthenticate = false;
509             Assert.False(request.PreAuthenticate);
510         }
511 
512         [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "dotnet/corefx #19225")]
513         [Theory, MemberData(nameof(EchoServers))]
PreAuthenticate_SetAndGetBooleanResponse_ValuesMatch(Uri remoteServer)514         public void PreAuthenticate_SetAndGetBooleanResponse_ValuesMatch(Uri remoteServer)
515         {
516             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
517             request.PreAuthenticate = true;
518             using (var response = (HttpWebResponse)request.GetResponse())
519             {
520                 Assert.True(request.PreAuthenticate);
521             }
522         }
523 
524         [Theory, MemberData(nameof(EchoServers))]
Connection_NullOrWhiteSpace_ValuesMatch(Uri remoteServer)525         public void Connection_NullOrWhiteSpace_ValuesMatch(Uri remoteServer)
526         {
527             const string Connection = "connect";
528             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
529             request.Connection = Connection;
530             Assert.Equal(Connection, request.Connection);
531             request.Connection = null;
532             Assert.Equal(null, request.Connection);
533         }
534 
535         [Theory, MemberData(nameof(EchoServers))]
Connection_SetKeepAliveAndClose_ThrowsArgumentException(Uri remoteServer)536         public void Connection_SetKeepAliveAndClose_ThrowsArgumentException(Uri remoteServer)
537         {
538             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
539             AssertExtensions.Throws<ArgumentException>("value", () => request.Connection = "keep-alive");
540             AssertExtensions.Throws<ArgumentException>("value", () => request.Connection = "close");
541         }
542 
543         [Theory, MemberData(nameof(EchoServers))]
Expect_SetNullOrWhiteSpace_ValuesMatch(Uri remoteServer)544         public void Expect_SetNullOrWhiteSpace_ValuesMatch(Uri remoteServer)
545         {
546             const string Expect = "101-go";
547             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
548             request.Expect = Expect;
549             Assert.Equal(Expect, request.Expect);
550             request.Expect = null;
551             Assert.Equal(null, request.Expect);
552         }
553 
554         [Theory, MemberData(nameof(EchoServers))]
Expect_Set100Continue_ThrowsArgumentException(Uri remoteServer)555         public void Expect_Set100Continue_ThrowsArgumentException(Uri remoteServer)
556         {
557             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
558             AssertExtensions.Throws<ArgumentException>("value", () => request.Expect = "100-continue");
559         }
560 
561         [Fact]
DefaultMaximumResponseHeadersLength_SetAndGetLength_ValuesMatch()562         public void DefaultMaximumResponseHeadersLength_SetAndGetLength_ValuesMatch()
563         {
564             RemoteInvoke(() =>
565             {
566                 int defaultMaximumResponseHeadersLength = HttpWebRequest.DefaultMaximumResponseHeadersLength;
567                 const int NewDefaultMaximumResponseHeadersLength = 255;
568 
569                 try
570                 {
571                     HttpWebRequest.DefaultMaximumResponseHeadersLength = NewDefaultMaximumResponseHeadersLength;
572                     Assert.Equal(NewDefaultMaximumResponseHeadersLength, HttpWebRequest.DefaultMaximumResponseHeadersLength);
573                 }
574                 finally
575                 {
576                     HttpWebRequest.DefaultMaximumResponseHeadersLength = defaultMaximumResponseHeadersLength;
577                 }
578 
579                 return SuccessExitCode;
580             }).Dispose();
581         }
582 
583         [Fact]
DefaultMaximumErrorResponseLength_SetAndGetLength_ValuesMatch()584         public void DefaultMaximumErrorResponseLength_SetAndGetLength_ValuesMatch()
585         {
586             RemoteInvoke(() =>
587             {
588                 int defaultMaximumErrorsResponseLength = HttpWebRequest.DefaultMaximumErrorResponseLength;
589                 const int NewDefaultMaximumErrorsResponseLength = 255;
590 
591                 try
592                 {
593                     HttpWebRequest.DefaultMaximumErrorResponseLength = NewDefaultMaximumErrorsResponseLength;
594                     Assert.Equal(NewDefaultMaximumErrorsResponseLength, HttpWebRequest.DefaultMaximumErrorResponseLength);
595                 }
596                 finally
597                 {
598                     HttpWebRequest.DefaultMaximumErrorResponseLength = defaultMaximumErrorsResponseLength;
599                 }
600 
601                 return SuccessExitCode;
602             }).Dispose();
603         }
604 
605         [Fact]
DefaultCachePolicy_SetAndGetPolicyReload_ValuesMatch()606         public void DefaultCachePolicy_SetAndGetPolicyReload_ValuesMatch()
607         {
608             RemoteInvoke(() =>
609             {
610                 RequestCachePolicy requestCachePolicy = HttpWebRequest.DefaultCachePolicy;
611 
612                 try
613                 {
614                     RequestCachePolicy newRequestCachePolicy = new RequestCachePolicy(RequestCacheLevel.Reload);
615                     HttpWebRequest.DefaultCachePolicy = newRequestCachePolicy;
616                     Assert.Equal(newRequestCachePolicy.Level, HttpWebRequest.DefaultCachePolicy.Level);
617                 }
618                 finally
619                 {
620                     HttpWebRequest.DefaultCachePolicy = requestCachePolicy;
621                 }
622 
623                 return SuccessExitCode;
624             }).Dispose();
625         }
626 
627         [Theory, MemberData(nameof(EchoServers))]
IfModifiedSince_SetMinDateAfterValidDate_ValuesMatch(Uri remoteServer)628         public void IfModifiedSince_SetMinDateAfterValidDate_ValuesMatch(Uri remoteServer)
629         {
630             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
631 
632             DateTime newIfModifiedSince = new DateTime(2000, 1, 1);
633             request.IfModifiedSince = newIfModifiedSince;
634             Assert.Equal(newIfModifiedSince, request.IfModifiedSince);
635 
636             DateTime ifModifiedSince = DateTime.MinValue;
637             request.IfModifiedSince = ifModifiedSince;
638             Assert.Equal(ifModifiedSince, request.IfModifiedSince);
639         }
640 
641         [Theory, MemberData(nameof(EchoServers))]
Date_SetMinDateAfterValidDate_ValuesMatch(Uri remoteServer)642         public void Date_SetMinDateAfterValidDate_ValuesMatch(Uri remoteServer)
643         {
644             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
645 
646             DateTime newDate = new DateTime(2000, 1, 1);
647             request.Date = newDate;
648             Assert.Equal(newDate, request.Date);
649 
650             DateTime date = DateTime.MinValue;
651             request.Date = date;
652             Assert.Equal(date, request.Date);
653         }
654 
655         [Theory, MemberData(nameof(EchoServers))]
SendChunked_SetAndGetBoolean_ValuesMatch(Uri remoteServer)656         public void SendChunked_SetAndGetBoolean_ValuesMatch(Uri remoteServer)
657         {
658             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
659             request.SendChunked = true;
660             Assert.True(request.SendChunked);
661             request.SendChunked = false;
662             Assert.False(request.SendChunked);
663         }
664 
665         [Theory, MemberData(nameof(EchoServers))]
ContinueDelegate_SetNullDelegate_Success(Uri remoteServer)666         public void ContinueDelegate_SetNullDelegate_Success(Uri remoteServer)
667         {
668             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
669             request.ContinueDelegate = null;
670         }
671 
672         [Theory, MemberData(nameof(EchoServers))]
ContinueDelegate_SetDelegateThenGet_ValuesSame(Uri remoteServer)673         public void ContinueDelegate_SetDelegateThenGet_ValuesSame(Uri remoteServer)
674         {
675             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
676             HttpContinueDelegate continueDelegate = new HttpContinueDelegate((a, b) => { });
677             request.ContinueDelegate = continueDelegate;
678             Assert.Same(continueDelegate, request.ContinueDelegate);
679         }
680 
681         [Theory, MemberData(nameof(EchoServers))]
ServicePoint_GetValue_ExpectedResult(Uri remoteServer)682         public void ServicePoint_GetValue_ExpectedResult(Uri remoteServer)
683         {
684             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
685             if (PlatformDetection.IsFullFramework)
686             {
687                 Assert.NotNull(request.ServicePoint);
688             }
689             else
690             {
691                 Assert.Throws<PlatformNotSupportedException>(() => request.ServicePoint);
692             }
693         }
694 
695         [Theory, MemberData(nameof(EchoServers))]
ServerCertificateValidationCallback_SetCallbackThenGet_ValuesSame(Uri remoteServer)696         public void ServerCertificateValidationCallback_SetCallbackThenGet_ValuesSame(Uri remoteServer)
697         {
698             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
699             var serverCertificateVallidationCallback = new Security.RemoteCertificateValidationCallback((a, b, c, d) => true);
700             request.ServerCertificateValidationCallback = serverCertificateVallidationCallback;
701             Assert.Same(serverCertificateVallidationCallback, request.ServerCertificateValidationCallback);
702         }
703 
704         [Theory, MemberData(nameof(EchoServers))]
ClientCertificates_SetNullX509_ThrowsArgumentNullException(Uri remoteServer)705         public void ClientCertificates_SetNullX509_ThrowsArgumentNullException(Uri remoteServer)
706         {
707             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
708             AssertExtensions.Throws<ArgumentNullException>("value", () => request.ClientCertificates = null);
709         }
710 
711         [Theory, MemberData(nameof(EchoServers))]
ClientCertificates_SetThenGetX509_ValuesSame(Uri remoteServer)712         public void ClientCertificates_SetThenGetX509_ValuesSame(Uri remoteServer)
713         {
714             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
715             var certificateCollection = new System.Security.Cryptography.X509Certificates.X509CertificateCollection();
716             request.ClientCertificates = certificateCollection;
717             Assert.Same(certificateCollection, request.ClientCertificates);
718         }
719 
720         [Theory, MemberData(nameof(EchoServers))]
ProtocolVersion_SetInvalidHttpVersion_ThrowsArgumentException(Uri remoteServer)721         public void ProtocolVersion_SetInvalidHttpVersion_ThrowsArgumentException(Uri remoteServer)
722         {
723             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
724             AssertExtensions.Throws<ArgumentException>("value", () => request.ProtocolVersion = new Version());
725         }
726 
727         [Theory, MemberData(nameof(EchoServers))]
ProtocolVersion_SetThenGetHttpVersions_ValuesMatch(Uri remoteServer)728         public void ProtocolVersion_SetThenGetHttpVersions_ValuesMatch(Uri remoteServer)
729         {
730             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
731 
732             request.ProtocolVersion = HttpVersion.Version10;
733             Assert.Equal(HttpVersion.Version10, request.ProtocolVersion);
734 
735             request.ProtocolVersion = HttpVersion.Version11;
736             Assert.Equal(HttpVersion.Version11, request.ProtocolVersion);
737         }
738 
739         [SkipOnTargetFramework(TargetFrameworkMonikers.Uap, "UAP does not allow HTTP/1.0 requests.")]
740         [OuterLoop]
741         [Theory]
742         [InlineData(false)]
743         [InlineData(true)]
ProtocolVersion_SetThenSendRequest_CorrectHttpRequestVersionSent(bool isVersion10)744         public async Task ProtocolVersion_SetThenSendRequest_CorrectHttpRequestVersionSent(bool isVersion10)
745         {
746             Version requestVersion = isVersion10 ? HttpVersion.Version10 : HttpVersion.Version11;
747             Version receivedRequestVersion = null;
748 
749             await LoopbackServer.CreateServerAsync(async (server, url) =>
750             {
751                 HttpWebRequest request = WebRequest.CreateHttp(url);
752                 request.ProtocolVersion = requestVersion;
753 
754                 Task<WebResponse> getResponse = request.GetResponseAsync();
755                 Task<List<string>> serverTask = LoopbackServer.ReadRequestAndSendResponseAsync(server);
756 
757                 using (HttpWebResponse response = (HttpWebResponse) await getResponse)
758                 {
759                     Assert.Equal(HttpStatusCode.OK, response.StatusCode);
760                 }
761 
762                 List<string> receivedRequest = await serverTask;
763                 string statusLine = receivedRequest[0];
764                 if (statusLine.Contains("/1.0"))
765                 {
766                     receivedRequestVersion = HttpVersion.Version10;
767                 }
768                 else if (statusLine.Contains("/1.1"))
769                 {
770                     receivedRequestVersion = HttpVersion.Version11;
771                 }
772             });
773 
774             Assert.Equal(requestVersion, receivedRequestVersion);
775         }
776 
777         [Fact]
ReadWriteTimeout_SetThenGet_ValuesMatch()778         public void ReadWriteTimeout_SetThenGet_ValuesMatch()
779         {
780             // Note: In CoreFX changing this value will not have any effect on HTTP stack's behavior.
781             //       For app-compat reasons we allow applications to alter and read the property.
782             HttpWebRequest request = WebRequest.CreateHttp("http://test");
783             request.ReadWriteTimeout = 5;
784             Assert.Equal(5, request.ReadWriteTimeout);
785         }
786 
787         [Fact]
ReadWriteTimeout_InfiniteValue_Ok()788         public void ReadWriteTimeout_InfiniteValue_Ok()
789         {
790             HttpWebRequest request = WebRequest.CreateHttp("http://test");
791             request.ReadWriteTimeout = Timeout.Infinite;
792         }
793 
794         [Fact]
ReadWriteTimeout_NegativeOrZeroValue_Fail()795         public void ReadWriteTimeout_NegativeOrZeroValue_Fail()
796         {
797             HttpWebRequest request = WebRequest.CreateHttp("http://test");
798             Assert.Throws<ArgumentOutOfRangeException>(() => { request.ReadWriteTimeout = 0; });
799             Assert.Throws<ArgumentOutOfRangeException>(() => { request.ReadWriteTimeout = -10; });
800         }
801 
802         [Theory, MemberData(nameof(EchoServers))]
CookieContainer_SetThenGetContainer_Success(Uri remoteServer)803         public void CookieContainer_SetThenGetContainer_Success(Uri remoteServer)
804         {
805             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
806             request.CookieContainer = null;
807             var cookieContainer = new CookieContainer();
808             request.CookieContainer = cookieContainer;
809             Assert.Same(cookieContainer, request.CookieContainer);
810         }
811 
812         [Theory, MemberData(nameof(EchoServers))]
Credentials_SetDefaultCredentialsThenGet_ValuesMatch(Uri remoteServer)813         public void Credentials_SetDefaultCredentialsThenGet_ValuesMatch(Uri remoteServer)
814         {
815             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
816             request.Credentials = CredentialCache.DefaultCredentials;
817             Assert.Equal(CredentialCache.DefaultCredentials, request.Credentials);
818         }
819 
820         [Theory, MemberData(nameof(EchoServers))]
Credentials_SetExplicitCredentialsThenGet_ValuesMatch(Uri remoteServer)821         public void Credentials_SetExplicitCredentialsThenGet_ValuesMatch(Uri remoteServer)
822         {
823             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
824             request.Credentials = _explicitCredential;
825             Assert.Equal(_explicitCredential, request.Credentials);
826         }
827 
828         [Theory, MemberData(nameof(EchoServers))]
UseDefaultCredentials_SetTrue_CredentialsEqualsDefaultCredentials(Uri remoteServer)829         public void UseDefaultCredentials_SetTrue_CredentialsEqualsDefaultCredentials(Uri remoteServer)
830         {
831             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
832             request.Credentials = _explicitCredential;
833             request.UseDefaultCredentials = true;
834             Assert.Equal(CredentialCache.DefaultCredentials, request.Credentials);
835         }
836 
837         [Theory, MemberData(nameof(EchoServers))]
UseDefaultCredentials_SetFalse_CredentialsNull(Uri remoteServer)838         public void UseDefaultCredentials_SetFalse_CredentialsNull(Uri remoteServer)
839         {
840             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
841             request.Credentials = _explicitCredential;
842             request.UseDefaultCredentials = false;
843             Assert.Equal(null, request.Credentials);
844         }
845 
846         [OuterLoop]
847         [Theory]
848         [MemberData(nameof(EchoServers))]
UseDefaultCredentials_SetGetResponse_ExpectSuccess(Uri remoteServer)849         public void UseDefaultCredentials_SetGetResponse_ExpectSuccess(Uri remoteServer)
850         {
851             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
852             request.UseDefaultCredentials = true;
853             WebResponse response = request.GetResponse();
854             response.Dispose();
855         }
856 
857         [Theory, MemberData(nameof(EchoServers))]
BeginGetRequestStream_UseGETVerb_ThrowsProtocolViolationException(Uri remoteServer)858         public void BeginGetRequestStream_UseGETVerb_ThrowsProtocolViolationException(Uri remoteServer)
859         {
860             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
861             Assert.Throws<ProtocolViolationException>(() =>
862             {
863                 request.BeginGetRequestStream(null, null);
864             });
865         }
866 
867         [Theory, MemberData(nameof(EchoServers))]
BeginGetRequestStream_UseHEADVerb_ThrowsProtocolViolationException(Uri remoteServer)868         public void BeginGetRequestStream_UseHEADVerb_ThrowsProtocolViolationException(Uri remoteServer)
869         {
870             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
871             request.Method = HttpMethod.Head.Method;
872             Assert.Throws<ProtocolViolationException>(() =>
873             {
874                 request.BeginGetRequestStream(null, null);
875             });
876         }
877 
878         [Theory, MemberData(nameof(EchoServers))]
BeginGetRequestStream_UseCONNECTVerb_ThrowsProtocolViolationException(Uri remoteServer)879         public void BeginGetRequestStream_UseCONNECTVerb_ThrowsProtocolViolationException(Uri remoteServer)
880         {
881             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
882             request.Method = "CONNECT";
883             Assert.Throws<ProtocolViolationException>(() =>
884             {
885                 request.BeginGetRequestStream(null, null);
886             });
887         }
888 
889         [Theory, MemberData(nameof(EchoServers))]
BeginGetRequestStream_CreatePostRequestThenAbort_ThrowsWebException(Uri remoteServer)890         public void BeginGetRequestStream_CreatePostRequestThenAbort_ThrowsWebException(Uri remoteServer)
891         {
892             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
893             request.Method = HttpMethod.Post.Method;
894             request.Abort();
895             WebException ex = Assert.Throws<WebException>(() => request.BeginGetRequestStream(null, null));
896             Assert.Equal(WebExceptionStatus.RequestCanceled, ex.Status);
897         }
898 
899         [Theory, MemberData(nameof(EchoServers))]
900         [SkipOnTargetFramework(TargetFrameworkMonikers.Mono, "no exception thrown on mono")]
901         [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "no exception thrown on netfx")]
BeginGetRequestStream_CreatePostRequestThenCallTwice_ThrowsInvalidOperationException(Uri remoteServer)902         public void BeginGetRequestStream_CreatePostRequestThenCallTwice_ThrowsInvalidOperationException(Uri remoteServer)
903         {
904             HttpWebRequest request = HttpWebRequest.CreateHttp(remoteServer);
905             request.Method = "POST";
906 
907             IAsyncResult asyncResult = request.BeginGetRequestStream(null, null);
908             Assert.Throws<InvalidOperationException>(() =>
909             {
910                 request.BeginGetRequestStream(null, null);
911             });
912         }
913 
914         [Theory, MemberData(nameof(EchoServers))]
BeginGetRequestStream_CreateRequestThenBeginGetResponsePrior_ThrowsProtocolViolationException(Uri remoteServer)915         public void BeginGetRequestStream_CreateRequestThenBeginGetResponsePrior_ThrowsProtocolViolationException(Uri remoteServer)
916         {
917             HttpWebRequest request = HttpWebRequest.CreateHttp(remoteServer);
918 
919             IAsyncResult asyncResult = request.BeginGetResponse(null, null);
920             Assert.Throws<ProtocolViolationException>(() =>
921             {
922                 request.BeginGetRequestStream(null, null);
923             });
924         }
925 
BeginGetResponse_CreateRequestThenCallTwice_ThrowsInvalidOperationException()926         public async Task BeginGetResponse_CreateRequestThenCallTwice_ThrowsInvalidOperationException()
927         {
928             await LoopbackServer.CreateServerAsync((server, url) =>
929             {
930                 HttpWebRequest request = WebRequest.CreateHttp(url);
931                 IAsyncResult asyncResult = request.BeginGetResponse(null, null);
932                 Assert.Throws<InvalidOperationException>(() => request.BeginGetResponse(null, null));
933                 return Task.FromResult<object>(null);
934             });
935         }
936 
937         [Theory, MemberData(nameof(EchoServers))]
BeginGetResponse_CreatePostRequestThenAbort_ThrowsWebException(Uri remoteServer)938         public void BeginGetResponse_CreatePostRequestThenAbort_ThrowsWebException(Uri remoteServer)
939         {
940             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
941             request.Method = HttpMethod.Post.Method;
942             request.Abort();
943             WebException ex = Assert.Throws<WebException>(() => request.BeginGetResponse(null, null));
944             Assert.Equal(WebExceptionStatus.RequestCanceled, ex.Status);
945         }
946 
GetRequestStreamAsync_WriteAndDisposeRequestStreamThenOpenRequestStream_ThrowsArgumentException()947         public async Task GetRequestStreamAsync_WriteAndDisposeRequestStreamThenOpenRequestStream_ThrowsArgumentException()
948         {
949             await LoopbackServer.CreateServerAsync(async (server, url) =>
950             {
951                 HttpWebRequest request = WebRequest.CreateHttp(url);
952                 request.Method = HttpMethod.Post.Method;
953                 using (Stream requestStream = await request.GetRequestStreamAsync())
954                 {
955                     requestStream.Write(_requestBodyBytes, 0, _requestBodyBytes.Length);
956                     AssertExtensions.Throws<ArgumentException>(null, () => new StreamReader(requestStream));
957                 }
958             });
959         }
960 
GetRequestStreamAsync_SetPOSTThenGet_ExpectNotNull()961         public async Task GetRequestStreamAsync_SetPOSTThenGet_ExpectNotNull()
962         {
963             await LoopbackServer.CreateServerAsync(async (server, url) =>
964             {
965                 HttpWebRequest request = WebRequest.CreateHttp(url);
966                 request.Method = HttpMethod.Post.Method;
967                 using (Stream requestStream = await request.GetRequestStreamAsync())
968                 {
969                     Assert.NotNull(requestStream);
970                 }
971             });
972         }
973 
GetResponseAsync_GetResponseStream_ExpectNotNull()974         public async Task GetResponseAsync_GetResponseStream_ExpectNotNull()
975         {
976             await LoopbackServer.CreateServerAsync(async (server, url) =>
977             {
978                 HttpWebRequest request = WebRequest.CreateHttp(url);
979                 using (WebResponse response = await request.GetResponseAsync())
980                 {
981                     Assert.NotNull(response.GetResponseStream());
982                 }
983             });
984         }
985 
986         [Theory, MemberData(nameof(EchoServers))]
GetResponseAsync_GetResponseStream_ContainsHost(Uri remoteServer)987         public async Task GetResponseAsync_GetResponseStream_ContainsHost(Uri remoteServer)
988         {
989             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
990             request.Method = HttpMethod.Get.Method;
991 
992             using (WebResponse response = await request.GetResponseAsync())
993             using (Stream myStream = response.GetResponseStream())
994             {
995                 Assert.NotNull(myStream);
996                 using (var sr = new StreamReader(myStream))
997                 {
998                     string strContent = sr.ReadToEnd();
999                     Assert.True(strContent.Contains("\"Host\": \"" + System.Net.Test.Common.Configuration.Http.Host + "\""));
1000                 }
1001             }
1002         }
1003 
1004         [OuterLoop]
1005         [Theory, MemberData(nameof(EchoServers))]
CookieContainer_Count_Add(Uri remoteServer)1006         public void CookieContainer_Count_Add(Uri remoteServer)
1007         {
1008             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1009             DateTime now = DateTime.UtcNow;
1010             request.CookieContainer = new CookieContainer();
1011             request.CookieContainer.Add(remoteServer, new Cookie("1", "cookie1"));
1012             request.CookieContainer.Add(remoteServer, new Cookie("2", "cookie2"));
1013             Assert.True(request.SupportsCookieContainer);
1014             Assert.Equal(request.CookieContainer.GetCookies(remoteServer).Count, 2);
1015         }
1016 
1017         [Theory, MemberData(nameof(EchoServers))]
Range_Add_Success(Uri remoteServer)1018         public void Range_Add_Success(Uri remoteServer)
1019         {
1020             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1021             request.AddRange(1, 5);
1022             Assert.Equal(request.Headers["Range"], "bytes=1-5");
1023         }
1024 
1025         [Theory, MemberData(nameof(EchoServers))]
GetResponseAsync_PostRequestStream_ContainsData(Uri remoteServer)1026         public async Task GetResponseAsync_PostRequestStream_ContainsData(Uri remoteServer)
1027         {
1028             HttpWebRequest request = HttpWebRequest.CreateHttp(remoteServer);
1029             request.Method = HttpMethod.Post.Method;
1030 
1031             using (Stream requestStream = await request.GetRequestStreamAsync())
1032             {
1033                 requestStream.Write(_requestBodyBytes, 0, _requestBodyBytes.Length);
1034             }
1035 
1036             using (WebResponse response = await request.GetResponseAsync())
1037             using (Stream myStream = response.GetResponseStream())
1038             using (var sr = new StreamReader(myStream))
1039             {
1040                 string strContent = sr.ReadToEnd();
1041                 Assert.True(strContent.Contains(RequestBody));
1042             }
1043         }
1044 
1045         [Theory]
1046         [MemberData(nameof(EchoServers))]
GetResponseAsync_UseDefaultCredentials_ExpectSuccess(Uri remoteServer)1047         public async Task GetResponseAsync_UseDefaultCredentials_ExpectSuccess(Uri remoteServer)
1048         {
1049             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1050             request.UseDefaultCredentials = true;
1051             var response = await request.GetResponseAsync();
1052             response.Dispose();
1053         }
1054 
1055         [OuterLoop] // fails on networks with DNS servers that provide a dummy page for invalid addresses
1056         [Fact]
GetResponseAsync_ServerNameNotInDns_ThrowsWebException()1057         public async Task GetResponseAsync_ServerNameNotInDns_ThrowsWebException()
1058         {
1059             string serverUrl = string.Format("http://www.{0}.com/", Guid.NewGuid().ToString());
1060             HttpWebRequest request = WebRequest.CreateHttp(serverUrl);
1061             WebException ex = await Assert.ThrowsAsync<WebException>(() => request.GetResponseAsync());
1062             Assert.Equal(WebExceptionStatus.NameResolutionFailure, ex.Status);
1063         }
1064 
1065         public static object[][] StatusCodeServers = {
1066             new object[] { System.Net.Test.Common.Configuration.Http.StatusCodeUri(false, 404) },
1067             new object[] { System.Net.Test.Common.Configuration.Http.StatusCodeUri(true, 404) },
1068         };
1069 
1070         [Theory, MemberData(nameof(StatusCodeServers))]
GetResponseAsync_ResourceNotFound_ThrowsWebException(Uri remoteServer)1071         public async Task GetResponseAsync_ResourceNotFound_ThrowsWebException(Uri remoteServer)
1072         {
1073             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1074             WebException ex = await Assert.ThrowsAsync<WebException>(() => request.GetResponseAsync());
1075             Assert.Equal(WebExceptionStatus.ProtocolError, ex.Status);
1076         }
1077 
1078         [Theory, MemberData(nameof(EchoServers))]
HaveResponse_GetResponseAsync_ExpectTrue(Uri remoteServer)1079         public async Task HaveResponse_GetResponseAsync_ExpectTrue(Uri remoteServer)
1080         {
1081             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1082             using (WebResponse response = await request.GetResponseAsync())
1083             {
1084                 Assert.True(request.HaveResponse);
1085             }
1086         }
1087 
1088         [Theory]
1089         [MemberData(nameof(EchoServers))]
Headers_GetResponseHeaders_ContainsExpectedValue(Uri remoteServer)1090         public async Task Headers_GetResponseHeaders_ContainsExpectedValue(Uri remoteServer)
1091         {
1092             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1093             using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
1094             {
1095                 string headersString = response.Headers.ToString();
1096                 string headersPartialContent = "Content-Type: application/json";
1097                 Assert.True(headersString.Contains(headersPartialContent));
1098             }
1099         }
1100 
1101         [Theory, MemberData(nameof(EchoServers))]
Method_SetThenGetToGET_ExpectSameValue(Uri remoteServer)1102         public void Method_SetThenGetToGET_ExpectSameValue(Uri remoteServer)
1103         {
1104             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1105             request.Method = HttpMethod.Get.Method;
1106             Assert.Equal(HttpMethod.Get.Method, request.Method);
1107         }
1108 
1109         [Theory, MemberData(nameof(EchoServers))]
Method_SetThenGetToPOST_ExpectSameValue(Uri remoteServer)1110         public void Method_SetThenGetToPOST_ExpectSameValue(Uri remoteServer)
1111         {
1112             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1113             request.Method = HttpMethod.Post.Method;
1114             Assert.Equal(HttpMethod.Post.Method, request.Method);
1115         }
1116 
1117         [Theory, MemberData(nameof(EchoServers))]
Method_SetInvalidString_ThrowsArgumentException(Uri remoteServer)1118         public void Method_SetInvalidString_ThrowsArgumentException(Uri remoteServer)
1119         {
1120             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1121             AssertExtensions.Throws<ArgumentException>("value", () => request.Method = null);
1122             AssertExtensions.Throws<ArgumentException>("value", () => request.Method = string.Empty);
1123             AssertExtensions.Throws<ArgumentException>("value", () => request.Method = "Method(2");
1124         }
1125 
1126         [Theory, MemberData(nameof(EchoServers))]
Proxy_GetDefault_ExpectNotNull(Uri remoteServer)1127         public void Proxy_GetDefault_ExpectNotNull(Uri remoteServer)
1128         {
1129             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1130             Assert.NotNull(request.Proxy);
1131         }
1132 
1133         [Theory, MemberData(nameof(EchoServers))]
RequestUri_CreateHttpThenGet_ExpectSameUri(Uri remoteServer)1134         public void RequestUri_CreateHttpThenGet_ExpectSameUri(Uri remoteServer)
1135         {
1136             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1137             Assert.Equal(remoteServer, request.RequestUri);
1138         }
1139 
1140         [Theory, MemberData(nameof(EchoServers))]
ResponseUri_GetResponseAsync_ExpectSameUri(Uri remoteServer)1141         public async Task ResponseUri_GetResponseAsync_ExpectSameUri(Uri remoteServer)
1142         {
1143             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1144             using (WebResponse response = await request.GetResponseAsync())
1145             {
1146                 Assert.Equal(remoteServer, response.ResponseUri);
1147             }
1148         }
1149 
1150         [Theory, MemberData(nameof(EchoServers))]
SupportsCookieContainer_GetDefault_ExpectTrue(Uri remoteServer)1151         public void SupportsCookieContainer_GetDefault_ExpectTrue(Uri remoteServer)
1152         {
1153             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1154             Assert.True(request.SupportsCookieContainer);
1155         }
1156 
1157         [Theory, MemberData(nameof(EchoServers))]
SimpleScenario_UseGETVerb_Success(Uri remoteServer)1158         public async Task SimpleScenario_UseGETVerb_Success(Uri remoteServer)
1159         {
1160             HttpWebRequest request = HttpWebRequest.CreateHttp(remoteServer);
1161             using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
1162             using (Stream responseStream = response.GetResponseStream())
1163             using (var sr = new StreamReader(responseStream))
1164             {
1165                 string responseBody = sr.ReadToEnd();
1166                 Assert.Equal(HttpStatusCode.OK, response.StatusCode);
1167             }
1168         }
1169 
1170         [Theory, MemberData(nameof(EchoServers))]
SimpleScenario_UsePOSTVerb_Success(Uri remoteServer)1171         public async Task SimpleScenario_UsePOSTVerb_Success(Uri remoteServer)
1172         {
1173             HttpWebRequest request = HttpWebRequest.CreateHttp(remoteServer);
1174             request.Method = HttpMethod.Post.Method;
1175 
1176             using (Stream requestStream = await request.GetRequestStreamAsync())
1177             {
1178                 requestStream.Write(_requestBodyBytes, 0, _requestBodyBytes.Length);
1179             }
1180 
1181             using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
1182             using (Stream responseStream = response.GetResponseStream())
1183             using (var sr = new StreamReader(responseStream))
1184             {
1185                 string responseBody = sr.ReadToEnd();
1186                 Assert.Equal(HttpStatusCode.OK, response.StatusCode);
1187             }
1188         }
1189 
1190         [Theory, MemberData(nameof(EchoServers))]
ContentType_AddHeaderWithNoContent_SendRequest_HeaderGetsSent(Uri remoteServer)1191         public async Task ContentType_AddHeaderWithNoContent_SendRequest_HeaderGetsSent(Uri remoteServer)
1192         {
1193             const string ContentType = "text/plain; charset=utf-8";
1194             HttpWebRequest request = HttpWebRequest.CreateHttp(remoteServer);
1195             request.ContentType = ContentType;
1196 
1197             using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
1198             using (Stream responseStream = response.GetResponseStream())
1199             using (var sr = new StreamReader(responseStream))
1200             {
1201                 string responseBody = sr.ReadToEnd();
1202                 _output.WriteLine(responseBody);
1203 
1204                 Assert.Equal(HttpStatusCode.OK, response.StatusCode);
1205                 Assert.True(responseBody.Contains($"\"Content-Type\": \"{ContentType}\""));
1206             }
1207         }
1208 
1209         [Theory, MemberData(nameof(EchoServers))]
MediaType_SetThenGet_ValuesMatch(Uri remoteServer)1210         public void MediaType_SetThenGet_ValuesMatch(Uri remoteServer)
1211         {
1212             const string MediaType = "text/plain";
1213             HttpWebRequest request = WebRequest.CreateHttp(remoteServer);
1214             request.MediaType = MediaType;
1215             Assert.Equal(MediaType, request.MediaType);
1216         }
1217 
HttpWebRequest_EndGetRequestStreamContext_ExpectedValue()1218         public async Task HttpWebRequest_EndGetRequestStreamContext_ExpectedValue()
1219         {
1220             await LoopbackServer.CreateServerAsync((server, url) =>
1221             {
1222                 System.Net.TransportContext context;
1223                 HttpWebRequest request = HttpWebRequest.CreateHttp(url);
1224                 request.Method = "POST";
1225 
1226                 using (request.EndGetRequestStream(request.BeginGetRequestStream(null, null), out context))
1227                 {
1228                     if (PlatformDetection.IsFullFramework)
1229                     {
1230                         Assert.NotNull(context);
1231                     }
1232                     else
1233                     {
1234                         Assert.Null(context);
1235                     }
1236                 }
1237 
1238                 return Task.FromResult<object>(null);
1239             });
1240         }
1241 
1242         [ActiveIssue(19083)]
1243         [SkipOnTargetFramework(TargetFrameworkMonikers.Mono, "dotnet/corefx #19083")]
1244         [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "dotnet/corefx #19083")]
1245         [Fact]
Abort_BeginGetRequestStreamThenAbort_EndGetRequestStreamThrowsWebException()1246         public async Task Abort_BeginGetRequestStreamThenAbort_EndGetRequestStreamThrowsWebException()
1247         {
1248             await LoopbackServer.CreateServerAsync((server, url) =>
1249             {
1250                 HttpWebRequest request = WebRequest.CreateHttp(url);
1251                 request.Method = "POST";
1252                 RequestState state = new RequestState();
1253                 state.Request = request;
1254 
1255                 request.BeginGetResponse(new AsyncCallback(RequestStreamCallback), state);
1256 
1257                 request.Abort();
1258                 Assert.Equal(1, state.RequestStreamCallbackCallCount);
1259                 WebException wex = state.SavedRequestStreamException as WebException;
1260                 Assert.Equal(WebExceptionStatus.RequestCanceled, wex.Status);
1261 
1262                 return Task.FromResult<object>(null);
1263             });
1264         }
1265 
1266         [SkipOnTargetFramework(TargetFrameworkMonikers.Mono, "ResponseCallback not called after Abort on mono")]
1267         [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "ResponseCallback not called after Abort on netfx")]
1268         [Fact]
Abort_BeginGetResponseThenAbort_ResponseCallbackCalledBeforeAbortReturns()1269         public async Task Abort_BeginGetResponseThenAbort_ResponseCallbackCalledBeforeAbortReturns()
1270         {
1271             await LoopbackServer.CreateServerAsync((server, url) =>
1272             {
1273                 HttpWebRequest request = WebRequest.CreateHttp(url);
1274                 RequestState state = new RequestState();
1275                 state.Request = request;
1276 
1277                 request.BeginGetResponse(new AsyncCallback(ResponseCallback), state);
1278 
1279                 request.Abort();
1280                 Assert.Equal(1, state.ResponseCallbackCallCount);
1281 
1282                 return Task.FromResult<object>(null);
1283             });
1284         }
1285 
1286         [ActiveIssue(18800)]
1287         [Fact]
Abort_BeginGetResponseThenAbort_EndGetResponseThrowsWebException()1288         public async Task Abort_BeginGetResponseThenAbort_EndGetResponseThrowsWebException()
1289         {
1290             await LoopbackServer.CreateServerAsync((server, url) =>
1291             {
1292                 HttpWebRequest request = WebRequest.CreateHttp(url);
1293                 RequestState state = new RequestState();
1294                 state.Request = request;
1295 
1296                 request.BeginGetResponse(new AsyncCallback(ResponseCallback), state);
1297 
1298                 request.Abort();
1299 
1300                 WebException wex = state.SavedResponseException as WebException;
1301                 Assert.Equal(WebExceptionStatus.RequestCanceled, wex.Status);
1302 
1303                 return Task.FromResult<object>(null);
1304             });
1305         }
1306 
1307         [Fact]
Abort_BeginGetResponseUsingNoCallbackThenAbort_Success()1308         public async Task Abort_BeginGetResponseUsingNoCallbackThenAbort_Success()
1309         {
1310             await LoopbackServer.CreateServerAsync((server, url) =>
1311             {
1312                 HttpWebRequest request = WebRequest.CreateHttp(url);
1313                 request.BeginGetResponse(null, null);
1314                 request.Abort();
1315 
1316                 return Task.FromResult<object>(null);
1317             });
1318         }
1319 
1320         [Theory, MemberData(nameof(EchoServers))]
Abort_CreateRequestThenAbort_Success(Uri remoteServer)1321         public void Abort_CreateRequestThenAbort_Success(Uri remoteServer)
1322         {
1323             HttpWebRequest request = HttpWebRequest.CreateHttp(remoteServer);
1324 
1325             request.Abort();
1326         }
1327 
RequestStreamCallback(IAsyncResult asynchronousResult)1328         private void RequestStreamCallback(IAsyncResult asynchronousResult)
1329         {
1330             RequestState state = (RequestState)asynchronousResult.AsyncState;
1331             state.RequestStreamCallbackCallCount++;
1332 
1333             try
1334             {
1335                 HttpWebRequest request = state.Request;
1336                 state.Response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
1337 
1338                 Stream stream = request.EndGetRequestStream(asynchronousResult);
1339                 stream.Dispose();
1340             }
1341             catch (Exception ex)
1342             {
1343                 state.SavedRequestStreamException = ex;
1344             }
1345         }
1346 
ResponseCallback(IAsyncResult asynchronousResult)1347         private void ResponseCallback(IAsyncResult asynchronousResult)
1348         {
1349             RequestState state = (RequestState)asynchronousResult.AsyncState;
1350             state.ResponseCallbackCallCount++;
1351 
1352             try
1353             {
1354                 using (HttpWebResponse response = (HttpWebResponse)state.Request.EndGetResponse(asynchronousResult))
1355                 {
1356                     state.SavedResponseHeaders = response.Headers;
1357                 }
1358             }
1359             catch (Exception ex)
1360             {
1361                 state.SavedResponseException = ex;
1362             }
1363         }
1364 
1365         [Fact]
HttpWebRequest_Serialize_Fails()1366         public void HttpWebRequest_Serialize_Fails()
1367         {
1368             using (MemoryStream fs = new MemoryStream())
1369             {
1370                 BinaryFormatter formatter = new BinaryFormatter();
1371                 var hwr = HttpWebRequest.CreateHttp("http://localhost");
1372 
1373                 if (PlatformDetection.IsFullFramework)
1374                 {
1375                     // .NET Framework throws a more detailed exception.
1376                     // System.Runtime.Serialization.SerializationException):
1377                     //  Type 'System.Net.WebRequest+WebProxyWrapper' in Assembly 'System, Version=4.0.0.
1378                     //        0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.
1379                     Assert.Throws<System.Runtime.Serialization.SerializationException>(() => formatter.Serialize(fs, hwr));
1380                 }
1381                 else
1382                 {
1383                     // TODO: Issue #18850. Change HttpWebRquest to throw SerializationException similar to .NET Framework.
1384                     Assert.Throws<PlatformNotSupportedException>(() => formatter.Serialize(fs, hwr));
1385                 }
1386             }
1387         }
1388     }
1389 
1390     public class RequestState
1391     {
1392         public HttpWebRequest Request;
1393         public HttpWebResponse Response;
1394         public WebHeaderCollection SavedResponseHeaders;
1395         public int RequestStreamCallbackCallCount;
1396         public int ResponseCallbackCallCount;
1397         public Exception SavedRequestStreamException;
1398         public Exception SavedResponseException;
1399     }
1400 }
1401