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