From: Piotr Caban piotr@codeweavers.com
--- dlls/winhttp/session.c | 79 +++++++++++++++++++++++++----------- dlls/winhttp/tests/winhttp.c | 3 -- 2 files changed, 55 insertions(+), 27 deletions(-)
diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c index 978bf28bc37..f42e01e0187 100644 --- a/dlls/winhttp/session.c +++ b/dlls/winhttp/session.c @@ -2031,42 +2031,73 @@ BOOL WINAPI InternetDeInitializeAutoProxyDll(LPSTR, DWORD); BOOL WINAPI InternetGetProxyInfo(LPCSTR, DWORD, LPSTR, DWORD, LPSTR *, LPDWORD); BOOL WINAPI InternetInitializeAutoProxyDll(DWORD, LPSTR, LPSTR, void *, struct AUTO_PROXY_SCRIPT_BUFFER *);
-static BOOL run_script( char *script, DWORD size, const WCHAR *url, WINHTTP_PROXY_INFO *info ) +#define MAX_SCHEME_LENGTH 32 +static BOOL run_script( char *script, DWORD size, const WCHAR *url, + WINHTTP_PROXY_INFO *info, DWORD flags ) { + WCHAR scheme[MAX_SCHEME_LENGTH + 1], buf[MAX_HOST_NAME_LENGTH + 1], *hostname; BOOL ret; - char *result, *urlA; - DWORD len_result; + char *result, *urlA, *hostnameA; + DWORD len, len_scheme, len_hostname; struct AUTO_PROXY_SCRIPT_BUFFER buffer; URL_COMPONENTSW uc;
- buffer.dwStructSize = sizeof(buffer); - buffer.lpszScriptBuffer = script; - buffer.dwScriptBufferSize = size; - - if (!(urlA = strdupWA( url ))) return FALSE; - if (!(ret = InternetInitializeAutoProxyDll( 0, NULL, NULL, NULL, &buffer ))) - { - free( urlA ); - return FALSE; - } - memset( &uc, 0, sizeof(uc) ); uc.dwStructSize = sizeof(uc); + uc.dwSchemeLength = -1; uc.dwHostNameLength = -1;
- if ((ret = WinHttpCrackUrl( url, 0, 0, &uc ))) + if (!WinHttpCrackUrl( url, 0, 0, &uc )) + return FALSE; + + memcpy( scheme, uc.lpszScheme, uc.dwSchemeLength * sizeof(WCHAR) ); + scheme[uc.dwSchemeLength] = 0; + wcslwr( scheme ); + len_scheme = WideCharToMultiByte( CP_ACP, 0, scheme, uc.dwSchemeLength, + NULL, 0, NULL, NULL ); + + if (flags & WINHTTP_AUTOPROXY_HOST_LOWERCASE && !(flags & WINHTTP_AUTOPROXY_HOST_KEEPCASE)) { - char *hostnameA = strdupWA_sized( uc.lpszHostName, uc.dwHostNameLength ); + memcpy( buf, uc.lpszHostName, uc.dwHostNameLength * sizeof(WCHAR) ); + buf[uc.dwHostNameLength] = 0; + wcslwr( buf ); + hostname = buf; + } + else + { + hostname = uc.lpszHostName; + } + len_hostname = WideCharToMultiByte( CP_ACP, 0, hostname, + uc.dwHostNameLength, NULL, 0, NULL, NULL ); + + len = WideCharToMultiByte( CP_ACP, 0, + uc.lpszHostName + uc.dwHostNameLength, -1, NULL, 0, NULL, NULL ); + if (!(urlA = malloc( len + len_scheme + len_hostname + 3 ))) return FALSE; + WideCharToMultiByte( CP_ACP, 0, scheme, uc.dwSchemeLength, + urlA, len_scheme, NULL, NULL ); + urlA[len_scheme++] = ':'; + urlA[len_scheme++] = '/'; + urlA[len_scheme++] = '/'; + WideCharToMultiByte( CP_ACP, 0, hostname, uc.dwHostNameLength, + urlA + len_scheme, len_hostname, NULL, NULL ); + hostnameA = urlA + len_scheme; + WideCharToMultiByte( CP_ACP, 0, uc.lpszHostName + uc.dwHostNameLength, -1, + urlA + len_scheme + len_hostname, len, NULL, NULL );
- if ((ret = InternetGetProxyInfo( urlA, strlen(urlA), - hostnameA, strlen(hostnameA), &result, &len_result ))) - { - ret = parse_script_result( result, info ); - free( result ); - } + buffer.dwStructSize = sizeof(buffer); + buffer.lpszScriptBuffer = script; + buffer.dwScriptBufferSize = size; + + if (!InternetInitializeAutoProxyDll( 0, NULL, NULL, NULL, &buffer )) + return FALSE;
- free( hostnameA ); + if ((ret = InternetGetProxyInfo( urlA, strlen(urlA), + hostnameA, len_hostname, &result, &len ))) + { + ret = parse_script_result( result, info ); + free( result ); } + free( urlA ); InternetDeInitializeAutoProxyDll( NULL, 0 ); return ret; @@ -2118,7 +2149,7 @@ BOOL WINAPI WinHttpGetProxyForUrl( HINTERNET hsession, LPCWSTR url, WINHTTP_AUTO
if ((script = download_script( pac_url, &size ))) { - ret = run_script( script, size, url, info ); + ret = run_script( script, size, url, info, options->dwFlags ); free( script ); }
diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index a0ff0d6633b..5dbac88eb15 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -5400,7 +5400,6 @@ static void test_WinHttpGetProxyForUrl(int port) ok(ret, "expected success\n" ); ok(info.dwAccessType == WINHTTP_ACCESS_TYPE_NAMED_PROXY, "info.dwAccessType = %lu\n", info.dwAccessType); - todo_wine ok(!wcscmp(info.lpszProxy, L"http___WINEHQ.ORG_Test.html_WINEHQ.ORG:8080"), "info.Proxy = %s\n", wine_dbgstr_w(info.lpszProxy)); ok(!info.lpszProxyBypass, "info.ProxyBypass = %s\n", @@ -5413,7 +5412,6 @@ static void test_WinHttpGetProxyForUrl(int port) ok(ret, "expected success\n" ); ok(info.dwAccessType == WINHTTP_ACCESS_TYPE_NAMED_PROXY, "info.dwAccessType = %lu\n", info.dwAccessType); - todo_wine ok(!wcscmp(info.lpszProxy, L"http___winehq.org_Test.html_winehq.org:8080"), "info.Proxy = %s\n", wine_dbgstr_w(info.lpszProxy)); ok(!info.lpszProxyBypass, "info.ProxyBypass = %s\n", @@ -5426,7 +5424,6 @@ static void test_WinHttpGetProxyForUrl(int port) ok(ret, "expected success\n" ); ok(info.dwAccessType == WINHTTP_ACCESS_TYPE_NAMED_PROXY, "info.dwAccessType = %lu\n", info.dwAccessType); - todo_wine ok(!wcscmp(info.lpszProxy, L"http___WINEHQ.ORG_Test.html_WINEHQ.ORG:8080"), "info.Proxy = %s\n", wine_dbgstr_w(info.lpszProxy)); ok(!info.lpszProxyBypass, "info.ProxyBypass = %s\n",