-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSimpleServer.cs
More file actions
79 lines (67 loc) · 1.96 KB
/
Copy pathSimpleServer.cs
File metadata and controls
79 lines (67 loc) · 1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using Rage;
using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
public delegate byte[] ProcessDataDelegate(string data);
public class SimpleServer
{
private const int HandlerThread = 3;
private readonly ProcessDataDelegate handler;
private readonly HttpListener listener;
public SimpleServer(HttpListener listener, string url, ProcessDataDelegate handler)
{
this.listener = listener;
this.handler = handler;
listener.Prefixes.Add(url);
}
public void Start()
{
if (listener.IsListening)
return;
try
{
listener.Start();
for (int i = 0; i < HandlerThread; i++)
{
listener.GetContextAsync().ContinueWith(ProcessRequestHandler);
}
}
catch (Exception ex)
{
Game.LogTrivial($"Server failed: {ex}");
}
}
public void Stop()
{
if (listener.IsListening)
listener.Stop();
}
private async void ProcessRequestHandler(Task<HttpListenerContext> result)
{
var context = await result;
if (!listener.IsListening)
return;
// Avvia nuovo listener prima di elaborare
listener.GetContextAsync().ContinueWith(ProcessRequestHandler);
try
{
// Leggi la richiesta
string request = new StreamReader(context.Request.InputStream).ReadToEnd();
// Elabora la risposta
var responseBytes = handler.Invoke(request);
context.Response.ContentLength64 = responseBytes.Length;
// Invia risposta
await context.Response.OutputStream.WriteAsync(responseBytes, 0, responseBytes.Length);
}
catch (Exception ex)
{
Game.LogTrivial($"Error: {ex}");
context.Response.StatusCode = 500;
}
finally
{
context.Response.Close();
}
}
}