using System; using System.Net; using System.Net.Http; using System.Net.Http.Json; using System.Threading; using System.Threading.Tasks; using Oqtane.Shared; namespace Oqtane.Services { public class RemoteServiceBase { private readonly SiteState _siteState; private readonly IHttpClientFactory _httpClientFactory; protected RemoteServiceBase(IHttpClientFactory httpClientFactory, SiteState siteState) { _siteState = siteState; _httpClientFactory = httpClientFactory; } private HttpClient GetHttpClient() { return GetHttpClient(_siteState?.AuthorizationToken); } private HttpClient GetHttpClient(string AuthorizationToken) { var httpClient = _httpClientFactory.CreateClient("Remote"); if (!httpClient.DefaultRequestHeaders.Contains("Authorization") && !string.IsNullOrEmpty(AuthorizationToken)) { httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + AuthorizationToken); } return httpClient; } protected async Task GetAsync(string uri) { var response = await GetHttpClient().GetAsync(uri); CheckResponse(response); } protected async Task GetStringAsync(string uri) { try { return await GetHttpClient().GetStringAsync(uri); } catch (Exception e) { Console.WriteLine(e); } return default; } protected async Task GetByteArrayAsync(string uri) { try { return await GetHttpClient().GetByteArrayAsync(uri); } catch (Exception e) { Console.WriteLine(e); } return default; } protected async Task GetJsonAsync(string uri) { var response = await GetHttpClient().GetAsync(uri, HttpCompletionOption.ResponseHeadersRead, CancellationToken.None); if (CheckResponse(response) && ValidateJsonContent(response.Content)) { return await response.Content.ReadFromJsonAsync(); } return default; } protected async Task PutAsync(string uri) { var response = await GetHttpClient().PutAsync(uri, null); CheckResponse(response); } protected async Task PutJsonAsync(string uri, T value) { return await PutJsonAsync(uri, value); } protected async Task PutJsonAsync(string uri, TValue value) { var response = await GetHttpClient().PutAsJsonAsync(uri, value); if (CheckResponse(response) && ValidateJsonContent(response.Content)) { var result = await response.Content.ReadFromJsonAsync(); return result; } return default; } protected async Task PostAsync(string uri) { var response = await GetHttpClient().PostAsync(uri, null); CheckResponse(response); } protected async Task PostJsonAsync(string uri, T value) { return await PostJsonAsync(uri, value); } protected async Task PostJsonAsync(string uri, TValue value) { var response = await GetHttpClient().PostAsJsonAsync(uri, value); if (CheckResponse(response) && ValidateJsonContent(response.Content)) { var result = await response.Content.ReadFromJsonAsync(); return result; } return default; } protected async Task DeleteAsync(string uri) { var response = await GetHttpClient().DeleteAsync(uri); CheckResponse(response); } private bool CheckResponse(HttpResponseMessage response) { if (response.IsSuccessStatusCode) return true; if (response.StatusCode != HttpStatusCode.NoContent && response.StatusCode != HttpStatusCode.NotFound) { Console.WriteLine($"Request: {response.RequestMessage.RequestUri}"); Console.WriteLine($"Response status: {response.StatusCode} {response.ReasonPhrase}"); } return false; } private static bool ValidateJsonContent(HttpContent content) { var mediaType = content?.Headers.ContentType?.MediaType; return mediaType != null && mediaType.Equals("application/json", StringComparison.OrdinalIgnoreCase); } } }