using Microsoft.AspNetCore.Http; using System; using System.Linq; namespace Mirea.Api.Endpoint.Common.Services; public static class UrlHelper { public static string GetCurrentScheme(this HttpContext context) => context.Request.Headers["X-Forwarded-Proto"].FirstOrDefault() ?? context.Request.Scheme; public static string GetCurrentDomain(this HttpContext context) => context.Request.Headers["X-Forwarded-Host"].FirstOrDefault() ?? context.Request.Host.Host; private static string CreateSubPath(string? path) { if (string.IsNullOrEmpty(path)) return "/"; return "/" + path.Trim('/') + "/"; } public static string GetSubPath => CreateSubPath(Environment.GetEnvironmentVariable("ACTUAL_SUB_PATH")); public static string GetSubPathWithoutFirstApiName { get { var path = GetSubPath; if (string.IsNullOrEmpty(path) || path == "/") return CreateSubPath(null); var parts = path.Split('/', StringSplitOptions.RemoveEmptyEntries); if (parts[^1].Equals("api", StringComparison.CurrentCultureIgnoreCase)) parts = parts.Take(parts.Length - 1).ToArray(); return CreateSubPath(string.Join("/", parts)); } } public static string GetSubPathSwagger => CreateSubPath(Environment.GetEnvironmentVariable("SWAGGER_SUB_PATH")); public static string GetApiUrl(this HttpContext context, string apiPath = "") { var scheme = GetCurrentScheme(context); var domain = GetCurrentDomain(context).TrimEnd('/'); var port = context.Request.Host.Port; var portString = port.HasValue && port != 80 && port != 443 ? $":{port}" : string.Empty; return $"{scheme}://{domain}{portString}{GetSubPathWithoutFirstApiName}{apiPath.Trim('/')}"; } }