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 virtualHosts = new Dictionary(); public VirtualHostRouter() { } public VirtualHostRouter(HttpRouter defaultRoute) { DefaultRoute = defaultRoute; } public VirtualHostRouter(IEnumerable> routes) { foreach (KeyValuePair route in routes) virtualHosts.Add(route.Key, route.Value); } public VirtualHostRouter(HttpRouter defaultRoute,IEnumerable> 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)); } } }