[PATCH 0/1] MR11689: winhttp: Support WINHTTP_QUERY_FLAG_NUMBER64 with WINHTTP_QUERY_CONTENT_LENGTH.
From: Paul Gofman <pgofman@codeweavers.com> --- dlls/winhttp/request.c | 20 +++++++++++++++++++- dlls/winhttp/tests/winhttp.c | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index 64452f99727..e63e15a9f5b 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -1043,7 +1043,8 @@ static WCHAR *build_request_string( struct request *request ) return ret; } -#define QUERY_MODIFIER_MASK (WINHTTP_QUERY_FLAG_REQUEST_HEADERS | WINHTTP_QUERY_FLAG_SYSTEMTIME | WINHTTP_QUERY_FLAG_NUMBER) +#define QUERY_MODIFIER_MASK (WINHTTP_QUERY_FLAG_REQUEST_HEADERS | WINHTTP_QUERY_FLAG_SYSTEMTIME | WINHTTP_QUERY_FLAG_NUMBER \ + | WINHTTP_QUERY_FLAG_NUMBER64) static DWORD query_headers( struct request *request, DWORD level, const WCHAR *name, void *buffer, DWORD *buflen, DWORD *index ) @@ -1199,6 +1200,23 @@ static DWORD query_headers( struct request *request, DWORD level, const WCHAR *n } *buflen = sizeof(DWORD); } + else if (level & WINHTTP_QUERY_FLAG_NUMBER64) + { + if (attr != WINHTTP_QUERY_CONTENT_LENGTH) + { + WARN( "WINHTTP_QUERY_FLAG_NUMBER64 with attr %lu.\n", attr ); + return ERROR_WINHTTP_INVALID_QUERY_REQUEST; + } + if (!buffer || sizeof(ULONG64) > *buflen) ret = ERROR_INSUFFICIENT_BUFFER; + else + { + ULONG64 *number = buffer; + *number = wcstoull( header->value, NULL, 10 ); + TRACE( "returning number: %I64u\n", *number ); + ret = ERROR_SUCCESS; + } + *buflen = sizeof(ULONG64); + } else if (level & WINHTTP_QUERY_FLAG_SYSTEMTIME) { SYSTEMTIME *st = buffer; diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index ea257d51772..5bbb55971ee 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -1342,6 +1342,7 @@ static void test_request_parameter_defaults(void) HINTERNET ses, con, req; DWORD size, status, error; WCHAR *version; + ULONG64 val64; BOOL ret; ses = WinHttpOpen(L"winetest", 0, NULL, NULL, 0); @@ -1371,6 +1372,15 @@ static void test_request_parameter_defaults(void) ok(ret, "failed unexpectedly %lu\n", GetLastError()); ok(status == HTTP_STATUS_OK, "request failed unexpectedly %lu\n", status); + val64 = 0xdeadbeeffeedcafe; + size = sizeof(val64) * 2; + ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER64, NULL, &val64, &size, NULL); + error = GetLastError(); + ok(!ret, "succeeded unexpectedly\n"); + ok(size == sizeof(val64) * 2, "got %#lx.\n", size); + ok(error == ERROR_WINHTTP_INVALID_QUERY_REQUEST, "expected ERROR_INSUFFICIENT_BUFFER, got %lu\n", error); + ok(val64 == 0xdeadbeeffeedcafe, "request failed unexpectedly %I64x\n", val64); + WinHttpCloseHandle(req); req = WinHttpOpenRequest(con, L"", L"", L"", NULL, NULL, 0); @@ -3516,6 +3526,7 @@ static void test_websocket(int port) WCHAR header[32]; char buf[128], *large_buf; USHORT close_status; + ULONG64 val64; BOOL ret; if (!pWinHttpWebSocketCompleteUpgrade) @@ -3633,6 +3644,13 @@ static void test_websocket(int port) ok(ret, "failure\n"); ok(len == 4, "got %lu\n", len); + val64 = 0xdeadbeeffeedcafe; + size = sizeof(val64) * 2; + ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER64, NULL, &val64, &size, NULL); + ok(ret, "failed unexpectedly %lu\n", GetLastError()); + ok(size == sizeof(val64), "got %lu.\n", size); + ok(val64 == 4, "request failed unexpectedly %lu\n", status); + index = 0; size = sizeof(buf); ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM, L"Sec-WebSocket-Accept", buf, &size, &index); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11689
Hans Leidekker (@hans) commented about dlls/winhttp/tests/winhttp.c:
ok(ret, "failed unexpectedly %lu\n", GetLastError()); ok(status == HTTP_STATUS_OK, "request failed unexpectedly %lu\n", status);
+ val64 = 0xdeadbeeffeedcafe; + size = sizeof(val64) * 2; + ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER64, NULL, &val64, &size, NULL); + error = GetLastError(); + ok(!ret, "succeeded unexpectedly\n"); + ok(size == sizeof(val64) * 2, "got %#lx.\n", size); + ok(error == ERROR_WINHTTP_INVALID_QUERY_REQUEST, "expected ERROR_INSUFFICIENT_BUFFER, got %lu\n", error); + ok(val64 == 0xdeadbeeffeedcafe, "request failed unexpectedly %I64x\n", val64);
Typo. I would just use "got %lu" / "got %I64x" here. Please set last error to a known value before the call. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11689#note_149145
participants (3)
-
Hans Leidekker (@hans) -
Paul Gofman -
Paul Gofman (@gofman)