Skip to content

Commit d8118d1

Browse files
committed
Parse proxy from string (protocol://address:port:username:password)
1 parent 21507c0 commit d8118d1

File tree

1 file changed

+46
-1
lines changed

1 file changed

+46
-1
lines changed

~Proxy/ProxyClient.cs

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Net.Sockets;
34
using System.Security;
45
using System.Text;
@@ -257,7 +258,18 @@ internal protected ProxyClient(ProxyType proxyType, string address, int port, st
257258
#endregion
258259

259260

260-
#region Статические методы (открытые)
261+
#region Статические методы
262+
/// <summary>
263+
/// Служит для преобразования строковых прокси к объекту ProxyClient.
264+
/// </summary>
265+
private static readonly Dictionary<string, ProxyType> ProxyProtocol = new Dictionary<string, ProxyType> {
266+
{ "http", ProxyType.Http },
267+
{ "https", ProxyType.Http },
268+
{ "socks4", ProxyType.Socks4 },
269+
{ "socks4a", ProxyType.Socks4a },
270+
{ "socks5", ProxyType.Socks5 },
271+
{ "socks", ProxyType.Socks5 }
272+
};
261273

262274
/// <summary>
263275
/// Преобразует строку в экземпляр класса прокси-клиента, унаследованный от <see cref="ProxyClient"/>.
@@ -334,6 +346,23 @@ public static ProxyClient Parse(ProxyType proxyType, string proxyAddress)
334346
return ProxyHelper.CreateProxyClient(proxyType, host, port, username, password);
335347
}
336348

349+
/// <inheritdoc cref="Parse(Leaf.Net.ProxyType,string)"/>
350+
/// <param name="protoProxyAddress">Строка вида - протокол://хост:порт:имя_пользователя:пароль. Три последних параметра являются необязательными.</param>
351+
/// <returns>Экземпляр класса прокси-клиента, унаследованный от <see cref="ProxyClient"/>.</returns>
352+
public static ProxyClient Parse(string protoProxyAddress)
353+
{
354+
var proxy = protoProxyAddress.Split(new[] { "://" }, StringSplitOptions.RemoveEmptyEntries);
355+
if (proxy.Length < 2)
356+
return null;
357+
358+
string proto = proxy[0];
359+
if (!ProxyProtocol.ContainsKey(proto))
360+
return null;
361+
362+
var proxyType = ProxyProtocol[proto];
363+
return Parse(proxyType, proxy[1]);
364+
}
365+
337366
/// <summary>
338367
/// Преобразует строку в экземпляр класса прокси-клиента, унаследованный от <see cref="ProxyClient"/>. Возвращает значение, указывающее, успешно ли выполнено преобразование.
339368
/// </summary>
@@ -392,6 +421,22 @@ public static bool TryParse(ProxyType proxyType, string proxyAddress, out ProxyC
392421
return true;
393422
}
394423

424+
/// <inheritdoc cref="TryParse(Leaf.Net.ProxyType,string,out Leaf.Net.ProxyClient)"/>
425+
/// <param name="protoProxyAddress">Строка вида - протокол://хост:порт:имя_пользователя:пароль. Три последних параметра являются необязательными.</param>
426+
/// <returns>Значение <see langword="true"/>, если параметр <paramref name="protoProxyAddress"/> преобразован успешно, иначе <see langword="false"/>.</returns>
427+
public static bool TryParse(string protoProxyAddress, out ProxyClient result)
428+
{
429+
var proxy = protoProxyAddress.Split(new[] {"://"}, StringSplitOptions.RemoveEmptyEntries);
430+
if (proxy.Length < 2 || !ProxyProtocol.ContainsKey(proxy[0]))
431+
{
432+
result = null;
433+
return false;
434+
}
435+
436+
var proxyType = ProxyProtocol[proxy[0]];
437+
return TryParse(proxyType, proxy[1], out result);
438+
}
439+
395440
#endregion
396441

397442

0 commit comments

Comments
 (0)