mirror of
https://github.com/2dust/v2rayN.git
synced 2026-10-15 17:55:00 +03:00
Improve ConnectionHandler DownloadService
This commit is contained in:
@@ -4,6 +4,9 @@ public static class ConnectionHandler
|
||||
{
|
||||
private static readonly string _tag = "ConnectionHandler";
|
||||
|
||||
/// <summary>
|
||||
/// Runs ping and IP checks and returns a formatted result string.
|
||||
/// </summary>
|
||||
public static async Task<string> RunAvailabilityCheck()
|
||||
{
|
||||
var time = await GetRealPingTimeInfo();
|
||||
@@ -12,40 +15,24 @@ public static class ConnectionHandler
|
||||
return string.Format(ResUI.TestMeOutput, time, ip);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets IP information using the default local proxy.
|
||||
/// </summary>
|
||||
private static async Task<string?> GetIPInfo()
|
||||
{
|
||||
var url = AppManager.Instance.Config.SpeedTestItem.IPAPIUrl;
|
||||
if (url.IsNullOrEmpty())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var downloadHandle = new DownloadService();
|
||||
var result = await downloadHandle.TryDownloadString(url, true, "");
|
||||
if (result == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var ipInfo = JsonUtils.Deserialize<IPAPIInfo>(result);
|
||||
if (ipInfo == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var ip = ipInfo.ip ?? ipInfo.clientIp ?? ipInfo.ip_addr ?? ipInfo.query;
|
||||
var country = ipInfo.country_code ?? ipInfo.country ?? ipInfo.countryCode ?? ipInfo.location?.country_code;
|
||||
|
||||
return $"({country ?? "unknown"}) {ip}";
|
||||
var webProxy = await GetWebProxy();
|
||||
return await GetIPInfo(webProxy);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Measures real ping time using configured test URL.
|
||||
/// </summary>
|
||||
private static async Task<int> GetRealPingTimeInfo()
|
||||
{
|
||||
var responseTime = -1;
|
||||
try
|
||||
{
|
||||
var port = AppManager.Instance.GetLocalPort(EInboundProtocol.socks);
|
||||
var webProxy = new WebProxy($"socks5://{Global.Loopback}:{port}");
|
||||
var webProxy = await GetWebProxy();
|
||||
var url = AppManager.Instance.Config.SpeedTestItem.SpeedPingTestUrl;
|
||||
|
||||
for (var i = 0; i < 2; i++)
|
||||
@@ -66,6 +53,18 @@ public static class ConnectionHandler
|
||||
return responseTime;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates local SOCKS proxy instance.
|
||||
/// </summary>
|
||||
private static async Task<WebProxy?> GetWebProxy()
|
||||
{
|
||||
var port = AppManager.Instance.GetLocalPort(EInboundProtocol.socks);
|
||||
return new WebProxy($"socks5://{Global.Loopback}:{port}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Measures response time by sending HTTP requests through proxy.
|
||||
/// </summary>
|
||||
public static async Task<int> GetRealPingTime(string url, IWebProxy? webProxy, int downloadTimeout)
|
||||
{
|
||||
var responseTime = -1;
|
||||
@@ -95,4 +94,34 @@ public static class ConnectionHandler
|
||||
}
|
||||
return responseTime;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets IP and country information through specified proxy.
|
||||
/// </summary>
|
||||
public static async Task<string?> GetIPInfo(IWebProxy? webProxy)
|
||||
{
|
||||
var url = AppManager.Instance.Config.SpeedTestItem.IPAPIUrl;
|
||||
if (url.IsNullOrEmpty())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var downloadHandle = new DownloadService();
|
||||
var result = await downloadHandle.TryDownloadString(url, webProxy, "");
|
||||
if (result == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var ipInfo = JsonUtils.Deserialize<IPAPIInfo>(result);
|
||||
if (ipInfo == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var ip = ipInfo.ip ?? ipInfo.clientIp ?? ipInfo.ip_addr ?? ipInfo.query;
|
||||
var country = ipInfo.country_code ?? ipInfo.country ?? ipInfo.countryCode ?? ipInfo.location?.country_code;
|
||||
|
||||
return $"({country ?? "unknown"}) {ip}";
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user