using Furion; using Furion.DatabaseAccessor; using Furion.DataEncryption; using Furion.HttpRemote; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Security.Claims; using System.Text; using System.Text.Json; using System.Threading.Tasks; namespace ApiTools.Core { /// /// 默认资源提供者 /// public class DefaultResourceHttpProvider : IResourceHttpProvider { public async Task SendAsStringAsync(HttpRequestBuilder builder) { var httpRemoteService = App.GetRequiredService(); builder = WithHeader(builder, "Authorization"); builder = WithHeader(builder, "X-Authorization"); var body = (builder.RawContent as JsonDocument).RootElement.ToString(); var response = await httpRemoteService.SendAsStringAsync(builder); try { var result = response.JsonTo(new { Code = 0 }); if (result.Code == 401) { var accessToken = GetHeaderValue(builder, "Authorization"); var logier = await accessToken.GetCurrentLogier(); if (logier != null) { var builderNew = HttpRequestBuilder.Create(builder.HttpMethod, builder.RequestUri); if (builder.HttpMethod == HttpMethod.Get) builderNew = builderNew.WithQueryParameters(builderNew.QueryParameters); else builderNew = builderNew.SetJsonContent(body); builderNew = builderNew.WithHeader("Authorization", $"Bearer {logier.AccessToken}"); builderNew = builderNew.WithHeader("X-Authorization", $"Bearer {logier.RefreshToken}"); response = await httpRemoteService.SendAsStringAsync(builderNew); } } } catch { } return response; } public string GetHeaderValue(HttpRequestBuilder builder, string name) { string value = null; if (builder.Headers?.ContainsKey(name) ?? false) { value = builder.Headers[name].FirstOrDefault(); } else if (App.HttpContext.Request.Headers.ContainsKey(name)) { value = App.HttpContext.Request.Headers[name].ToString(); } return value; } private HttpRequestBuilder WithHeader(HttpRequestBuilder builder, string name, string value = null) { value ??= GetHeaderValue(builder, name); if (value.IsNotNull()) { builder = builder.WithHeader(name, value, replace: true); } return builder; } } }