FFXIVLauncher-Netmaui
90 строк · 2.5 Кб
1using System;
2using System.Diagnostics;
3using System.Net;
4using System.Net.Sockets;
5using System.Text;
6using System.Text.RegularExpressions;
7using System.Threading;
8
9namespace XIVLauncher.Common.Http
10{
11// This is a very dumb HTTP server that just accepts GETs and fires events with the requested URL
12internal class HttpServer
13{
14private readonly TcpListener listener;
15
16private readonly byte[] httpResponse;
17
18public EventHandler<HttpServerGetEvent> GetReceived;
19
20private bool _isRunning = false;
21
22public class HttpServerGetEvent
23{
24public string Path { get; set; }
25}
26
27public HttpServer(int port, string version)
28{
29this.listener = new TcpListener(IPAddress.Any, port);
30
31this.httpResponse = Encoding.Default.GetBytes(
32"HTTP/1.0 200 OK\n" +
33"Content-Type: application/json; charset=UTF-8\n" +
34"\n{\"app\":\"XIVLauncher\", \"version\":\"" + version + "\"}"
35);
36}
37
38public void Start()
39{
40try
41{
42this.listener.Start();
43_isRunning = true;
44
45while (_isRunning)
46{
47if (!this.listener.Pending())
48{
49Thread.Sleep(200);
50continue;
51}
52
53var client = this.listener.AcceptTcpClient();
54
55while (client.Connected)
56{
57var networkStream = client.GetStream();
58
59var message = new byte[1024];
60networkStream.Read(message, 0, message.Length);
61
62var messageString = Encoding.Default.GetString(message);
63Debug.WriteLine(Encoding.Default.GetString(message));
64
65networkStream.Write(httpResponse, 0, httpResponse.Length);
66
67networkStream.Close(3);
68
69GetReceived?.Invoke(this, new HttpServerGetEvent
70{
71Path = Regex.Match(messageString, "GET (?<url>.+) HTTP").Groups["url"].Value
72});
73}
74
75client.Close();
76}
77}
78catch
79{
80// ignored
81}
82}
83
84public void Stop()
85{
86_isRunning = false;
87this.listener.Stop();
88}
89}
90}