Files
SPT-Server-Build/Libraries/SPTarkov.Server.Core/Routers/HttpRouter.cs
T
Jesse 80f759a0da Http server router refactor (#553)
* Add edge case for Reverse Proxies

* Cleanup HttpListener, remove unecessary MemoryStreams

* Handle with IPAddress instead of string

* Handle nullabiity of RouteAction, tighten typing on requests

* Cleanup HttpRouter

* Use tighter typing on Routers
2025-08-18 17:59:07 +00:00

67 lines
1.8 KiB
C#

using Microsoft.AspNetCore.Http;
using SPTarkov.DI.Annotations;
using SPTarkov.Server.Core.DI;
using SPTarkov.Server.Core.Models.Common;
namespace SPTarkov.Server.Core.Routers;
[Injectable]
public class HttpRouter(IEnumerable<StaticRouter> staticRouters, IEnumerable<DynamicRouter> dynamicRoutes)
{
public async ValueTask<string?> GetResponse(HttpRequest req, MongoId sessionID, string? body)
{
var wrapper = new ResponseWrapper("");
var handled = await HandleRoute(req, sessionID, wrapper, staticRouters, false, body);
if (!handled)
{
await HandleRoute(req, sessionID, wrapper, dynamicRoutes, true, body);
}
return wrapper.Output;
}
protected async ValueTask<bool> HandleRoute(
HttpRequest request,
MongoId sessionID,
ResponseWrapper wrapper,
IEnumerable<Router> routers,
bool dynamic,
string? body
)
{
var url = request.Path.Value;
// remove retry from url
if (url?.Contains("?retry=") ?? false)
{
url = url.Split("?retry=")[0];
}
var matched = false;
foreach (var route in routers)
{
if (route.CanHandle(url, dynamic))
{
if (dynamic)
{
wrapper.Output = await (route as DynamicRouter).HandleDynamic(url, body, sessionID, wrapper.Output) as string;
}
else
{
wrapper.Output = await (route as StaticRouter).HandleStatic(url, body, sessionID, wrapper.Output) as string;
}
matched = true;
}
}
return matched;
}
protected class ResponseWrapper(string? output)
{
public string? Output { get; set; } = output;
}
}