Module: wine Branch: master Commit: 9d55252d41f2c6b578c76716c1d113588d700c0e URL: http://source.winehq.org/git/wine.git/?a=commit;h=9d55252d41f2c6b578c76716c1...
Author: Hans Leidekker hans@it.vu.nl Date: Sat May 31 21:46:34 2008 +0200
wininet: Don't send a handle closing callback for session handles created with InternetOpenUrl.
---
dlls/wininet/internet.c | 10 +++++++--- dlls/wininet/tests/http.c | 20 +++++++++++++++----- 2 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index d4734a4..a7a28c1 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -181,9 +181,13 @@ BOOL WININET_Release( LPWININETHANDLEHEADER info ) TRACE( "closing connection %p\n", info); info->vtbl->CloseConnection( info ); } - INTERNET_SendCallback(info, info->dwContext, - INTERNET_STATUS_HANDLE_CLOSING, &info->hInternet, - sizeof(HINTERNET)); + /* Don't send a callback if this is a session handle created with InternetOpenUrl */ + if (info->htype != WH_HHTTPSESSION || !(info->dwInternalFlags & INET_OPENURL)) + { + INTERNET_SendCallback(info, info->dwContext, + INTERNET_STATUS_HANDLE_CLOSING, &info->hInternet, + sizeof(HINTERNET)); + } TRACE( "destroying object %p\n", info); if ( info->htype != WH_HINIT ) list_remove( &info->entry ); diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c index ccaf324..cd2aba2 100644 --- a/dlls/wininet/tests/http.c +++ b/dlls/wininet/tests/http.c @@ -1809,18 +1809,25 @@ struct context
static void WINAPI cb(HINTERNET handle, DWORD_PTR context, DWORD status, LPVOID info, DWORD size) { + INTERNET_ASYNC_RESULT *result = info; + struct context *ctx = (struct context *)context; + 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); } + if (status == INTERNET_STATUS_HANDLE_CLOSING) + { + DWORD type = INTERNET_HANDLE_TYPE_CONNECT_HTTP, size = sizeof(type); + + if (InternetQueryOption(handle, INTERNET_OPTION_HANDLE_TYPE, &type, &size)) + ok(type != INTERNET_HANDLE_TYPE_CONNECT_HTTP, "unexpected callback\n"); + SetEvent(ctx->event); + } }
static void test_open_url_async(void) @@ -1857,9 +1864,12 @@ static void test_open_url_async(void) ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "HttpQueryInfo failed\n"); ok(size > 0, "expected size > 0\n");
- CloseHandle(ctx.event); + ResetEvent(ctx.event); InternetCloseHandle(ctx.req); + WaitForSingleObject(ctx.event, INFINITE); + InternetCloseHandle(ses); + CloseHandle(ctx.event); }
#define STATUS_STRING(status) \