ln.http/ln.http/router/VirtualHostRouter.cs

49 lines
1.9 KiB
C#

using ln.http.exceptions;
using System.Collections.Generic;
namespace ln.http.router
{
public class VirtualHostRouter : IHttpRouter
{
public IHttpRouter DefaultRoute { get; set; }
Dictionary<string, IHttpRouter> virtualHosts = new Dictionary<string, IHttpRouter>();
public VirtualHostRouter()
{
}
public VirtualHostRouter(IHttpRouter defaultRoute)
{
DefaultRoute = defaultRoute;
}
public VirtualHostRouter(IEnumerable<KeyValuePair<string, IHttpRouter>> routes)
{
foreach (KeyValuePair<string, IHttpRouter> route in routes)
virtualHosts.Add(route.Key, route.Value);
}
public VirtualHostRouter(IHttpRouter defaultRoute,IEnumerable<KeyValuePair<string, IHttpRouter>> routes)
:this(routes)
{
DefaultRoute = defaultRoute;
}
public VirtualHostRouter(VirtualHostRouter source)
: this(source.virtualHosts) { }
public void Add(string hostname,IHttpRouter 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 IHttpRouter router) => virtualHosts.TryGetValue(hostname, out router);
public HttpResponse Route(HttpRoutingContext routingContext, HttpRequest httpRequest)
{
if (virtualHosts.TryGetValue(httpRequest.Hostname, out IHttpRouter virtualHost))
return virtualHost.Route(routingContext, httpRequest);
if (DefaultRoute != null)
return DefaultRoute.Route(routingContext, httpRequest);
throw new HttpException(410, string.Format("Gone. Hostname {0} not found on this server.", httpRequest.Hostname));
}
}
}