diff --git a/src/Titanium.Web.Proxy/Helpers/NativeMethods.SystemProxy.cs b/src/Titanium.Web.Proxy/Helpers/NativeMethods.SystemProxy.cs
index c85e880fa..56509a458 100644
--- a/src/Titanium.Web.Proxy/Helpers/NativeMethods.SystemProxy.cs
+++ b/src/Titanium.Web.Proxy/Helpers/NativeMethods.SystemProxy.cs
@@ -18,6 +18,12 @@ internal static extern bool InternetSetOption(IntPtr hInternet, int dwOption, In
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);
+ ///
+ ///
+ ///
+ [DllImport("user32.dll")]
+ internal static extern int GetSystemMetrics(int nIndex);
+
// Pinvoke
internal delegate bool ConsoleEventDelegate(int eventType);
}
diff --git a/src/Titanium.Web.Proxy/Helpers/SystemProxy.cs b/src/Titanium.Web.Proxy/Helpers/SystemProxy.cs
index a1a5cb0da..11cd5f8f9 100644
--- a/src/Titanium.Web.Proxy/Helpers/SystemProxy.cs
+++ b/src/Titanium.Web.Proxy/Helpers/SystemProxy.cs
@@ -80,10 +80,13 @@ public SystemProxyManager()
///
internal void SetProxy(string hostname, int port, ProxyProtocolType protocolType)
{
- var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
-
- if (reg != null)
+ using (var reg = OpenInternetSettingsKey())
{
+ if (reg == null)
+ {
+ return;
+ }
+
saveOriginalProxyConfiguration(reg);
prepareRegistry(reg);
@@ -124,9 +127,13 @@ internal void SetProxy(string hostname, int port, ProxyProtocolType protocolType
///
internal void RemoveProxy(ProxyProtocolType protocolType, bool saveOriginalConfig = true)
{
- var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
- if (reg != null)
+ using (var reg = OpenInternetSettingsKey())
{
+ if (reg == null)
+ {
+ return;
+ }
+
if (saveOriginalConfig)
{
saveOriginalProxyConfiguration(reg);
@@ -161,10 +168,13 @@ internal void RemoveProxy(ProxyProtocolType protocolType, bool saveOriginalConfi
///
internal void DisableAllProxy()
{
- var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
-
- if (reg != null)
+ using (var reg = OpenInternetSettingsKey())
{
+ if (reg == null)
+ {
+ return;
+ }
+
saveOriginalProxyConfiguration(reg);
reg.SetValue(regProxyEnable, 0);
@@ -176,10 +186,13 @@ internal void DisableAllProxy()
internal void SetAutoProxyUrl(string url)
{
- var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
-
- if (reg != null)
+ using (var reg = OpenInternetSettingsKey())
{
+ if (reg == null)
+ {
+ return;
+ }
+
saveOriginalProxyConfiguration(reg);
reg.SetValue(regAutoConfigUrl, url);
refresh();
@@ -188,10 +201,13 @@ internal void SetAutoProxyUrl(string url)
internal void SetProxyOverride(string proxyOverride)
{
- var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
-
- if (reg != null)
+ using (var reg = OpenInternetSettingsKey())
{
+ if (reg == null)
+ {
+ return;
+ }
+
saveOriginalProxyConfiguration(reg);
reg.SetValue(regProxyOverride, proxyOverride);
refresh();
@@ -205,10 +221,13 @@ internal void RestoreOriginalSettings()
return;
}
- var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
-
- if (reg != null)
+ using (var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true))
{
+ if (reg == null)
+ {
+ return;
+ }
+
var ov = originalValues;
if (ov.AutoConfigUrl != null)
{
@@ -246,26 +265,43 @@ internal void RestoreOriginalSettings()
reg.DeleteValue(regProxyOverride, false);
}
+ // This should not be needed, but sometimes the values are not stored into the registry
+ // at system shutdown without flushing.
+ reg.Flush();
+
originalValues = null;
- refresh();
+
+ const int SM_SHUTTINGDOWN = 0x2000;
+ Version windows7Version = new Version(6, 1);
+ if (Environment.OSVersion.Version > windows7Version ||
+ NativeMethods.GetSystemMetrics(SM_SHUTTINGDOWN) == 0)
+ {
+ // Do not call refresh() in Windows 7 or earlier at system shutdown.
+ // SetInternetOption in the refresh method re-enables ProxyEnable registry value
+ // in Windows 7 or earlier at system shutdown.
+ refresh();
+ }
}
}
internal ProxyInfo GetProxyInfoFromRegistry()
{
- var reg = Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
-
- if (reg != null)
+ using (var reg = OpenInternetSettingsKey())
{
+ if (reg == null)
+ {
+ return null;
+ }
+
return getProxyInfoFromRegistry(reg);
}
-
- return null;
}
private ProxyInfo getProxyInfoFromRegistry(RegistryKey reg)
{
- var pi = new ProxyInfo(null, reg.GetValue(regAutoConfigUrl) as string, reg.GetValue(regProxyEnable) as int?,
+ var pi = new ProxyInfo(null,
+ reg.GetValue(regAutoConfigUrl) as string,
+ reg.GetValue(regProxyEnable) as int?,
reg.GetValue(regProxyServer) as string,
reg.GetValue(regProxyOverride) as string);
@@ -307,5 +343,13 @@ private static void refresh()
NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionSettingsChanged, IntPtr.Zero, 0);
NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionRefresh, IntPtr.Zero, 0);
}
+
+ ///
+ /// Opens the registry key with the internet settings
+ ///
+ private static RegistryKey OpenInternetSettingsKey()
+ {
+ return Registry.CurrentUser.OpenSubKey(regKeyInternetSettings, true);
+ }
}
}