Skip to content

Commit 7329df7

Browse files
committed
Use HttpClientHandler as final handler for PS 5.1.
1 parent 8fdeceb commit 7329df7

File tree

3 files changed

+57
-26
lines changed

3 files changed

+57
-26
lines changed

src/Authentication/Authentication/Handlers/RequestHeaderHandler.cs

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License in the project root for license information.
33
// ------------------------------------------------------------------------------
44

5-
using Microsoft.Graph.PowerShell.Authentication.Cmdlets;
65
using System;
76
using System.Collections.Generic;
87
using System.Linq;
98
using System.Net.Http;
10-
using System.Net.Http.Headers;
119
using System.Reflection;
1210
using System.Threading;
1311
using System.Threading.Tasks;
@@ -21,37 +19,30 @@ namespace Microsoft.Graph.PowerShell.Authentication.Handlers
2119
internal class RequestHeaderHandler : DelegatingHandler
2220
{
2321
/// The version for current assembly.
24-
private static readonly AssemblyName _assemblyInfo = typeof(ConnectMgGraph).GetTypeInfo().Assembly.GetName();
22+
private static readonly AssemblyName _assemblyInfo = typeof(RequestHeaderHandler).GetTypeInfo().Assembly.GetName();
2523

2624
public RequestHeaderHandler() { }
2725

28-
public RequestHeaderHandler(HttpRequestHeaders requestHeaders, HttpMessageHandler innerHandler) : base(innerHandler) { }
29-
3026
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
3127
{
32-
SetRequestHeaders(request);
33-
return base.SendAsync(request, cancellationToken);
34-
}
35-
36-
private static void SetRequestHeaders(HttpRequestMessage request)
37-
{
38-
string sdkVersionHeaderValue = string.Format(request.RequestUri.AbsolutePath.StartsWith("/beta") ? Constants.PSSDKHeaderValueBeta : Constants.PSSDKHeaderValueV1, _assemblyInfo.Version.Major, _assemblyInfo.Version.Minor, _assemblyInfo.Version.Build);
39-
PrependHeader(request, CoreConstants.Headers.SdkVersionHeaderName, sdkVersionHeaderValue);
40-
}
41-
42-
private static void PrependHeader(HttpRequestMessage request, string headerName, string headerValue)
43-
{
44-
if (request.Headers.TryGetValues(headerName, out IEnumerable<string> previousSDKHeaders))
28+
string psSdkVersionHeader = string.Format(request.RequestUri.AbsolutePath.StartsWith("/beta") ? Constants.PSSDKHeaderValueBeta
29+
: Constants.PSSDKHeaderValueV1, _assemblyInfo.Version.Major, _assemblyInfo.Version.Minor, _assemblyInfo.Version.Build);
30+
if (request.Headers.TryGetValues(CoreConstants.Headers.SdkVersionHeaderName, out IEnumerable<string> previousSDKHeaders))
4531
{
46-
request.Headers.Remove(headerName);
47-
request.Headers.Add(headerName, new[] {
48-
headerValue, previousSDKHeaders.Where(h => h.StartsWith(Constants.DotNetSDKHeaderValue, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault()
49-
});
32+
var dotNetSdkHeader = previousSDKHeaders.Where(h => h.StartsWith(Constants.DotNetSDKHeaderValue, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
33+
request.Headers.Remove(CoreConstants.Headers.SdkVersionHeaderName);
34+
request.Headers.Add(CoreConstants.Headers.SdkVersionHeaderName, new[] { psSdkVersionHeader, dotNetSdkHeader });
5035
}
5136
else
5237
{
53-
request.Headers.Add(headerName, headerValue);
38+
request.Headers.Add(CoreConstants.Headers.SdkVersionHeaderName, psSdkVersionHeader);
5439
}
40+
41+
if (request.Headers.Contains(CoreConstants.Headers.ClientRequestId))
42+
request.Headers.Remove(CoreConstants.Headers.ClientRequestId);
43+
request.Headers.Add(CoreConstants.Headers.ClientRequestId, Guid.NewGuid().ToString());
44+
45+
return base.SendAsync(request, cancellationToken);
5546
}
5647
}
5748
}

src/Authentication/Authentication/Helpers/HttpHelpers.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.Graph.PowerShell.Authentication.Handlers;
77
using System.Collections.Generic;
88
using System.Globalization;
9+
using System.Net;
910
using System.Net.Http;
1011

1112
namespace Microsoft.Graph.PowerShell.Authentication.Helpers
@@ -46,7 +47,6 @@ private static HttpClient GetGraphHttpClient(IAuthenticationProvider authProvide
4647
throw new AuthenticationException(string.Format(CultureInfo.InvariantCulture, Core.ErrorConstants.Message.MissingSessionProperty, nameof(requestContext)));
4748

4849
IList<DelegatingHandler> delegatingHandlers = new List<DelegatingHandler> {
49-
new RequestHeaderHandler(),
5050
new AuthenticationHandler(authProvider),
5151
new NationalCloudHandler(),
5252
new ODataQueryOptionsHandler(),
@@ -57,10 +57,26 @@ private static HttpClient GetGraphHttpClient(IAuthenticationProvider authProvide
5757
MaxRetry = requestContext.MaxRetry,
5858
RetriesTimeLimit= requestContext.RetriesTimeLimit
5959
}),
60-
new RedirectHandler()
60+
new RedirectHandler(),
61+
new RequestHeaderHandler() // Should always be last.
6162
};
6263

63-
HttpClient httpClient = GraphClientFactory.Create(delegatingHandlers);
64+
HttpClient httpClient;
65+
if (!RuntimeUtils.IsPsCore())
66+
{
67+
httpClient = GraphClientFactory.Create(delegatingHandlers,
68+
finalHandler: new HttpClientHandler
69+
{
70+
Proxy = null,
71+
AllowAutoRedirect = false,
72+
AutomaticDecompression = DecompressionMethods.None
73+
});
74+
}
75+
else
76+
{
77+
httpClient = GraphClientFactory.Create(delegatingHandlers);
78+
}
79+
6480
httpClient.Timeout = requestContext.ClientTimeout;
6581
return httpClient;
6682
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// ------------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License in the project root for license information.
3+
// ------------------------------------------------------------------------------
4+
5+
using System;
6+
7+
namespace Microsoft.Graph.PowerShell.Authentication.Helpers
8+
{
9+
/// <summary>
10+
/// Utility class containing runtime utility methods.
11+
/// </summary>
12+
internal static class RuntimeUtils
13+
{
14+
/// <summary>
15+
/// Determines if the PSEdition of the current process is Core.
16+
/// </summary>
17+
/// <returns><see cref="true"/> when PSEdition is core, else <see cref="false"/>.</returns>
18+
internal static bool IsPsCore()
19+
{
20+
var psCoreVersion = new Version(6, 0, 0);
21+
return GraphSession.Instance.AuthContext.PSHostVersion >= psCoreVersion;
22+
}
23+
}
24+
}

0 commit comments

Comments
 (0)