From 3f34f06cd5a45594bcdd8ac0858ae43f44730963 Mon Sep 17 00:00:00 2001 From: kosipov Date: Thu, 9 Apr 2026 18:26:49 +0200 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20Program.cs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program.cs | 63 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/Program.cs b/Program.cs index eac06bd..48317b4 100644 --- a/Program.cs +++ b/Program.cs @@ -236,21 +236,72 @@ class WinHttpProxy : IWebProxy static class WinHttpHelper { [DllImport("winhttp.dll", SetLastError = true)] - static extern bool WinHttpGetIEProxyConfigForCurrentUser(out WINHTTP_CURRENT_USER_IE_PROXY_CONFIG config); + static extern bool WinHttpGetIEProxyConfigForCurrentUser( + out WINHTTP_CURRENT_USER_IE_PROXY_CONFIG config); public static Uri GetProxyForUrl(Uri url) { - WinHttpGetIEProxyConfigForCurrentUser(out var cfg); + if (!WinHttpGetIEProxyConfigForCurrentUser(out var cfg)) + return url; - if (!string.IsNullOrEmpty(cfg.lpszProxy)) + string proxy = PtrToString(cfg.lpszProxy); + + if (string.IsNullOrWhiteSpace(proxy)) + return url; + + string selectedProxy = ParseProxy(proxy, url.Scheme); + + if (string.IsNullOrEmpty(selectedProxy)) + return url; + + return new Uri(NormalizeProxy(selectedProxy)); + } + + // ===== helpers ===== + + static string PtrToString(IntPtr ptr) + { + if (ptr == IntPtr.Zero) + return null; + + return Marshal.PtrToStringUni(ptr); + } + + static string ParseProxy(string proxy, string scheme) + { + // варианты: + // "proxy:8080" + // "http=proxy:8080;https=proxy2:8080" + + if (!proxy.Contains("=")) + return proxy; + + var entries = proxy.Split(';', StringSplitOptions.RemoveEmptyEntries); + + foreach (var entry in entries) { - var parts = cfg.lpszProxy.Split(':'); - return new Uri($"http://{parts[0]}:{parts[1]}"); + var parts = entry.Split('=', 2); + if (parts.Length != 2) + continue; + + if (parts[0].Equals(scheme, StringComparison.OrdinalIgnoreCase)) + return parts[1]; } - return url; // direct + // fallback — берём первый + return entries[0].Split('=')[1]; } + static string NormalizeProxy(string proxy) + { + if (!proxy.StartsWith("http://") && !proxy.StartsWith("https://")) + return "http://" + proxy; + + return proxy; + } + + // ===== struct ===== + struct WINHTTP_CURRENT_USER_IE_PROXY_CONFIG { public bool fAutoDetect;