minor adjustments

This commit is contained in:
Pilzinsel64
2025-02-04 15:02:59 +01:00
parent a80e972460
commit 4e849845c6

View File

@@ -3,17 +3,18 @@ using Pilz.Extensions.Reflection;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Net; using System.Net;
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Web; using System.Web;
using static Pilz.Net.Api.IApiServer; using static Pilz.Net.Api.IApiServer;
namespace Pilz.Net.Api; namespace Pilz.Net.Api;
public class ApiServer(string apiUrl) : IApiServer public class ApiServer : IApiServer
{ {
protected readonly List<PrivateMessageHandler> handlers = []; protected readonly List<PrivateMessageHandler> handlers = [];
protected readonly Dictionary<Type, IApiMessageSerializer> serializers = []; protected readonly Dictionary<Type, IApiMessageSerializer> serializers = [];
protected HttpListener httpListener = new(); protected HttpListener httpListener;
protected int restartAttempts = 0; protected int restartAttempts = 0;
protected DateTime lastRestartAttempt; protected DateTime lastRestartAttempt;
protected SemaphoreSlim? semaphore; protected SemaphoreSlim? semaphore;
@@ -30,7 +31,7 @@ public class ApiServer(string apiUrl) : IApiServer
protected record PrivateApiResult(ApiResult Original, object? ResultContent); protected record PrivateApiResult(ApiResult Original, object? ResultContent);
public string ApiUrl { get; } = apiUrl; public string ApiUrl { get; }
public virtual bool EnableAuth { get; set; } public virtual bool EnableAuth { get; set; }
@@ -44,12 +45,37 @@ public class ApiServer(string apiUrl) : IApiServer
public int StopDelay { get; set; } = 5000; public int StopDelay { get; set; } = 5000;
public int AutoRestartOnError { get; set; } = 5000; public bool AutoRestartOnError { get; set; } = true;
public int MaxAutoRestartsPerMinute { get; set; } = 10; public int MaxAutoRestartsPerMinute { get; set; } = 10;
public int MaxConcurentConnections { get; set; } = 5; public int MaxConcurentConnections { get; set; } = 5;
public ApiServer(string apiUrl) : this(apiUrl, null)
{
}
public ApiServer(string apiUrl, HttpListener? httpListener)
{
ApiUrl = apiUrl;
this.httpListener = httpListener ?? CreateDefaultHttpListener();
}
protected virtual HttpListener CreateDefaultHttpListener()
{
var httpListener = new HttpListener();
httpListener.TimeoutManager.IdleConnection = new TimeSpan(0, 10, 0);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
httpListener.TimeoutManager.RequestQueue = new TimeSpan(0, 10, 0);
httpListener.TimeoutManager.HeaderWait = new TimeSpan(0, 10, 0);
}
return httpListener;
}
public virtual void Start() public virtual void Start()
{ {
Log.Info("Starting listener"); Log.Info("Starting listener");
@@ -90,9 +116,19 @@ public class ApiServer(string apiUrl) : IApiServer
protected virtual bool AutoRestart(bool graceful) protected virtual bool AutoRestart(bool graceful)
{ {
if (AutoRestartOnError)
return false;
if (isAutoRestarting) if (isAutoRestarting)
return true; return true;
var now = DateTime.Now;
if (now - lastRestartAttempt > TimeSpan.FromMinutes(1))
{
lastRestartAttempt = now;
restartAttempts = 0;
}
if (restartAttempts > MaxAutoRestartsPerMinute) if (restartAttempts > MaxAutoRestartsPerMinute)
{ {
Log.Fatal("Reached maximum auto-restart attempts"); Log.Fatal("Reached maximum auto-restart attempts");
@@ -100,12 +136,7 @@ public class ApiServer(string apiUrl) : IApiServer
return false; return false;
} }
var now = DateTime.Now;
if (now - lastRestartAttempt > TimeSpan.FromMinutes(1))
lastRestartAttempt = now;
restartAttempts += 1; restartAttempts += 1;
isAutoRestarting = true; isAutoRestarting = true;
Restart(graceful); Restart(graceful);
isAutoRestarting = false; isAutoRestarting = false;