From ec282245c33c51f3204470f0a1591e2533c33fb8 Mon Sep 17 00:00:00 2001 From: markekraus Date: Sat, 16 Sep 2017 13:40:09 -0500 Subject: [PATCH 1/4] [Feature] Create Headers Only Once and Only If Called --- .../CoreCLR/WebResponseObject.CoreClr.cs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs index 9e4b52bfd0f..741ad07185c 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs @@ -31,23 +31,28 @@ public Dictionary> Headers { get { - var headers = new Dictionary>(StringComparer.OrdinalIgnoreCase); - foreach (var entry in BaseResponse.Headers) + if(headers == null) { - headers[entry.Key] = entry.Value; - } - if (BaseResponse.Content != null) - { - foreach (var entry in BaseResponse.Content.Headers) + headers = new Dictionary>(StringComparer.OrdinalIgnoreCase); + foreach (var entry in BaseResponse.Headers) { headers[entry.Key] = entry.Value; } + if (BaseResponse.Content != null) + { + foreach (var entry in BaseResponse.Content.Headers) + { + headers[entry.Key] = entry.Value; + } + } } return headers; } } + private Dictionary> headers = null; + /// /// gets the RelationLink property /// From fa0b8e14d468418b50f236759c9853ad69f71271 Mon Sep 17 00:00:00 2001 From: markekraus Date: Sat, 16 Sep 2017 16:56:06 -0500 Subject: [PATCH 2/4] {feature] headers -> _headers --- .../WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs index 741ad07185c..fc8ceac562e 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs @@ -31,27 +31,27 @@ public Dictionary> Headers { get { - if(headers == null) + if(_headers == null) { - headers = new Dictionary>(StringComparer.OrdinalIgnoreCase); + _headers = new Dictionary>(StringComparer.OrdinalIgnoreCase); foreach (var entry in BaseResponse.Headers) { - headers[entry.Key] = entry.Value; + _headers[entry.Key] = entry.Value; } if (BaseResponse.Content != null) { foreach (var entry in BaseResponse.Content.Headers) { - headers[entry.Key] = entry.Value; + _headers[entry.Key] = entry.Value; } } } - return headers; + return _headers; } } - private Dictionary> headers = null; + private Dictionary> _headers = null; /// /// gets the RelationLink property From e92ceca64f143774850ed32ebd603a9df32c752f Mon Sep 17 00:00:00 2001 From: markekraus Date: Sun, 17 Sep 2017 08:44:28 -0500 Subject: [PATCH 3/4] [Feature] Move logic to WebResponseObject for reuse This code has potential reuse in InvokeRestMethodCommand. Moving it to WebResponseHelper --- .../CoreCLR/WebResponseHelper.CoreClr.cs | 20 +++++++++++++++++++ .../CoreCLR/WebResponseObject.CoreClr.cs | 13 +----------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs index ec570876343..9a2726db86b 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs @@ -4,6 +4,8 @@ Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ +using System; +using System.Collections.Generic; using System.Net.Http; using System.Globalization; @@ -16,6 +18,24 @@ internal static string GetCharacterSet(HttpResponseMessage response) string characterSet = response.Content.Headers.ContentType.CharSet; return characterSet; } + + internal static Dictionary> GetHeadersDictionary(HttpResponseMessage response) + { + var headers = new Dictionary>(StringComparer.OrdinalIgnoreCase); + foreach (var entry in response.Headers) + { + headers[entry.Key] = entry.Value; + } + if (response.Content != null) + { + foreach (var entry in response.Content.Headers) + { + headers[entry.Key] = entry.Value; + } + } + + return headers; + } internal static string GetProtocol(HttpResponseMessage response) { diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs index fc8ceac562e..d683a833b4b 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs @@ -33,18 +33,7 @@ public Dictionary> Headers { if(_headers == null) { - _headers = new Dictionary>(StringComparer.OrdinalIgnoreCase); - foreach (var entry in BaseResponse.Headers) - { - _headers[entry.Key] = entry.Value; - } - if (BaseResponse.Content != null) - { - foreach (var entry in BaseResponse.Content.Headers) - { - _headers[entry.Key] = entry.Value; - } - } + _headers = WebResponseHelper.GetHeadersDictionary(BaseResponse); } return _headers; From 283bdf4b7a7f97689ea5fa4585697cc2b5adae05 Mon Sep 17 00:00:00 2001 From: Mark Kraus Date: Mon, 18 Sep 2017 12:53:00 -0500 Subject: [PATCH 4/4] Add comment to address PR Feedback. --- .../utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs index 9a2726db86b..fbcbdd80181 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs @@ -26,6 +26,10 @@ internal static Dictionary> GetHeadersDictionary(Htt { headers[entry.Key] = entry.Value; } + // In CoreFX, HttpResponseMessage separates content related headers, such as Content-Type to + // HttpResponseMessage.Content.Headers. The remaining headers are in HttpResponseMessage.Headers. + // The keys in both should be unique with no duplicates between them. + // Added for backwards compatibility with PowerShell 5.1 and earlier. if (response.Content != null) { foreach (var entry in response.Content.Headers)