diff options
author | Stephen Toub <stoub@microsoft.com> | 2017-04-19 21:14:39 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-19 21:14:39 +0300 |
commit | 554c330585adbb02be6bdbe26d6ea496d73d3380 (patch) | |
tree | ba9af17a126c2a32ad41607108033e25862c257a /src | |
parent | 00243dd86175e29480dc08e8d32db6b276331c4e (diff) | |
parent | 5bd6fd713ee2909100381e5edd98083872ff8897 (diff) |
Merge pull request #18612 from stephentoub/hwr_keepalive
Fix HttpWebRequest.KeepAlive handling
Diffstat (limited to 'src')
-rw-r--r-- | src/System.Net.Requests/src/System/Net/HttpWebRequest.cs | 28 | ||||
-rw-r--r-- | src/System.Net.Requests/tests/HttpWebRequestHeaderTest.cs | 34 |
2 files changed, 41 insertions, 21 deletions
diff --git a/src/System.Net.Requests/src/System/Net/HttpWebRequest.cs b/src/System.Net.Requests/src/System/Net/HttpWebRequest.cs index fc9b2572ca..5bd2f94c53 100644 --- a/src/System.Net.Requests/src/System/Net/HttpWebRequest.cs +++ b/src/System.Net.Requests/src/System/Net/HttpWebRequest.cs @@ -384,24 +384,7 @@ namespace System.Net } - public bool KeepAlive - { - get - { - return _webHeaderCollection[HttpKnownHeaderNames.KeepAlive] == bool.TrueString; - } - set - { - if (value) - { - SetSpecialHeaders(HttpKnownHeaderNames.KeepAlive, bool.TrueString); - } - else - { - SetSpecialHeaders(HttpKnownHeaderNames.KeepAlive, bool.FalseString); - } - } - } + public bool KeepAlive { get; set; } = true; public bool UnsafeAuthenticatedConnectionSharing { @@ -1188,6 +1171,15 @@ namespace System.Net request.Headers.TransferEncodingChunked = SendChunked; + if (KeepAlive) + { + request.Headers.Connection.Add(HttpKnownHeaderNames.KeepAlive); + } + else + { + request.Headers.ConnectionClose = true; + } + _sendRequestTask = client.SendAsync( request, _allowReadStreamBuffering ? HttpCompletionOption.ResponseContentRead : HttpCompletionOption.ResponseHeadersRead, diff --git a/src/System.Net.Requests/tests/HttpWebRequestHeaderTest.cs b/src/System.Net.Requests/tests/HttpWebRequestHeaderTest.cs index 51f5c0bf74..3bf8d34452 100644 --- a/src/System.Net.Requests/tests/HttpWebRequestHeaderTest.cs +++ b/src/System.Net.Requests/tests/HttpWebRequestHeaderTest.cs @@ -3,10 +3,8 @@ // See the LICENSE file in the project root for more information. using System.Diagnostics; -using System.Net.Http; +using System.IO; using System.Net.Sockets; -using System.Net.Test.Common; -using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -33,6 +31,7 @@ namespace System.Net.Tests Assert.Null(request.CookieContainer); Assert.True(request.AllowWriteStreamBuffering); Assert.NotNull(request.ClientCertificates); + Assert.True(request.KeepAlive); // TODO: Issue #17842 if (!PlatformDetection.IsFullFramework) @@ -222,5 +221,34 @@ namespace System.Net.Tests Assert.True(request.PreAuthenticate); } } + + [Theory] + [InlineData(null)] + [InlineData(false)] + [InlineData(true)] + public void HttpWebRequest_KeepAlive_CorrectConnectionHeaderSent(bool? keepAlive) + { + HttpWebRequest request = WebRequest.CreateHttp(Configuration.Http.RemoteEchoServer); + + if (keepAlive.HasValue) + { + request.KeepAlive = keepAlive.Value; + } + + using (var response = (HttpWebResponse)request.GetResponse()) + using (var body = new StreamReader(response.GetResponseStream())) + { + string content = body.ReadToEnd(); + if (!keepAlive.HasValue || keepAlive.Value) + { + Assert.Contains("\"Connection\": \"Keep-Alive\"", content, StringComparison.OrdinalIgnoreCase); + } + else + { + Assert.Contains("\"Connection\": \"close\"", content, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("\"Keep-Alive\"", content, StringComparison.OrdinalIgnoreCase); + } + } + } } } |