Commit 11da0ac8 authored by Dmitry Timoshkov's avatar Dmitry Timoshkov Committed by Alexandre Julliard

winhttp: Add some tests for set/query option, make them pass under Wine.

parent c4d58a4b
...@@ -76,8 +76,44 @@ static void session_destroy( object_header_t *hdr ) ...@@ -76,8 +76,44 @@ static void session_destroy( object_header_t *hdr )
heap_free( session ); heap_free( session );
} }
static BOOL session_query_option( object_header_t *hdr, DWORD option, LPVOID buffer, LPDWORD buflen )
{
if (!buflen)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
switch (option)
{
case WINHTTP_OPTION_REDIRECT_POLICY:
{
if (!buffer || *buflen < sizeof(DWORD))
{
*buflen = sizeof(DWORD);
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
*(DWORD *)buffer = hdr->redirect_policy;
*buflen = sizeof(DWORD);
return TRUE;
}
default:
FIXME("unimplemented option %u\n", option);
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
}
static BOOL session_set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD buflen ) static BOOL session_set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD buflen )
{ {
if (!buffer)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
switch (option) switch (option)
{ {
case WINHTTP_OPTION_PROXY: case WINHTTP_OPTION_PROXY:
...@@ -89,22 +125,33 @@ static BOOL session_set_option( object_header_t *hdr, DWORD option, LPVOID buffe ...@@ -89,22 +125,33 @@ static BOOL session_set_option( object_header_t *hdr, DWORD option, LPVOID buffe
} }
case WINHTTP_OPTION_REDIRECT_POLICY: case WINHTTP_OPTION_REDIRECT_POLICY:
{ {
DWORD policy = *(DWORD *)buffer; DWORD policy;
if (buflen != sizeof(policy))
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
policy = *(DWORD *)buffer;
TRACE("0x%x\n", policy); TRACE("0x%x\n", policy);
hdr->redirect_policy = policy; hdr->redirect_policy = policy;
return TRUE; return TRUE;
} }
case WINHTTP_OPTION_DISABLE_FEATURE:
SetLastError(ERROR_WINHTTP_INCORRECT_HANDLE_TYPE);
return FALSE;
default: default:
FIXME("unimplemented option %u\n", option); FIXME("unimplemented option %u\n", option);
return TRUE; SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
} }
} }
static const object_vtbl_t session_vtbl = static const object_vtbl_t session_vtbl =
{ {
session_destroy, session_destroy,
NULL, session_query_option,
session_set_option session_set_option
}; };
...@@ -125,6 +172,7 @@ HINTERNET WINAPI WinHttpOpen( LPCWSTR agent, DWORD access, LPCWSTR proxy, LPCWST ...@@ -125,6 +172,7 @@ HINTERNET WINAPI WinHttpOpen( LPCWSTR agent, DWORD access, LPCWSTR proxy, LPCWST
session->hdr.flags = flags; session->hdr.flags = flags;
session->hdr.refs = 1; session->hdr.refs = 1;
session->access = access; session->access = access;
session->hdr.redirect_policy = WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP;
if (agent && !(session->agent = strdupW( agent ))) goto end; if (agent && !(session->agent = strdupW( agent ))) goto end;
if (proxy && !(session->proxy_server = strdupW( proxy ))) goto end; if (proxy && !(session->proxy_server = strdupW( proxy ))) goto end;
...@@ -254,15 +302,29 @@ static void request_destroy( object_header_t *hdr ) ...@@ -254,15 +302,29 @@ static void request_destroy( object_header_t *hdr )
static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buffer, LPDWORD buflen ) static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buffer, LPDWORD buflen )
{ {
if (!buflen)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
switch (option) switch (option)
{ {
case WINHTTP_OPTION_SECURITY_FLAGS: case WINHTTP_OPTION_SECURITY_FLAGS:
{ {
DWORD flags = 0; DWORD flags;
if (!buffer || *buflen < sizeof(flags))
{
*buflen = sizeof(flags);
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
flags = 0;
if (hdr->flags & WINHTTP_FLAG_SECURE) flags |= SECURITY_FLAG_SECURE; if (hdr->flags & WINHTTP_FLAG_SECURE) flags |= SECURITY_FLAG_SECURE;
*(DWORD *)buffer = flags; *(DWORD *)buffer = flags;
*buflen = sizeof(DWORD); *buflen = sizeof(flags);
return TRUE; return TRUE;
} }
case WINHTTP_OPTION_SERVER_CERT_CONTEXT: case WINHTTP_OPTION_SERVER_CERT_CONTEXT:
...@@ -270,6 +332,13 @@ static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buf ...@@ -270,6 +332,13 @@ static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buf
const CERT_CONTEXT *cert; const CERT_CONTEXT *cert;
request_t *request = (request_t *)hdr; request_t *request = (request_t *)hdr;
if (!buffer || *buflen < sizeof(cert))
{
*buflen = sizeof(cert);
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
if (!(cert = netconn_get_certificate( &request->netconn ))) return FALSE; if (!(cert = netconn_get_certificate( &request->netconn ))) return FALSE;
*(CERT_CONTEXT **)buffer = (CERT_CONTEXT *)cert; *(CERT_CONTEXT **)buffer = (CERT_CONTEXT *)cert;
*buflen = sizeof(cert); *buflen = sizeof(cert);
...@@ -277,18 +346,32 @@ static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buf ...@@ -277,18 +346,32 @@ static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buf
} }
case WINHTTP_OPTION_SECURITY_KEY_BITNESS: case WINHTTP_OPTION_SECURITY_KEY_BITNESS:
{ {
if (!buffer || *buflen < sizeof(DWORD))
{
*buflen = sizeof(DWORD);
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
*(DWORD *)buffer = 128; /* FIXME */ *(DWORD *)buffer = 128; /* FIXME */
*buflen = sizeof(DWORD); *buflen = sizeof(DWORD);
return TRUE; return TRUE;
} }
default: default:
FIXME("unimplemented option %u\n", option); FIXME("unimplemented option %u\n", option);
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE; return FALSE;
} }
} }
static BOOL request_set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD buflen ) static BOOL request_set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD buflen )
{ {
if (!buffer)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
switch (option) switch (option)
{ {
case WINHTTP_OPTION_PROXY: case WINHTTP_OPTION_PROXY:
...@@ -302,6 +385,12 @@ static BOOL request_set_option( object_header_t *hdr, DWORD option, LPVOID buffe ...@@ -302,6 +385,12 @@ static BOOL request_set_option( object_header_t *hdr, DWORD option, LPVOID buffe
{ {
DWORD disable = *(DWORD *)buffer; DWORD disable = *(DWORD *)buffer;
if (buflen != sizeof(DWORD))
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
TRACE("0x%x\n", disable); TRACE("0x%x\n", disable);
hdr->disable_flags &= disable; hdr->disable_flags &= disable;
return TRUE; return TRUE;
...@@ -310,6 +399,12 @@ static BOOL request_set_option( object_header_t *hdr, DWORD option, LPVOID buffe ...@@ -310,6 +399,12 @@ static BOOL request_set_option( object_header_t *hdr, DWORD option, LPVOID buffe
{ {
DWORD policy = *(DWORD *)buffer; DWORD policy = *(DWORD *)buffer;
if (buflen != sizeof(DWORD))
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
TRACE("0x%x\n", policy); TRACE("0x%x\n", policy);
hdr->logon_policy = policy; hdr->logon_policy = policy;
return TRUE; return TRUE;
...@@ -318,12 +413,19 @@ static BOOL request_set_option( object_header_t *hdr, DWORD option, LPVOID buffe ...@@ -318,12 +413,19 @@ static BOOL request_set_option( object_header_t *hdr, DWORD option, LPVOID buffe
{ {
DWORD policy = *(DWORD *)buffer; DWORD policy = *(DWORD *)buffer;
if (buflen != sizeof(DWORD))
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
TRACE("0x%x\n", policy); TRACE("0x%x\n", policy);
hdr->redirect_policy = policy; hdr->redirect_policy = policy;
return TRUE; return TRUE;
} }
default: default:
FIXME("unimplemented option %u\n", option); FIXME("unimplemented option %u\n", option);
SetLastError(ERROR_INVALID_PARAMETER);
return TRUE; return TRUE;
} }
} }
...@@ -426,10 +528,14 @@ static BOOL query_option( object_header_t *hdr, DWORD option, LPVOID buffer, LPD ...@@ -426,10 +528,14 @@ static BOOL query_option( object_header_t *hdr, DWORD option, LPVOID buffer, LPD
return TRUE; return TRUE;
} }
default: default:
{
if (hdr->vtbl->query_option) ret = hdr->vtbl->query_option( hdr, option, buffer, buflen ); if (hdr->vtbl->query_option) ret = hdr->vtbl->query_option( hdr, option, buffer, buflen );
else FIXME("unimplemented option %u\n", option); else
} {
FIXME("unimplemented option %u\n", option);
SetLastError(ERROR_WINHTTP_INCORRECT_HANDLE_TYPE);
return FALSE;
}
break;
} }
return ret; return ret;
} }
...@@ -468,10 +574,14 @@ static BOOL set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD ...@@ -468,10 +574,14 @@ static BOOL set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD
return TRUE; return TRUE;
} }
default: default:
{
if (hdr->vtbl->set_option) ret = hdr->vtbl->set_option( hdr, option, buffer, buflen ); if (hdr->vtbl->set_option) ret = hdr->vtbl->set_option( hdr, option, buffer, buflen );
else FIXME("unimplemented option %u\n", option); else
} {
FIXME("unimplemented option %u\n", option);
SetLastError(ERROR_WINHTTP_INCORRECT_HANDLE_TYPE);
return FALSE;
}
break;
} }
return ret; return ret;
} }
......
...@@ -31,6 +31,154 @@ static const WCHAR test_useragent[] = ...@@ -31,6 +31,154 @@ static const WCHAR test_useragent[] =
{'W','i','n','e',' ','R','e','g','r','e','s','s','i','o','n',' ','T','e','s','t',0}; {'W','i','n','e',' ','R','e','g','r','e','s','s','i','o','n',' ','T','e','s','t',0};
static const WCHAR test_server[] = {'w','i','n','e','h','q','.','o','r','g',0}; static const WCHAR test_server[] = {'w','i','n','e','h','q','.','o','r','g',0};
static void test_QueryOption(void)
{
BOOL ret;
HINTERNET session, request, connection;
DWORD feature, size;
SetLastError(0xdeadbeef);
session = WinHttpOpen(test_useragent, 0, 0, 0, 0);
ok(session != NULL, "WinHttpOpen failed to open session, error %u\n", GetLastError());
SetLastError(0xdeadbeef);
ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, NULL, NULL);
ok(!ret, "should fail to set redirect policy %u\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
size = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, NULL, &size);
ok(!ret, "should fail to query option\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
ok(size == 4, "expected 4, got %u\n", size);
feature = 0xdeadbeef;
size = sizeof(feature) - 1;
SetLastError(0xdeadbeef);
ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, &size);
ok(!ret, "should fail to query option\n");
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
ok(size == 4, "expected 4, got %u\n", size);
feature = 0xdeadbeef;
size = sizeof(feature) + 1;
SetLastError(0xdeadbeef);
ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, &size);
ok(ret, "failed to query option %u\n", GetLastError());
ok(size == sizeof(feature), "WinHttpQueryOption should set the size: %u\n", size);
ok(feature == WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP,
"expected WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP, got %#x\n", feature);
SetLastError(0xdeadbeef);
ret = WinHttpSetOption(session, WINHTTP_OPTION_REDIRECT_POLICY, NULL, sizeof(feature));
ok(!ret, "should fail to set redirect policy %u\n", GetLastError());
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
feature = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS;
SetLastError(0xdeadbeef);
ret = WinHttpSetOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, sizeof(feature) - 1);
ok(!ret, "should fail to set redirect policy %u\n", GetLastError());
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
feature = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS;
SetLastError(0xdeadbeef);
ret = WinHttpSetOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, sizeof(feature) + 1);
ok(!ret, "should fail to set redirect policy %u\n", GetLastError());
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
feature = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS;
SetLastError(0xdeadbeef);
ret = WinHttpSetOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, sizeof(feature));
ok(ret, "failed to set redirect policy %u\n", GetLastError());
feature = 0xdeadbeef;
size = sizeof(feature);
SetLastError(0xdeadbeef);
ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, &size);
ok(ret, "failed to query option %u\n", GetLastError());
ok(feature == WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS,
"expected WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS, got %#x\n", feature);
feature = WINHTTP_DISABLE_COOKIES;
SetLastError(0xdeadbeef);
ret = WinHttpSetOption(session, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature));
ok(!ret, "should fail to set disable feature for a session\n");
ok(GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE,
"expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u\n", GetLastError());
SetLastError(0xdeadbeef);
connection = WinHttpConnect(session, test_server, INTERNET_DEFAULT_HTTP_PORT, 0);
ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u\n", GetLastError());
feature = WINHTTP_DISABLE_COOKIES;
SetLastError(0xdeadbeef);
ret = WinHttpSetOption(connection, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature));
ok(!ret, "should fail to set disable feature for a connection\n");
ok(GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE,
"expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u\n", GetLastError());
SetLastError(0xdeadbeef);
request = WinHttpOpenRequest(connection, NULL, NULL, NULL, WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
if (request == NULL && GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED)
{
skip("Network unreachable, skipping the test\n");
goto done;
}
feature = 0xdeadbeef;
size = sizeof(feature);
SetLastError(0xdeadbeef);
ret = WinHttpQueryOption(request, WINHTTP_OPTION_DISABLE_FEATURE, &feature, &size);
ok(!ret, "should fail to query disable feature for a request\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
feature = 0;
size = sizeof(feature);
SetLastError(0xdeadbeef);
ret = WinHttpSetOption(request, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature));
ok(ret, "failed to set feature %u\n", GetLastError());
feature = 0xffffffff;
size = sizeof(feature);
SetLastError(0xdeadbeef);
ret = WinHttpSetOption(request, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature));
ok(ret, "failed to set feature %u\n", GetLastError());
feature = WINHTTP_DISABLE_COOKIES;
size = sizeof(feature);
SetLastError(0xdeadbeef);
ret = WinHttpSetOption(request, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature));
ok(ret, "failed to set feature %u\n", GetLastError());
size = 0;
SetLastError(0xdeadbeef);
ret = WinHttpQueryOption(request, WINHTTP_OPTION_DISABLE_FEATURE, NULL, &size);
ok(!ret, "should fail to query disable feature for a request\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER,
"expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
SetLastError(0xdeadbeef);
ret = WinHttpCloseHandle(request);
ok(ret, "WinHttpCloseHandle failed on closing request: %u\n", GetLastError());
done:
SetLastError(0xdeadbeef);
ret = WinHttpCloseHandle(connection);
ok(ret, "WinHttpCloseHandle failed on closing connection: %u\n", GetLastError());
SetLastError(0xdeadbeef);
ret = WinHttpCloseHandle(session);
ok(ret, "WinHttpCloseHandle failed on closing session: %u\n", GetLastError());
}
static void test_OpenRequest (void) static void test_OpenRequest (void)
{ {
BOOL ret; BOOL ret;
...@@ -273,6 +421,7 @@ static void test_WinHttpAddHeaders(void) ...@@ -273,6 +421,7 @@ static void test_WinHttpAddHeaders(void)
*/ */
index = 0; index = 0;
len = 5*sizeof(WCHAR); len = 5*sizeof(WCHAR);
memset(check_buffer, 0xab, sizeof(check_buffer));
memcpy(buffer, check_buffer, sizeof(buffer)); memcpy(buffer, check_buffer, sizeof(buffer));
ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS, ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
test_header_name, buffer, &len, &index); test_header_name, buffer, &len, &index);
...@@ -677,4 +826,5 @@ START_TEST (winhttp) ...@@ -677,4 +826,5 @@ START_TEST (winhttp)
test_WinHttpAddHeaders(); test_WinHttpAddHeaders();
test_secure_connection(); test_secure_connection();
test_request_parameter_defaults(); test_request_parameter_defaults();
test_QueryOption();
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment