From: Piotr Caban piotr@codeweavers.com
--- dlls/wininet/internet.c | 50 ++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 26 deletions(-)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index 9702c3e4f05..238b540994e 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -81,7 +81,7 @@ static UINT_PTR handle_table_size;
typedef struct { - DWORD proxyEnabled; + DWORD flags; LPWSTR proxy; LPWSTR proxyBypass; LPWSTR proxyUsername; @@ -326,12 +326,14 @@ HRESULT WINAPI DllInstall(BOOL bInstall, LPCWSTR cmdline) static LONG INTERNET_SaveProxySettings( proxyinfo_t *lpwpi ) { HKEY key; + DWORD val; LONG ret;
if ((ret = RegOpenKeyW( HKEY_CURRENT_USER, szInternetSettings, &key ))) return ret;
- if ((ret = RegSetValueExW( key, L"ProxyEnable", 0, REG_DWORD, (BYTE*)&lpwpi->proxyEnabled, sizeof(DWORD)))) + val = !!(lpwpi->flags & PROXY_TYPE_PROXY); + if ((ret = RegSetValueExW( key, L"ProxyEnable", 0, REG_DWORD, (BYTE*)&val, sizeof(DWORD)))) { RegCloseKey( key ); return ret; @@ -533,7 +535,7 @@ static BOOL parse_proxy_url( proxyinfo_t *info, const WCHAR *url ) static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) { HKEY key; - DWORD type, len; + DWORD type, len, val; const WCHAR *envproxy; LONG ret;
@@ -542,7 +544,7 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) EnterCriticalSection( &WININET_cs ); if (global_proxy) { - lpwpi->proxyEnabled = global_proxy->proxyEnabled; + lpwpi->flags = global_proxy->flags; lpwpi->proxy = wcsdup( global_proxy->proxy ); lpwpi->proxyBypass = wcsdup( global_proxy->proxyBypass ); } @@ -555,18 +557,22 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) }
len = sizeof(DWORD); - if (RegQueryValueExW( key, L"ProxyEnable", NULL, &type, (BYTE *)&lpwpi->proxyEnabled, &len ) || type != REG_DWORD) + if (RegQueryValueExW( key, L"ProxyEnable", NULL, &type, (BYTE *)&val, &len ) || type != REG_DWORD) { - lpwpi->proxyEnabled = 0; - if((ret = RegSetValueExW( key, L"ProxyEnable", 0, REG_DWORD, (BYTE *)&lpwpi->proxyEnabled, sizeof(DWORD) ))) + val = 0; + if((ret = RegSetValueExW( key, L"ProxyEnable", 0, REG_DWORD, (BYTE *)&val, sizeof(DWORD) ))) { FreeProxyInfo( lpwpi ); RegCloseKey( key ); return ret; } } + else + { + lpwpi->flags |= (val ? PROXY_TYPE_PROXY : PROXY_TYPE_DIRECT); + }
- if (!(envproxy = _wgetenv( L"http_proxy" )) || lpwpi->proxyEnabled) + if (!(envproxy = _wgetenv( L"http_proxy" )) || (lpwpi->flags & PROXY_TYPE_PROXY)) { /* figure out how much memory the proxy setting takes */ if (!RegQueryValueExW( key, L"ProxyServer", NULL, &type, NULL, &len ) && len && (type == REG_SZ)) @@ -611,19 +617,19 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) if (parse_proxy_url( lpwpi, envproxy )) { TRACE("http proxy (from environment) = %s\n", debugstr_w(lpwpi->proxy)); - lpwpi->proxyEnabled = 1; + lpwpi->flags |= PROXY_TYPE_PROXY; lpwpi->proxyBypass = NULL; } else { WARN("failed to parse http_proxy value %s\n", debugstr_w(envproxy)); - lpwpi->proxyEnabled = 0; + lpwpi->flags &= ~PROXY_TYPE_PROXY; lpwpi->proxy = NULL; lpwpi->proxyBypass = NULL; } }
- if (lpwpi->proxyEnabled) + if (lpwpi->flags & PROXY_TYPE_PROXY) { TRACE("Proxy is enabled.\n");
@@ -689,7 +695,7 @@ static BOOL INTERNET_ConfigureProxy( appinfo_t *lpwai ) if (INTERNET_LoadProxySettings( &wpi )) return FALSE;
- if (wpi.proxyEnabled) + if (wpi.flags & PROXY_TYPE_PROXY) { TRACE("http proxy = %s bypass = %s\n", debugstr_w(wpi.proxy), debugstr_w(wpi.proxyBypass));
@@ -2696,10 +2702,7 @@ static DWORD query_global_option(DWORD option, void *buffer, DWORD *size, BOOL u
switch (optionW->dwOption) { case INTERNET_PER_CONN_FLAGS: - if(pi.proxyEnabled) - optionW->Value.dwValue = PROXY_TYPE_PROXY; - else - optionW->Value.dwValue = PROXY_TYPE_DIRECT; + optionW->Value.dwValue = pi.flags; if (url) /* native includes PROXY_TYPE_DIRECT even if PROXY_TYPE_PROXY is set */ optionW->Value.dwValue |= PROXY_TYPE_DIRECT|PROXY_TYPE_AUTO_PROXY_URL; @@ -3026,13 +3029,13 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, { if (info->dwAccessType == INTERNET_OPEN_TYPE_PROXY) { - global_proxy->proxyEnabled = 1; + global_proxy->flags = PROXY_TYPE_PROXY; global_proxy->proxy = wcsdup(info->lpszProxy); global_proxy->proxyBypass = wcsdup(info->lpszProxyBypass); } else { - global_proxy->proxyEnabled = 0; + global_proxy->flags = PROXY_TYPE_DIRECT; global_proxy->proxy = global_proxy->proxyBypass = NULL; } } @@ -3188,14 +3191,9 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, break;
case INTERNET_PER_CONN_FLAGS: - if(option->Value.dwValue & PROXY_TYPE_PROXY) - pi.proxyEnabled = 1; - else - { - if(option->Value.dwValue != PROXY_TYPE_DIRECT) - FIXME("Unhandled flags: 0x%lx\n", option->Value.dwValue); - pi.proxyEnabled = 0; - } + if(option->Value.dwValue & ~(PROXY_TYPE_PROXY | PROXY_TYPE_DIRECT)) + FIXME("Unhandled flags: 0x%lx\n", option->Value.dwValue); + pi.flags = option->Value.dwValue; break;
case INTERNET_PER_CONN_PROXY_BYPASS:
From: Piotr Caban piotr@codeweavers.com
--- dlls/wininet/internet.c | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index 238b540994e..a8ae37a52cd 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -472,16 +472,13 @@ static void FreeProxyInfo( proxyinfo_t *lpwpi ) free(lpwpi->proxyPassword); }
-static proxyinfo_t *global_proxy; +static proxyinfo_t global_proxy;
static void free_global_proxy( void ) { EnterCriticalSection( &WININET_cs ); - if (global_proxy) - { - FreeProxyInfo( global_proxy ); - free( global_proxy ); - } + FreeProxyInfo( &global_proxy ); + memset( &global_proxy, 0, sizeof(global_proxy) ); LeaveCriticalSection( &WININET_cs ); }
@@ -542,11 +539,11 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) memset( lpwpi, 0, sizeof(*lpwpi) );
EnterCriticalSection( &WININET_cs ); - if (global_proxy) + if (global_proxy.flags) { - lpwpi->flags = global_proxy->flags; - lpwpi->proxy = wcsdup( global_proxy->proxy ); - lpwpi->proxyBypass = wcsdup( global_proxy->proxyBypass ); + lpwpi->flags = global_proxy.flags; + lpwpi->proxy = wcsdup( global_proxy.proxy ); + lpwpi->proxyBypass = wcsdup( global_proxy.proxyBypass ); } LeaveCriticalSection( &WININET_cs );
@@ -3024,20 +3021,16 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, { EnterCriticalSection( &WININET_cs ); free_global_proxy(); - global_proxy = malloc(sizeof(proxyinfo_t)); - if (global_proxy) + if (info->dwAccessType == INTERNET_OPEN_TYPE_PROXY) { - if (info->dwAccessType == INTERNET_OPEN_TYPE_PROXY) - { - global_proxy->flags = PROXY_TYPE_PROXY; - global_proxy->proxy = wcsdup(info->lpszProxy); - global_proxy->proxyBypass = wcsdup(info->lpszProxyBypass); - } - else - { - global_proxy->flags = PROXY_TYPE_DIRECT; - global_proxy->proxy = global_proxy->proxyBypass = NULL; - } + global_proxy.flags = PROXY_TYPE_PROXY; + global_proxy.proxy = wcsdup(info->lpszProxy); + global_proxy.proxyBypass = wcsdup(info->lpszProxyBypass); + } + else + { + global_proxy.flags = PROXY_TYPE_DIRECT; + global_proxy.proxy = global_proxy.proxyBypass = NULL; } LeaveCriticalSection( &WININET_cs ); }
From: Piotr Caban piotr@codeweavers.com
--- dlls/wininet/internet.c | 186 +++++++++++++++++----------------------- 1 file changed, 78 insertions(+), 108 deletions(-)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index a8ae37a52cd..58f35605940 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -520,8 +520,7 @@ static BOOL parse_proxy_url( proxyinfo_t *info, const WCHAR *url ) /*********************************************************************** * INTERNET_LoadProxySettings * - * Loads proxy information from process-wide global settings, the registry, - * or the environment into lpwpi. + * Loads proxy information from the registry into lpwpi. * * The caller should call FreeProxyInfo when done with lpwpi. * @@ -531,27 +530,14 @@ static BOOL parse_proxy_url( proxyinfo_t *info, const WCHAR *url ) */ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) { - HKEY key; DWORD type, len, val; - const WCHAR *envproxy; + HKEY key; LONG ret;
memset( lpwpi, 0, sizeof(*lpwpi) );
- EnterCriticalSection( &WININET_cs ); - if (global_proxy.flags) - { - lpwpi->flags = global_proxy.flags; - lpwpi->proxy = wcsdup( global_proxy.proxy ); - lpwpi->proxyBypass = wcsdup( global_proxy.proxyBypass ); - } - LeaveCriticalSection( &WININET_cs ); - if ((ret = RegOpenKeyW( HKEY_CURRENT_USER, szInternetSettings, &key ))) - { - FreeProxyInfo( lpwpi ); return ret; - }
len = sizeof(DWORD); if (RegQueryValueExW( key, L"ProxyEnable", NULL, &type, (BYTE *)&val, &len ) || type != REG_DWORD) @@ -559,7 +545,6 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) val = 0; if((ret = RegSetValueExW( key, L"ProxyEnable", 0, REG_DWORD, (BYTE *)&val, sizeof(DWORD) ))) { - FreeProxyInfo( lpwpi ); RegCloseKey( key ); return ret; } @@ -569,116 +554,101 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) lpwpi->flags |= (val ? PROXY_TYPE_PROXY : PROXY_TYPE_DIRECT); }
- if (!(envproxy = _wgetenv( L"http_proxy" )) || (lpwpi->flags & PROXY_TYPE_PROXY)) + /* figure out how much memory the proxy setting takes */ + if (!RegQueryValueExW( key, L"ProxyServer", NULL, &type, NULL, &len ) && len && (type == REG_SZ)) { - /* figure out how much memory the proxy setting takes */ - if (!RegQueryValueExW( key, L"ProxyServer", NULL, &type, NULL, &len ) && len && (type == REG_SZ)) - { - LPWSTR szProxy, p; - - if (!(szProxy = malloc( len ))) - { - RegCloseKey( key ); - FreeProxyInfo( lpwpi ); - return ERROR_OUTOFMEMORY; - } - RegQueryValueExW( key, L"ProxyServer", NULL, &type, (BYTE*)szProxy, &len ); - - /* find the http proxy, and strip away everything else */ - p = wcsstr( szProxy, L"http=" ); - if (p) - { - p += lstrlenW( L"http=" ); - lstrcpyW( szProxy, p ); - } - p = wcschr( szProxy, ';' ); - if (p) *p = 0; - - FreeProxyInfo( lpwpi ); - lpwpi->proxy = szProxy; - lpwpi->proxyBypass = NULL; + LPWSTR szProxy, p;
- TRACE("http proxy (from registry) = %s\n", debugstr_w(lpwpi->proxy)); + if (!(szProxy = malloc( len ))) + { + RegCloseKey( key ); + return ERROR_OUTOFMEMORY; } - else + RegQueryValueExW( key, L"ProxyServer", NULL, &type, (BYTE*)szProxy, &len ); + + /* find the http proxy, and strip away everything else */ + p = wcsstr( szProxy, L"http=" ); + if (p) { - TRACE("No proxy server settings in registry.\n"); - FreeProxyInfo( lpwpi ); - lpwpi->proxy = NULL; - lpwpi->proxyBypass = NULL; + p += lstrlenW( L"http=" ); + lstrcpyW( szProxy, p ); } + p = wcschr( szProxy, ';' ); + if (p) *p = 0; + + lpwpi->proxy = szProxy; + TRACE("http proxy (from registry%s) = %s\n", lpwpi->flags & PROXY_TYPE_PROXY ? "" : ", disabled", + debugstr_w(lpwpi->proxy)); } - else if (envproxy) + else { - FreeProxyInfo( lpwpi ); - if (parse_proxy_url( lpwpi, envproxy )) - { - TRACE("http proxy (from environment) = %s\n", debugstr_w(lpwpi->proxy)); - lpwpi->flags |= PROXY_TYPE_PROXY; - lpwpi->proxyBypass = NULL; - } - else - { - WARN("failed to parse http_proxy value %s\n", debugstr_w(envproxy)); - lpwpi->flags &= ~PROXY_TYPE_PROXY; - lpwpi->proxy = NULL; - lpwpi->proxyBypass = NULL; - } + TRACE("No proxy server settings in registry.\n"); }
- if (lpwpi->flags & PROXY_TYPE_PROXY) + if (!RegQueryValueExW( key, L"ProxyOverride", NULL, &type, NULL, &len ) && len && (type == REG_SZ)) { - TRACE("Proxy is enabled.\n"); + LPWSTR szProxy;
- if (!(envproxy = _wgetenv( L"no_proxy" ))) + if (!(szProxy = malloc( len ))) { - /* figure out how much memory the proxy setting takes */ - if (!RegQueryValueExW( key, L"ProxyOverride", NULL, &type, NULL, &len ) && len && (type == REG_SZ)) - { - LPWSTR szProxy; + RegCloseKey( key ); + FreeProxyInfo( lpwpi ); + return ERROR_OUTOFMEMORY; + } + RegQueryValueExW( key, L"ProxyOverride", NULL, &type, (BYTE*)szProxy, &len );
- if (!(szProxy = malloc( len ))) - { - RegCloseKey( key ); - FreeProxyInfo( lpwpi ); - return ERROR_OUTOFMEMORY; - } - RegQueryValueExW( key, L"ProxyOverride", NULL, &type, (BYTE*)szProxy, &len ); + lpwpi->proxyBypass = szProxy; + TRACE("http proxy bypass (from registry) = %s\n", debugstr_w(lpwpi->proxyBypass)); + } + else + { + TRACE("No proxy bypass server settings in registry.\n"); + }
- free( lpwpi->proxyBypass ); - lpwpi->proxyBypass = szProxy; + RegCloseKey( key ); + return ERROR_SUCCESS; +}
- TRACE("http proxy bypass (from registry) = %s\n", debugstr_w(lpwpi->proxyBypass)); - } - else - { - free( lpwpi->proxyBypass ); - lpwpi->proxyBypass = NULL; +/*********************************************************************** + * INTERNET_GetProxySettings + * + * Loads proxy information from registry, enironment or process-wide settings + * into lpwpi. + */ +static LONG INTERNET_GetProxySettings( proxyinfo_t *lpwpi ) +{ + const WCHAR *envproxy; + LONG ret;
- TRACE("No proxy bypass server settings in registry.\n"); - } + if ((ret = INTERNET_LoadProxySettings( lpwpi )) || (lpwpi->flags & PROXY_TYPE_PROXY)) + return ret; + FreeProxyInfo( lpwpi ); + + if ((envproxy = _wgetenv( L"http_proxy" ))) + { + memset( lpwpi, 0, sizeof(*lpwpi) ); + lpwpi->flags = PROXY_TYPE_DIRECT; + if (parse_proxy_url( lpwpi, envproxy )) + { + lpwpi->flags = PROXY_TYPE_PROXY; + lpwpi->proxyBypass = wcsdup(_wgetenv( L"no_proxy" )); + TRACE("http proxy (from environment) = %s\n", debugstr_w(lpwpi->proxy)); + TRACE("http proxy bypass (from environment) = %s\n", debugstr_w(lpwpi->proxyBypass)); } else { - WCHAR *envproxyW; - - if (!(envproxyW = malloc( wcslen(envproxy) * sizeof(WCHAR) ))) - { - RegCloseKey( key ); - FreeProxyInfo( lpwpi ); - return ERROR_OUTOFMEMORY; - } - lstrcpyW( envproxyW, envproxy ); - - free( lpwpi->proxyBypass ); - lpwpi->proxyBypass = envproxyW; - - TRACE("http proxy bypass (from environment) = %s\n", debugstr_w(lpwpi->proxyBypass)); + WARN("failed to parse http_proxy value %s\n", debugstr_w(envproxy)); } + return ERROR_SUCCESS; } - else TRACE("Proxy is disabled.\n");
- RegCloseKey( key ); + EnterCriticalSection( &WININET_cs ); + lpwpi->flags = global_proxy.flags; + lpwpi->proxy = wcsdup( global_proxy.proxy ); + lpwpi->proxyBypass = wcsdup( global_proxy.proxyBypass ); + LeaveCriticalSection( &WININET_cs ); + + lpwpi->flags |= PROXY_TYPE_DIRECT; return ERROR_SUCCESS; }
@@ -689,7 +659,7 @@ static BOOL INTERNET_ConfigureProxy( appinfo_t *lpwai ) { proxyinfo_t wpi;
- if (INTERNET_LoadProxySettings( &wpi )) + if (INTERNET_GetProxySettings( &wpi )) return FALSE;
if (wpi.flags & PROXY_TYPE_PROXY) @@ -2681,7 +2651,7 @@ static DWORD query_global_option(DWORD option, void *buffer, DWORD *size, BOOL u LONG ret;
TRACE("Getting global proxy info\n"); - if((ret = INTERNET_LoadProxySettings(&pi))) + if((ret = INTERNET_GetProxySettings(&pi))) return ret;
FIXME("INTERNET_OPTION_PER_CONNECTION_OPTION stub\n"); @@ -3172,7 +3142,7 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, unsigned int i; proxyinfo_t pi;
- if (INTERNET_LoadProxySettings(&pi)) return FALSE; + if (INTERNET_GetProxySettings(&pi)) return FALSE;
for (i = 0; i < con->dwOptionCount; i++) { INTERNET_PER_CONN_OPTIONW *option = con->pOptions + i;
From: Piotr Caban piotr@codeweavers.com
Use INTERNET_LoadProxySettings when settings from registry are needed. --- dlls/wininet/internet.c | 64 ++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 30 deletions(-)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index 58f35605940..4739834df53 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -609,46 +609,50 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) return ERROR_SUCCESS; }
-/*********************************************************************** - * INTERNET_GetProxySettings - * - * Loads proxy information from registry, enironment or process-wide settings - * into lpwpi. - */ -static LONG INTERNET_GetProxySettings( proxyinfo_t *lpwpi ) +static void init_global_proxy(void) { const WCHAR *envproxy; - LONG ret;
- if ((ret = INTERNET_LoadProxySettings( lpwpi )) || (lpwpi->flags & PROXY_TYPE_PROXY)) - return ret; - FreeProxyInfo( lpwpi ); + EnterCriticalSection( &WININET_cs ); + if (global_proxy.flags) goto done;
- if ((envproxy = _wgetenv( L"http_proxy" ))) + INTERNET_LoadProxySettings( &global_proxy ); + if (global_proxy.flags & PROXY_TYPE_PROXY || !(envproxy = _wgetenv( L"http_proxy" ))) + goto done; + + if (parse_proxy_url( &global_proxy, envproxy )) { - memset( lpwpi, 0, sizeof(*lpwpi) ); - lpwpi->flags = PROXY_TYPE_DIRECT; - if (parse_proxy_url( lpwpi, envproxy )) - { - lpwpi->flags = PROXY_TYPE_PROXY; - lpwpi->proxyBypass = wcsdup(_wgetenv( L"no_proxy" )); - TRACE("http proxy (from environment) = %s\n", debugstr_w(lpwpi->proxy)); - TRACE("http proxy bypass (from environment) = %s\n", debugstr_w(lpwpi->proxyBypass)); - } - else - { - WARN("failed to parse http_proxy value %s\n", debugstr_w(envproxy)); - } - return ERROR_SUCCESS; + global_proxy.flags |= PROXY_TYPE_PROXY; + global_proxy.proxyBypass = wcsdup(_wgetenv( L"no_proxy" )); + TRACE("http proxy (from environment) = %s\n", debugstr_w(global_proxy.proxy)); + TRACE("http proxy bypass (from environment) = %s\n", debugstr_w(global_proxy.proxyBypass)); } + else + { + WARN("failed to parse http_proxy value %s\n", debugstr_w(envproxy)); + } + +done: + LeaveCriticalSection( &WININET_cs ); +}
+/*********************************************************************** + * INTERNET_GetProxySettings + * + * Loads process-wide proxy settings into lpwpi. + */ +static LONG INTERNET_GetProxySettings( proxyinfo_t *lpwpi ) +{ + init_global_proxy(); + + memset(lpwpi, 0, sizeof(*lpwpi)); EnterCriticalSection( &WININET_cs ); lpwpi->flags = global_proxy.flags; lpwpi->proxy = wcsdup( global_proxy.proxy ); lpwpi->proxyBypass = wcsdup( global_proxy.proxyBypass ); + lpwpi->proxyUsername = wcsdup( global_proxy.proxyUsername ); + lpwpi->proxyPassword = wcsdup( global_proxy.proxyPassword ); LeaveCriticalSection( &WININET_cs ); - - lpwpi->flags |= PROXY_TYPE_DIRECT; return ERROR_SUCCESS; }
@@ -2651,7 +2655,7 @@ static DWORD query_global_option(DWORD option, void *buffer, DWORD *size, BOOL u LONG ret;
TRACE("Getting global proxy info\n"); - if((ret = INTERNET_GetProxySettings(&pi))) + if((ret = INTERNET_LoadProxySettings(&pi))) return ret;
FIXME("INTERNET_OPTION_PER_CONNECTION_OPTION stub\n"); @@ -3142,7 +3146,7 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, unsigned int i; proxyinfo_t pi;
- if (INTERNET_GetProxySettings(&pi)) return FALSE; + if (INTERNET_LoadProxySettings(&pi)) return FALSE;
for (i = 0; i < con->dwOptionCount; i++) { INTERNET_PER_CONN_OPTIONW *option = con->pOptions + i;
From: Piotr Caban piotr@codeweavers.com
--- dlls/wininet/internet.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index 4739834df53..1d7b9796a21 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -86,6 +86,7 @@ typedef struct LPWSTR proxyBypass; LPWSTR proxyUsername; LPWSTR proxyPassword; + LPWSTR autoconf_url; } proxyinfo_t;
static ULONG max_conns = 2, max_1_0_conns = 4; @@ -470,6 +471,7 @@ static void FreeProxyInfo( proxyinfo_t *lpwpi ) free(lpwpi->proxyBypass); free(lpwpi->proxyUsername); free(lpwpi->proxyPassword); + free(lpwpi->autoconf_url); }
static proxyinfo_t global_proxy; @@ -605,6 +607,23 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) TRACE("No proxy bypass server settings in registry.\n"); }
+ if (!RegQueryValueExW( key, L"AutoConfigURL", NULL, &type, NULL, &len ) && len && (type == REG_SZ)) + { + LPWSTR autoconf_url; + + if (!(autoconf_url = malloc( len ))) + { + RegCloseKey( key ); + FreeProxyInfo( lpwpi ); + return ERROR_OUTOFMEMORY; + } + RegQueryValueExW( key, L"AutoConfigURL", NULL, &type, (BYTE*)autoconf_url, &len ); + + lpwpi->flags |= PROXY_TYPE_AUTO_PROXY_URL; + lpwpi->autoconf_url = autoconf_url; + TRACE("AutoConfigURL = %s\n", debugstr_w(lpwpi->autoconf_url)); + } + RegCloseKey( key ); return ERROR_SUCCESS; }
From: Piotr Caban piotr@codeweavers.com
--- dlls/wininet/internet.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index 1d7b9796a21..4a89cc4064c 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -342,7 +342,8 @@ static LONG INTERNET_SaveProxySettings( proxyinfo_t *lpwpi )
if (lpwpi->proxy) { - if ((ret = RegSetValueExW( key, L"ProxyServer", 0, REG_SZ, (BYTE*)lpwpi->proxy, sizeof(WCHAR) * (lstrlenW(lpwpi->proxy) + 1)))) + if ((ret = RegSetValueExW( key, L"ProxyServer", 0, REG_SZ, (BYTE*)lpwpi->proxy, + sizeof(WCHAR) * (lstrlenW(lpwpi->proxy) + 1)))) { RegCloseKey( key ); return ret; @@ -519,6 +520,23 @@ static BOOL parse_proxy_url( proxyinfo_t *info, const WCHAR *url ) return TRUE; }
+static WCHAR *get_http_proxy( const WCHAR *proxy ) +{ + const WCHAR *p, *end; + WCHAR *ret; + + p = wcsstr( proxy, L"http=" ); + if (p) p += 5; + else p = proxy; + end = wcschr( p, ';' ); + if (!end) end = p + wcslen( p ); + + ret = malloc( (end - p + 1) * sizeof(WCHAR) ); + memcpy(ret, p, (end - p) * sizeof(WCHAR) ); + ret[end - p] = 0; + return ret; +} + /*********************************************************************** * INTERNET_LoadProxySettings * @@ -559,7 +577,7 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) /* figure out how much memory the proxy setting takes */ if (!RegQueryValueExW( key, L"ProxyServer", NULL, &type, NULL, &len ) && len && (type == REG_SZ)) { - LPWSTR szProxy, p; + LPWSTR szProxy;
if (!(szProxy = malloc( len ))) { @@ -568,18 +586,8 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi ) } RegQueryValueExW( key, L"ProxyServer", NULL, &type, (BYTE*)szProxy, &len );
- /* find the http proxy, and strip away everything else */ - p = wcsstr( szProxy, L"http=" ); - if (p) - { - p += lstrlenW( L"http=" ); - lstrcpyW( szProxy, p ); - } - p = wcschr( szProxy, ';' ); - if (p) *p = 0; - lpwpi->proxy = szProxy; - TRACE("http proxy (from registry%s) = %s\n", lpwpi->flags & PROXY_TYPE_PROXY ? "" : ", disabled", + TRACE("proxy server (from registry%s) = %s\n", lpwpi->flags & PROXY_TYPE_PROXY ? "" : ", disabled", debugstr_w(lpwpi->proxy)); } else @@ -690,10 +698,11 @@ static BOOL INTERNET_ConfigureProxy( appinfo_t *lpwai ) TRACE("http proxy = %s bypass = %s\n", debugstr_w(wpi.proxy), debugstr_w(wpi.proxyBypass));
lpwai->accessType = INTERNET_OPEN_TYPE_PROXY; - lpwai->proxy = wpi.proxy; + lpwai->proxy = get_http_proxy( wpi.proxy ); lpwai->proxyBypass = wpi.proxyBypass; lpwai->proxyUsername = wpi.proxyUsername; lpwai->proxyPassword = wpi.proxyPassword; + free( wpi.proxy ); return TRUE; }
From: Piotr Caban piotr@codeweavers.com
--- dlls/wininet/internet.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index 4a89cc4064c..e8804d49d03 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -358,6 +358,24 @@ static LONG INTERNET_SaveProxySettings( proxyinfo_t *lpwpi ) } }
+ if (lpwpi->proxyBypass) + { + if ((ret = RegSetValueExW( key, L"ProxyOverride", 0, REG_SZ, (BYTE*)lpwpi->proxyBypass, + sizeof(WCHAR) * (lstrlenW(lpwpi->proxyBypass) + 1)))) + { + RegCloseKey( key ); + return ret; + } + } + else + { + if ((ret = RegDeleteValueW( key, L"ProxyOverride" )) && ret != ERROR_FILE_NOT_FOUND) + { + RegCloseKey( key ); + return ret; + } + } + RegCloseKey(key); return ERROR_SUCCESS; }
From: Piotr Caban piotr@codeweavers.com
--- dlls/wininet/internet.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index e8804d49d03..fc962016246 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -376,6 +376,24 @@ static LONG INTERNET_SaveProxySettings( proxyinfo_t *lpwpi ) } }
+ if (lpwpi->autoconf_url) + { + if ((ret = RegSetValueExW( key, L"AutoConfigURL", 0, REG_SZ, (BYTE*)lpwpi->autoconf_url, + sizeof(WCHAR) * (lstrlenW(lpwpi->autoconf_url) + 1)))) + { + RegCloseKey( key ); + return ret; + } + } + else + { + if ((ret = RegDeleteValueW( key, L"AutoConfigURL" )) && ret != ERROR_FILE_NOT_FOUND) + { + RegCloseKey( key ); + return ret; + } + } + RegCloseKey(key); return ERROR_SUCCESS; }
This merge request was approved by Jacek Caban.