80f759a0da
* 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
67 lines
1.8 KiB
C#
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;
|
|
}
|
|
}
|