68 lines
1.7 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|