namespace Cleanuparr.Api.Extensions; public static class HttpRequestExtensions { /// /// Returns the request PathBase as a safe relative path. /// Rejects absolute URLs (e.g. "://" or "//") to prevent open redirect attacks. /// public static string GetSafeBasePath(this HttpRequest request) { var basePath = request.PathBase.Value?.TrimEnd('/') ?? ""; if (basePath.Contains("://") || basePath.StartsWith("//")) { return ""; } return basePath; } /// /// Returns the external base URL (scheme + host + basePath). /// TrustedForwardedHeadersMiddleware has already applied X-Forwarded-Proto and X-Forwarded-Host to / . /// public static string GetExternalBaseUrl(this HttpContext context) { var request = context.Request; var basePath = request.GetSafeBasePath(); return $"{request.Scheme}://{request.Host}{basePath}"; } }