Skip to content

Commit f72b456

Browse files
authored
Reuse session HTTP client. (#1184)
1 parent a91325c commit f72b456

File tree

5 files changed

+118
-1
lines changed

5 files changed

+118
-1
lines changed

src/Authentication/Authentication.Core/Common/GraphSession.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace Microsoft.Graph.PowerShell.Authentication
99

1010
using System;
1111
using System.Collections;
12+
using System.Net.Http;
1213
using System.Security;
1314
using System.Threading;
1415

@@ -68,6 +69,8 @@ public byte[] MSALToken
6869
/// </summary>
6970
public Hashtable[] MgCommandMetadata { get; set; }
7071

72+
public HttpClient GraphHttpClient { get; set; }
73+
7174
/// <summary>
7275
/// Gets an instance of <see cref="GraphSession"/>.
7376
/// </summary>

src/Authentication/Authentication.Test/Helpers/HttpHelpersTests.cs

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace Microsoft.Graph.Authentication.Test.Helpers
55
{
66
using System;
77
using System.Net.Http;
8+
using Microsoft.Graph.Authentication.Core;
89
using Microsoft.Graph.PowerShell.Authentication;
910
using Microsoft.Graph.PowerShell.Authentication.Helpers;
1011
using Xunit;
@@ -71,5 +72,112 @@ public void GetGraphHttpClientShouldReturnHttpClientWithCustomerProvidedTimeout(
7172
// reset static instance.
7273
GraphSession.Reset();
7374
}
75+
76+
[Fact]
77+
public void GetGraphHttpClientShouldReturnInSessionHttpClientWhenSessionHasAClient()
78+
{
79+
GraphSession.Initialize(() => new GraphSession());
80+
GraphSession.Instance.AuthContext = new AuthContext
81+
{
82+
AuthType = AuthenticationType.UserProvidedAccessToken,
83+
ContextScope = ContextScope.Process,
84+
};
85+
GraphSession.Instance.GraphHttpClient = new HttpClient
86+
{
87+
BaseAddress = new Uri("https://test.contoso.com/v1.0/")
88+
};
89+
90+
HttpClient httpClient = HttpHelpers.GetGraphHttpClient();
91+
92+
Assert.NotNull(httpClient);
93+
Assert.NotNull(GraphSession.Instance.GraphHttpClient);
94+
Assert.Equal(httpClient.BaseAddress, GraphSession.Instance.GraphHttpClient.BaseAddress);
95+
96+
// reset static instance.
97+
GraphSession.Reset();
98+
}
99+
100+
[Fact]
101+
public void GetGraphHttpClientShouldReturnNewHttpClientWhenSessionHasNoClient()
102+
{
103+
GraphSession.Initialize(() => new GraphSession());
104+
GraphSession.Instance.AuthContext = new AuthContext
105+
{
106+
AuthType = AuthenticationType.UserProvidedAccessToken,
107+
ContextScope = ContextScope.Process,
108+
};
109+
GraphSession.Instance.GraphHttpClient = null;
110+
111+
HttpClient httpClient = HttpHelpers.GetGraphHttpClient();
112+
113+
Assert.NotNull(httpClient);
114+
Assert.NotNull(GraphSession.Instance.GraphHttpClient);
115+
Assert.Equal(httpClient.BaseAddress, GraphSession.Instance.GraphHttpClient.BaseAddress);
116+
117+
// reset static instance.
118+
GraphSession.Reset();
119+
}
120+
121+
[Fact]
122+
public void GetGraphHttpClientShouldReturnNewHttpClientWhenSessionIsNew()
123+
{
124+
GraphSession.Initialize(() => new GraphSession());
125+
GraphSession.Instance.AuthContext = new AuthContext
126+
{
127+
AuthType = AuthenticationType.UserProvidedAccessToken,
128+
ContextScope = ContextScope.Process,
129+
};
130+
131+
HttpClient httpClient = HttpHelpers.GetGraphHttpClient();
132+
133+
Assert.NotNull(httpClient);
134+
Assert.NotNull(GraphSession.Instance.GraphHttpClient);
135+
Assert.Equal(httpClient.BaseAddress, GraphSession.Instance.GraphHttpClient.BaseAddress);
136+
137+
// reset static instance.
138+
GraphSession.Reset();
139+
}
140+
141+
[Fact]
142+
public void GetGraphHttpClientShouldReturnNewHttpClientSignOutThenSignIn()
143+
{
144+
GraphSession.Initialize(() => new GraphSession());
145+
GraphSession.Instance.AuthContext = new AuthContext
146+
{
147+
AuthType = AuthenticationType.UserProvidedAccessToken,
148+
ContextScope = ContextScope.Process,
149+
};
150+
151+
var dummyClient = new HttpClient
152+
{
153+
BaseAddress = new Uri("https://test.contoso.com/v1.0/")
154+
};
155+
GraphSession.Instance.GraphHttpClient = dummyClient;
156+
HttpClient httpClientAttempt1 = HttpHelpers.GetGraphHttpClient();
157+
158+
// Mock sign out.
159+
Authenticator.LogOut(GraphSession.Instance.AuthContext);
160+
GraphSession.Instance.AuthContext = null;
161+
GraphSession.Instance.GraphHttpClient = null;
162+
163+
// Mock sign in.
164+
GraphSession.Initialize(() => new GraphSession());
165+
GraphSession.Instance.AuthContext = new AuthContext
166+
{
167+
AuthType = AuthenticationType.UserProvidedAccessToken,
168+
ContextScope = ContextScope.Process,
169+
};
170+
HttpClient httpClientAttempt2 = HttpHelpers.GetGraphHttpClient();
171+
172+
Assert.NotNull(httpClientAttempt1);
173+
Assert.NotNull(httpClientAttempt2);
174+
Assert.NotNull(GraphSession.Instance.GraphHttpClient);
175+
Assert.NotEqual(httpClientAttempt2.BaseAddress, httpClientAttempt1.BaseAddress);
176+
Assert.Equal(httpClientAttempt1.BaseAddress, dummyClient.BaseAddress);
177+
Assert.Equal(httpClientAttempt2.BaseAddress, GraphSession.Instance.GraphHttpClient.BaseAddress);
178+
179+
// reset static instance.
180+
GraphSession.Reset();
181+
}
74182
}
75183
}

src/Authentication/Authentication/Cmdlets/ConnectMgGraph.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ private async Task ProcessRecordAsync()
189189
if (MyInvocation.BoundParameters.ContainsKey(nameof(ClientTimeout))) { authContext.ClientTimeout = TimeSpan.FromSeconds(ClientTimeout); }
190190
// Set selected environment to the session object.
191191
GraphSession.Instance.Environment = environment;
192+
GraphSession.Instance.GraphHttpClient = null;
192193
switch (ParameterSetName)
193194
{
194195
case Constants.UserParameterSet:

src/Authentication/Authentication/Cmdlets/DisconnectMgGraph.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ protected override void ProcessRecord()
3434
Authenticator.LogOut(authContext);
3535

3636
GraphSession.Instance.AuthContext = null;
37+
GraphSession.Instance.GraphHttpClient = null;
3738
}
3839

3940
protected override void StopProcessing()

src/Authentication/Authentication/Helpers/HttpHelpers.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,18 @@ public static HttpClient GetGraphHttpClient(InvocationInfo invocationInfo, IAuth
6060
/// <returns></returns>
6161
public static HttpClient GetGraphHttpClient(IAuthContext authContext = null)
6262
{
63+
if (GraphSession.Instance?.GraphHttpClient != null)
64+
return GraphSession.Instance.GraphHttpClient;
6365
authContext = authContext ?? GraphSession.Instance.AuthContext;
6466
if (authContext is null)
6567
{
6668
throw new AuthenticationException(Core.ErrorConstants.Message.MissingAuthContext);
6769
}
6870

6971
IAuthenticationProvider authProvider = AuthenticationHelpers.GetAuthProvider(authContext);
70-
return GetGraphHttpClient(authProvider, authContext.ClientTimeout);
72+
var newHttpClient = GetGraphHttpClient(authProvider, authContext.ClientTimeout);
73+
GraphSession.Instance.GraphHttpClient = newHttpClient;
74+
return newHttpClient;
7175
}
7276

7377
/// <summary>

0 commit comments

Comments
 (0)