From e1b889830de6da326d6e89c1845c0fb952d352b8 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Fri, 16 May 2008 13:50:36 +0200 Subject: [PATCH] wininet: INTERNET_STATUS_REQUEST_COMPLETE callback must supply a handle. --- dlls/wininet/http.c | 2 +- dlls/wininet/tests/http.c | 57 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index d24bc43e22f..24918fcf2ae 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -3397,7 +3397,7 @@ lend: /* TODO: send notification for P3P header */ - iar.dwResult = (DWORD)bSuccess; + iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet; iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError(); INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c index 0a02dfe9ed7..b946d3bfc1f 100644 --- a/dlls/wininet/tests/http.c +++ b/dlls/wininet/tests/http.c @@ -1801,6 +1801,62 @@ static void test_bogus_accept_types_array(void) InternetCloseHandle(ses); } +struct context +{ + HANDLE event; + HINTERNET req; +}; + +static void WINAPI cb(HINTERNET handle, DWORD_PTR context, DWORD status, LPVOID info, DWORD size) +{ + trace("%p 0x%08lx %u %p 0x%08x\n", handle, context, status, info, size); + + if (status == INTERNET_STATUS_REQUEST_COMPLETE) + { + INTERNET_ASYNC_RESULT *result = info; + struct context *ctx = (struct context *)context; + + trace("request handle: 0x%08lx\n", result->dwResult); + + ctx->req = (HINTERNET)result->dwResult; + SetEvent(ctx->event); + } +} + +static void test_open_url_async(void) +{ + BOOL ret; + HINTERNET ses, req; + DWORD size; + struct context ctx; + ULONG type; + + ctx.req = NULL; + ctx.event = CreateEvent(NULL, TRUE, FALSE, "Z:_home_hans_jaman-installer.exe_ev1"); + + ses = InternetOpen("AdvancedInstaller", 0, NULL, NULL, INTERNET_FLAG_ASYNC); + ok(ses != NULL, "InternetOpen failed\n"); + + InternetSetStatusCallback(ses, cb); + ResetEvent(ctx.event); + + req = InternetOpenUrl(ses, "http://www.winehq.org", NULL, 0, 0, (DWORD_PTR)&ctx); + ok(!req && GetLastError() == ERROR_IO_PENDING, "InternetOpenUrl failed\n"); + + WaitForSingleObject(ctx.event, INFINITE); + + type = 0; + size = sizeof(type); + ret = InternetQueryOption(ctx.req, INTERNET_OPTION_HANDLE_TYPE, &type, &size); + ok(ret, "HttpQueryInfo failed: %u\n", GetLastError()); + ok(type == INTERNET_HANDLE_TYPE_HTTP_REQUEST, + "expected INTERNET_HANDLE_TYPE_HTTP_REQUEST, got %u\n", type); + + CloseHandle(ctx.event); + InternetCloseHandle(ctx.req); + InternetCloseHandle(ses); +} + #define STATUS_STRING(status) \ memcpy(status_string[status], #status, sizeof(CHAR) * \ (strlen(#status) < MAX_STATUS_NAME ? \ @@ -1877,4 +1933,5 @@ START_TEST(http) test_http_connection(); test_user_agent_header(); test_bogus_accept_types_array(); + test_open_url_async(); }