private async Task <HttpContent> Request(string path, object?body, HttpMethod method, NodeCredentials credentials, CancellationToken ct = default) { using var client = ClientFor(credentials); var request = new HttpRequestMessage(); if (body != null) { request.Content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8); } request.Method = method; request.RequestUri = new Uri(path, UriKind.Relative); var resp = await client.SendAsync(request, ct); if (!resp.IsSuccessStatusCode) { var errorResponse = await resp.Content.ReadFromJsonAsync <ProxyClientErrorResponse>(cancellationToken : ct) ?? throw new InvalidOperationException("Could not read error response"); var exp = new ProxyClientException(errorResponse.Title) { ErrorResponse = errorResponse }; LogError(exp); throw exp; } return(resp.Content); }
private void LogError(ProxyClientException ex) { var currentActivity = Activity.Current; connectionLog.Error( currentActivity != null && ex.ErrorResponse != null ? $"{currentActivity.DisplayName} failed" : ex.Message, ex, ex.ErrorResponse != null ? new Dictionary <string, dynamic>( new[] { new KeyValuePair <string, dynamic>("detail", ex.ErrorResponse.Detail) }) : null ); currentActivity?.AddEvent(new ActivityEvent("Request failed", tags: new ActivityTagsCollection { ["detail"] = ex.ErrorResponse?.Detail, ["title"] = ex.ErrorResponse?.Title, ["type"] = ex.ErrorResponse?.Type })); }