Skip to content

Commit 3cf77c2

Browse files
authored
Add 10 minute timeout to HTTPClient (#1626)
1 parent bb4c0d0 commit 3cf77c2

File tree

5 files changed

+24
-19
lines changed

5 files changed

+24
-19
lines changed

src/code/ContainerRegistryServerAPICalls.cs

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
using System.Text;
2121
using System.Security.Cryptography;
2222
using System.Text.Json;
23-
using System.Runtime.InteropServices.WindowsRuntime;
2423

2524
namespace Microsoft.PowerShell.PSResourceGet
2625
{
@@ -48,8 +47,6 @@ internal class ContainerRegistryServerAPICalls : ServerApiCall
4847
const string containerRegistryStartUploadTemplate = "https://{0}/v2/{1}/blobs/uploads/"; // 0 - registry, 1 - packagename
4948
const string containerRegistryEndUploadTemplate = "https://{0}{1}&digest=sha256:{2}"; // 0 - registry, 1 - location, 2 - digest
5049

51-
private static readonly HttpClient s_client = new HttpClient();
52-
5350
#endregion
5451

5552
#region Constructor
@@ -65,6 +62,7 @@ public ContainerRegistryServerAPICalls(PSRepositoryInfo repository, PSCmdlet cmd
6562
};
6663

6764
_sessionClient = new HttpClient(handler);
65+
_sessionClient.Timeout = TimeSpan.FromMinutes(10);
6866
_sessionClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", userAgentString);
6967
}
7068

@@ -444,7 +442,7 @@ internal bool IsContainerRegistryUnauthenticated(string containerRegistyUrl, out
444442
HttpResponseMessage response;
445443
try
446444
{
447-
response = s_client.SendAsync(new HttpRequestMessage(HttpMethod.Head, endpoint)).Result;
445+
response = _sessionClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, endpoint)).Result;
448446
}
449447
catch (Exception e)
450448
{
@@ -965,7 +963,7 @@ internal JObject GetHttpResponseJObjectUsingContentHeaders(string url, HttpMetho
965963
/// <summary>
966964
/// Get response headers.
967965
/// </summary>
968-
internal static async Task<HttpResponseHeaders> GetHttpResponseHeader(string url, HttpMethod method, Collection<KeyValuePair<string, string>> defaultHeaders)
966+
internal async Task<HttpResponseHeaders> GetHttpResponseHeader(string url, HttpMethod method, Collection<KeyValuePair<string, string>> defaultHeaders)
969967
{
970968
try
971969
{
@@ -982,24 +980,24 @@ internal static async Task<HttpResponseHeaders> GetHttpResponseHeader(string url
982980
/// <summary>
983981
/// Set default headers for HttpClient.
984982
/// </summary>
985-
private static void SetDefaultHeaders(Collection<KeyValuePair<string, string>> defaultHeaders)
983+
private void SetDefaultHeaders(Collection<KeyValuePair<string, string>> defaultHeaders)
986984
{
987-
s_client.DefaultRequestHeaders.Clear();
985+
_sessionClient.DefaultRequestHeaders.Clear();
988986
if (defaultHeaders != null)
989987
{
990988
foreach (var header in defaultHeaders)
991989
{
992990
if (string.Equals(header.Key, "Authorization", StringComparison.OrdinalIgnoreCase))
993991
{
994-
s_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", header.Value);
992+
_sessionClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", header.Value);
995993
}
996994
else if (string.Equals(header.Key, "Accept", StringComparison.OrdinalIgnoreCase))
997995
{
998-
s_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(header.Value));
996+
_sessionClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(header.Value));
999997
}
1000998
else
1001999
{
1002-
s_client.DefaultRequestHeaders.Add(header.Key, header.Value);
1000+
_sessionClient.DefaultRequestHeaders.Add(header.Key, header.Value);
10031001
}
10041002
}
10051003
}
@@ -1008,11 +1006,11 @@ private static void SetDefaultHeaders(Collection<KeyValuePair<string, string>> d
10081006
/// <summary>
10091007
/// Sends request for content.
10101008
/// </summary>
1011-
private static async Task<HttpContent> SendContentRequestAsync(HttpRequestMessage message)
1009+
private async Task<HttpContent> SendContentRequestAsync(HttpRequestMessage message)
10121010
{
10131011
try
10141012
{
1015-
HttpResponseMessage response = await s_client.SendAsync(message);
1013+
HttpResponseMessage response = await _sessionClient.SendAsync(message);
10161014
response.EnsureSuccessStatusCode();
10171015
return response.Content;
10181016
}
@@ -1025,12 +1023,12 @@ private static async Task<HttpContent> SendContentRequestAsync(HttpRequestMessag
10251023
/// <summary>
10261024
/// Sends HTTP request.
10271025
/// </summary>
1028-
private static async Task<JObject> SendRequestAsync(HttpRequestMessage message)
1026+
private async Task<JObject> SendRequestAsync(HttpRequestMessage message)
10291027
{
10301028
HttpResponseMessage response;
10311029
try
10321030
{
1033-
response = await s_client.SendAsync(message);
1031+
response = await _sessionClient.SendAsync(message);
10341032
}
10351033
catch (Exception e)
10361034
{
@@ -1058,11 +1056,11 @@ private static async Task<JObject> SendRequestAsync(HttpRequestMessage message)
10581056
/// <summary>
10591057
/// Send request to get response headers.
10601058
/// </summary>
1061-
private static async Task<HttpResponseHeaders> SendRequestHeaderAsync(HttpRequestMessage message)
1059+
private async Task<HttpResponseHeaders> SendRequestHeaderAsync(HttpRequestMessage message)
10621060
{
10631061
try
10641062
{
1065-
HttpResponseMessage response = await s_client.SendAsync(message);
1063+
HttpResponseMessage response = await _sessionClient.SendAsync(message);
10661064
response.EnsureSuccessStatusCode();
10671065
return response.Headers;
10681066
}
@@ -1075,7 +1073,7 @@ private static async Task<HttpResponseHeaders> SendRequestHeaderAsync(HttpReques
10751073
/// <summary>
10761074
/// Sends a PUT request, used for publishing to container registry.
10771075
/// </summary>
1078-
private static async Task<HttpResponseMessage> PutRequestAsync(string url, string filePath, bool isManifest, Collection<KeyValuePair<string, string>> contentHeaders)
1076+
private async Task<HttpResponseMessage> PutRequestAsync(string url, string filePath, bool isManifest, Collection<KeyValuePair<string, string>> contentHeaders)
10791077
{
10801078
try
10811079
{
@@ -1094,7 +1092,7 @@ private static async Task<HttpResponseMessage> PutRequestAsync(string url, strin
10941092
httpContent.Headers.Add("Content-Type", "application/octet-stream");
10951093
}
10961094

1097-
return await s_client.PutAsync(url, httpContent);
1095+
return await _sessionClient.PutAsync(url, httpContent);
10981096
}
10991097
}
11001098
catch (Exception e)

src/code/NuGetServerAPICalls.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public NuGetServerAPICalls (PSRepositoryInfo repository, PSCmdlet cmdletPassedIn
4040
};
4141

4242
_sessionClient = new HttpClient(handler);
43+
_sessionClient.Timeout = TimeSpan.FromMinutes(10);
4344
_sessionClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", userAgentString);
4445
}
4546

src/code/ServerApiCall.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Text;
1111
using System.Runtime.ExceptionServices;
1212
using System.Management.Automation;
13+
using System;
1314

1415
namespace Microsoft.PowerShell.PSResourceGet.Cmdlets
1516
{
@@ -43,13 +44,14 @@ public ServerApiCall(PSRepositoryInfo repository, NetworkCredential networkCrede
4344

4445
_sessionClient = new HttpClient(handler);
4546
_sessionClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
46-
4747
} else {
4848

4949
handler.Credentials = networkCredential;
5050

5151
_sessionClient = new HttpClient(handler);
5252
};
53+
_sessionClient.Timeout = TimeSpan.FromMinutes(10);
54+
5355
}
5456

5557
#endregion

src/code/V2ServerAPICalls.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ public V2ServerAPICalls (PSRepositoryInfo repository, PSCmdlet cmdletPassedIn, N
7575
_sessionClient = new HttpClient(handler);
7676
};
7777

78+
_sessionClient = new HttpClient(handler);
79+
_sessionClient.Timeout = TimeSpan.FromMinutes(10);
7880
_sessionClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", userAgentString);
7981
var repoURL = repository.Uri.ToString().ToLower();
8082
_isADORepo = repoURL.Contains("pkgs.dev.azure.com") || repoURL.Contains("pkgs.visualstudio.com");

src/code/V3ServerAPICalls.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ public V3ServerAPICalls(PSRepositoryInfo repository, PSCmdlet cmdletPassedIn, Ne
7575
_sessionClient = new HttpClient(handler);
7676
};
7777

78+
_sessionClient = new HttpClient(handler);
79+
_sessionClient.Timeout = TimeSpan.FromMinutes(10);
7880
_sessionClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", userAgentString);
7981

8082
_isNuGetRepo = String.Equals(Repository.Uri.AbsoluteUri, nugetRepoUri, StringComparison.InvariantCultureIgnoreCase);

0 commit comments

Comments
 (0)