xdm/app/XDM/HttpServer/HttpServer.cs
2021-12-06 14:05:37 +01:00

68 lines
1.7 KiB
C#

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using TraceLog;
namespace HttpServer
{
public class NanoServer
{
private readonly TcpListener listener;
public event EventHandler<RequestContextEventArgs>? RequestReceived;
public NanoServer(int port) : this(IPAddress.Any, port) { }
public NanoServer(IPAddress host, int port)
{
this.listener = new TcpListener(host, port);
}
public void Start()
{
listener.Start();
while (true)
{
var tcp = listener.AcceptTcpClient();
ProcessRequest(tcp);
}
}
public void Stop()
{
try
{
this.listener.Stop();
}
catch { }
}
private void ProcessRequest(TcpClient tcp)
{
new Thread(() =>
{
try
{
while (true)
{
var ctx = HttpParser.ParseContext(tcp);
this.RequestReceived?.Invoke(this, new RequestContextEventArgs(ctx));
if (!ctx.KeepAlive)
{
break;
}
}
}
catch (Exception ex)
{
Log.Debug(ex, ex.Message);
}
finally
{
try { tcp.Close(); } catch { }
}
}).Start();
}
}
}