Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
MultiProxy.cs
Go to the documentation of this file.
2
3namespace System.Net.Http;
4
5internal struct MultiProxy
6{
7 private static readonly char[] s_proxyDelimiters = new char[5] { ';', ' ', '\n', '\r', '\t' };
8
10
11 private readonly Uri[] _uris;
12
13 private readonly string _proxyConfig;
14
15 private readonly bool _secure;
16
17 private int _currentIndex;
18
20
21 public static MultiProxy Empty => new MultiProxy(null, Array.Empty<Uri>());
22
23 private MultiProxy(FailedProxyCache failedProxyCache, Uri[] uris)
24 {
25 _failedProxyCache = failedProxyCache;
26 _uris = uris;
27 _proxyConfig = null;
28 _secure = false;
29 _currentIndex = 0;
30 _currentUri = null;
31 }
32
33 private MultiProxy(FailedProxyCache failedProxyCache, string proxyConfig, bool secure)
34 {
35 _failedProxyCache = failedProxyCache;
36 _uris = null;
37 _proxyConfig = proxyConfig;
38 _secure = secure;
39 _currentIndex = 0;
40 _currentUri = null;
41 }
42
43 public static MultiProxy Parse(FailedProxyCache failedProxyCache, string proxyConfig, bool secure)
44 {
45 Uri[] array = Array.Empty<Uri>();
46 ReadOnlySpan<char> proxyString = proxyConfig;
47 Uri uri;
48 int charactersConsumed;
49 while (TryParseProxyConfigPart(proxyString, secure, out uri, out charactersConsumed))
50 {
51 int num = array.Length;
52 Array.Resize(ref array, num + 1);
53 array[num] = uri;
54 proxyString = proxyString.Slice(charactersConsumed);
55 }
56 return new MultiProxy(failedProxyCache, array);
57 }
58
59 public static MultiProxy CreateLazy(FailedProxyCache failedProxyCache, string proxyConfig, bool secure)
60 {
61 if (string.IsNullOrEmpty(proxyConfig))
62 {
63 return Empty;
64 }
65 return new MultiProxy(failedProxyCache, proxyConfig, secure);
66 }
67
68 public bool ReadNext([NotNullWhen(true)] out Uri uri, out bool isFinalProxy)
69 {
70 if (_currentUri != null)
71 {
73 }
74 if (!ReadNextHelper(out uri, out isFinalProxy))
75 {
76 _currentUri = null;
77 return false;
78 }
79 Uri uri2 = null;
80 long num = long.MaxValue;
81 do
82 {
83 long proxyRenewTicks = _failedProxyCache.GetProxyRenewTicks(uri);
84 if (proxyRenewTicks == 0L)
85 {
86 _currentUri = uri;
87 return true;
88 }
89 if (proxyRenewTicks < num)
90 {
91 uri2 = uri;
92 num = proxyRenewTicks;
93 }
94 }
95 while (ReadNextHelper(out uri, out isFinalProxy));
96 if (_currentUri == null)
97 {
98 uri = uri2;
99 _currentUri = uri2;
100 if (uri2 != null)
101 {
103 return true;
104 }
105 }
106 return false;
107 }
108
109 private bool ReadNextHelper([NotNullWhen(true)] out Uri uri, out bool isFinalProxy)
110 {
111 if (_uris != null)
112 {
113 if (_currentIndex == _uris.Length)
114 {
115 uri = null;
116 isFinalProxy = false;
117 return false;
118 }
119 uri = _uris[_currentIndex++];
120 isFinalProxy = _currentIndex == _uris.Length;
121 return true;
122 }
123 if (_currentIndex < _proxyConfig.Length)
124 {
125 int charactersConsumed;
126 bool result = TryParseProxyConfigPart(_proxyConfig.AsSpan(_currentIndex), _secure, out uri, out charactersConsumed);
127 _currentIndex += charactersConsumed;
128 isFinalProxy = _currentIndex == _proxyConfig.Length;
129 return result;
130 }
131 uri = null;
132 isFinalProxy = false;
133 return false;
134 }
135
136 private static bool TryParseProxyConfigPart(ReadOnlySpan<char> proxyString, bool secure, [NotNullWhen(true)] out Uri uri, out int charactersConsumed)
137 {
138 int num = (secure ? 1 : 2);
139 int length = proxyString.Length;
140 while (true)
141 {
142 int i;
143 for (i = 0; i < proxyString.Length && Array.IndexOf(s_proxyDelimiters, proxyString[i]) >= 0; i++)
144 {
145 }
146 if (i == proxyString.Length)
147 {
148 break;
149 }
150 proxyString = proxyString.Slice(i);
151 int num2 = 3;
152 if (proxyString.StartsWith("http="))
153 {
154 num2 = 2;
155 proxyString = proxyString.Slice("http=".Length);
156 }
157 else if (proxyString.StartsWith("https="))
158 {
159 num2 = 1;
160 proxyString = proxyString.Slice("https=".Length);
161 }
162 if (proxyString.StartsWith("http://"))
163 {
164 num2 = 2;
165 proxyString = proxyString.Slice("http://".Length);
166 }
167 else if (proxyString.StartsWith("https://"))
168 {
169 num2 = 1;
170 proxyString = proxyString.Slice("https://".Length);
171 }
172 i = proxyString.IndexOfAny(s_proxyDelimiters);
173 if (i < 0)
174 {
175 i = proxyString.Length;
176 }
177 if ((num2 & num) != 0 && Uri.TryCreate("http://" + proxyString.Slice(0, i), UriKind.Absolute, out uri))
178 {
179 charactersConsumed = length - proxyString.Length + i;
180 return true;
181 }
182 proxyString = proxyString.Slice(i);
183 }
184 uri = null;
185 charactersConsumed = length;
186 return false;
187 }
188}
int IList. IndexOf(object value)
Definition Array.cs:1228
bool TryRenewProxy(Uri uri, long renewTicks)
static bool TryCreate([NotNullWhen(true)] string? uriString, UriKind uriKind, [NotNullWhen(true)] out Uri? result)
Definition Uri.cs:3793
UriKind
Definition UriKind.cs:4
static MultiProxy CreateLazy(FailedProxyCache failedProxyCache, string proxyConfig, bool secure)
Definition MultiProxy.cs:59
MultiProxy(FailedProxyCache failedProxyCache, string proxyConfig, bool secure)
Definition MultiProxy.cs:33
readonly FailedProxyCache _failedProxyCache
Definition MultiProxy.cs:9
readonly string _proxyConfig
Definition MultiProxy.cs:13
static MultiProxy Empty
Definition MultiProxy.cs:21
bool ReadNext([NotNullWhen(true)] out Uri uri, out bool isFinalProxy)
Definition MultiProxy.cs:68
static readonly char[] s_proxyDelimiters
Definition MultiProxy.cs:7
static MultiProxy Parse(FailedProxyCache failedProxyCache, string proxyConfig, bool secure)
Definition MultiProxy.cs:43
static bool TryParseProxyConfigPart(ReadOnlySpan< char > proxyString, bool secure, [NotNullWhen(true)] out Uri uri, out int charactersConsumed)
bool ReadNextHelper([NotNullWhen(true)] out Uri uri, out bool isFinalProxy)
MultiProxy(FailedProxyCache failedProxyCache, Uri[] uris)
Definition MultiProxy.cs:23
ReadOnlySpan< T > Slice(int start)