winhttp: Add support for WINHTTP_AUTOPROXY_HOST_LOWERCASE flag in WinHttpGetProxyForUrl.
This commit is contained in:
parent
9eb644fa13
commit
7ab46f03b1
3 changed files with 48 additions and 39 deletions
|
@ -2031,42 +2031,69 @@ 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;
|
||||
|
||||
memset( &uc, 0, sizeof(uc) );
|
||||
uc.dwStructSize = sizeof(uc);
|
||||
uc.dwSchemeLength = -1;
|
||||
uc.dwHostNameLength = -1;
|
||||
|
||||
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))
|
||||
{
|
||||
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 );
|
||||
|
||||
buffer.dwStructSize = sizeof(buffer);
|
||||
buffer.lpszScriptBuffer = script;
|
||||
buffer.dwScriptBufferSize = size;
|
||||
|
||||
if (!(urlA = strdupWA( url ))) return FALSE;
|
||||
if (!(ret = InternetInitializeAutoProxyDll( 0, NULL, NULL, NULL, &buffer )))
|
||||
if (!InternetInitializeAutoProxyDll( 0, NULL, NULL, NULL, &buffer ))
|
||||
{
|
||||
free( urlA );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
memset( &uc, 0, sizeof(uc) );
|
||||
uc.dwStructSize = sizeof(uc);
|
||||
uc.dwHostNameLength = -1;
|
||||
|
||||
if ((ret = WinHttpCrackUrl( url, 0, 0, &uc )))
|
||||
if ((ret = InternetGetProxyInfo( urlA, strlen(urlA), hostnameA, len_hostname, &result, &len )))
|
||||
{
|
||||
char *hostnameA = strdupWA_sized( uc.lpszHostName, uc.dwHostNameLength );
|
||||
|
||||
if ((ret = InternetGetProxyInfo( urlA, strlen(urlA),
|
||||
hostnameA, strlen(hostnameA), &result, &len_result )))
|
||||
{
|
||||
ret = parse_script_result( result, info );
|
||||
free( result );
|
||||
}
|
||||
|
||||
free( hostnameA );
|
||||
ret = parse_script_result( result, info );
|
||||
free( result );
|
||||
}
|
||||
|
||||
free( urlA );
|
||||
InternetDeInitializeAutoProxyDll( NULL, 0 );
|
||||
return ret;
|
||||
|
@ -2118,7 +2145,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 );
|
||||
}
|
||||
|
||||
|
|
|
@ -5406,7 +5406,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") ||
|
||||
broken(old_winhttp && !wcscmp(info.lpszProxy, L"HTTP___WINEHQ.ORG_Test.html_WINEHQ.ORG:8080")),
|
||||
"info.Proxy = %s\n", wine_dbgstr_w(info.lpszProxy));
|
||||
|
@ -5420,7 +5419,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") ||
|
||||
broken(old_winhttp && !wcscmp(info.lpszProxy, L"HTTP___winehq.org_Test.html_winehq.org:8080")),
|
||||
"info.Proxy = %s\n", wine_dbgstr_w(info.lpszProxy));
|
||||
|
@ -5436,7 +5434,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",
|
||||
|
|
|
@ -455,21 +455,6 @@ static inline char *strdupWA( const WCHAR *src )
|
|||
return dst;
|
||||
}
|
||||
|
||||
static inline char *strdupWA_sized( const WCHAR *src, DWORD size )
|
||||
{
|
||||
char *dst = NULL;
|
||||
if (src)
|
||||
{
|
||||
int len = WideCharToMultiByte( CP_ACP, 0, src, size, NULL, 0, NULL, NULL ) + 1;
|
||||
if ((dst = malloc( len )))
|
||||
{
|
||||
WideCharToMultiByte( CP_ACP, 0, src, size, dst, len, NULL, NULL );
|
||||
dst[len - 1] = 0;
|
||||
}
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
extern HINSTANCE winhttp_instance;
|
||||
|
||||
#define MIN_WEBSOCKET_SEND_BUFFER_SIZE 16
|
||||
|
|
Loading…
Add table
Reference in a new issue