private async Task <ReloadlyException> CreateResponseException <TResponse>( ReloadlyRequest <TResponse> request, HttpResponseMessage responseMessage) where TResponse : class { if ((int)responseMessage.StatusCode == STATUS_CODE_TOO_MANY_REQUEST) { return(CreateRateLimitException <TResponse>(responseMessage)); } var body = responseMessage.Content != null ? await responseMessage.Content.ReadAsStringAsync() : null; if (string.IsNullOrWhiteSpace(body)) { throw new ApiException( "No response from server, please try again or contact support", (int)responseMessage.StatusCode, responseMessage.RequestMessage.RequestUri.AbsolutePath); } if (responseMessage.RequestMessage.RequestUri.AbsolutePath.TrimStart('/') == "oauth/token") { throw new ReloadlyOAuthException <TResponse>( request, body, (int)responseMessage.StatusCode, responseMessage.RequestMessage.RequestUri.AbsolutePath); } throw new ApiException(body, (int)responseMessage.StatusCode, responseMessage.RequestMessage.RequestUri.AbsolutePath); }
public Task <TResponse> RefreshTokenForRequest <TResponse>(ReloadlyRequest <TResponse> request, string accessToken) where TResponse : class { AccessToken = accessToken; request.SetHeader(HeaderNames.Authorization, $"Bearer {accessToken}"); return(_httpClient.SendAsync(request)); }
public async Task <TResponse?> SendAsync <TResponse>(ReloadlyRequest <TResponse> request) where TResponse : class { var reqMessage = request.CreateHttpRequestMessage(); if (!_disableTelemetry) { var telemetry = TelemetryUtility.Create(_apiVersion).HttpHeaderValue(); reqMessage.Headers.TryAddWithoutValidation(TelemetryHeaderName, telemetry); } var httpClient = _httpClientFactory.CreateClient(); var resMessage = await httpClient.SendAsync(reqMessage); return(await ParseResponse(request, resMessage)); }
private async Task <TResponse?> ParseResponse <TResponse>(ReloadlyRequest <TResponse> request, HttpResponseMessage responseMessage) where TResponse : class { if (!responseMessage.IsSuccessStatusCode) { throw await CreateResponseException(request, responseMessage); } var payload = await responseMessage.Content.ReadAsStringAsync(); try { return(JsonConvert.DeserializeObject <TResponse>(payload)); } catch (System.Exception ex) { var path = responseMessage.RequestMessage.RequestUri.AbsolutePath; throw new ApiException("Failed to parse json body.", (int)responseMessage.StatusCode, path, ex); } }
public async Task OfTShouldCreateHttpRequestMessage() { // arrange var url = ServiceUrls.ByEnvironment(Enums.ReloadlyEnvironment.Live); var reloadlyRequest = new ReloadlyRequest <object>(HttpMethod.Get, new Uri(url)) .SetHeader("Accept", "application/json") .SetBody(new { name = "bodyValue" }) .SetQueryParameter("param", "queryValue"); // act var request = reloadlyRequest.CreateHttpRequestMessage(); // assert Assert.AreEqual(new Uri(url).Host, request.RequestUri.Host); var requestBody = await request.Content.ReadAsStringAsync(); Assert.IsTrue(requestBody.Contains("\"name\":\"bodyValue\"")); Assert.AreEqual("?param=queryValue", request.RequestUri.Query); }
public ReloadlyOAuthException() { Request = default !;