Skip to content
This repository was archived by the owner on Jul 9, 2023. It is now read-only.

Commit c0895a1

Browse files
authored
Merge 8b0e1e7 into c963bc5
2 parents c963bc5 + 8b0e1e7 commit c0895a1

File tree

2 files changed

+74
-24
lines changed

2 files changed

+74
-24
lines changed

src/Titanium.Web.Proxy/Helpers/NativeMethods.SystemProxy.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ internal static extern bool InternetSetOption(IntPtr hInternet, int dwOption, In
1818
[DllImport("kernel32.dll", SetLastError = true)]
1919
internal static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);
2020

21+
/// <summary>
22+
/// <see href="https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getsystemmetrics" />
23+
/// </summary>
24+
[DllImport("user32.dll")]
25+
internal static extern int GetSystemMetrics(int nIndex);
26+
2127
// Pinvoke
2228
internal delegate bool ConsoleEventDelegate(int eventType);
2329
}

src/Titanium.Web.Proxy/Helpers/SystemProxy.cs

Lines changed: 68 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,13 @@ public SystemProxyManager()
8080
/// <param name="protocolType"></param>
8181
internal void SetProxy(string hostname, int port, ProxyProtocolType protocolType)
8282
{
83-
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
84-
85-
if (reg != null)
83+
using (var reg = OpenInternetSettingsKey())
8684
{
85+
if (reg == null)
86+
{
87+
return;
88+
}
89+
8790
saveOriginalProxyConfiguration(reg);
8891
prepareRegistry(reg);
8992

@@ -124,9 +127,13 @@ internal void SetProxy(string hostname, int port, ProxyProtocolType protocolType
124127
/// </summary>
125128
internal void RemoveProxy(ProxyProtocolType protocolType, bool saveOriginalConfig = true)
126129
{
127-
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
128-
if (reg != null)
130+
using (var reg = OpenInternetSettingsKey())
129131
{
132+
if (reg == null)
133+
{
134+
return;
135+
}
136+
130137
if (saveOriginalConfig)
131138
{
132139
saveOriginalProxyConfiguration(reg);
@@ -161,10 +168,13 @@ internal void RemoveProxy(ProxyProtocolType protocolType, bool saveOriginalConfi
161168
/// </summary>
162169
internal void DisableAllProxy()
163170
{
164-
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
165-
166-
if (reg != null)
171+
using (var reg = OpenInternetSettingsKey())
167172
{
173+
if (reg == null)
174+
{
175+
return;
176+
}
177+
168178
saveOriginalProxyConfiguration(reg);
169179

170180
reg.SetValue(regProxyEnable, 0);
@@ -176,10 +186,13 @@ internal void DisableAllProxy()
176186

177187
internal void SetAutoProxyUrl(string url)
178188
{
179-
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
180-
181-
if (reg != null)
189+
using (var reg = OpenInternetSettingsKey())
182190
{
191+
if (reg == null)
192+
{
193+
return;
194+
}
195+
183196
saveOriginalProxyConfiguration(reg);
184197
reg.SetValue(regAutoConfigUrl, url);
185198
refresh();
@@ -188,10 +201,13 @@ internal void SetAutoProxyUrl(string url)
188201

189202
internal void SetProxyOverride(string proxyOverride)
190203
{
191-
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
192-
193-
if (reg != null)
204+
using (var reg = OpenInternetSettingsKey())
194205
{
206+
if (reg == null)
207+
{
208+
return;
209+
}
210+
195211
saveOriginalProxyConfiguration(reg);
196212
reg.SetValue(regProxyOverride, proxyOverride);
197213
refresh();
@@ -205,10 +221,13 @@ internal void RestoreOriginalSettings()
205221
return;
206222
}
207223

208-
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
209-
210-
if (reg != null)
224+
using (var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true))
211225
{
226+
if (reg == null)
227+
{
228+
return;
229+
}
230+
212231
var ov = originalValues;
213232
if (ov.AutoConfigUrl != null)
214233
{
@@ -246,26 +265,43 @@ internal void RestoreOriginalSettings()
246265
reg.DeleteValue(regProxyOverride, false);
247266
}
248267

268+
// This should not be needed, but sometimes the values are not stored into the registry
269+
// at system shutdown without flushing.
270+
reg.Flush();
271+
249272
originalValues = null;
250-
refresh();
273+
274+
const int SM_SHUTTINGDOWN = 0x2000;
275+
Version windows7Version = new Version(6, 1);
276+
if (Environment.OSVersion.Version > windows7Version ||
277+
NativeMethods.GetSystemMetrics(SM_SHUTTINGDOWN) == 0)
278+
{
279+
// Do not call refresh() in Windows 7 or earlier at system shutdown.
280+
// SetInternetOption in the refresh method re-enables ProxyEnable registry value
281+
// in Windows 7 or earlier at system shutdown.
282+
refresh();
283+
}
251284
}
252285
}
253286

254287
internal ProxyInfo GetProxyInfoFromRegistry()
255288
{
256-
var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
257-
258-
if (reg != null)
289+
using (var reg = OpenInternetSettingsKey())
259290
{
291+
if (reg == null)
292+
{
293+
return null;
294+
}
295+
260296
return getProxyInfoFromRegistry(reg);
261297
}
262-
263-
return null;
264298
}
265299

266300
private ProxyInfo getProxyInfoFromRegistry(RegistryKey reg)
267301
{
268-
var pi = new ProxyInfo(null, reg.GetValue(regAutoConfigUrl) as string, reg.GetValue(regProxyEnable) as int?,
302+
var pi = new ProxyInfo(null,
303+
reg.GetValue(regAutoConfigUrl) as string,
304+
reg.GetValue(regProxyEnable) as int?,
269305
reg.GetValue(regProxyServer) as string,
270306
reg.GetValue(regProxyOverride) as string);
271307

@@ -307,5 +343,13 @@ private static void refresh()
307343
NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionSettingsChanged, IntPtr.Zero, 0);
308344
NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionRefresh, IntPtr.Zero, 0);
309345
}
346+
347+
/// <summary>
348+
/// Opens the registry key with the internet settings
349+
/// </summary>
350+
private static RegistryKey OpenInternetSettingsKey()
351+
{
352+
return Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
353+
}
310354
}
311355
}

0 commit comments

Comments
 (0)