https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a4f791d9206d3b1c67fba…
commit a4f791d9206d3b1c67fba2793f80234ad8a2411f
Author: Amine Khaldi <amine.khaldi(a)reactos.org>
AuthorDate: Sat Dec 7 13:07:21 2019 +0100
Commit: Amine Khaldi <amine.khaldi(a)reactos.org>
CommitDate: Sat Dec 7 13:07:21 2019 +0100
[WININET_WINETEST] Sync with Wine Staging 4.18. CORE-16441
---
modules/rostests/winetests/wininet/CMakeLists.txt | 2 +-
modules/rostests/winetests/wininet/ftp.c | 35 +-
modules/rostests/winetests/wininet/http.c | 539 +++++++++++++++++++++-
modules/rostests/winetests/wininet/internet.c | 27 +-
modules/rostests/winetests/wininet/url.c | 52 +--
modules/rostests/winetests/wininet/urlcache.c | 105 ++++-
6 files changed, 680 insertions(+), 80 deletions(-)
diff --git a/modules/rostests/winetests/wininet/CMakeLists.txt
b/modules/rostests/winetests/wininet/CMakeLists.txt
index 576bcaaa0ae..ca770fda0f5 100644
--- a/modules/rostests/winetests/wininet/CMakeLists.txt
+++ b/modules/rostests/winetests/wininet/CMakeLists.txt
@@ -12,5 +12,5 @@ list(APPEND SOURCE
add_executable(wininet_winetest ${SOURCE})
set_module_type(wininet_winetest win32cui)
-add_importlibs(wininet_winetest wininet crypt32 ws2_32 user32 advapi32 msvcrt kernel32)
+add_importlibs(wininet_winetest wininet crypt32 ws2_32 user32 advapi32 shell32 msvcrt
kernel32 ntdll)
add_rostests_file(TARGET wininet_winetest)
diff --git a/modules/rostests/winetests/wininet/ftp.c
b/modules/rostests/winetests/wininet/ftp.c
index baf20ffa118..6a3e4dc1d98 100644
--- a/modules/rostests/winetests/wininet/ftp.c
+++ b/modules/rostests/winetests/wininet/ftp.c
@@ -71,7 +71,7 @@ static void test_connect(HINTERNET hInternet)
*/
SetLastError(0xdeadbeef);
- hFtp = InternetConnectA(hInternet, "ftp.winehq.org",
INTERNET_DEFAULT_FTP_PORT, "anonymous", NULL, INTERNET_SERVICE_FTP,
INTERNET_FLAG_PASSIVE, 0);
+ hFtp = InternetConnectA(hInternet, "ftp.winehq.org",
INTERNET_DEFAULT_FTP_PORT, "anonymous", "IEUser@",
INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
if (hFtp) /* some servers accept an empty password */
{
ros_skip_flaky
@@ -707,7 +707,7 @@ static void test_renamefile(HINTERNET hFtp, HINTERNET hConnect)
"Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n",
GetLastError());
}
-static void test_command(HINTERNET hFtp, HINTERNET hConnect)
+static void test_command(HINTERNET hFtp)
{
BOOL ret;
DWORD error;
@@ -722,17 +722,18 @@ static void test_command(HINTERNET hFtp, HINTERNET hConnect)
{
{ FALSE, ERROR_INVALID_PARAMETER, NULL },
{ FALSE, ERROR_INVALID_PARAMETER, "" },
- { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "HELO" },
- { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE " },
- { FALSE, ERROR_INTERNET_EXTENDED_ERROR, " SIZE" },
- { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE " },
- { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE /welcome.msg
/welcome.msg" },
- { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE /welcome.msg" },
- { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE /welcome.msg " },
- { TRUE, ERROR_SUCCESS, "SIZE\t/welcome.msg" },
- { TRUE, ERROR_SUCCESS, "SIZE /welcome.msg" },
- { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "PWD /welcome.msg" },
- { TRUE, ERROR_SUCCESS, "PWD" }
+ { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "invalid" },
+ { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "size" },
+ { TRUE, ERROR_SUCCESS, "type i" },
+ { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "size " },
+ { FALSE, ERROR_INTERNET_EXTENDED_ERROR, " size" },
+ { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "size " },
+ { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "size welcome.msg welcome.msg"
},
+ { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "size welcome.msg" },
+ { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "size welcome.msg " },
+ { TRUE, ERROR_SUCCESS, "size welcome.msg" },
+ { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "pwd welcome.msg" },
+ { TRUE, ERROR_SUCCESS, "pwd" }
};
if (!pFtpCommandA)
@@ -741,7 +742,7 @@ static void test_command(HINTERNET hFtp, HINTERNET hConnect)
return;
}
- for (i = 0; i < sizeof(command_test) / sizeof(command_test[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(command_test); i++)
{
SetLastError(0xdeadbeef);
ret = pFtpCommandA(hFtp, FALSE, FTP_TRANSFER_TYPE_ASCII, command_test[i].cmd, 0,
NULL);
@@ -970,7 +971,7 @@ static void test_status_callbacks(HINTERNET hInternet)
cb = pInternetSetStatusCallbackA(hInternet, status_callback);
ok(cb == NULL, "expected NULL got %p\n", cb);
- hFtp = InternetConnectA(hInternet, "ftp.winehq.org",
INTERNET_DEFAULT_FTP_PORT, "anonymous", NULL,
+ hFtp = InternetConnectA(hInternet, "ftp.winehq.org",
INTERNET_DEFAULT_FTP_PORT, "anonymous", "IEUser@",
INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 1);
if (!hFtp)
{
@@ -1004,7 +1005,7 @@ START_TEST(ftp)
hInternet = InternetOpenA("winetest", 0, NULL, NULL, 0);
ok(hInternet != NULL, "InternetOpen failed: %u\n", GetLastError());
- hFtp = InternetConnectA(hInternet, "ftp.winehq.org",
INTERNET_DEFAULT_FTP_PORT, "anonymous", NULL, INTERNET_SERVICE_FTP,
INTERNET_FLAG_PASSIVE, 0);
+ hFtp = InternetConnectA(hInternet, "ftp.winehq.org",
INTERNET_DEFAULT_FTP_PORT, "anonymous", "IEUser@",
INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
if (!hFtp)
{
InternetCloseHandle(hInternet);
@@ -1037,7 +1038,7 @@ START_TEST(ftp)
test_putfile(hFtp, hHttp);
test_removedir(hFtp, hHttp);
test_renamefile(hFtp, hHttp);
- test_command(hFtp, hHttp);
+ test_command(hFtp);
test_find_first_file(hFtp, hHttp);
test_get_current_dir(hFtp, hHttp);
test_status_callbacks(hInternet);
diff --git a/modules/rostests/winetests/wininet/http.c
b/modules/rostests/winetests/wininet/http.c
index 1c5cbfe834b..de34a37cd6b 100644
--- a/modules/rostests/winetests/wininet/http.c
+++ b/modules/rostests/winetests/wininet/http.c
@@ -23,6 +23,7 @@
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
+#include <limits.h>
#include "windef.h"
#include "winbase.h"
@@ -172,7 +173,7 @@ static BOOL (WINAPI
*pInternetGetSecurityInfoByURLA)(LPSTR,PCCERT_CHAIN_CONTEXT*
static int strcmp_wa(LPCWSTR strw, const char *stra)
{
WCHAR buf[512];
- MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, sizeof(buf)/sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, ARRAY_SIZE(buf));
return lstrcmpW(strw, buf);
}
@@ -723,8 +724,11 @@ static void InternetReadFile_test(int flags, const test_data_t
*test)
length = sizeof(buffer)-2;
memset(buffer, 0x77, sizeof(buffer));
+ SetLastError(0xdeadbeef);
res = HttpQueryInfoA(hor,HTTP_QUERY_RAW_HEADERS,buffer,&length,0x0);
ok(res, "HttpQueryInfoA(HTTP_QUERY_RAW_HEADERS) failed with error %d\n",
GetLastError());
+ ok(GetLastError() == 0 ||
+ broken(GetLastError() == 0xdeadbeef /* XP/W2K3 */), "Last Error not
reset %u\n", GetLastError());
/* show that the function writes data past the length returned */
ok(buffer[length-2], "Expected any header character, got 0x00\n");
ok(!buffer[length-1], "Expected 0x00, got %02X\n", buffer[length-1]);
@@ -985,7 +989,10 @@ static void InternetReadFile_chunked_test(void)
{
char *buffer = HeapAlloc(GetProcessHeap(),0,length+1);
+ SetLastError(0xdeadbeef);
res = InternetReadFile(hor,buffer,length,&got);
+ ok(GetLastError() == 0 ||
+ broken(GetLastError() == 0xdeadbeef /* XP/W2K3 */), "Last Error not
reset %u\n", GetLastError());
buffer[got]=0;
trace("ReadFile -> %i %i\n",res,got);
@@ -998,8 +1005,11 @@ static void InternetReadFile_chunked_test(void)
if (length == 0)
{
got = 0xdeadbeef;
+ SetLastError(0xdeadbeef);
res = InternetReadFile( hor, buffer, 1, &got );
ok( res, "InternetReadFile failed: %u\n", GetLastError() );
+ ok(GetLastError() == 0 ||
+ broken(GetLastError() == 0xdeadbeef /* XP/W2K3 */), "Last Error not
reset %u\n", GetLastError());
ok( !got, "got %u\n", got );
break;
}
@@ -2044,6 +2054,11 @@ static const char okmsg[] =
"Server: winetest\r\n"
"\r\n";
+static const char okmsg201[] =
+"HTTP/1.1 201 OK\r\n"
+"Server: winetest\r\n"
+"\r\n";
+
static const char okmsg2[] =
"HTTP/1.1 200 OK\r\n"
"Date: Mon, 01 Dec 2008 13:44:34 GMT\r\n"
@@ -2053,6 +2068,12 @@ static const char okmsg2[] =
"Set-Cookie: two\r\n"
"\r\n";
+static DWORD64 content_length;
+static const char largemsg[] =
+"HTTP/1.1 200 OK\r\n"
+"Content-Length: %I64u\r\n"
+"\r\n";
+
static const char okmsg_cookie_path[] =
"HTTP/1.1 200 OK\r\n"
"Date: Mon, 01 Dec 2008 13:44:34 GMT\r\n"
@@ -2432,6 +2453,22 @@ static DWORD CALLBACK server_thread(LPVOID param)
else
send(c, notokmsg, sizeof notokmsg-1, 0);
}
+ if (strstr(buffer, "HEAD /upload3.txt"))
+ {
+ if (strstr(buffer, "Authorization: Basic dXNlcjE6cHdkMQ=="))
+ send(c, okmsg, sizeof okmsg-1, 0);
+ else
+ send(c, noauthmsg, sizeof noauthmsg-1, 0);
+ }
+ if (strstr(buffer, "HEAD /upload4.txt"))
+ {
+ if (strstr(buffer, "Authorization: Bearer dXNlcjE6cHdkMQ=="))
+ send(c, okmsg, sizeof okmsg-1, 0);
+ else if (strstr(buffer, "Authorization: Basic dXNlcjpwd2Q="))
+ send(c, okmsg201, sizeof okmsg-1, 0);
+ else
+ send(c, noauthmsg, sizeof noauthmsg-1, 0);
+ }
if (strstr(buffer, "/test_cookie_path1"))
{
if (strstr(buffer, "subcookie=data"))
@@ -2508,6 +2545,13 @@ static DWORD CALLBACK server_thread(LPVOID param)
{
send(c, okmsg, sizeof(okmsg)-1, 0);
}
+
+ if (strstr(buffer, "HEAD /test_large_content"))
+ {
+ char msg[sizeof(largemsg) + 16];
+ sprintf(msg, largemsg, content_length);
+ send(c, msg, strlen(msg), 0);
+ }
if (strstr(buffer, "HEAD /test_auth_host1"))
{
if (strstr(buffer, "Authorization: Basic dGVzdDE6cGFzcw=="))
@@ -4245,7 +4289,7 @@ static void test_head_request(int port)
len = sizeof(content_length);
content_length = -1;
ret = HttpQueryInfoA(req.request, HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_CONTENT_LENGTH,
&content_length, &len, 0);
- ok(ret, "HttpQueryInfo dailed: %u\n", GetLastError());
+ ok(ret, "HttpQueryInfo failed: %u\n", GetLastError());
ok(len == sizeof(DWORD), "len = %u\n", len);
ok(content_length == 100, "content_length = %u\n", content_length);
@@ -4544,7 +4588,7 @@ static void test_http_status(int port)
DWORD i, size;
BOOL res;
- for(i=0; i < sizeof(http_status_tests)/sizeof(*http_status_tests); i++) {
+ for(i = 0; i < ARRAY_SIZE(http_status_tests); i++) {
send_buffer = http_status_tests[i].response_text;
open_simple_request(&req, "localhost", port, NULL,
"/send_from_buffer");
@@ -4681,6 +4725,7 @@ static void test_basic_auth_credentials_reuse(int port)
HINTERNET ses, con, req;
DWORD status, size;
BOOL ret;
+ char buffer[0x40];
ses = InternetOpenA( "winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0
);
ok( ses != NULL, "InternetOpenA failed\n" );
@@ -4695,6 +4740,20 @@ static void test_basic_auth_credentials_reuse(int port)
ret = HttpSendRequestA( req, NULL, 0, NULL, 0 );
ok( ret, "HttpSendRequestA failed %u\n", GetLastError() );
+ size = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ ret = InternetQueryOptionA(req, INTERNET_OPTION_USERNAME, buffer, &size);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+ ok(!strcmp(buffer, "user"), "got %s\n", buffer);
+ ok(size == 4, "got %u\n", size);
+
+ size = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ ret = InternetQueryOptionA(req, INTERNET_OPTION_PASSWORD, buffer, &size);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+ ok(!strcmp(buffer, "pwd"), "got %s\n", buffer);
+ ok(size == 3, "got %u\n", size);
+
status = 0xdeadbeef;
size = sizeof(status);
ret = HttpQueryInfoA( req, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
&status, &size, NULL );
@@ -4718,6 +4777,316 @@ static void test_basic_auth_credentials_reuse(int port)
ret = HttpSendRequestA( req, NULL, 0, NULL, 0 );
ok( ret, "HttpSendRequestA failed %u\n", GetLastError() );
+ size = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ ret = InternetQueryOptionA(req, INTERNET_OPTION_USERNAME, buffer, &size);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+ ok(!strcmp(buffer, "user"), "got %s\n", buffer);
+ ok(size == 4, "got %u\n", size);
+
+ size = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ ret = InternetQueryOptionA(req, INTERNET_OPTION_PASSWORD, buffer, &size);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+ ok(!strcmp(buffer, "pwd"), "got %s\n", buffer);
+ ok(size == 3, "got %u\n", size);
+
+ status = 0xdeadbeef;
+ size = sizeof(status);
+ ret = HttpQueryInfoA( req, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
&status, &size, NULL );
+ ok( ret, "HttpQueryInfoA failed %u\n", GetLastError() );
+ ok( status == 200, "got %u\n", status );
+
+ InternetCloseHandle( req );
+ InternetCloseHandle( con );
+ InternetCloseHandle( ses );
+}
+
+static void test_basic_auth_credentials_end_session(int port)
+{
+ HINTERNET ses, con, req;
+ DWORD status, size;
+ BOOL ret;
+ char buffer[0x40];
+
+ ses = InternetOpenA( "winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0
);
+ ok( ses != NULL, "InternetOpenA failed\n" );
+
+ con = InternetConnectA( ses, "localhost", port, "user",
"pwd",
+ INTERNET_SERVICE_HTTP, 0, 0 );
+ ok( con != NULL, "InternetConnectA failed %u\n", GetLastError() );
+
+ req = HttpOpenRequestA( con, "HEAD", "/upload.txt", NULL, NULL,
NULL, 0, 0 );
+ ok( req != NULL, "HttpOpenRequestA failed %u\n", GetLastError() );
+
+ ret = HttpSendRequestA( req, NULL, 0, NULL, 0 );
+ ok( ret, "HttpSendRequestA failed %u\n", GetLastError() );
+
+ size = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ ret = InternetQueryOptionA(req, INTERNET_OPTION_USERNAME, buffer, &size);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+ ok(!strcmp(buffer, "user"), "got %s\n", buffer);
+ ok(size == 4, "got %u\n", size);
+
+ size = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ ret = InternetQueryOptionA(req, INTERNET_OPTION_PASSWORD, buffer, &size);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+ ok(!strcmp(buffer, "pwd"), "got %s\n", buffer);
+ ok(size == 3, "got %u\n", size);
+
+ status = 0xdeadbeef;
+ size = sizeof(status);
+ ret = HttpQueryInfoA( req, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
&status, &size, NULL );
+ ok( ret, "HttpQueryInfoA failed %u\n", GetLastError() );
+ ok( status == HTTP_STATUS_OK, "got %u\n", status );
+
+ InternetCloseHandle( req );
+ InternetCloseHandle( con );
+ InternetCloseHandle( ses );
+
+ ses = InternetOpenA( "winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0
);
+ ok( ses != NULL, "InternetOpenA failed\n" );
+
+ /* Clear the cached credentials */
+ ret = InternetSetOptionA(ses, INTERNET_OPTION_END_BROWSER_SESSION, NULL, 0);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+
+ con = InternetConnectA( ses, "localhost", port, NULL, NULL,
+ INTERNET_SERVICE_HTTP, 0, 0 );
+ ok( con != NULL, "InternetConnectA failed %u\n", GetLastError() );
+
+ req = HttpOpenRequestA( con, "PUT", "/upload2.txt", NULL, NULL,
NULL, 0, 0 );
+ ok( req != NULL, "HttpOpenRequestA failed %u\n", GetLastError() );
+
+ ret = HttpSendRequestA( req, NULL, 0, NULL, 0 );
+ ok( ret, "HttpSendRequestA failed %u\n", GetLastError() );
+
+ size = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ ret = InternetQueryOptionA(req, INTERNET_OPTION_USERNAME, buffer, &size);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+ ok(!strcmp(buffer, ""), "got %s\n", buffer);
+ ok(size == 0, "got %u\n", size);
+
+ size = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ ret = InternetQueryOptionA(req, INTERNET_OPTION_PASSWORD, buffer, &size);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+ ok(!strcmp(buffer, ""), "got %s\n", buffer);
+ ok(size == 0, "got %u\n", size);
+
+ status = 0xdeadbeef;
+ size = sizeof(status);
+ ret = HttpQueryInfoA( req, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
&status, &size, NULL );
+ ok( ret, "HttpQueryInfoA failed %u\n", GetLastError() );
+ ok( status == HTTP_STATUS_BAD_REQUEST, "got %u\n", status );
+
+ InternetCloseHandle( req );
+ InternetCloseHandle( con );
+ InternetCloseHandle( ses );
+}
+
+static void test_basic_auth_credentials_different(int port)
+{
+ HINTERNET ses, con, req;
+ DWORD status, size;
+ BOOL ret;
+ char buffer[0x40];
+
+ ses = InternetOpenA( "winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0
);
+ ok( ses != NULL, "InternetOpenA failed\n" );
+
+ con = InternetConnectA( ses, "localhost", port, "user",
"pwd",
+ INTERNET_SERVICE_HTTP, 0, 0 );
+ ok( con != NULL, "InternetConnectA failed %u\n", GetLastError() );
+
+ req = HttpOpenRequestA( con, "HEAD", "/upload.txt", NULL, NULL,
NULL, 0, 0 );
+ ok( req != NULL, "HttpOpenRequestA failed %u\n", GetLastError() );
+
+ ret = HttpSendRequestA( req, NULL, 0, NULL, 0 );
+ ok( ret, "HttpSendRequestA failed %u\n", GetLastError() );
+
+ size = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ ret = InternetQueryOptionA(req, INTERNET_OPTION_USERNAME, buffer, &size);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+ ok(!strcmp(buffer, "user"), "got %s\n", buffer);
+ ok(size == 4, "got %u\n", size);
+
+ size = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ ret = InternetQueryOptionA(req, INTERNET_OPTION_PASSWORD, buffer, &size);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+ ok(!strcmp(buffer, "pwd"), "got %s\n", buffer);
+ ok(size == 3, "got %u\n", size);
+
+ status = 0xdeadbeef;
+ size = sizeof(status);
+ ret = HttpQueryInfoA( req, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
&status, &size, NULL );
+ ok( ret, "HttpQueryInfoA failed %u\n", GetLastError() );
+ ok( status == 200, "got %u\n", status );
+
+ InternetCloseHandle( req );
+ InternetCloseHandle( con );
+ InternetCloseHandle( ses );
+
+ ses = InternetOpenA( "winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0
);
+ ok( ses != NULL, "InternetOpenA failed\n" );
+
+ con = InternetConnectA( ses, "localhost", port, "user1",
"pwd1",
+ INTERNET_SERVICE_HTTP, 0, 0 );
+ ok( con != NULL, "InternetConnectA failed %u\n", GetLastError() );
+
+ req = HttpOpenRequestA( con, "HEAD", "/upload3.txt", NULL, NULL,
NULL, 0, 0 );
+ ok( req != NULL, "HttpOpenRequestA failed %u\n", GetLastError() );
+
+ ret = HttpSendRequestA( req, NULL, 0, NULL, 0 );
+ ok( ret, "HttpSendRequestA failed %u\n", GetLastError() );
+
+ size = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ ret = InternetQueryOptionA(req, INTERNET_OPTION_USERNAME, buffer, &size);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+ ok(!strcmp(buffer, "user1"), "got %s\n", buffer);
+ ok(size == 5, "got %u\n", size);
+
+ size = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ ret = InternetQueryOptionA(req, INTERNET_OPTION_PASSWORD, buffer, &size);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+ ok(!strcmp(buffer, "pwd1"), "got %s\n", buffer);
+ ok(size == 4, "got %u\n", size);
+
+ status = 0xdeadbeef;
+ size = sizeof(status);
+ ret = HttpQueryInfoA( req, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
&status, &size, NULL );
+ ok( ret, "HttpQueryInfoA failed %u\n", GetLastError() );
+ ok( status == 200, "got %u\n", status );
+
+ InternetCloseHandle( req );
+ InternetCloseHandle( con );
+ InternetCloseHandle( ses );
+}
+
+/*
+ * Manually set the Authorization for both calls.
+ */
+static void test_basic_auth_credentials_manual(int port)
+{
+ HINTERNET ses, con, req;
+ DWORD status, size;
+ BOOL ret;
+
+ ses = InternetOpenA( "winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0
);
+ ok( ses != NULL, "InternetOpenA failed\n" );
+
+ /* Clear the cached credentials */
+ ret = InternetSetOptionA(ses, INTERNET_OPTION_END_BROWSER_SESSION, NULL, 0);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+
+ con = InternetConnectA( ses, "localhost", port, NULL, NULL,
INTERNET_SERVICE_HTTP, 0, 0 );
+ ok( con != NULL, "InternetConnectA failed %u\n", GetLastError() );
+
+ req = HttpOpenRequestA( con, "HEAD", "/upload.txt", NULL, NULL,
NULL, 0, 0 );
+ ok( req != NULL, "HttpOpenRequestA failed %u\n", GetLastError() );
+
+ /* Set Authorization Header */
+ ret = HttpAddRequestHeadersA(req, "Authorization: Basic dXNlcjpwd2Q=\r\n",
~0u,
+ HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD);
+ ok(ret, "HttpAddRequestHeaders Failed\n");
+
+ ret = HttpSendRequestA( req, NULL, 0, NULL, 0 );
+ ok( ret, "HttpSendRequestA failed %u\n", GetLastError() );
+
+ status = 0xdeadbeef;
+ size = sizeof(status);
+ ret = HttpQueryInfoA( req, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
&status, &size, NULL );
+ ok( ret, "HttpQueryInfoA failed %u\n", GetLastError() );
+ ok( status == 200, "got %u\n", status );
+
+ InternetCloseHandle( req );
+ InternetCloseHandle( con );
+ InternetCloseHandle( ses );
+
+ /* Show manual headers are cached. */
+ ses = InternetOpenA( "winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0
);
+ ok( ses != NULL, "InternetOpenA failed\n" );
+
+ con = InternetConnectA( ses, "localhost", port, NULL, NULL,
INTERNET_SERVICE_HTTP, 0, 0 );
+ ok( con != NULL, "InternetConnectA failed %u\n", GetLastError() );
+
+ req = HttpOpenRequestA( con, "HEAD", "/upload.txt", NULL, NULL,
NULL, 0, 0 );
+ ok( req != NULL, "HttpOpenRequestA failed %u\n", GetLastError() );
+
+ ret = HttpSendRequestA( req, NULL, 0, NULL, 0 );
+ ok( ret, "HttpSendRequestA failed %u\n", GetLastError() );
+
+ status = 0xdeadbeef;
+ size = sizeof(status);
+ ret = HttpQueryInfoA( req, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
&status, &size, NULL );
+ ok( ret, "HttpQueryInfoA failed %u\n", GetLastError() );
+ ok( status == 401, "got %u\n", status );
+
+ InternetCloseHandle( req );
+ InternetCloseHandle( con );
+ InternetCloseHandle( ses );
+
+ ses = InternetOpenA( "winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0
);
+ ok( ses != NULL, "InternetOpenA failed\n" );
+
+ con = InternetConnectA( ses, "localhost", port, NULL, NULL,
INTERNET_SERVICE_HTTP, 0, 0 );
+ ok( con != NULL, "InternetConnectA failed %u\n", GetLastError() );
+
+ req = HttpOpenRequestA( con, "HEAD", "/upload4.txt", NULL, NULL,
NULL, 0, 0 );
+ ok( req != NULL, "HttpOpenRequestA failed %u\n", GetLastError() );
+
+ /* Set Authorization Header */
+ ret = HttpAddRequestHeadersA(req, "Authorization: Bearer
dXNlcjE6cHdkMQ==\r\n", ~0u,
+ HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD);
+ ok(ret, "HttpAddRequestHeaders Failed\n");
+
+ ret = HttpSendRequestA( req, NULL, 0, NULL, 0 );
+ ok( ret, "HttpSendRequestA failed %u\n", GetLastError() );
+
+ status = 0xdeadbeef;
+ size = sizeof(status);
+ ret = HttpQueryInfoA( req, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
&status, &size, NULL );
+ ok( ret, "HttpQueryInfoA failed %u\n", GetLastError() );
+ ok( status == 200, "got %u\n", status );
+
+ InternetCloseHandle( req );
+ InternetCloseHandle( con );
+ InternetCloseHandle( ses );
+}
+
+/*
+ * Manually set the Authorization for the bearer call, which shows the cached is used.
+ */
+static void test_basic_auth_credentials_cached_manual(int port)
+{
+ HINTERNET ses, con, req;
+ DWORD status, size;
+ BOOL ret;
+
+ ses = InternetOpenA( "winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0
);
+ ok( ses != NULL, "InternetOpenA failed\n" );
+
+ /* Clear the cached credentials */
+ ret = InternetSetOptionA(ses, INTERNET_OPTION_END_BROWSER_SESSION, NULL, 0);
+ ok(ret, "unexpected failure %u\n", GetLastError());
+
+ con = InternetConnectA( ses, "localhost", port, "user",
"pwd",
+ INTERNET_SERVICE_HTTP, 0, 0 );
+ ok( con != NULL, "InternetConnectA failed %u\n", GetLastError() );
+
+ req = HttpOpenRequestA( con, "HEAD", "/upload.txt", NULL, NULL,
NULL, 0, 0 );
+ ok( req != NULL, "HttpOpenRequestA failed %u\n", GetLastError() );
+
+ ret = HttpSendRequestA( req, NULL, 0, NULL, 0 );
+ ok( ret, "HttpSendRequestA failed %u\n", GetLastError() );
+
status = 0xdeadbeef;
size = sizeof(status);
ret = HttpQueryInfoA( req, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
&status, &size, NULL );
@@ -4727,6 +5096,33 @@ static void test_basic_auth_credentials_reuse(int port)
InternetCloseHandle( req );
InternetCloseHandle( con );
InternetCloseHandle( ses );
+
+ ses = InternetOpenA( "winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0
);
+ ok( ses != NULL, "InternetOpenA failed\n" );
+
+ con = InternetConnectA( ses, "localhost", port, NULL, NULL,
INTERNET_SERVICE_HTTP, 0, 0 );
+ ok( con != NULL, "InternetConnectA failed %u\n", GetLastError() );
+
+ req = HttpOpenRequestA( con, "HEAD", "/upload4.txt", NULL, NULL,
NULL, 0, 0 );
+ ok( req != NULL, "HttpOpenRequestA failed %u\n", GetLastError() );
+
+ /* Setting an Authorization Header doesn't override the cached one. */
+ ret = HttpAddRequestHeadersA(req, "Authorization: Bearer
dXNlcjE6cHdkMQ==\r\n", ~0u,
+ HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD);
+ ok(ret, "HttpAddRequestHeaders Failed\n");
+
+ ret = HttpSendRequestA( req, NULL, 0, NULL, 0 );
+ ok( ret, "HttpSendRequestA failed %u\n", GetLastError() );
+
+ status = 0xdeadbeef;
+ size = sizeof(status);
+ ret = HttpQueryInfoA( req, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
&status, &size, NULL );
+ ok( ret, "HttpQueryInfoA failed %u\n", GetLastError() );
+ ok( status == 201, "got %u\n", status );
+
+ InternetCloseHandle( req );
+ InternetCloseHandle( con );
+ InternetCloseHandle( ses );
}
static void test_async_read(int port)
@@ -5792,6 +6188,94 @@ static void test_remove_dot_segments(int port)
close_request(&req);
}
+struct large_test
+{
+ DWORD64 content_length;
+ BOOL ret;
+};
+
+static void test_large_content(int port)
+{
+ struct large_test tests[] = {
+ { 0, TRUE },
+ { UINT_MAX-1, TRUE },
+ { UINT_MAX, TRUE },
+ { (DWORD64)UINT_MAX+1, FALSE },
+ { ~0, FALSE },
+ };
+ test_request_t req;
+ DWORD sizelen, len;
+ DWORD read_size;
+ DWORD64 len64;
+ char buf[16];
+ BOOL ret;
+ size_t i;
+
+ open_simple_request(&req, "localhost", port, "HEAD",
"/test_large_content");
+
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
+ {
+ content_length = tests[i].content_length;
+ ret = HttpSendRequestA(req.request, NULL, 0, NULL, 0);
+ ok(ret, "HttpSendRequest failed: %u\n", GetLastError());
+
+ len = ~0;
+ sizelen = sizeof(len);
+ SetLastError(0xdeadbeef);
+ ret = HttpQueryInfoA(req.request,
HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_CONTENT_LENGTH,
+ &len, &sizelen, 0);
+ if (tests[i].ret)
+ {
+ ok(ret, "HttpQueryInfo should have succeeded\n");
+ ok(GetLastError() == ERROR_SUCCESS ||
+ broken(GetLastError() == 0xdeadbeef), /* xp, 2k8, vista */
+ "expected ERROR_SUCCESS, got %x\n", GetLastError());
+ ok(len == (DWORD)tests[i].content_length, "expected %u, got %u\n",
+ (DWORD)tests[i].content_length, len);
+ }
+ else
+ {
+ ok(!ret, "HttpQueryInfo should have failed\n");
+ ok(GetLastError() == ERROR_HTTP_INVALID_HEADER,
+ "expected ERROR_HTTP_INVALID_HEADER, got %x\n",
GetLastError());
+ ok(len == ~0, "expected ~0, got %u\n", len);
+ }
+ ok(sizelen == sizeof(DWORD), "sizelen %u\n", sizelen);
+ }
+
+ /* test argument size */
+ len64 = ~0;
+ sizelen = sizeof(len64);
+ SetLastError(0xdeadbeef);
+ ret = HttpQueryInfoA(req.request, HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_CONTENT_LENGTH,
+ &len64, &len, 0);
+ ok(!ret, "HttpQueryInfo should have failed\n");
+ ok(GetLastError() == ERROR_HTTP_INVALID_HEADER,
+ "expected ERROR_HTTP_INVALID_HEADER, got %x\n", GetLastError());
+ ok(sizelen == sizeof(DWORD64), "sizelen %u\n", sizelen);
+ ok(len64 == ~0, "len64 %x%08x\n", (DWORD)(len64 >> 32),
(DWORD)len64);
+
+ close_request(&req);
+
+ /* test internal use of HttpQueryInfo on large size */
+ open_read_test_request(port, &req,
+ "HTTP/1.1 200 OK\r\n"
+ "Server: winetest\r\n"
+ "Content-Length: 4294967296\r\n"
+ "\r\n"
+ "xx");
+ read_expect_async(req.request, buf, 4, &read_size, "xx");
+ send_response_and_wait("yy1234567890", FALSE, buf, &read_size,
"xxyy", 4, 0, 2);
+ read_expect_sync_data(req.request, buf, 10, "1234567890");
+
+ SET_EXPECT(INTERNET_STATUS_CLOSING_CONNECTION);
+ SET_EXPECT(INTERNET_STATUS_CONNECTION_CLOSED);
+ close_async_handle(req.session, 2);
+ CHECK_NOTIFIED(INTERNET_STATUS_CLOSING_CONNECTION);
+ CHECK_NOTIFIED(INTERNET_STATUS_CONNECTION_CLOSED);
+ close_connection();
+}
+
static void test_http_connection(void)
{
struct server_info si;
@@ -5801,7 +6285,7 @@ static void test_http_connection(void)
si.hEvent = CreateEventW(NULL, 0, 0, NULL);
si.port = 7531;
- hThread = CreateThread(NULL, 0, server_thread, (LPVOID) &si, 0, &id);
+ hThread = CreateThread(NULL, 0, server_thread, &si, 0, &id);
ok( hThread != NULL, "create thread failed\n");
r = WaitForSingleObject(si.hEvent, 10000);
@@ -5843,6 +6327,10 @@ static void test_http_connection(void)
test_request_content_length(si.port);
test_accept_encoding(si.port);
test_basic_auth_credentials_reuse(si.port);
+ test_basic_auth_credentials_end_session(si.port);
+ test_basic_auth_credentials_different(si.port);
+ test_basic_auth_credentials_manual(si.port);
+ test_basic_auth_credentials_cached_manual(si.port);
test_async_read(si.port);
test_http_read(si.port);
test_connection_break(si.port);
@@ -5861,6 +6349,7 @@ else
}
#endif
test_remove_dot_segments(si.port);
+ test_large_content(si.port);
/* send the basic request again to shutdown the server thread */
test_basic_request(si.port, "GET", "/quit");
@@ -5908,12 +6397,15 @@ static const cert_struct_test_t test_winehq_com_cert = {
"Minnesota\r\n"
"Saint Paul\r\n"
"WineHQ\r\n"
+ "IT\r\n"
"test.winehq.com\r\n"
"webmaster(a)winehq.org".org",
"US\r\n"
"Minnesota\r\n"
+ "Saint Paul\r\n"
"WineHQ\r\n"
+ "IT\r\n"
"test.winehq.com\r\n"
"webmaster(a)winehq.org"
};
@@ -5928,6 +6420,12 @@ static void test_cert_struct(HINTERNET req, const
cert_struct_test_t *test)
size = sizeof(info);
res = InternetQueryOptionA(req, INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT,
&info, &size);
+ if (!res)
+ {
+ win_skip("Querying INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT failed,
skipping tests\n");
+ return;
+ }
+
ok(res, "InternetQueryOption failed: %u\n", GetLastError());
ok(size == sizeof(info), "size = %u\n", size);
@@ -6142,7 +6640,7 @@ static void test_security_flags(void)
ok(!res && GetLastError() == ERROR_IO_PENDING, "HttpSendRequest failed:
%u\n", GetLastError());
WaitForSingleObject(complete_event, INFINITE);
- ok(req_error == ERROR_INTERNET_SEC_CERT_REV_FAILED || broken(req_error ==
ERROR_INTERNET_SEC_CERT_ERRORS),
+ ok(req_error == ERROR_INTERNET_SEC_CERT_ERRORS,
"req_error = %d\n", req_error);
size = 0;
@@ -6166,6 +6664,9 @@ static void test_security_flags(void)
ok(!cert->lpszEncryptionAlgName, "unexpected encryption algorithm
name\n");
ok(!cert->lpszProtocolName, "unexpected protocol name\n");
ok(cert->dwKeySize != 0xdeadbeef, "unexpected key size\n");
+
+ LocalFree(cert->lpszSubjectInfo);
+ LocalFree(cert->lpszIssuerInfo);
}
HeapFree(GetProcessHeap(), 0, cert);
@@ -6178,7 +6679,7 @@ static void test_security_flags(void)
CLEAR_NOTIFIED(INTERNET_STATUS_COOKIE_SENT);
CLEAR_NOTIFIED(INTERNET_STATUS_DETECTING_PROXY);
- if(req_error != ERROR_INTERNET_SEC_CERT_REV_FAILED) {
+ if(req_error != ERROR_INTERNET_SEC_CERT_ERRORS) {
win_skip("Unexpected cert errors %u, skipping security flags tests\n",
req_error);
close_async_handle(ses, 3);
@@ -6192,10 +6693,10 @@ static void test_security_flags(void)
test_request_flags(req, 8);
/* IE11 finds both rev failure and invalid CA. Previous versions required rev
failure
to be ignored before invalid CA was reported. */
- test_secflags_option(req, _SECURITY_FLAG_CERT_REV_FAILED,
_SECURITY_FLAG_CERT_INVALID_CA);
+ test_secflags_option(req, _SECURITY_FLAG_CERT_INVALID_CA,
_SECURITY_FLAG_CERT_REV_FAILED);
set_secflags(req, FALSE, SECURITY_FLAG_IGNORE_REVOCATION);
- test_secflags_option(req,
_SECURITY_FLAG_CERT_REV_FAILED|SECURITY_FLAG_IGNORE_REVOCATION,
_SECURITY_FLAG_CERT_INVALID_CA);
+ test_secflags_option(req,
_SECURITY_FLAG_CERT_INVALID_CA|SECURITY_FLAG_IGNORE_REVOCATION,
_SECURITY_FLAG_CERT_REV_FAILED);
SET_EXPECT(INTERNET_STATUS_CONNECTING_TO_SERVER);
SET_EXPECT(INTERNET_STATUS_CONNECTED_TO_SERVER);
@@ -6209,7 +6710,7 @@ static void test_security_flags(void)
ok(!res && GetLastError() == ERROR_IO_PENDING, "HttpSendRequest failed:
%u\n", GetLastError());
WaitForSingleObject(complete_event, INFINITE);
- ok(req_error == ERROR_INTERNET_SEC_CERT_ERRORS, "req_error = %d\n",
req_error);
+ ok(req_error == ERROR_INTERNET_INVALID_CA || req_error ==
ERROR_INTERNET_SEC_CERT_ERRORS, "req_error = %d\n", req_error);
CHECK_NOTIFIED(INTERNET_STATUS_CONNECTING_TO_SERVER);
CHECK_NOTIFIED(INTERNET_STATUS_CONNECTED_TO_SERVER);
@@ -6220,11 +6721,11 @@ static void test_security_flags(void)
CLEAR_NOTIFIED(INTERNET_STATUS_DETECTING_PROXY);
test_request_flags(req, INTERNET_REQFLAG_NO_HEADERS);
- test_secflags_option(req,
SECURITY_FLAG_IGNORE_REVOCATION|_SECURITY_FLAG_CERT_REV_FAILED|_SECURITY_FLAG_CERT_INVALID_CA,
0);
+ test_secflags_option(req,
SECURITY_FLAG_IGNORE_REVOCATION|_SECURITY_FLAG_CERT_INVALID_CA, 0);
test_security_info("https://test.winehq.com/data/some_file.html?q"ml?q",
ERROR_INTERNET_ITEM_NOT_FOUND, 0);
set_secflags(req, FALSE, SECURITY_FLAG_IGNORE_UNKNOWN_CA);
- test_secflags_option(req,
_SECURITY_FLAG_CERT_INVALID_CA|_SECURITY_FLAG_CERT_REV_FAILED
+ test_secflags_option(req, _SECURITY_FLAG_CERT_INVALID_CA
|SECURITY_FLAG_IGNORE_REVOCATION|SECURITY_FLAG_IGNORE_UNKNOWN_CA, 0);
test_http_version(req);
@@ -6262,11 +6763,11 @@ static void test_security_flags(void)
test_request_flags(req, 0);
test_secflags_option(req,
SECURITY_FLAG_SECURE|SECURITY_FLAG_IGNORE_UNKNOWN_CA|SECURITY_FLAG_IGNORE_REVOCATION
-
|SECURITY_FLAG_STRENGTH_STRONG|_SECURITY_FLAG_CERT_REV_FAILED|_SECURITY_FLAG_CERT_INVALID_CA,
0);
+ |SECURITY_FLAG_STRENGTH_STRONG|_SECURITY_FLAG_CERT_INVALID_CA, 0);
test_cert_struct(req, &test_winehq_com_cert);
test_security_info("https://test.winehq.com/data/some_file.html?q"ml?q", 0,
- _SECURITY_FLAG_CERT_INVALID_CA|_SECURITY_FLAG_CERT_REV_FAILED);
+ _SECURITY_FLAG_CERT_INVALID_CA);
res = InternetReadFile(req, buf, sizeof(buf), &size);
ok(res, "InternetReadFile failed: %u\n", GetLastError());
@@ -6299,7 +6800,7 @@ static void test_security_flags(void)
CHECK_NOTIFIED(INTERNET_STATUS_HANDLE_CREATED);
test_secflags_option(req,
SECURITY_FLAG_SECURE|SECURITY_FLAG_IGNORE_UNKNOWN_CA|SECURITY_FLAG_STRENGTH_STRONG
-
|SECURITY_FLAG_IGNORE_REVOCATION|_SECURITY_FLAG_CERT_REV_FAILED|_SECURITY_FLAG_CERT_INVALID_CA,
0);
+ |SECURITY_FLAG_IGNORE_REVOCATION|_SECURITY_FLAG_CERT_INVALID_CA, 0);
test_http_version(req);
SET_EXPECT(INTERNET_STATUS_CONNECTING_TO_SERVER);
@@ -6334,7 +6835,7 @@ static void test_security_flags(void)
test_request_flags(req, 0);
test_secflags_option(req,
SECURITY_FLAG_SECURE|SECURITY_FLAG_IGNORE_UNKNOWN_CA|SECURITY_FLAG_STRENGTH_STRONG
-
|SECURITY_FLAG_IGNORE_REVOCATION|_SECURITY_FLAG_CERT_REV_FAILED|_SECURITY_FLAG_CERT_INVALID_CA,
0);
+ |SECURITY_FLAG_IGNORE_REVOCATION|_SECURITY_FLAG_CERT_INVALID_CA, 0);
res = InternetReadFile(req, buf, sizeof(buf), &size);
ok(res, "InternetReadFile failed: %u\n", GetLastError());
@@ -6903,14 +7404,14 @@ static const struct notification
async_send_request_ex_chunked_test[] =
static const struct notification_data notification_data[] = {
{
async_send_request_ex_chunked_test,
-
sizeof(async_send_request_ex_chunked_test)/sizeof(async_send_request_ex_chunked_test[0]),
+ ARRAY_SIZE(async_send_request_ex_chunked_test),
"GET",
"test.winehq.org",
"tests/data.php"
},
{
async_send_request_ex_test,
- sizeof(async_send_request_ex_test)/sizeof(async_send_request_ex_test[0]),
+ ARRAY_SIZE(async_send_request_ex_test),
"POST",
"test.winehq.org",
"tests/post.php",
@@ -6918,14 +7419,14 @@ static const struct notification_data notification_data[] = {
},
{
async_send_request_ex_test2,
- sizeof(async_send_request_ex_test)/sizeof(async_send_request_ex_test[0]),
+ ARRAY_SIZE(async_send_request_ex_test2),
"POST",
"test.winehq.org",
"tests/post.php"
},
{
async_send_request_ex_resolve_failure_test,
-
sizeof(async_send_request_ex_resolve_failure_test)/sizeof(async_send_request_ex_resolve_failure_test[0]),
+ ARRAY_SIZE(async_send_request_ex_resolve_failure_test),
"GET",
"brokenhost",
"index.html",
diff --git a/modules/rostests/winetests/wininet/internet.c
b/modules/rostests/winetests/wininet/internet.c
index 39c698f5dbf..13b29309888 100644
--- a/modules/rostests/winetests/wininet/internet.c
+++ b/modules/rostests/winetests/wininet/internet.c
@@ -629,7 +629,7 @@ static void test_cookie_url(void)
ok(!res && GetLastError() == ERROR_INVALID_PARAMETER,
"InternetGetCookeA failed: %u, expected ERROR_INVALID_PARAMETER\n",
GetLastError());
- len = sizeof(bufw)/sizeof(*bufw);
+ len = ARRAY_SIZE(bufw);
res = InternetGetCookieW(about_blankW, NULL, bufw, &len);
ok(!res && GetLastError() == ERROR_INVALID_PARAMETER,
"InternetGetCookeW failed: %u, expected ERROR_INVALID_PARAMETER\n",
GetLastError());
@@ -639,7 +639,7 @@ static void test_cookie_url(void)
ok(!res && GetLastError() == ERROR_INVALID_PARAMETER,
"InternetGetCookeExA failed: %u, expected ERROR_INVALID_PARAMETER\n",
GetLastError());
- len = sizeof(bufw)/sizeof(*bufw);
+ len = ARRAY_SIZE(bufw);
res = pInternetGetCookieExW(about_blankW, NULL, bufw, &len, 0, NULL);
ok(!res && GetLastError() == ERROR_INVALID_PARAMETER,
"InternetGetCookeExW failed: %u, expected ERROR_INVALID_PARAMETER\n",
GetLastError());
@@ -887,7 +887,7 @@ static void InternetTimeFromSystemTimeW_test(void)
/* test too small buffer size */
SetLastError(0xdeadbeef);
- ret = pInternetTimeFromSystemTimeW( &time, INTERNET_RFC1123_FORMAT, string,
sizeof(string)/sizeof(string[0]) );
+ ret = pInternetTimeFromSystemTimeW( &time, INTERNET_RFC1123_FORMAT, string,
ARRAY_SIZE(string));
error = GetLastError();
ok( !ret, "InternetTimeFromSystemTimeW should have returned FALSE\n" );
ok( error == ERROR_INSUFFICIENT_BUFFER,
@@ -1084,7 +1084,7 @@ static void test_PrivacyGetSetZonePreferenceW(void)
trace("template %u\n", old_template);
if(old_template == PRIVACY_TEMPLATE_ADVANCED) {
- pref_size = sizeof(pref)/sizeof(WCHAR);
+ pref_size = ARRAY_SIZE(pref);
ret = pPrivacyGetZonePreferenceW(zone, type, &old_template, pref,
&pref_size);
ok(ret == 0, "expected ret == 0, got %u\n", ret);
}
@@ -1555,14 +1555,11 @@ static void test_InternetErrorDlg(void)
/* Handle some special cases */
switch(i)
{
- case ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR:
- case ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR:
+ case ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR: /* later 9.x versions */
+ case ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR: /* later 9.x versions */
+ case ERROR_INTERNET_SEC_CERT_WEAK_SIGNATURE: /* later 11.x versions */
if(res == ERROR_CANCELLED)
- {
- /* Some windows XP, w2k3 x64, W2K8 */
- win_skip("Skipping some tests for %d\n", i);
- continue;
- }
+ expected = ERROR_CANCELLED;
break;
case ERROR_INTERNET_FORTEZZA_LOGIN_NEEDED:
if(res != expected)
@@ -1721,7 +1718,7 @@ static void test_InternetGetConnectedStateExW(void)
flags = 0;
buffer[0] = 0;
- res = pInternetGetConnectedStateExW(&flags, buffer, sizeof(buffer) /
sizeof(buffer[0]), 0);
+ res = pInternetGetConnectedStateExW(&flags, buffer, ARRAY_SIZE(buffer), 0);
trace("Internet Connection: Flags 0x%02x - Name '%s'\n", flags,
wine_dbgstr_w(buffer));
todo_wine
ok (flags & INTERNET_RAS_INSTALLED, "Missing RAS flag\n");
@@ -1755,21 +1752,21 @@ todo_wine
ok(!buffer[0], "Buffer must not change, got %02X\n", buffer[0]);
buffer[0] = 0;
- res = pInternetGetConnectedStateExW(NULL, buffer, sizeof(buffer) / sizeof(buffer[0]),
0);
+ res = pInternetGetConnectedStateExW(NULL, buffer, ARRAY_SIZE(buffer), 0);
ok(res == TRUE, "Expected TRUE, got %d\n", res);
sz = lstrlenW(buffer);
ok(sz > 0, "Expected a connection name\n");
buffer[0] = 0;
flags = 0;
- res = pInternetGetConnectedStateExW(&flags, buffer, sizeof(buffer) /
sizeof(buffer[0]), 0);
+ res = pInternetGetConnectedStateExW(&flags, buffer, ARRAY_SIZE(buffer), 0);
ok(res == TRUE, "Expected TRUE, got %d\n", res);
ok(flags, "Expected at least one flag set\n");
sz = lstrlenW(buffer);
ok(sz > 0, "Expected a connection name\n");
flags = 0;
- res = pInternetGetConnectedStateExW(&flags, NULL, sizeof(buffer) /
sizeof(buffer[0]), 0);
+ res = pInternetGetConnectedStateExW(&flags, NULL, ARRAY_SIZE(buffer), 0);
ok(res == TRUE, "Expected TRUE, got %d\n", res);
ok(flags, "Expected at least one flag set\n");
diff --git a/modules/rostests/winetests/wininet/url.c
b/modules/rostests/winetests/wininet/url.c
index 2024b158ff0..19ae7c3314e 100644
--- a/modules/rostests/winetests/wininet/url.c
+++ b/modules/rostests/winetests/wininet/url.c
@@ -672,17 +672,17 @@ static void InternetCrackUrlW_test(void)
memset(&comp, 0, sizeof comp);
comp.dwStructSize = sizeof(comp);
comp.lpszScheme = scheme;
- comp.dwSchemeLength = sizeof(scheme)/sizeof(scheme[0]);
+ comp.dwSchemeLength = ARRAY_SIZE(scheme);
comp.lpszHostName = host;
- comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
+ comp.dwHostNameLength = ARRAY_SIZE(host);
comp.lpszUserName = user;
- comp.dwUserNameLength = sizeof(user)/sizeof(user[0]);
+ comp.dwUserNameLength = ARRAY_SIZE(user);
comp.lpszPassword = pwd;
- comp.dwPasswordLength = sizeof(pwd)/sizeof(pwd[0]);
+ comp.dwPasswordLength = ARRAY_SIZE(pwd);
comp.lpszUrlPath = urlpart;
- comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
+ comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
comp.lpszExtraInfo = extra;
- comp.dwExtraInfoLength = sizeof(extra)/sizeof(extra[0]);
+ comp.dwExtraInfoLength = ARRAY_SIZE(extra);
SetLastError(0xdeadbeef);
r = InternetCrackUrlW(NULL, 0, 0, &comp );
@@ -721,9 +721,9 @@ static void InternetCrackUrlW_test(void)
memset(&comp, 0, sizeof comp);
comp.dwStructSize = sizeof comp;
comp.lpszHostName = host;
- comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
+ comp.dwHostNameLength = ARRAY_SIZE(host);
comp.lpszUrlPath = urlpart;
- comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
+ comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
r = InternetCrackUrlW(url, 0, 0, &comp );
ok( r, "failed to crack url\n");
@@ -739,11 +739,11 @@ static void InternetCrackUrlW_test(void)
memset(&comp, 0, sizeof comp);
comp.dwStructSize = sizeof comp;
comp.lpszHostName = host;
- comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
+ comp.dwHostNameLength = ARRAY_SIZE(host);
comp.lpszUrlPath = urlpart;
- comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
+ comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
comp.lpszExtraInfo = NULL;
- comp.dwExtraInfoLength = sizeof(extra)/sizeof(extra[0]);
+ comp.dwExtraInfoLength = ARRAY_SIZE(extra);
r = InternetCrackUrlW(url, 0, 0, &comp );
ok( r, "failed to crack url\n");
@@ -763,17 +763,17 @@ static void InternetCrackUrlW_test(void)
memset(&comp, 0, sizeof(comp));
comp.dwStructSize = sizeof(comp);
comp.lpszScheme = scheme;
- comp.dwSchemeLength = sizeof(scheme)/sizeof(scheme[0]);
+ comp.dwSchemeLength = ARRAY_SIZE(scheme);
comp.lpszHostName = host;
- comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
+ comp.dwHostNameLength = ARRAY_SIZE(host);
comp.lpszUserName = user;
- comp.dwUserNameLength = sizeof(user)/sizeof(user[0]);
+ comp.dwUserNameLength = ARRAY_SIZE(user);
comp.lpszPassword = pwd;
- comp.dwPasswordLength = sizeof(pwd)/sizeof(pwd[0]);
+ comp.dwPasswordLength = ARRAY_SIZE(pwd);
comp.lpszUrlPath = urlpart;
- comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
+ comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
comp.lpszExtraInfo = extra;
- comp.dwExtraInfoLength = sizeof(extra)/sizeof(extra[0]);
+ comp.dwExtraInfoLength = ARRAY_SIZE(extra);
r = InternetCrackUrlW(url2, 0, 0, &comp);
ok(!r, "InternetCrackUrl should have failed\n");
@@ -791,17 +791,17 @@ static void InternetCrackUrlW_test(void)
memset(&comp, 0, sizeof comp);
comp.dwStructSize = sizeof comp;
comp.lpszScheme = scheme;
- comp.dwSchemeLength = sizeof(scheme)/sizeof(scheme[0]);
+ comp.dwSchemeLength = ARRAY_SIZE(scheme);
comp.lpszHostName = host;
- comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
+ comp.dwHostNameLength = ARRAY_SIZE(host);
comp.lpszUserName = user;
- comp.dwUserNameLength = sizeof(user)/sizeof(user[0]);
+ comp.dwUserNameLength = ARRAY_SIZE(user);
comp.lpszPassword = pwd;
- comp.dwPasswordLength = sizeof(pwd)/sizeof(pwd[0]);
+ comp.dwPasswordLength = ARRAY_SIZE(pwd);
comp.lpszUrlPath = urlpart;
- comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
+ comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
comp.lpszExtraInfo = extra;
- comp.dwExtraInfoLength = sizeof(extra)/sizeof(extra[0]);
+ comp.dwExtraInfoLength = ARRAY_SIZE(extra);
r = InternetCrackUrlW(url3, 0, 0, &comp );
ok( r, "InternetCrackUrlW failed unexpectedly\n");
ok( host[0] == 'x', "host should be x.org\n");
@@ -812,9 +812,9 @@ static void InternetCrackUrlW_test(void)
memset(&comp, 0, sizeof(comp));
comp.dwStructSize = sizeof(comp);
comp.lpszHostName = host;
- comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
+ comp.dwHostNameLength = ARRAY_SIZE(host);
comp.lpszUrlPath = urlpart;
- comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
+ comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
r = InternetCrackUrlW(url3, 0, ICU_DECODE, &comp);
ok(r, "InternetCrackUrlW failed unexpectedly\n");
ok(!strcmp_wa(host, "x.org"), "host is %s, should be x.org\n",
wine_dbgstr_w(host));
@@ -1224,7 +1224,7 @@ START_TEST(url)
return;
}
- for(i=0; i < sizeof(crack_url_tests)/sizeof(*crack_url_tests); i++)
+ for(i = 0; i < ARRAY_SIZE(crack_url_tests); i++)
test_crack_url(crack_url_tests+i);
test_long_url();
diff --git a/modules/rostests/winetests/wininet/urlcache.c
b/modules/rostests/winetests/wininet/urlcache.c
index 310054b6a7e..f7a5cef0bb1 100644
--- a/modules/rostests/winetests/wininet/urlcache.c
+++ b/modules/rostests/winetests/wininet/urlcache.c
@@ -18,6 +18,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
@@ -27,6 +30,7 @@
#include "winnls.h"
#include "wininet.h"
#include "winineti.h"
+#include "shlobj.h"
#include "wine/test.h"
@@ -891,13 +895,13 @@ static void test_urlcacheW(void)
if(ie10_cache) {
if(!MultiByteToWideChar(CP_ACP, 0, urls[6].encoded_url, -1,
- urls[6].url, sizeof(urls[6].url)/sizeof(WCHAR)))
+ urls[6].url, ARRAY_SIZE(urls[6].url)))
urls[6].url[0] = 0;
trace("converted url in test 6: %s\n", wine_dbgstr_w(urls[6].url));
}
- for(i=0; i<sizeof(urls)/sizeof(*urls); i++) {
+ for(i=0; i<ARRAY_SIZE(urls); i++) {
INTERNET_CACHE_ENTRY_INFOA *entry_infoA;
INTERNET_CACHE_ENTRY_INFOW *entry_infoW;
DWORD size;
@@ -1100,6 +1104,102 @@ static void test_trailing_slash(void)
DeleteFileA(filename);
}
+static void get_cache_path(DWORD flags, char path[MAX_PATH], char path_win8[MAX_PATH])
+{
+ BOOL ret;
+ int folder = -1;
+ const char *suffix = "";
+ const char *suffix_win8 = "";
+
+ switch (flags)
+ {
+ case 0:
+ case CACHE_CONFIG_CONTENT_PATHS_FC:
+ folder = CSIDL_INTERNET_CACHE;
+ suffix = "\\Content.IE5\\";
+ suffix_win8 = "\\IE\\";
+ break;
+
+ case CACHE_CONFIG_COOKIES_PATHS_FC:
+ folder = CSIDL_COOKIES;
+ suffix = "\\";
+ suffix_win8 = "\\";
+ break;
+
+ case CACHE_CONFIG_HISTORY_PATHS_FC:
+ folder = CSIDL_HISTORY;
+ suffix = "\\History.IE5\\";
+ suffix_win8 = "\\History.IE5\\";
+ break;
+
+ default:
+ ok(0, "unexpected flags %#x\n", flags);
+ break;
+ }
+
+ ret = SHGetSpecialFolderPathA(0, path, folder, FALSE);
+ ok(ret, "SHGetSpecialFolderPath error %u\n", GetLastError());
+
+ strcpy(path_win8, path);
+ strcat(path_win8, suffix_win8);
+
+ strcat(path, suffix);
+}
+
+static void test_GetUrlCacheConfigInfo(void)
+{
+ INTERNET_CACHE_CONFIG_INFOA info;
+ struct
+ {
+ INTERNET_CACHE_CONFIG_INFOA *info;
+ DWORD dwStructSize;
+ DWORD flags;
+ BOOL ret;
+ DWORD error;
+ } td[] =
+ {
+#if 0 /* crashes under Vista */
+ { NULL, 0, 0, FALSE, ERROR_INVALID_PARAMETER },
+#endif
+ { &info, 0, 0, TRUE },
+ { &info, sizeof(info) - 1, 0, TRUE },
+ { &info, sizeof(info) + 1, 0, TRUE },
+ { &info, 0, CACHE_CONFIG_CONTENT_PATHS_FC, TRUE },
+ { &info, sizeof(info), CACHE_CONFIG_CONTENT_PATHS_FC, TRUE },
+ { &info, 0, CACHE_CONFIG_COOKIES_PATHS_FC, TRUE },
+ { &info, sizeof(info), CACHE_CONFIG_COOKIES_PATHS_FC, TRUE },
+ { &info, 0, CACHE_CONFIG_HISTORY_PATHS_FC, TRUE },
+ { &info, sizeof(info), CACHE_CONFIG_HISTORY_PATHS_FC, TRUE },
+ };
+ int i;
+ BOOL ret;
+
+ for (i = 0; i < ARRAY_SIZE(td); i++)
+ {
+ if (td[i].info)
+ {
+ memset(&info, 0, sizeof(*td[i].info));
+ info.dwStructSize = td[i].dwStructSize;
+ }
+
+ SetLastError(0xdeadbeef);
+ ret = GetUrlCacheConfigInfoA(td[i].info, NULL, td[i].flags);
+ ok(ret == td[i].ret, "%d: expected %d, got %d\n", i, td[i].ret, ret);
+ if (!ret)
+ ok(GetLastError() == td[i].error, "%d: expected %u, got %u\n", i,
td[i].error, GetLastError());
+ else
+ {
+ char path[MAX_PATH], path_win8[MAX_PATH];
+
+ get_cache_path(td[i].flags, path, path_win8);
+
+ ok(info.dwStructSize == td[i].dwStructSize, "got %u\n",
info.dwStructSize);
+ ok(!lstrcmpA(info.CachePath, path) || !lstrcmpA(info.CachePath, path_win8),
+ "%d: expected %s or %s, got %s\n", i, path, path_win8,
info.CachePath);
+ }
+ }
+}
+
START_TEST(urlcache)
{
HMODULE hdll;
@@ -1124,4 +1224,5 @@ START_TEST(urlcache)
test_FindCloseUrlCache();
test_GetDiskInfoA();
test_trailing_slash();
+ test_GetUrlCacheConfigInfo();
}