WINE_DEFAULT_DEBUG_CHANNEL(winhttp);
+#define DEFAULT_RESOLVE_TIMEOUT 0
#define DEFAULT_CONNECT_TIMEOUT 20000
#define DEFAULT_SEND_TIMEOUT 30000
#define DEFAULT_RECEIVE_TIMEOUT 30000
*buflen = sizeof(DWORD);
return TRUE;
}
+ case WINHTTP_OPTION_RESOLVE_TIMEOUT:
+ *(DWORD *)buffer = session->resolve_timeout;
+ *buflen = sizeof(DWORD);
+ return TRUE;
case WINHTTP_OPTION_CONNECT_TIMEOUT:
*(DWORD *)buffer = session->connect_timeout;
*buflen = sizeof(DWORD);
case WINHTTP_OPTION_DISABLE_FEATURE:
set_last_error( ERROR_WINHTTP_INCORRECT_HANDLE_TYPE );
return FALSE;
+ case WINHTTP_OPTION_RESOLVE_TIMEOUT:
+ session->resolve_timeout = *(DWORD *)buffer;
+ return TRUE;
case WINHTTP_OPTION_CONNECT_TIMEOUT:
session->connect_timeout = *(DWORD *)buffer;
return TRUE;
session->hdr.flags = flags;
session->hdr.refs = 1;
session->hdr.redirect_policy = WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP;
+ session->resolve_timeout = DEFAULT_RESOLVE_TIMEOUT;
session->connect_timeout = DEFAULT_CONNECT_TIMEOUT;
session->send_timeout = DEFAULT_SEND_TIMEOUT;
session->recv_timeout = DEFAULT_RECEIVE_TIMEOUT;
*buflen = sizeof(HINTERNET);
return TRUE;
}
+ case WINHTTP_OPTION_RESOLVE_TIMEOUT:
+ *(DWORD *)buffer = connect->session->resolve_timeout;
+ *buflen = sizeof(DWORD);
+ return TRUE;
case WINHTTP_OPTION_CONNECT_TIMEOUT:
*(DWORD *)buffer = connect->session->connect_timeout;
*buflen = sizeof(DWORD);
*buflen = sizeof(DWORD);
return TRUE;
}
+ case WINHTTP_OPTION_RESOLVE_TIMEOUT:
+ *(DWORD *)buffer = request->resolve_timeout;
+ *buflen = sizeof(DWORD);
+ return TRUE;
case WINHTTP_OPTION_CONNECT_TIMEOUT:
*(DWORD *)buffer = request->connect_timeout;
*buflen = sizeof(DWORD);
FIXME("WINHTTP_OPTION_SECURITY_FLAGS unimplemented (%08x)\n",
*(DWORD *)buffer);
return TRUE;
+ case WINHTTP_OPTION_RESOLVE_TIMEOUT:
+ request->resolve_timeout = *(DWORD *)buffer;
+ return TRUE;
case WINHTTP_OPTION_CONNECT_TIMEOUT:
request->connect_timeout = *(DWORD *)buffer;
return TRUE;
list_add_head( &connect->hdr.children, &request->hdr.entry );
if (!netconn_init( &request->netconn, request->hdr.flags & WINHTTP_FLAG_SECURE )) goto end;
+ request->resolve_timeout = connect->session->resolve_timeout;
request->connect_timeout = connect->session->connect_timeout;
request->send_timeout = connect->session->send_timeout;
request->recv_timeout = connect->session->recv_timeout;
return FALSE;
}
- if (resolve > 0)
- FIXME("resolve timeout (%d) not supported\n", resolve);
-
if (!(hdr = grab_object( handle )))
{
set_last_error( ERROR_INVALID_HANDLE );
request = (request_t *)hdr;
request->connect_timeout = connect;
+ if (resolve < 0) resolve = 0;
+ request->resolve_timeout = resolve;
+
if (send < 0) send = 0;
request->send_timeout = send;
session = (session_t *)hdr;
session->connect_timeout = connect;
+ if (resolve < 0) resolve = 0;
+ session->resolve_timeout = resolve;
+
if (send < 0) send = 0;
session->send_timeout = send;
ret = WinHttpSetTimeouts(ses, 0x0123, 0x4567, 0x89ab, 0xcdef);
ok(ret, "%u\n", GetLastError());
+ SetLastError(0xdeadbeef);
+ value = 0xdeadbeef;
+ size = sizeof(DWORD);
+ ret = WinHttpQueryOption(ses, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, &size);
+ ok(ret, "%u\n", GetLastError());
+ ok(value == 0x0123, "Expected 0x0123, got %u\n", value);
+
SetLastError(0xdeadbeef);
value = 0xdeadbeef;
size = sizeof(DWORD);
ok(ret, "%u\n", GetLastError());
ok(value == 0xcdef, "Expected 0xcdef, got %u\n", value);
+ SetLastError(0xdeadbeef);
+ value = 0;
+ ret = WinHttpSetOption(ses, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, sizeof(value));
+ ok(ret, "%u\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ value = 0xdeadbeef;
+ size = sizeof(DWORD);
+ ret = WinHttpQueryOption(ses, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, &size);
+ ok(ret, "%u\n", GetLastError());
+ ok(value == 0, "Expected 0, got %u\n", value);
+
SetLastError(0xdeadbeef);
value = 0;
ret = WinHttpSetOption(ses, WINHTTP_OPTION_CONNECT_TIMEOUT, &value, sizeof(value));
ok(ret, "%u\n", GetLastError());
ok(value == 0, "Expected 0, got %u\n", value);
+ SetLastError(0xdeadbeef);
+ value = 0xbeefdead;
+ ret = WinHttpSetOption(ses, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, sizeof(value));
+ ok(ret, "%u\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ value = 0xdeadbeef;
+ size = sizeof(DWORD);
+ ret = WinHttpQueryOption(ses, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, &size);
+ ok(ret, "%u\n", GetLastError());
+ ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
+
SetLastError(0xdeadbeef);
value = 0xbeefdead;
ret = WinHttpSetOption(ses, WINHTTP_OPTION_CONNECT_TIMEOUT, &value, sizeof(value));
ok(con != NULL, "failed to open a connection %u\n", GetLastError());
/* Timeout values should match the last one set for session */
+ SetLastError(0xdeadbeef);
+ value = 0xdeadbeef;
+ size = sizeof(DWORD);
+ ret = WinHttpQueryOption(con, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, &size);
+ ok(ret, "%u\n", GetLastError());
+ ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
+
SetLastError(0xdeadbeef);
value = 0xdeadbeef;
size = sizeof(DWORD);
ok(!ret && GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE,
"expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
+ SetLastError(0xdeadbeef);
+ value = 0;
+ ret = WinHttpSetOption(con, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, sizeof(value));
+ ok(!ret && GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE,
+ "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
+
SetLastError(0xdeadbeef);
value = 0;
ret = WinHttpSetOption(con, WINHTTP_OPTION_CONNECT_TIMEOUT, &value, sizeof(value));
"expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
/* Changing timeout values for session should affect the values for connection */
+ SetLastError(0xdeadbeef);
+ value = 0xdead;
+ ret = WinHttpSetOption(ses, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, sizeof(value));
+ ok(ret, "%u\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ value = 0xdeadbeef;
+ size = sizeof(DWORD);
+ ret = WinHttpQueryOption(con, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, &size);
+ ok(ret, "%u\n", GetLastError());
+ ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
+
SetLastError(0xdeadbeef);
value = 0xdead;
ret = WinHttpSetOption(ses, WINHTTP_OPTION_CONNECT_TIMEOUT, &value, sizeof(value));
ok(req != NULL, "failed to open a request %u\n", GetLastError());
/* Timeout values should match the last one set for session */
+ SetLastError(0xdeadbeef);
+ value = 0xdeadbeef;
+ size = sizeof(DWORD);
+ ret = WinHttpQueryOption(req, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, &size);
+ ok(ret, "%u\n", GetLastError());
+ ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
+
SetLastError(0xdeadbeef);
value = 0xdeadbeef;
size = sizeof(DWORD);
ret = WinHttpSetTimeouts(req, 0xcdef, 0x89ab, 0x4567, 0x0123);
ok(ret, "%u\n", GetLastError());
+ SetLastError(0xdeadbeef);
+ value = 0xdeadbeef;
+ size = sizeof(DWORD);
+ ret = WinHttpQueryOption(req, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, &size);
+ ok(ret, "%u\n", GetLastError());
+ ok(value == 0xcdef, "Expected 0xcdef, got %u\n", value);
+
SetLastError(0xdeadbeef);
value = 0xdeadbeef;
size = sizeof(DWORD);
ok(ret, "%u\n", GetLastError());
ok(value == 0x0123, "Expected 0x0123, got %u\n", value);
+ SetLastError(0xdeadbeef);
+ value = 0;
+ ret = WinHttpSetOption(req, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, sizeof(value));
+ ok(ret, "%u\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ value = 0xdeadbeef;
+ size = sizeof(DWORD);
+ ret = WinHttpQueryOption(req, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, &size);
+ ok(ret, "%u\n", GetLastError());
+ ok(value == 0, "Expected 0, got %u\n", value);
+
SetLastError(0xdeadbeef);
value = 0;
ret = WinHttpSetOption(req, WINHTTP_OPTION_CONNECT_TIMEOUT, &value, sizeof(value));
ok(ret, "%u\n", GetLastError());
ok(value == 0, "Expected 0, got %u\n", value);
+ SetLastError(0xdeadbeef);
+ value = 0xbeefdead;
+ ret = WinHttpSetOption(req, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, sizeof(value));
+ ok(ret, "%u\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ value = 0xdeadbeef;
+ size = sizeof(DWORD);
+ ret = WinHttpQueryOption(req, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, &size);
+ ok(ret, "%u\n", GetLastError());
+ ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
+
SetLastError(0xdeadbeef);
value = 0xbeefdead;
ret = WinHttpSetOption(req, WINHTTP_OPTION_CONNECT_TIMEOUT, &value, sizeof(value));
/* Changing timeout values for session should not affect the values for a request,
* neither should the other way around.
*/
+ SetLastError(0xdeadbeef);
+ value = 0xbeefdead;
+ ret = WinHttpSetOption(req, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, sizeof(value));
+ ok(ret, "%u\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ value = 0xdeadbeef;
+ size = sizeof(DWORD);
+ ret = WinHttpQueryOption(ses, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, &size);
+ ok(ret, "%u\n", GetLastError());
+ ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
+
SetLastError(0xdeadbeef);
value = 0xbeefdead;
ret = WinHttpSetOption(req, WINHTTP_OPTION_CONNECT_TIMEOUT, &value, sizeof(value));
ok(ret, "%u\n", GetLastError());
ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
+ SetLastError(0xdeadbeef);
+ value = 0xbeef;
+ ret = WinHttpSetOption(ses, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, sizeof(value));
+ ok(ret, "%u\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ value = 0xdeadbeef;
+ size = sizeof(DWORD);
+ ret = WinHttpQueryOption(req, WINHTTP_OPTION_RESOLVE_TIMEOUT, &value, &size);
+ ok(ret, "%u\n", GetLastError());
+ ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
+
SetLastError(0xdeadbeef);
value = 0xbeef;
ret = WinHttpSetOption(ses, WINHTTP_OPTION_CONNECT_TIMEOUT, &value, sizeof(value));
WinHttpCloseHandle(ses);
}
+static void test_resolve_timeout(void)
+{
+ static const WCHAR codeweavers[] = {'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
+ static const WCHAR srevaewedoc[] = {'s','r','e','v','a','e','w','e','d','o','c','.','m','o','c',0};
+
+ HANDLE ses, con, req;
+ DWORD timeout;
+ BOOL ret;
+
+ ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0);
+ ok(ses != NULL, "failed to open session %u\n", GetLastError());
+
+ timeout = 10000;
+ ret = WinHttpSetOption(ses, WINHTTP_OPTION_RESOLVE_TIMEOUT, &timeout, sizeof(timeout));
+ ok(ret, "failed to set resolve timeout %u\n", GetLastError());
+
+ con = WinHttpConnect(ses, srevaewedoc, 0, 0);
+ ok(con != NULL, "failed to open a connection %u\n", GetLastError());
+
+ req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
+ ok(req != NULL, "failed to open a request %u\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
+ ok(!ret, "sent request\n");
+ ok(GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED, "expected ERROR_WINHTTP_NAME_NOT_RESOLVED got %u\n", ret);
+
+ WinHttpCloseHandle(req);
+ WinHttpCloseHandle(con);
+ WinHttpCloseHandle(ses);
+
+ ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0);
+ ok(ses != NULL, "failed to open session %u\n", GetLastError());
+
+ timeout = 10000;
+ ret = WinHttpSetOption(ses, WINHTTP_OPTION_RESOLVE_TIMEOUT, &timeout, sizeof(timeout));
+ ok(ret, "failed to set resolve timeout %u\n", GetLastError());
+
+ con = WinHttpConnect(ses, codeweavers, 0, 0);
+ ok(con != NULL, "failed to open a connection %u\n", GetLastError());
+
+ req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
+ ok(req != NULL, "failed to open a request %u\n", GetLastError());
+
+ ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
+ ok(ret, "failed to send request\n");
+
+ WinHttpCloseHandle(req);
+ WinHttpCloseHandle(con);
+ WinHttpCloseHandle(ses);
+}
+
START_TEST (winhttp)
{
test_OpenRequest();
test_set_default_proxy_config();
test_empty_headers_param();
test_Timeouts();
+ test_resolve_timeout();
}