2022-02-07 09:29:30 +01:00
|
|
|
|
using System;
|
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
2023-08-07 10:38:01 +02:00
|
|
|
|
using ln.http.route;
|
2022-02-07 09:29:30 +01:00
|
|
|
|
|
|
|
|
|
namespace ln.http
|
|
|
|
|
{
|
2023-08-07 10:38:01 +02:00
|
|
|
|
public delegate bool HttpRouterDelegate(HttpRequestContext context, string routedPath);
|
|
|
|
|
public delegate bool HttpAuthorizationDelegate(HttpRequestContext httpRequestContext);
|
|
|
|
|
public delegate void HttpFilterDelegate(HttpRequestContext httpRequestContext);
|
2022-02-07 09:29:30 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public enum HttpRoutePriority : int { HIGHEST = 0, HIGH = 1, NORMAL = 2, LOW = 3, LOWEST = 4 }
|
|
|
|
|
|
2023-08-07 10:38:01 +02:00
|
|
|
|
public class HttpRouter : HttpRoute, IDisposable
|
2022-02-07 09:29:30 +01:00
|
|
|
|
{
|
|
|
|
|
public event HttpFilterDelegate HttpFilters;
|
2023-08-07 10:38:01 +02:00
|
|
|
|
public event HttpFilterDelegate HttpFixups;
|
|
|
|
|
|
2022-06-07 22:43:14 +02:00
|
|
|
|
private HttpRouter _parentRouter;
|
2023-08-07 10:38:01 +02:00
|
|
|
|
private List<HttpRoute> _routes = new List<HttpRoute>();
|
2022-05-27 07:25:41 +02:00
|
|
|
|
|
2022-02-07 09:29:30 +01:00
|
|
|
|
public HttpRouter()
|
2023-08-07 10:38:01 +02:00
|
|
|
|
:this(HttpMethod.ANY, null)
|
2022-02-07 09:29:30 +01:00
|
|
|
|
{
|
2023-08-07 10:38:01 +02:00
|
|
|
|
_routerDelegate = RouteRequest;
|
2022-02-07 09:29:30 +01:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-07 10:38:01 +02:00
|
|
|
|
public HttpRouter(HttpMethod httpMethod, string mapPath)
|
|
|
|
|
: base(httpMethod, mapPath)
|
2022-05-27 07:25:41 +02:00
|
|
|
|
{
|
|
|
|
|
}
|
2023-08-07 10:38:01 +02:00
|
|
|
|
|
|
|
|
|
public HttpRouter(HttpRouter parentRouter, string mapPath)
|
|
|
|
|
:base(HttpMethod.ANY, mapPath)
|
2022-06-07 22:43:14 +02:00
|
|
|
|
{
|
|
|
|
|
_parentRouter = parentRouter;
|
2023-08-07 10:38:01 +02:00
|
|
|
|
_parentRouter.Map(this);
|
2022-06-07 22:43:14 +02:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-07 10:38:01 +02:00
|
|
|
|
public void Map(HttpRoute httpRoute) => _routes.Add(httpRoute);
|
|
|
|
|
public void UnMap(HttpRoute httpRoute) => _routes.Remove(httpRoute);
|
2022-02-07 09:29:30 +01:00
|
|
|
|
|
2023-08-07 10:38:01 +02:00
|
|
|
|
public void Map(HttpMethod httpMethod, string route, HttpRouterDelegate routerDelegate)
|
|
|
|
|
=> Map(new HttpRoute(httpMethod, route, routerDelegate));
|
|
|
|
|
|
2022-02-07 09:29:30 +01:00
|
|
|
|
|
2024-04-26 14:49:44 +02:00
|
|
|
|
public virtual bool RouteRequest(HttpRequestContext httpRequestContext, string routePath)
|
2022-06-07 22:43:14 +02:00
|
|
|
|
{
|
2023-08-07 10:38:01 +02:00
|
|
|
|
HttpFilters?.Invoke(httpRequestContext);
|
|
|
|
|
|
|
|
|
|
foreach (var httpRoute in _routes)
|
2022-06-07 22:43:14 +02:00
|
|
|
|
{
|
2023-08-07 10:38:01 +02:00
|
|
|
|
if (httpRoute.TryRoute(httpRequestContext, routePath))
|
|
|
|
|
{
|
|
|
|
|
HttpFixups?.Invoke(httpRequestContext);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2022-06-07 22:43:14 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-07 10:38:01 +02:00
|
|
|
|
public void Dispose()
|
2022-02-07 09:29:30 +01:00
|
|
|
|
{
|
2023-08-07 10:38:01 +02:00
|
|
|
|
_parentRouter?.Dispose();
|
2022-02-07 09:29:30 +01:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-07 10:38:01 +02:00
|
|
|
|
public override string ToString() => $"[HttpRouter]";
|
|
|
|
|
|
|
|
|
|
/*private string RegexFromRoute(string route)
|
2022-02-07 09:29:30 +01:00
|
|
|
|
{
|
|
|
|
|
string[] parts = route.Split(new char[] { '/' });
|
|
|
|
|
string[] reparts = parts.Select((part) =>
|
|
|
|
|
{
|
|
|
|
|
if (part.StartsWith(":", StringComparison.InvariantCulture))
|
|
|
|
|
if (part.EndsWith("*", StringComparison.InvariantCulture))
|
|
|
|
|
return string.Format("(?<{0}>[^/]+)(?<_>/.*)?", part.Substring(1, part.Length - 2));
|
|
|
|
|
else
|
|
|
|
|
return string.Format("(?<{0}>[^/]+)", part.Substring(1));
|
|
|
|
|
else if (part.Equals("*"))
|
|
|
|
|
return string.Format("(?<_>.*)");
|
2023-08-07 10:38:01 +02:00
|
|
|
|
else if (part.EndsWith("*", StringComparison.InvariantCulture))
|
|
|
|
|
return string.Format("{0}[^/]+(?<_>/.*)?", part.Substring(0, part.Length-1));
|
2022-02-07 09:29:30 +01:00
|
|
|
|
else
|
|
|
|
|
return string.Format("{0}", part);
|
|
|
|
|
}).ToArray();
|
|
|
|
|
|
|
|
|
|
return string.Format("^{0}/?$", string.Join("/", reparts));
|
2023-08-07 10:38:01 +02:00
|
|
|
|
}*/
|
2022-02-07 09:29:30 +01:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|