FFXIVLauncher-Netmaui

Форк
0
90 строк · 2.5 Кб
1
using System;
2
using System.Diagnostics;
3
using System.Net;
4
using System.Net.Sockets;
5
using System.Text;
6
using System.Text.RegularExpressions;
7
using System.Threading;
8

9
namespace XIVLauncher.Common.Http
10
{
11
    // This is a very dumb HTTP server that just accepts GETs and fires events with the requested URL
12
    internal class HttpServer
13
    {
14
        private readonly TcpListener listener;
15

16
        private readonly byte[] httpResponse;
17

18
        public EventHandler<HttpServerGetEvent> GetReceived;
19

20
        private bool _isRunning = false;
21

22
        public class HttpServerGetEvent
23
        {
24
            public string Path { get; set; }
25
        }
26

27
        public HttpServer(int port, string version)
28
        {
29
            this.listener = new TcpListener(IPAddress.Any, port);
30

31
            this.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

38
        public void Start()
39
        {
40
            try
41
            {
42
                this.listener.Start();
43
                _isRunning = true;
44

45
                while (_isRunning)
46
                {
47
                    if (!this.listener.Pending())
48
                    {
49
                        Thread.Sleep(200);
50
                        continue;
51
                    }
52

53
                    var client = this.listener.AcceptTcpClient();
54

55
                    while (client.Connected)
56
                    {
57
                        var networkStream = client.GetStream();
58

59
                        var message = new byte[1024];
60
                        networkStream.Read(message, 0, message.Length);
61

62
                        var messageString = Encoding.Default.GetString(message);
63
                        Debug.WriteLine(Encoding.Default.GetString(message));
64

65
                        networkStream.Write(httpResponse, 0, httpResponse.Length);
66

67
                        networkStream.Close(3);
68

69
                        GetReceived?.Invoke(this, new HttpServerGetEvent
70
                        {
71
                            Path = Regex.Match(messageString, "GET (?<url>.+) HTTP").Groups["url"].Value
72
                        });
73
                    }
74

75
                    client.Close();
76
                }
77
            }
78
            catch
79
            {
80
                // ignored
81
            }
82
        }
83

84
        public void Stop()
85
        {
86
            _isRunning = false;
87
            this.listener.Stop();
88
        }
89
    }
90
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.