-
Notifications
You must be signed in to change notification settings - Fork 42
Expand file tree
/
Copy pathProgram.cs
More file actions
123 lines (112 loc) · 3.96 KB
/
Program.cs
File metadata and controls
123 lines (112 loc) · 3.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#nullable enable
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;
namespace NetProxy
{
internal static class Program
{
private static void Main(string[] args)
{
try
{
var configJson = System.IO.File.ReadAllText("config.json");
Dictionary<string, ProxyConfig>? configs = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, ProxyConfig>>(configJson);
if (configs == null)
{
throw new Exception("configs is null");
}
var tasks = configs.SelectMany(c => ProxyFromConfig(c.Key, c.Value));
Task.WhenAll(tasks).Wait();
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred : {ex}");
}
}
private static IEnumerable<Task> ProxyFromConfig(string proxyName, ProxyConfig proxyConfig)
{
var forwardPort = proxyConfig.forwardPort;
var localPort = proxyConfig.localPort;
var forwardIp = proxyConfig.forwardIp;
var localIp = proxyConfig.localIp;
var protocol = proxyConfig.protocol;
var forwardTls = proxyConfig.forwardTls;
try
{
if (forwardIp == null)
{
throw new Exception("forwardIp is null");
}
if (!forwardPort.HasValue)
{
throw new Exception("forwardPort is null");
}
if (!localPort.HasValue)
{
throw new Exception("localPort is null");
}
if (protocol != "udp" && protocol != "tcp" && protocol != "any")
{
throw new Exception($"protocol is not supported {protocol}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Failed to start {proxyName} : {ex.Message}");
throw;
}
bool protocolHandled = false;
if (protocol == "udp" || protocol == "any")
{
protocolHandled = true;
Task task;
try
{
var proxy = new UdpProxy();
task = proxy.Start(forwardIp, forwardPort.Value, localPort.Value, localIp, forwardTls);
}
catch (Exception ex)
{
Console.WriteLine($"Failed to start {proxyName} : {ex.Message}");
throw;
}
yield return task;
}
if (protocol == "tcp" || protocol == "any")
{
protocolHandled = true;
Task task;
try
{
var proxy = new TcpProxy();
task = proxy.Start(forwardIp, forwardPort.Value, localPort.Value, localIp, forwardTls);
}
catch (Exception ex)
{
Console.WriteLine($"Failed to start {proxyName} : {ex.Message}");
throw;
}
yield return task;
}
if (!protocolHandled)
{
throw new InvalidOperationException($"protocol not supported {protocol}");
}
}
}
public class ProxyConfig
{
public string? protocol { get; set; }
public ushort? localPort { get; set; }
public string? localIp { get; set; }
public string? forwardIp { get; set; }
public ushort? forwardPort { get; set; }
public bool forwardTls { get; set; }
}
internal interface IProxy
{
Task Start(string remoteServerHostNameOrAddress, ushort remoteServerPort, ushort localPort, string? localIp = null, bool remoteTls = false);
}
}