diff --git a/src/Tgstation.Server.Client/ApiClient.cs b/src/Tgstation.Server.Client/ApiClient.cs index 9913a10184..c3e6dc7e94 100644 --- a/src/Tgstation.Server.Client/ApiClient.cs +++ b/src/Tgstation.Server.Client/ApiClient.cs @@ -318,7 +318,7 @@ namespace Tgstation.Server.Client await Task.WhenAll(requestLoggers.Select(x => x.LogRequest(request, cancellationToken))).ConfigureAwait(false); - response = await httpClient.SendAsync(request, cancellationToken).ConfigureAwait(false); + response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); } finally { diff --git a/src/Tgstation.Server.Common/HttpClient.cs b/src/Tgstation.Server.Common/HttpClient.cs index 41dcf6dec4..264b09fed0 100644 --- a/src/Tgstation.Server.Common/HttpClient.cs +++ b/src/Tgstation.Server.Common/HttpClient.cs @@ -45,6 +45,7 @@ namespace Tgstation.Server.Common public void Dispose() => httpClient.Dispose(); /// - public Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) => httpClient.SendAsync(request, cancellationToken); + public Task SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken) + => httpClient.SendAsync(request, completionOption, cancellationToken); } } diff --git a/src/Tgstation.Server.Common/IHttpClient.cs b/src/Tgstation.Server.Common/IHttpClient.cs index a1ce0190e0..474d54e003 100644 --- a/src/Tgstation.Server.Common/IHttpClient.cs +++ b/src/Tgstation.Server.Common/IHttpClient.cs @@ -25,8 +25,9 @@ namespace Tgstation.Server.Common /// Send an HTTP request. /// /// The . + /// The . /// The for the operation. /// A resulting in the of the request. - Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken); + Task SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken); } } diff --git a/src/Tgstation.Server.Host/IO/FileDownloader.cs b/src/Tgstation.Server.Host/IO/FileDownloader.cs index 4aff37090e..d7262001b4 100644 --- a/src/Tgstation.Server.Host/IO/FileDownloader.cs +++ b/src/Tgstation.Server.Host/IO/FileDownloader.cs @@ -51,7 +51,7 @@ namespace Tgstation.Server.Host.IO if (bearerToken != null) request.Headers.Authorization = new AuthenticationHeaderValue(ApiHeaders.BearerAuthenticationScheme, bearerToken); - var webRequestTask = httpClient.SendAsync(request, cancellationToken); + var webRequestTask = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken); using var response = await webRequestTask; response.EnsureSuccessStatusCode(); await using var responseStream = await response.Content.ReadAsStreamAsync(cancellationToken); diff --git a/src/Tgstation.Server.Host/Security/OAuth/GenericOAuthValidator.cs b/src/Tgstation.Server.Host/Security/OAuth/GenericOAuthValidator.cs index 8b98dabc0d..4b4fd51950 100644 --- a/src/Tgstation.Server.Host/Security/OAuth/GenericOAuthValidator.cs +++ b/src/Tgstation.Server.Host/Security/OAuth/GenericOAuthValidator.cs @@ -100,7 +100,7 @@ namespace Tgstation.Server.Host.Security.OAuth var tokenRequestDictionary = JsonConvert.DeserializeObject>(tokenRequestJson); tokenRequest.Content = new FormUrlEncodedContent(tokenRequestDictionary); - using var tokenResponse = await httpClient.SendAsync(tokenRequest, cancellationToken); + using var tokenResponse = await httpClient.SendAsync(tokenRequest, HttpCompletionOption.ResponseHeadersRead, cancellationToken); tokenResponse.EnsureSuccessStatusCode(); tokenResponsePayload = await tokenResponse.Content.ReadAsStringAsync(cancellationToken); var tokenResponseJson = JObject.Parse(tokenResponsePayload); diff --git a/src/Tgstation.Server.Host/Swarm/SwarmService.cs b/src/Tgstation.Server.Host/Swarm/SwarmService.cs index d53456c8ac..266d45e245 100644 --- a/src/Tgstation.Server.Host/Swarm/SwarmService.cs +++ b/src/Tgstation.Server.Host/Swarm/SwarmService.cs @@ -304,7 +304,7 @@ namespace Tgstation.Server.Host.Swarm try { - using var response = await httpClient.SendAsync(request, cancellationToken); + using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead, cancellationToken); response.EnsureSuccessStatusCode(); } catch (Exception ex) @@ -365,7 +365,7 @@ namespace Tgstation.Server.Host.Swarm try { - using var commitReadyResponse = await httpClient.SendAsync(commitReadyRequest, cancellationToken); + using var commitReadyResponse = await httpClient.SendAsync(commitReadyRequest, HttpCompletionOption.ResponseContentRead, cancellationToken); commitReadyResponse.EnsureSuccessStatusCode(); } catch (Exception ex) @@ -421,7 +421,7 @@ namespace Tgstation.Server.Host.Swarm { // I know using the cancellationToken after this point doesn't seem very sane // It's the token for Ctrl+C on server's console though, so we must respect it - using var response = await httpClient.SendAsync(request, cancellationToken); + using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead, cancellationToken); response.EnsureSuccessStatusCode(); } catch (Exception ex) @@ -516,7 +516,7 @@ namespace Tgstation.Server.Host.Swarm try { - using var response = await httpClient.SendAsync(request, cancellationToken); + using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead, cancellationToken); response.EnsureSuccessStatusCode(); } catch (Exception ex) @@ -782,7 +782,7 @@ namespace Tgstation.Server.Host.Swarm UpdateVersion = version, }); - using var response = await httpClient.SendAsync(request, cancellationToken); + using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead, cancellationToken); return response.IsSuccessStatusCode; } @@ -943,7 +943,7 @@ namespace Tgstation.Server.Host.Swarm try { - using var response = await httpClient.SendAsync(request, cancellationToken); + using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead, cancellationToken); response.EnsureSuccessStatusCode(); return; } @@ -1014,7 +1014,7 @@ namespace Tgstation.Server.Host.Swarm HttpMethod.Get, String.Empty, null); - using var response = await httpClient.SendAsync(request, cancellationToken); + using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead, cancellationToken); response.EnsureSuccessStatusCode(); logger.LogTrace("Controller health check successful"); return; @@ -1079,7 +1079,7 @@ namespace Tgstation.Server.Host.Swarm try { - using var response = await httpClient.SendAsync(registrationRequest, cancellationToken); + using var response = await httpClient.SendAsync(registrationRequest, HttpCompletionOption.ResponseContentRead, cancellationToken); if (response.IsSuccessStatusCode) { logger.LogInformation("Sucessfully registered with ID {registrationId}", requestedRegistrationId); @@ -1151,7 +1151,7 @@ namespace Tgstation.Server.Host.Swarm try { - using var response = await httpClient.SendAsync(request, cancellationToken); + using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead, cancellationToken); response.EnsureSuccessStatusCode(); } catch (Exception ex) when (ex is not OperationCanceledException) diff --git a/tests/Tgstation.Server.Client.Tests/TestApiClient.cs b/tests/Tgstation.Server.Client.Tests/TestApiClient.cs index 49ab83e74a..c848cb32c2 100644 --- a/tests/Tgstation.Server.Client.Tests/TestApiClient.cs +++ b/tests/Tgstation.Server.Client.Tests/TestApiClient.cs @@ -39,7 +39,7 @@ namespace Tgstation.Server.Client.Tests }; var httpClient = new Mock(); - httpClient.Setup(x => x.SendAsync(It.IsNotNull(), It.IsAny())).Returns(Task.FromResult(response)); + httpClient.Setup(x => x.SendAsync(It.IsNotNull(), It.IsAny(), It.IsAny())).Returns(Task.FromResult(response)); var client = new ApiClient(httpClient.Object, new Uri("http://fake.com"), new ApiHeaders(new ProductHeaderValue("fake"), "fake"), null, false); @@ -64,7 +64,7 @@ namespace Tgstation.Server.Client.Tests }; var httpClient = new Mock(); - httpClient.Setup(x => x.SendAsync(It.IsNotNull(), It.IsAny())).Returns(Task.FromResult(response)); + httpClient.Setup(x => x.SendAsync(It.IsNotNull(), It.IsAny(), It.IsAny())).Returns(Task.FromResult(response)); var client = new ApiClient(httpClient.Object, new Uri("http://fake.com"), new ApiHeaders(new ProductHeaderValue("fake"), "fake"), null, true); diff --git a/tests/Tgstation.Server.Host.Tests/Swarm/SwarmRpcMapper.cs b/tests/Tgstation.Server.Host.Tests/Swarm/SwarmRpcMapper.cs index f0678cd37d..acab0e6bbb 100644 --- a/tests/Tgstation.Server.Host.Tests/Swarm/SwarmRpcMapper.cs +++ b/tests/Tgstation.Server.Host.Tests/Swarm/SwarmRpcMapper.cs @@ -41,7 +41,7 @@ namespace Tgstation.Server.Host.Swarm.Tests { this.createSwarmController = createSwarmController; clientMock - .Setup(x => x.SendAsync(It.IsNotNull(), It.IsAny())) + .Setup(x => x.SendAsync(It.IsNotNull(), It.IsAny(), It.IsAny())) .Returns(MapRequest); this.logger = logger; AsyncRequests = true; @@ -59,6 +59,7 @@ namespace Tgstation.Server.Host.Swarm.Tests async Task MapRequest( HttpRequestMessage request, + HttpCompletionOption httpCompletionOption, CancellationToken cancellationToken) { var (config, node) = configToNodes.FirstOrDefault( diff --git a/tools/Tgstation.Server.Migrator/Program.cs b/tools/Tgstation.Server.Migrator/Program.cs index fb6810da0b..1bd41582cd 100644 --- a/tools/Tgstation.Server.Migrator/Program.cs +++ b/tools/Tgstation.Server.Migrator/Program.cs @@ -282,7 +282,7 @@ try using var httpClient = httpClientFactory.CreateClient(); using var request = new HttpRequestMessage(HttpMethod.Get, downloadUri); - var webRequestTask = httpClient.SendAsync(request, default); + var webRequestTask = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, default); using var response = await webRequestTask; response.EnsureSuccessStatusCode(); await using (var responseStream = await response.Content.ReadAsStreamAsync())