50 lines
1.9 KiB
C#
50 lines
1.9 KiB
C#
using ln.http.exceptions;
|
|
using System.Collections.Generic;
|
|
using System.Net.Http;
|
|
|
|
namespace ln.http.router
|
|
{
|
|
public class VirtualHostRouter : HttpRouter
|
|
{
|
|
public HttpRouter DefaultRoute { get; set; }
|
|
|
|
Dictionary<string, HttpRouter> virtualHosts = new Dictionary<string, HttpRouter>();
|
|
|
|
public VirtualHostRouter()
|
|
{
|
|
}
|
|
public VirtualHostRouter(HttpRouter defaultRoute)
|
|
{
|
|
DefaultRoute = defaultRoute;
|
|
}
|
|
public VirtualHostRouter(IEnumerable<KeyValuePair<string, HttpRouter>> routes)
|
|
{
|
|
foreach (KeyValuePair<string, HttpRouter> route in routes)
|
|
virtualHosts.Add(route.Key, route.Value);
|
|
}
|
|
public VirtualHostRouter(HttpRouter defaultRoute,IEnumerable<KeyValuePair<string, HttpRouter>> routes)
|
|
:this(routes)
|
|
{
|
|
DefaultRoute = defaultRoute;
|
|
}
|
|
public VirtualHostRouter(VirtualHostRouter source)
|
|
: this(source.virtualHosts) { }
|
|
|
|
public void Add(string hostname,HttpRouter router) => virtualHosts.Add(hostname, router);
|
|
public void Remove(string hostname) => virtualHosts.Remove(hostname);
|
|
public bool Contains(string hostname) => virtualHosts.ContainsKey(hostname);
|
|
|
|
public bool TryGetValue(string hostname, out HttpRouter router) => virtualHosts.TryGetValue(hostname, out router);
|
|
|
|
public bool Route(HttpRequestContext requestContext, string routePath)
|
|
{
|
|
if (virtualHosts.TryGetValue(requestContext.Request.Host, out HttpRouter virtualHost))
|
|
return virtualHost.RouteRequest(requestContext, routePath);
|
|
if (DefaultRoute != null)
|
|
return DefaultRoute.RouteRequest(requestContext, routePath);
|
|
|
|
throw new HttpException(HttpStatusCode.Gone, string.Format("Gone. Hostname {0} not found on this server.", requestContext.Request.Host));
|
|
}
|
|
}
|
|
}
|