winhttp: Always clear last error on success.

This commit is contained in:
Hans Leidekker 2015-08-03 11:27:31 +02:00 committed by Alexandre Julliard
parent 09de5cdb38
commit 1def0982f1
6 changed files with 194 additions and 33 deletions

View File

@ -541,6 +541,7 @@ BOOL WINAPI WinHttpAddRequestHeaders( HINTERNET hrequest, LPCWSTR headers, DWORD
ret = add_request_headers( request, headers, len, flags ); ret = add_request_headers( request, headers, len, flags );
release_object( &request->hdr ); release_object( &request->hdr );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -848,6 +849,7 @@ BOOL WINAPI WinHttpQueryHeaders( HINTERNET hrequest, DWORD level, LPCWSTR name,
ret = query_headers( request, level, name, buffer, buflen, index ); ret = query_headers( request, level, name, buffer, buflen, index );
release_object( &request->hdr ); release_object( &request->hdr );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -1265,6 +1267,7 @@ BOOL WINAPI WinHttpSendRequest( HINTERNET hrequest, LPCWSTR headers, DWORD heade
ret = send_request( request, headers, headers_len, optional, optional_len, total_len, context, FALSE ); ret = send_request( request, headers, headers_len, optional, optional_len, total_len, context, FALSE );
release_object( &request->hdr ); release_object( &request->hdr );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -1388,6 +1391,7 @@ BOOL WINAPI WinHttpQueryAuthSchemes( HINTERNET hrequest, LPDWORD supported, LPDW
} }
release_object( &request->hdr ); release_object( &request->hdr );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -1842,6 +1846,7 @@ BOOL WINAPI WinHttpSetCredentials( HINTERNET hrequest, DWORD target, DWORD schem
ret = set_credentials( request, target, scheme, username, password ); ret = set_credentials( request, target, scheme, username, password );
release_object( &request->hdr ); release_object( &request->hdr );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -2484,6 +2489,7 @@ BOOL WINAPI WinHttpReceiveResponse( HINTERNET hrequest, LPVOID reserved )
ret = receive_response( request, FALSE ); ret = receive_response( request, FALSE );
release_object( &request->hdr ); release_object( &request->hdr );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -2555,6 +2561,7 @@ BOOL WINAPI WinHttpQueryDataAvailable( HINTERNET hrequest, LPDWORD available )
ret = query_data_available( request, available, FALSE ); ret = query_data_available( request, available, FALSE );
release_object( &request->hdr ); release_object( &request->hdr );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -2604,6 +2611,7 @@ BOOL WINAPI WinHttpReadData( HINTERNET hrequest, LPVOID buffer, DWORD to_read, L
ret = read_data( request, buffer, to_read, read, FALSE ); ret = read_data( request, buffer, to_read, read, FALSE );
release_object( &request->hdr ); release_object( &request->hdr );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -2675,6 +2683,7 @@ BOOL WINAPI WinHttpWriteData( HINTERNET hrequest, LPCVOID buffer, DWORD to_write
ret = write_data( request, buffer, to_write, written, FALSE ); ret = write_data( request, buffer, to_write, written, FALSE );
release_object( &request->hdr ); release_object( &request->hdr );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }

View File

@ -276,6 +276,7 @@ HINTERNET WINAPI WinHttpOpen( LPCWSTR agent, DWORD access, LPCWSTR proxy, LPCWST
end: end:
release_object( &session->hdr ); release_object( &session->hdr );
TRACE("returning %p\n", handle); TRACE("returning %p\n", handle);
if (handle) set_last_error( ERROR_SUCCESS );
return handle; return handle;
} }
@ -552,6 +553,7 @@ end:
release_object( &connect->hdr ); release_object( &connect->hdr );
release_object( &session->hdr ); release_object( &session->hdr );
TRACE("returning %p\n", hconnect); TRACE("returning %p\n", hconnect);
if (hconnect) set_last_error( ERROR_SUCCESS );
return hconnect; return hconnect;
} }
@ -1127,6 +1129,7 @@ end:
release_object( &request->hdr ); release_object( &request->hdr );
release_object( &connect->hdr ); release_object( &connect->hdr );
TRACE("returning %p\n", hrequest); TRACE("returning %p\n", hrequest);
if (hrequest) set_last_error( ERROR_SUCCESS );
return hrequest; return hrequest;
} }
@ -1146,6 +1149,7 @@ BOOL WINAPI WinHttpCloseHandle( HINTERNET handle )
} }
release_object( hdr ); release_object( hdr );
free_handle( handle ); free_handle( handle );
set_last_error( ERROR_SUCCESS );
return TRUE; return TRUE;
} }
@ -1206,6 +1210,7 @@ BOOL WINAPI WinHttpQueryOption( HINTERNET handle, DWORD option, LPVOID buffer, L
ret = query_option( hdr, option, buffer, buflen ); ret = query_option( hdr, option, buffer, buflen );
release_object( hdr ); release_object( hdr );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -1264,6 +1269,7 @@ BOOL WINAPI WinHttpSetOption( HINTERNET handle, DWORD option, LPVOID buffer, DWO
ret = set_option( hdr, option, buffer, buflen ); ret = set_option( hdr, option, buffer, buflen );
release_object( hdr ); release_object( hdr );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -1373,6 +1379,7 @@ BOOL WINAPI WinHttpDetectAutoProxyConfigUrl( DWORD flags, LPWSTR *url )
if (!(urlW = strdupAW( system_url ))) return FALSE; if (!(urlW = strdupAW( system_url ))) return FALSE;
*url = urlW; *url = urlW;
set_last_error( ERROR_SUCCESS );
return TRUE; return TRUE;
} }
if (flags & WINHTTP_AUTO_DETECT_TYPE_DHCP) if (flags & WINHTTP_AUTO_DETECT_TYPE_DHCP)
@ -1433,6 +1440,7 @@ BOOL WINAPI WinHttpDetectAutoProxyConfigUrl( DWORD flags, LPWSTR *url )
set_last_error( ERROR_WINHTTP_AUTODETECTION_FAILED ); set_last_error( ERROR_WINHTTP_AUTODETECTION_FAILED );
*url = NULL; *url = NULL;
} }
else set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -1600,6 +1608,7 @@ BOOL WINAPI WinHttpGetDefaultProxyConfiguration( WINHTTP_PROXY_INFO *info )
info->lpszProxy = NULL; info->lpszProxy = NULL;
info->lpszProxyBypass = NULL; info->lpszProxyBypass = NULL;
} }
set_last_error( ERROR_SUCCESS );
return TRUE; return TRUE;
} }
@ -1682,6 +1691,7 @@ done:
GlobalFree( config->lpszProxyBypass ); GlobalFree( config->lpszProxyBypass );
config->lpszProxyBypass = NULL; config->lpszProxyBypass = NULL;
} }
else set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -1866,6 +1876,7 @@ BOOL WINAPI WinHttpGetProxyForUrl( HINTERNET hsession, LPCWSTR url, WINHTTP_AUTO
done: done:
GlobalFree( detected_pac_url ); GlobalFree( detected_pac_url );
release_object( &session->hdr ); release_object( &session->hdr );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -1973,6 +1984,7 @@ BOOL WINAPI WinHttpSetDefaultProxyConfiguration( WINHTTP_PROXY_INFO *info )
} }
RegCloseKey( key ); RegCloseKey( key );
} }
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -1997,6 +2009,7 @@ WINHTTP_STATUS_CALLBACK WINAPI WinHttpSetStatusCallback( HINTERNET handle, WINHT
hdr->notify_mask = flags; hdr->notify_mask = flags;
release_object( hdr ); release_object( hdr );
set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -2065,6 +2078,7 @@ BOOL WINAPI WinHttpSetTimeouts( HINTERNET handle, int resolve, int connect, int
ret = FALSE; ret = FALSE;
} }
release_object( hdr ); release_object( hdr );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -2087,7 +2101,11 @@ BOOL WINAPI WinHttpTimeFromSystemTime( const SYSTEMTIME *time, LPWSTR string )
TRACE("%p, %p\n", time, string); TRACE("%p, %p\n", time, string);
if (!time || !string) return FALSE; if (!time || !string)
{
set_last_error( ERROR_INVALID_PARAMETER );
return FALSE;
}
sprintfW( string, format, sprintfW( string, format,
wkday[time->wDayOfWeek], wkday[time->wDayOfWeek],
@ -2098,6 +2116,7 @@ BOOL WINAPI WinHttpTimeFromSystemTime( const SYSTEMTIME *time, LPWSTR string )
time->wMinute, time->wMinute,
time->wSecond ); time->wSecond );
set_last_error( ERROR_SUCCESS );
return TRUE; return TRUE;
} }
@ -2112,7 +2131,11 @@ BOOL WINAPI WinHttpTimeToSystemTime( LPCWSTR string, SYSTEMTIME *time )
TRACE("%s, %p\n", debugstr_w(string), time); TRACE("%s, %p\n", debugstr_w(string), time);
if (!string || !time) return FALSE; if (!string || !time)
{
set_last_error( ERROR_INVALID_PARAMETER );
return FALSE;
}
/* Windows does this too */ /* Windows does this too */
GetSystemTime( time ); GetSystemTime( time );
@ -2121,6 +2144,8 @@ BOOL WINAPI WinHttpTimeToSystemTime( LPCWSTR string, SYSTEMTIME *time )
* a SYSTEMTIME structure. * a SYSTEMTIME structure.
*/ */
set_last_error( ERROR_SUCCESS );
while (*s && !isalphaW( *s )) s++; while (*s && !isalphaW( *s )) s++;
if (s[0] == '\0' || s[1] == '\0' || s[2] == '\0') return TRUE; if (s[0] == '\0' || s[1] == '\0' || s[2] == '\0') return TRUE;
time->wDayOfWeek = 7; time->wDayOfWeek = 7;

View File

@ -474,7 +474,7 @@ static const struct notification async_test[] =
static void test_async( void ) static void test_async( void )
{ {
HANDLE ses, con, req, event; HANDLE ses, con, req, event;
DWORD size, status; DWORD size, status, err;
BOOL ret, unload = TRUE; BOOL ret, unload = TRUE;
struct info info, *context = &info; struct info info, *context = &info;
char buffer[1024]; char buffer[1024];
@ -495,22 +495,36 @@ static void test_async( void )
unload = FALSE; unload = FALSE;
} }
SetLastError( 0xdeadbeef );
WinHttpSetStatusCallback( ses, check_notification, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0 ); WinHttpSetStatusCallback( ses, check_notification, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0 );
err = GetLastError();
ok(err == ERROR_SUCCESS || broken(err == 0xdeadbeef) /* < win7 */, "got %u\n", err);
SetLastError( 0xdeadbeef );
ret = WinHttpSetOption( ses, WINHTTP_OPTION_CONTEXT_VALUE, &context, sizeof(struct info *) ); ret = WinHttpSetOption( ses, WINHTTP_OPTION_CONTEXT_VALUE, &context, sizeof(struct info *) );
ok(ret, "failed to set context value %u\n", GetLastError()); err = GetLastError();
ok(ret, "failed to set context value %u\n", err);
ok(err == ERROR_SUCCESS || broken(err == 0xdeadbeef) /* < win7 */, "got %u\n", err);
setup_test( &info, winhttp_connect, __LINE__ ); setup_test( &info, winhttp_connect, __LINE__ );
SetLastError( 0xdeadbeef );
con = WinHttpConnect( ses, test_winehq, 0, 0 ); con = WinHttpConnect( ses, test_winehq, 0, 0 );
ok(con != NULL, "failed to open a connection %u\n", GetLastError()); err = GetLastError();
ok(con != NULL, "failed to open a connection %u\n", err);
ok(err == ERROR_SUCCESS || broken(err == WSAEINVAL) /* < win7 */, "got %u\n", err);
setup_test( &info, winhttp_open_request, __LINE__ ); setup_test( &info, winhttp_open_request, __LINE__ );
SetLastError( 0xdeadbeef );
req = WinHttpOpenRequest( con, NULL, NULL, NULL, NULL, NULL, 0 ); req = WinHttpOpenRequest( con, NULL, NULL, NULL, NULL, NULL, 0 );
ok(req != NULL, "failed to open a request %u\n", GetLastError()); err = GetLastError();
ok(req != NULL, "failed to open a request %u\n", err);
ok(err == ERROR_SUCCESS, "got %u\n", err);
setup_test( &info, winhttp_send_request, __LINE__ ); setup_test( &info, winhttp_send_request, __LINE__ );
SetLastError( 0xdeadbeef );
ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 );
if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) err = GetLastError();
if (!ret && err == ERROR_WINHTTP_CANNOT_CONNECT)
{ {
skip("connection failed, skipping\n"); skip("connection failed, skipping\n");
WinHttpCloseHandle( req ); WinHttpCloseHandle( req );
@ -519,30 +533,43 @@ static void test_async( void )
CloseHandle( info.wait ); CloseHandle( info.wait );
return; return;
} }
ok(ret, "failed to send request %u\n", GetLastError()); ok(ret, "failed to send request %u\n", err);
ok(err == ERROR_SUCCESS, "got %u\n", err);
WaitForSingleObject( info.wait, INFINITE ); WaitForSingleObject( info.wait, INFINITE );
setup_test( &info, winhttp_receive_response, __LINE__ ); setup_test( &info, winhttp_receive_response, __LINE__ );
SetLastError( 0xdeadbeef );
ret = WinHttpReceiveResponse( req, NULL ); ret = WinHttpReceiveResponse( req, NULL );
ok(ret, "failed to receive response %u\n", GetLastError()); err = GetLastError();
ok(ret, "failed to receive response %u\n", err);
ok(err == ERROR_SUCCESS, "got %u\n", err);
WaitForSingleObject( info.wait, INFINITE ); WaitForSingleObject( info.wait, INFINITE );
size = sizeof(status); size = sizeof(status);
SetLastError( 0xdeadbeef );
ret = WinHttpQueryHeaders( req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL ); ret = WinHttpQueryHeaders( req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL );
ok(ret, "failed unexpectedly %u\n", GetLastError()); err = GetLastError();
ok(ret, "failed unexpectedly %u\n", err);
ok(status == 200, "request failed unexpectedly %u\n", status); ok(status == 200, "request failed unexpectedly %u\n", status);
ok(err == ERROR_SUCCESS || broken(err == 0xdeadbeef) /* < win7 */, "got %u\n", err);
setup_test( &info, winhttp_query_data, __LINE__ ); setup_test( &info, winhttp_query_data, __LINE__ );
SetLastError( 0xdeadbeef );
ret = WinHttpQueryDataAvailable( req, NULL ); ret = WinHttpQueryDataAvailable( req, NULL );
ok(ret, "failed to query data available %u\n", GetLastError()); err = GetLastError();
ok(ret, "failed to query data available %u\n", err);
ok(err == ERROR_SUCCESS || err == ERROR_IO_PENDING || broken(err == 0xdeadbeef) /* < win7 */, "got %u\n", err);
WaitForSingleObject( info.wait, INFINITE ); WaitForSingleObject( info.wait, INFINITE );
setup_test( &info, winhttp_read_data, __LINE__ ); setup_test( &info, winhttp_read_data, __LINE__ );
SetLastError( 0xdeadbeef );
ret = WinHttpReadData( req, buffer, sizeof(buffer), NULL ); ret = WinHttpReadData( req, buffer, sizeof(buffer), NULL );
ok(ret, "failed to query data available %u\n", GetLastError()); err = GetLastError();
ok(ret, "failed to read data %u\n", err);
ok(err == ERROR_SUCCESS, "got %u\n", err);
WaitForSingleObject( info.wait, INFINITE ); WaitForSingleObject( info.wait, INFINITE );

View File

@ -169,11 +169,14 @@ static void WinHttpCreateUrl_test( void )
ok( len == 57, "expected len 57 got %u\n", len ); ok( len == 57, "expected len 57 got %u\n", len );
/* allocated url, NULL scheme */ /* allocated url, NULL scheme */
SetLastError( 0xdeadbeef );
uc.lpszScheme = NULL; uc.lpszScheme = NULL;
url[0] = 0; url[0] = 0;
len = 256; len = 256;
ret = WinHttpCreateUrl( &uc, 0, url, &len ); ret = WinHttpCreateUrl( &uc, 0, url, &len );
ok( ret, "expected success\n" ); ok( ret, "expected success\n" );
ok( GetLastError() == ERROR_SUCCESS || broken(GetLastError() == 0xdeadbeef) /* < win7 */,
"expected ERROR_SUCCESS got %u\n", GetLastError() );
ok( len == 56, "expected len 56 got %u\n", len ); ok( len == 56, "expected len 56 got %u\n", len );
ok( !lstrcmpW( url, url1 ), "url doesn't match\n" ); ok( !lstrcmpW( url, url1 ), "url doesn't match\n" );
@ -380,9 +383,13 @@ static void WinHttpCrackUrl_test( void )
/* no buffers */ /* no buffers */
reset_url_components( &uc ); reset_url_components( &uc );
SetLastError( 0xdeadbeef );
ret = WinHttpCrackUrl( url_k1, 0, 0,&uc); ret = WinHttpCrackUrl( url_k1, 0, 0,&uc);
error = GetLastError();
ok( ret, "WinHttpCrackUrl failed le=%u\n", GetLastError() ); ok( ret, "WinHttpCrackUrl failed le=%u\n", error );
ok( error == ERROR_SUCCESS || broken(error == ERROR_INVALID_PARAMETER) /* < win7 */,
"got %u, expected ERROR_SUCCESS\n", error );
ok( uc.nScheme == INTERNET_SCHEME_HTTP, "unexpected scheme\n" ); ok( uc.nScheme == INTERNET_SCHEME_HTTP, "unexpected scheme\n" );
ok( uc.lpszScheme == url_k1,"unexpected scheme\n" ); ok( uc.lpszScheme == url_k1,"unexpected scheme\n" );
ok( uc.dwSchemeLength == 4, "unexpected scheme length\n" ); ok( uc.dwSchemeLength == 4, "unexpected scheme length\n" );

View File

@ -41,8 +41,11 @@ static BOOL proxy_active(void)
WINHTTP_PROXY_INFO proxy_info; WINHTTP_PROXY_INFO proxy_info;
BOOL active = FALSE; BOOL active = FALSE;
SetLastError(0xdeadbeef);
if (WinHttpGetDefaultProxyConfiguration(&proxy_info)) if (WinHttpGetDefaultProxyConfiguration(&proxy_info))
{ {
ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == 0xdeadbeef) /* < win7 */,
"got %u\n", GetLastError());
active = (proxy_info.lpszProxy != NULL); active = (proxy_info.lpszProxy != NULL);
if (active) if (active)
GlobalFree(proxy_info.lpszProxy); GlobalFree(proxy_info.lpszProxy);
@ -93,6 +96,8 @@ static void test_QueryOption(void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, &size); ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, &size);
ok(ret, "failed to query option %u\n", GetLastError()); ok(ret, "failed to query option %u\n", GetLastError());
ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == 0xdeadbeef) /* < win7 */,
"got %u\n", GetLastError());
ok(size == sizeof(feature), "WinHttpQueryOption should set the size: %u\n", size); ok(size == sizeof(feature), "WinHttpQueryOption should set the size: %u\n", size);
ok(feature == WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP, ok(feature == WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP,
"expected WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP, got %#x\n", feature); "expected WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP, got %#x\n", feature);
@ -207,39 +212,57 @@ static void test_OpenRequest (void)
{ {
BOOL ret; BOOL ret;
HINTERNET session, request, connection; HINTERNET session, request, connection;
DWORD err;
SetLastError(0xdeadbeef);
session = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, session = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
err = GetLastError();
ok(session != NULL, "WinHttpOpen failed to open session.\n"); ok(session != NULL, "WinHttpOpen failed to open session.\n");
ok(err == ERROR_SUCCESS, "got %u\n", err);
/* Test with a bad server name */ /* Test with a bad server name */
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
connection = WinHttpConnect(session, NULL, INTERNET_DEFAULT_HTTP_PORT, 0); connection = WinHttpConnect(session, NULL, INTERNET_DEFAULT_HTTP_PORT, 0);
err = GetLastError();
ok (connection == NULL, "WinHttpConnect succeeded in opening connection to NULL server argument.\n"); ok (connection == NULL, "WinHttpConnect succeeded in opening connection to NULL server argument.\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError()); ok(err == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u.\n", err);
/* Test with a valid server name */ /* Test with a valid server name */
SetLastError(0xdeadbeef);
connection = WinHttpConnect (session, test_winehq, INTERNET_DEFAULT_HTTP_PORT, 0); connection = WinHttpConnect (session, test_winehq, INTERNET_DEFAULT_HTTP_PORT, 0);
ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError()); err = GetLastError();
ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u.\n", err);
ok(err == ERROR_SUCCESS || broken(err == WSAEINVAL) /* < win7 */, "got %u\n", err);
SetLastError(0xdeadbeef);
request = WinHttpOpenRequest(connection, NULL, NULL, NULL, WINHTTP_NO_REFERER, request = WinHttpOpenRequest(connection, NULL, NULL, NULL, WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES, 0); WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
if (request == NULL && GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED) err = GetLastError();
if (request == NULL && err == ERROR_WINHTTP_NAME_NOT_RESOLVED)
{ {
skip("Network unreachable, skipping.\n"); skip("Network unreachable, skipping.\n");
goto done; goto done;
} }
ok(request != NULL, "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError()); ok(request != NULL, "WinHttpOpenrequest failed to open a request, error: %u.\n", err);
ok(err == ERROR_SUCCESS, "got %u\n", err);
SetLastError(0xdeadbeef);
ret = WinHttpSendRequest(request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, NULL, 0, 0, 0); ret = WinHttpSendRequest(request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, NULL, 0, 0, 0);
if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) err = GetLastError();
if (!ret && err == ERROR_WINHTTP_CANNOT_CONNECT)
{ {
skip("Connection failed, skipping.\n"); skip("Connection failed, skipping.\n");
goto done; goto done;
} }
ok(ret == TRUE, "WinHttpSendRequest failed: %u\n", GetLastError()); ok(ret, "WinHttpSendRequest failed: %u\n", err);
ok(err == ERROR_SUCCESS, "got %u\n", err);
SetLastError(0xdeadbeef);
ret = WinHttpCloseHandle(request); ret = WinHttpCloseHandle(request);
ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret); err = GetLastError();
ok(ret, "WinHttpCloseHandle failed on closing request, got %u.\n", err);
ok(err == ERROR_SUCCESS, "got %u\n", err);
done: done:
ret = WinHttpCloseHandle(connection); ret = WinHttpCloseHandle(connection);
@ -337,9 +360,13 @@ static void test_SendRequest (void)
for (i = 3; post_data[i]; i++) for (i = 3; post_data[i]; i++)
{ {
bytes_rw = -1; bytes_rw = -1;
SetLastError(0xdeadbeef);
ret = WinHttpWriteData(request, &post_data[i], 1, &bytes_rw); ret = WinHttpWriteData(request, &post_data[i], 1, &bytes_rw);
if (ret) if (ret)
{
ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %u.\n", GetLastError());
ok(bytes_rw == 1, "WinHttpWriteData failed, wrote %u bytes instead of 1 byte.\n", bytes_rw); ok(bytes_rw == 1, "WinHttpWriteData failed, wrote %u bytes instead of 1 byte.\n", bytes_rw);
}
else /* Since we already passed all optional data in WinHttpSendRequest Win7 fails our WinHttpWriteData call */ else /* Since we already passed all optional data in WinHttpSendRequest Win7 fails our WinHttpWriteData call */
{ {
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER got %u.\n", GetLastError()); ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER got %u.\n", GetLastError());
@ -347,7 +374,10 @@ static void test_SendRequest (void)
} }
} }
SetLastError(0xdeadbeef);
ret = WinHttpReceiveResponse(request, NULL); ret = WinHttpReceiveResponse(request, NULL);
ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == ERROR_NO_TOKEN) /* < win7 */,
"Expected ERROR_SUCCESS got %u.\n", GetLastError());
ok(ret == TRUE, "WinHttpReceiveResponse failed: %u.\n", GetLastError()); ok(ret == TRUE, "WinHttpReceiveResponse failed: %u.\n", GetLastError());
bytes_rw = -1; bytes_rw = -1;
@ -374,9 +404,25 @@ static void test_WinHttpTimeFromSystemTime(void)
{'M','o','n',',',' ','2','8',' ','J','u','l',' ','2','0','0','8',' ', {'M','o','n',',',' ','2','8',' ','J','u','l',' ','2','0','0','8',' ',
'1','0',':','0','5',':','5','2',' ','G','M','T',0}; '1','0',':','0','5',':','5','2',' ','G','M','T',0};
WCHAR time_string[WINHTTP_TIME_FORMAT_BUFSIZE+1]; WCHAR time_string[WINHTTP_TIME_FORMAT_BUFSIZE+1];
DWORD err;
SetLastError(0xdeadbeef);
ret = WinHttpTimeFromSystemTime(&time, NULL);
err = GetLastError();
ok(!ret, "WinHttpTimeFromSystemTime succeeded\n");
ok(err == ERROR_INVALID_PARAMETER, "got %u\n", err);
SetLastError(0xdeadbeef);
ret = WinHttpTimeFromSystemTime(NULL, time_string);
err = GetLastError();
ok(!ret, "WinHttpTimeFromSystemTime succeeded\n");
ok(err == ERROR_INVALID_PARAMETER, "got %u\n", err);
SetLastError(0xdeadbeef);
ret = WinHttpTimeFromSystemTime(&time, time_string); ret = WinHttpTimeFromSystemTime(&time, time_string);
ok(ret == TRUE, "WinHttpTimeFromSystemTime failed: %u\n", GetLastError()); err = GetLastError();
ok(ret, "WinHttpTimeFromSystemTime failed: %u\n", err);
ok(err == ERROR_SUCCESS || broken(err == 0xdeadbeef) /* < win7 */, "got %u\n", err);
ok(memcmp(time_string, expected_string, sizeof(expected_string)) == 0, ok(memcmp(time_string, expected_string, sizeof(expected_string)) == 0,
"Time string returned did not match expected time string.\n"); "Time string returned did not match expected time string.\n");
} }
@ -392,14 +438,33 @@ static void test_WinHttpTimeToSystemTime(void)
static const WCHAR time_string2[] = static const WCHAR time_string2[] =
{' ','m','o','n',' ','2','8',' ','j','u','l',' ','2','0','0','8',' ', {' ','m','o','n',' ','2','8',' ','j','u','l',' ','2','0','0','8',' ',
'1','0',' ','0','5',' ','5','2','\n',0}; '1','0',' ','0','5',' ','5','2','\n',0};
DWORD err;
SetLastError(0xdeadbeef);
ret = WinHttpTimeToSystemTime(time_string1, NULL);
err = GetLastError();
ok(!ret, "WinHttpTimeToSystemTime succeeded\n");
ok(err == ERROR_INVALID_PARAMETER, "got %u\n", err);
SetLastError(0xdeadbeef);
ret = WinHttpTimeToSystemTime(NULL, &time);
err = GetLastError();
ok(!ret, "WinHttpTimeToSystemTime succeeded\n");
ok(err == ERROR_INVALID_PARAMETER, "got %u\n", err);
SetLastError(0xdeadbeef);
ret = WinHttpTimeToSystemTime(time_string1, &time); ret = WinHttpTimeToSystemTime(time_string1, &time);
ok(ret == TRUE, "WinHttpTimeToSystemTime failed: %u\n", GetLastError()); err = GetLastError();
ok(ret, "WinHttpTimeToSystemTime failed: %u\n", err);
ok(err == ERROR_SUCCESS || broken(err == 0xdeadbeef) /* < win7 */, "got %u\n", err);
ok(memcmp(&time, &expected_time, sizeof(SYSTEMTIME)) == 0, ok(memcmp(&time, &expected_time, sizeof(SYSTEMTIME)) == 0,
"Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n"); "Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n");
SetLastError(0xdeadbeef);
ret = WinHttpTimeToSystemTime(time_string2, &time); ret = WinHttpTimeToSystemTime(time_string2, &time);
ok(ret == TRUE, "WinHttpTimeToSystemTime failed: %u\n", GetLastError()); err = GetLastError();
ok(ret, "WinHttpTimeToSystemTime failed: %u\n", err);
ok(err == ERROR_SUCCESS || broken(err == 0xdeadbeef) /* < win7 */, "got %u\n", err);
ok(memcmp(&time, &expected_time, sizeof(SYSTEMTIME)) == 0, ok(memcmp(&time, &expected_time, sizeof(SYSTEMTIME)) == 0,
"Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n"); "Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n");
} }
@ -490,8 +555,11 @@ static void test_WinHttpAddHeaders(void)
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);
ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded, found 'Warning' header.\n"); ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded, found 'Warning' header.\n");
SetLastError(0xdeadbeef);
ret = WinHttpAddRequestHeaders(request, test_headers[0], -1L, WINHTTP_ADDREQ_FLAG_ADD); ret = WinHttpAddRequestHeaders(request, test_headers[0], -1L, WINHTTP_ADDREQ_FLAG_ADD);
ok(ret == TRUE, "WinHttpAddRequestHeader failed to add new header, got %d with error %u.\n", ret, GetLastError()); err = GetLastError();
ok(ret, "WinHttpAddRequestHeader failed to add new header, got %d with error %u.\n", ret, err);
ok(err == ERROR_SUCCESS || broken(err == 0xdeadbeef) /* < win7 */, "got %u\n", err);
index = 0; index = 0;
len = sizeof(buffer); len = sizeof(buffer);
@ -1210,9 +1278,11 @@ static void test_set_default_proxy_config(void)
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) if (!ret && GetLastError() == ERROR_ACCESS_DENIED)
skip("couldn't set default proxy configuration: access denied\n"); skip("couldn't set default proxy configuration: access denied\n");
else else
ok(ret, "WinHttpSetDefaultProxyConfiguration failed: %d\n", {
GetLastError()); ok(ret, "WinHttpSetDefaultProxyConfiguration failed: %u\n", GetLastError());
ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == 0xdeadbeef) /* < win7 */,
"got %u\n", GetLastError());
}
set_default_proxy_reg_value( saved_proxy_settings, len, type ); set_default_proxy_reg_value( saved_proxy_settings, len, type );
} }
@ -1248,6 +1318,8 @@ static void test_Timeouts (void)
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = WinHttpSetTimeouts(ses, -1, -1, -1, -1); ret = WinHttpSetTimeouts(ses, -1, -1, -1, -1);
ok(ret, "%u\n", GetLastError()); ok(ret, "%u\n", GetLastError());
ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == 0xdeadbeef) /* < win7 */,
"expected ERROR_SUCCESS, got %u\n", GetLastError());
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = WinHttpSetTimeouts(ses, 0, 0, 0, 0); ret = WinHttpSetTimeouts(ses, 0, 0, 0, 0);
@ -2183,14 +2255,20 @@ static void test_basic_authentication(int port)
ok(status == 401, "request failed unexpectedly %u\n", status); ok(status == 401, "request failed unexpectedly %u\n", status);
supported = first = target = 0xdeadbeef; supported = first = target = 0xdeadbeef;
SetLastError(0xdeadbeef);
ret = WinHttpQueryAuthSchemes(req, &supported, &first, &target); ret = WinHttpQueryAuthSchemes(req, &supported, &first, &target);
ok(ret, "failed to query authentication schemes %u\n", GetLastError()); error = GetLastError();
ok(ret, "failed to query authentication schemes %u\n", error);
ok(error == ERROR_SUCCESS || broken(error == 0xdeadbeef) /* < win7 */, "expected ERROR_SUCCESS, got %u\n", error);
ok(supported == WINHTTP_AUTH_SCHEME_BASIC, "got %x\n", supported); ok(supported == WINHTTP_AUTH_SCHEME_BASIC, "got %x\n", supported);
ok(first == WINHTTP_AUTH_SCHEME_BASIC, "got %x\n", first); ok(first == WINHTTP_AUTH_SCHEME_BASIC, "got %x\n", first);
ok(target == WINHTTP_AUTH_TARGET_SERVER, "got %x\n", target); ok(target == WINHTTP_AUTH_TARGET_SERVER, "got %x\n", target);
SetLastError(0xdeadbeef);
ret = WinHttpSetCredentials(req, WINHTTP_AUTH_TARGET_SERVER, WINHTTP_AUTH_SCHEME_NTLM, NULL, NULL, NULL); ret = WinHttpSetCredentials(req, WINHTTP_AUTH_TARGET_SERVER, WINHTTP_AUTH_SCHEME_NTLM, NULL, NULL, NULL);
ok(ret, "failed to set credentials %u\n", GetLastError()); error = GetLastError();
ok(ret, "failed to set credentials %u\n", error);
ok(error == ERROR_SUCCESS || broken(error == 0xdeadbeef) /* < win7 */, "expected ERROR_SUCCESS, got %u\n", error);
ret = WinHttpSetCredentials(req, WINHTTP_AUTH_TARGET_SERVER, WINHTTP_AUTH_SCHEME_PASSPORT, NULL, NULL, NULL); ret = WinHttpSetCredentials(req, WINHTTP_AUTH_TARGET_SERVER, WINHTTP_AUTH_SCHEME_PASSPORT, NULL, NULL, NULL);
ok(ret, "failed to set credentials %u\n", GetLastError()); ok(ret, "failed to set credentials %u\n", GetLastError());
@ -2395,18 +2473,23 @@ static void test_no_content(int port)
ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER, ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER,
NULL, &status, &size, 0); NULL, &status, &size, 0);
ok(!ret, "expected no content-length header\n"); ok(!ret, "expected no content-length header\n");
ok(GetLastError() == ERROR_WINHTTP_HEADER_NOT_FOUND, ok(GetLastError() == ERROR_WINHTTP_HEADER_NOT_FOUND, "wrong error %u\n", GetLastError());
"wrong error %u\n", GetLastError() );
ok(status == 12345, "expected 0, got %d\n", status); ok(status == 12345, "expected 0, got %d\n", status);
SetLastError(0xdeadbeef);
size = 12345; size = 12345;
ret = WinHttpQueryDataAvailable(req, &size); ret = WinHttpQueryDataAvailable(req, &size);
ok(ret, "expected success\n"); ok(ret, "expected success\n");
ok(size == 0, "expected 0, got %d\n", size); ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == 0xdeadbeef) /* < win7 */,
"wrong error %u\n", GetLastError());
ok(!size, "expected 0, got %u\n", size);
SetLastError(0xdeadbeef);
ret = WinHttpReadData(req, buf, len, &bytes_read); ret = WinHttpReadData(req, buf, len, &bytes_read);
ok(ret, "expected success\n"); ok(ret, "expected success\n");
ok( bytes_read == 0, "expected 0, got %u available\n", bytes_read ); ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == 0xdeadbeef) /* < win7 */,
"wrong error %u\n", GetLastError());
ok(!bytes_read, "expected 0, got %u\n", bytes_read);
size = 12345; size = 12345;
ret = WinHttpQueryDataAvailable(req, &size); ret = WinHttpQueryDataAvailable(req, &size);
@ -3459,6 +3542,7 @@ if (0) /* crashes on some win2k systems */
} }
else else
{ {
ok( error == ERROR_SUCCESS, "got %u\n", error );
trace("%s\n", wine_dbgstr_w(url)); trace("%s\n", wine_dbgstr_w(url));
GlobalFree( url ); GlobalFree( url );
} }
@ -3478,8 +3562,12 @@ static void test_WinHttpGetIEProxyConfigForCurrentUser(void)
ok( !ret, "expected failure\n" ); ok( !ret, "expected failure\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
SetLastError(0xdeadbeef);
ret = WinHttpGetIEProxyConfigForCurrentUser( &cfg ); ret = WinHttpGetIEProxyConfigForCurrentUser( &cfg );
error = GetLastError();
ok( ret, "expected success\n" ); ok( ret, "expected success\n" );
ok( error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* < win7 */, "got %u\n", error );
trace("IEProxy.AutoDetect=%d\n", cfg.fAutoDetect); trace("IEProxy.AutoDetect=%d\n", cfg.fAutoDetect);
trace("IEProxy.AutoConfigUrl=%s\n", wine_dbgstr_w(cfg.lpszAutoConfigUrl)); trace("IEProxy.AutoConfigUrl=%s\n", wine_dbgstr_w(cfg.lpszAutoConfigUrl));
trace("IEProxy.Proxy=%s\n", wine_dbgstr_w(cfg.lpszProxy)); trace("IEProxy.Proxy=%s\n", wine_dbgstr_w(cfg.lpszProxy));
@ -3566,9 +3654,12 @@ static void test_WinHttpGetProxyForUrl(void)
options.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DNS_A; options.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DNS_A;
memset( &info, 0, sizeof(info) ); memset( &info, 0, sizeof(info) );
SetLastError(0xdeadbeef);
ret = WinHttpGetProxyForUrl( session, urlW, &options, &info ); ret = WinHttpGetProxyForUrl( session, urlW, &options, &info );
error = GetLastError();
if (ret) if (ret)
{ {
ok( error == ERROR_SUCCESS, "got %u\n", error );
trace("Proxy.AccessType=%u\n", info.dwAccessType); trace("Proxy.AccessType=%u\n", info.dwAccessType);
trace("Proxy.Proxy=%s\n", wine_dbgstr_w(info.lpszProxy)); trace("Proxy.Proxy=%s\n", wine_dbgstr_w(info.lpszProxy));
trace("Proxy.ProxyBypass=%s\n", wine_dbgstr_w(info.lpszProxyBypass)); trace("Proxy.ProxyBypass=%s\n", wine_dbgstr_w(info.lpszProxyBypass));

View File

@ -304,6 +304,7 @@ exit:
if (ret) uc->nScheme = scheme; if (ret) uc->nScheme = scheme;
heap_free( url_decoded ); heap_free( url_decoded );
heap_free( url_escaped ); heap_free( url_escaped );
if (ret) set_last_error( ERROR_SUCCESS );
return ret; return ret;
} }
@ -522,5 +523,6 @@ BOOL WINAPI WinHttpCreateUrl( LPURL_COMPONENTS uc, DWORD flags, LPWSTR url, LPDW
} }
} }
*url = 0; *url = 0;
set_last_error( ERROR_SUCCESS );
return TRUE; return TRUE;
} }