2022-04-27 18:29:09 +00:00
|
|
|
using System.Collections;
|
|
|
|
|
using System.Collections.Concurrent;
|
2023-10-20 07:51:56 +00:00
|
|
|
using Elsa.Extensions;
|
2022-04-27 18:29:09 +00:00
|
|
|
using Microsoft.Extensions.Caching.Memory;
|
2023-09-09 12:40:48 +00:00
|
|
|
using Microsoft.Extensions.Logging;
|
2022-04-27 18:29:09 +00:00
|
|
|
|
2023-03-03 21:47:23 +00:00
|
|
|
namespace Elsa.Http.Services;
|
2022-04-27 18:29:09 +00:00
|
|
|
|
2023-01-10 13:32:14 +00:00
|
|
|
/// <inheritdoc />
|
2024-10-15 21:16:50 +00:00
|
|
|
public class RouteTable(IMemoryCache cache, ILogger<RouteTable> logger) : IRouteTable
|
2022-04-27 18:29:09 +00:00
|
|
|
{
|
|
|
|
|
private static readonly object Key = new();
|
2023-09-09 12:40:48 +00:00
|
|
|
|
2024-10-15 21:16:50 +00:00
|
|
|
private ConcurrentDictionary<string, HttpRouteData> Routes => cache.GetOrCreate(Key, _ => new ConcurrentDictionary<string, HttpRouteData>())!;
|
2023-01-10 13:32:14 +00:00
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
2023-10-20 07:51:56 +00:00
|
|
|
public void Add(string route)
|
2023-09-09 12:40:48 +00:00
|
|
|
{
|
2024-10-14 19:27:11 +00:00
|
|
|
Add(new HttpRouteData(route));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public void Add(HttpRouteData httpRouteData)
|
|
|
|
|
{
|
|
|
|
|
var route = httpRouteData.Route;
|
2023-10-20 07:51:56 +00:00
|
|
|
if (route.Contains("//"))
|
2023-09-09 12:40:48 +00:00
|
|
|
{
|
2024-10-15 21:16:50 +00:00
|
|
|
logger.LogWarning("Path cannot contain double slashes. Ignoring path: {Path}", route);
|
2023-09-09 12:40:48 +00:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-20 07:51:56 +00:00
|
|
|
var normalizedRoute = route.NormalizeRoute();
|
2024-10-14 19:27:11 +00:00
|
|
|
Routes.TryAdd(normalizedRoute, httpRouteData);
|
2023-09-09 12:40:48 +00:00
|
|
|
}
|
2023-01-10 13:32:14 +00:00
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
2023-10-20 07:51:56 +00:00
|
|
|
public void Remove(string route)
|
|
|
|
|
{
|
|
|
|
|
var normalizedRoute = route.NormalizeRoute();
|
|
|
|
|
Routes.TryRemove(normalizedRoute, out _);
|
|
|
|
|
}
|
2022-04-27 18:29:09 +00:00
|
|
|
|
2023-01-10 13:32:14 +00:00
|
|
|
/// <inheritdoc />
|
2023-10-20 07:51:56 +00:00
|
|
|
public void AddRange(IEnumerable<string> routes)
|
2022-04-27 18:29:09 +00:00
|
|
|
{
|
2023-10-20 07:51:56 +00:00
|
|
|
foreach (var route in routes) Add(route);
|
2022-04-27 18:29:09 +00:00
|
|
|
}
|
|
|
|
|
|
2023-01-10 13:32:14 +00:00
|
|
|
/// <inheritdoc />
|
2023-10-20 07:51:56 +00:00
|
|
|
public void RemoveRange(IEnumerable<string> routes)
|
2022-04-27 18:29:09 +00:00
|
|
|
{
|
2023-10-20 07:51:56 +00:00
|
|
|
foreach (var route in routes) Remove(route);
|
2022-04-27 18:29:09 +00:00
|
|
|
}
|
|
|
|
|
|
2023-01-10 13:32:14 +00:00
|
|
|
/// <inheritdoc />
|
2024-10-14 19:27:11 +00:00
|
|
|
public IEnumerator<HttpRouteData> GetEnumerator() => Routes.Values.GetEnumerator();
|
2023-09-09 12:40:48 +00:00
|
|
|
|
2022-04-27 18:29:09 +00:00
|
|
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
|
|
|
|
}
|