4 changed files with 12 additions and 150 deletions
@ -1,106 +0,0 @@
@@ -1,106 +0,0 @@
|
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
using System.Linq; |
||||
using System.Threading.Tasks; |
||||
using System.Web; |
||||
using Microsoft.AspNetCore.Routing; |
||||
using Teknik.Utilities; |
||||
|
||||
namespace Teknik.Utilities.Routing |
||||
{ |
||||
public class SubdomainRoute : Route |
||||
{ |
||||
private readonly IRouter _target; |
||||
|
||||
public List<string> Subdomains { get; set; } |
||||
|
||||
public List<string> Domains { get; set; } |
||||
|
||||
public SubdomainRoute(List<string> subdomains, List<string> domains, IRouter router, string routeTemplate, IInlineConstraintResolver inlineConstraintResolver) |
||||
: base(router, routeTemplate, inlineConstraintResolver) |
||||
{ |
||||
this.Subdomains = subdomains; |
||||
this.Domains = domains; |
||||
this._target = router; |
||||
} |
||||
|
||||
public SubdomainRoute(List<string> subdomains, List<string> domains, IRouter router, string routeTemplate, RouteValueDictionary defaults, IDictionary<string, object> constraints, RouteValueDictionary dataTokens, IInlineConstraintResolver inlineConstraintResolver) |
||||
: base(router, routeTemplate, defaults, constraints, dataTokens, inlineConstraintResolver) |
||||
{ |
||||
this.Subdomains = subdomains; |
||||
this.Domains = domains; |
||||
this._target = router; |
||||
} |
||||
|
||||
public SubdomainRoute(List<string> subdomains, List<string> domains, IRouter router, string routeName, string routeTemplate, RouteValueDictionary defaults, IDictionary<string, object> constraints, RouteValueDictionary dataTokens, IInlineConstraintResolver inlineConstraintResolver) |
||||
: base(router, routeName, routeTemplate, defaults, constraints, dataTokens, inlineConstraintResolver) |
||||
{ |
||||
this.Subdomains = subdomains; |
||||
this.Domains = domains; |
||||
this._target = router; |
||||
} |
||||
|
||||
protected override Task OnRouteMatched(RouteContext context) |
||||
{ |
||||
// Only look at the subdomain if there is any route data.
|
||||
if (context.RouteData != null) |
||||
{ |
||||
string subdomain = context.HttpContext.Request.Query["sub"]; // A subdomain specified as a query parameter takes precedence over the hostname.
|
||||
string host = context.HttpContext.Request.Headers["Host"]; |
||||
|
||||
if (host != null) |
||||
{ |
||||
string domain = host.GetDomain(); |
||||
string curSub = host.GetSubdomain(); |
||||
|
||||
// special consideration for 'dev' subdomain
|
||||
if (subdomain == null || subdomain == "dev") |
||||
{ |
||||
if (!string.IsNullOrEmpty(curSub) && curSub == "dev") |
||||
{ |
||||
// if we are on dev, and the param is dev or empty, we need to initialize it to 'www'
|
||||
subdomain = "www"; |
||||
} |
||||
} |
||||
|
||||
if (subdomain == null) |
||||
{ |
||||
subdomain = curSub; |
||||
} |
||||
else |
||||
{ |
||||
if (context.RouteData.Values["sub"] == null) |
||||
{ |
||||
context.RouteData.Values["sub"] = subdomain; |
||||
} |
||||
else |
||||
{ |
||||
subdomain = context.RouteData.Values["sub"].ToString(); |
||||
} |
||||
} |
||||
|
||||
// Check if this route is valid for the current domain
|
||||
if (context.HttpContext.Request.IsLocal() || Domains.Contains(domain)) |
||||
{ |
||||
// Check if this route is valid for the current subdomain ('*' means any subdomain is valid)
|
||||
if (Subdomains.Contains("*") || Subdomains.Contains(subdomain)) |
||||
{ |
||||
context.RouteData.Values["sub"] = subdomain; |
||||
context.RouteData.Routers.Add(_target); |
||||
return _target.RouteAsync(context); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
return Task.CompletedTask; |
||||
} |
||||
|
||||
public override VirtualPathData GetVirtualPath(VirtualPathContext context) |
||||
{ |
||||
object subdomainParam = context.HttpContext.Request.Query["sub"]; |
||||
if (subdomainParam != null && context.Values["sub"] == null) |
||||
context.Values["sub"] = subdomainParam; |
||||
return base.GetVirtualPath(context); // we now have the route based on subdomain
|
||||
} |
||||
} |
||||
} |
@ -1,41 +0,0 @@
@@ -1,41 +0,0 @@
|
||||
using Microsoft.AspNetCore.Mvc; |
||||
using Microsoft.AspNetCore.Routing; |
||||
using Microsoft.Extensions.DependencyInjection; |
||||
using Microsoft.Extensions.Configuration; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace Teknik.Utilities.Routing |
||||
{ |
||||
public static class SubdomainRouteExtension |
||||
{ |
||||
public static SubdomainRoute MapSubdomainRoute(this IRouteBuilder routeBuilder, string name, List<string> subDomains, List<string> domains, string template, object defaults) |
||||
{ |
||||
return MapSubdomainRoute(routeBuilder, name, subDomains, domains, template, defaults, new { }, new { }); |
||||
} |
||||
|
||||
public static SubdomainRoute MapSubdomainRoute(this IRouteBuilder routeBuilder, string name, List<string> subDomains, List<string> domains, string template, object defaults, object constraints) |
||||
{ |
||||
return MapSubdomainRoute(routeBuilder, name, subDomains, domains, template, defaults, constraints, new { }); |
||||
} |
||||
|
||||
public static SubdomainRoute MapSubdomainRoute(this IRouteBuilder routeBuilder, string name, List<string> subDomains, List<string> domains, string template, object defaults, object constraints, object dataTokens) |
||||
{ |
||||
var inlineConstraintResolver = routeBuilder.ServiceProvider.GetRequiredService<IInlineConstraintResolver>(); |
||||
|
||||
SubdomainRoute route = new SubdomainRoute( |
||||
subDomains, |
||||
domains, |
||||
routeBuilder.DefaultHandler, |
||||
name, |
||||
template, |
||||
new RouteValueDictionary(defaults), |
||||
new RouteValueDictionary(constraints), |
||||
new RouteValueDictionary(dataTokens), |
||||
inlineConstraintResolver); |
||||
|
||||
routeBuilder.Routes.Add(route); |
||||
|
||||
return route; |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue