using System; using System.Net; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Rewrite; namespace StardewModdingAPI.Web.Framework.RedirectRules { /// Redirect matching requests to a URL. internal abstract class RedirectMatchRule : IRule { /********* ** Fields *********/ /// The status code to use for redirects. protected HttpStatusCode StatusCode { get; set; } = HttpStatusCode.Redirect; /********* ** Public methods *********/ /// Applies the rule. Implementations of ApplyRule should set the value for (defaults to RuleResult.ContinueRules). /// The rewrite context. public void ApplyRule(RewriteContext context) { string? newUrl = this.GetNewUrl(context); if (newUrl == null) return; HttpResponse response = context.HttpContext.Response; response.StatusCode = (int)HttpStatusCode.Redirect; response.Headers["Location"] = newUrl; context.Result = RuleResult.EndResponse; } /********* ** Protected methods *********/ /// Get the new redirect URL. /// The rewrite context. /// Returns the redirect URL, or null if the redirect doesn't apply. protected abstract string? GetNewUrl(RewriteContext context); /// Get the full request URL. /// The request. protected UriBuilder GetUrl(HttpRequest request) { return new UriBuilder { Scheme = request.Scheme, Host = request.Host.Host, Port = request.Host.Port ?? -1, Path = request.PathBase + request.Path, Query = request.QueryString.Value }; } } }