using System; using System.Linq; using System.Text.RegularExpressions; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Rewrite; namespace StardewModdingAPI.Web.Framework { /// Rewrite requests to prepend the subdomain portion (if any) to the path. /// Derived from . internal class RewriteSubdomainRule : IRule { /********* ** Accessors *********/ /// The paths (excluding the hostname portion) to not rewrite. public Regex[] ExceptPaths { get; set; } /********* ** 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) { context.Result = RuleResult.ContinueRules; HttpRequest request = context.HttpContext.Request; // check ignores if (this.ExceptPaths?.Any(pattern => pattern.IsMatch(request.Path)) == true) return; // get host parts string host = request.Host.Host; string[] parts = host.Split('.'); // validate if (parts.Length < 2) return; if (parts.Length < 3 && !"localhost".Equals(parts[1], StringComparison.InvariantCultureIgnoreCase)) return; // prepend to path request.Path = $"/{parts[0]}{request.Path}"; } } }