From a63e75a490ea18b877582120ae86b14462260e94 Mon Sep 17 00:00:00 2001 From: Ske Date: Sun, 21 Mar 2021 14:15:13 +0100 Subject: [PATCH] Properly remake request object on retry --- Myriad/Rest/BaseRestClient.cs | 50 ++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/Myriad/Rest/BaseRestClient.cs b/Myriad/Rest/BaseRestClient.cs index 40a85c68..374640a6 100644 --- a/Myriad/Rest/BaseRestClient.cs +++ b/Myriad/Rest/BaseRestClient.cs @@ -69,8 +69,8 @@ namespace Myriad.Rest public async Task Get(string path, (string endpointName, ulong major) ratelimitParams) where T: class { - var request = new HttpRequestMessage(HttpMethod.Get, ApiBaseUrl + path); - var response = await Send(request, ratelimitParams, true); + using var response = await Send(() => new HttpRequestMessage(HttpMethod.Get, ApiBaseUrl + path), + ratelimitParams, true); // GET-only special case: 404s are nulls and not exceptions if (response.StatusCode == HttpStatusCode.NotFound) @@ -82,47 +82,54 @@ namespace Myriad.Rest public async Task Post(string path, (string endpointName, ulong major) ratelimitParams, object? body) where T: class { - var request = new HttpRequestMessage(HttpMethod.Post, ApiBaseUrl + path); - SetRequestJsonBody(request, body); - - var response = await Send(request, ratelimitParams); + using var response = await Send(() => + { + var request = new HttpRequestMessage(HttpMethod.Post, ApiBaseUrl + path); + SetRequestJsonBody(request, body); + return request; + }, ratelimitParams); return await ReadResponse(response); } public async Task PostMultipart(string path, (string endpointName, ulong major) ratelimitParams, object? payload, MultipartFile[]? files) where T: class { - var request = new HttpRequestMessage(HttpMethod.Post, ApiBaseUrl + path); - SetRequestFormDataBody(request, payload, files); - - var response = await Send(request, ratelimitParams); + using var response = await Send(() => + { + var request = new HttpRequestMessage(HttpMethod.Post, ApiBaseUrl + path); + SetRequestFormDataBody(request, payload, files); + return request; + }, ratelimitParams); return await ReadResponse(response); } public async Task Patch(string path, (string endpointName, ulong major) ratelimitParams, object? body) where T: class { - var request = new HttpRequestMessage(HttpMethod.Patch, ApiBaseUrl + path); - SetRequestJsonBody(request, body); - - var response = await Send(request, ratelimitParams); + using var response = await Send(() => + { + var request = new HttpRequestMessage(HttpMethod.Patch, ApiBaseUrl + path); + SetRequestJsonBody(request, body); + return request; + }, ratelimitParams); return await ReadResponse(response); } public async Task Put(string path, (string endpointName, ulong major) ratelimitParams, object? body) where T: class { - var request = new HttpRequestMessage(HttpMethod.Put, ApiBaseUrl + path); - SetRequestJsonBody(request, body); - - var response = await Send(request, ratelimitParams); + using var response = await Send(() => + { + var request = new HttpRequestMessage(HttpMethod.Put, ApiBaseUrl + path); + SetRequestJsonBody(request, body); + return request; + }, ratelimitParams); return await ReadResponse(response); } public async Task Delete(string path, (string endpointName, ulong major) ratelimitParams) { - var request = new HttpRequestMessage(HttpMethod.Delete, ApiBaseUrl + path); - await Send(request, ratelimitParams); + using var _ = await Send(() => new HttpRequestMessage(HttpMethod.Delete, ApiBaseUrl + path), ratelimitParams); } private void SetRequestJsonBody(HttpRequestMessage request, object? body) @@ -159,12 +166,13 @@ namespace Myriad.Rest return await response.Content.ReadFromJsonAsync(_jsonSerializerOptions); } - private async Task Send(HttpRequestMessage request, + private async Task Send(Func createRequest, (string endpointName, ulong major) ratelimitParams, bool ignoreNotFound = false) { return await _retryPolicy.ExecuteAsync(async _ => { + var request = createRequest(); _logger.Debug("Sending request: {RequestMethod} {RequestPath}", request.Method, request.RequestUri);