1
0
mirror of https://github.com/wine-mirror/wine synced 2024-06-29 06:14:34 +00:00

wininet: Unify timeout values closer to hInternet.

This commit is contained in:
Jacob Pfeiffer 2024-06-06 17:37:40 -04:00 committed by Alexandre Julliard
parent bb772c2f3e
commit bc19f6f66d
4 changed files with 370 additions and 129 deletions

View File

@ -2280,11 +2280,11 @@ static DWORD HTTPREQ_QueryOption(object_header_t *hdr, DWORD option, void *buffe
return err;
}
case INTERNET_OPTION_CONNECT_TIMEOUT:
if (*size < sizeof(DWORD))
if (*size < sizeof(ULONG))
return ERROR_INSUFFICIENT_BUFFER;
*size = sizeof(DWORD);
*(DWORD *)buffer = req->connect_timeout;
*size = sizeof(ULONG);
*(ULONG *)buffer = hdr->connect_timeout;
return ERROR_SUCCESS;
case INTERNET_OPTION_REQUEST_FLAGS: {
DWORD flags = 0;
@ -2363,20 +2363,6 @@ static DWORD HTTPREQ_SetOption(object_header_t *hdr, DWORD option, void *buffer,
req->netconn->security_flags |= flags;
return ERROR_SUCCESS;
}
case INTERNET_OPTION_CONNECT_TIMEOUT:
if (!buffer || size != sizeof(DWORD)) return ERROR_INVALID_PARAMETER;
req->connect_timeout = *(DWORD *)buffer;
return ERROR_SUCCESS;
case INTERNET_OPTION_SEND_TIMEOUT:
if (!buffer || size != sizeof(DWORD)) return ERROR_INVALID_PARAMETER;
req->send_timeout = *(DWORD *)buffer;
return ERROR_SUCCESS;
case INTERNET_OPTION_RECEIVE_TIMEOUT:
if (!buffer || size != sizeof(DWORD)) return ERROR_INVALID_PARAMETER;
req->receive_timeout = *(DWORD *)buffer;
return ERROR_SUCCESS;
case INTERNET_OPTION_USERNAME:
free(req->session->userName);
@ -3461,9 +3447,9 @@ static DWORD HTTP_HttpOpenRequestW(http_session_t *session,
request->netconn_stream.data_stream.vtbl = &netconn_stream_vtbl;
request->data_stream = &request->netconn_stream.data_stream;
request->connect_timeout = session->connect_timeout;
request->send_timeout = session->send_timeout;
request->receive_timeout = session->receive_timeout;
request->hdr.connect_timeout = session->hdr.connect_timeout;
request->hdr.send_timeout = session->hdr.send_timeout;
request->hdr.receive_timeout = session->hdr.receive_timeout;
InitializeCriticalSectionEx( &request->headers_section, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO );
request->headers_section.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": http_request_t.headers_section");
@ -4946,7 +4932,7 @@ static DWORD open_http_connection(http_request_t *request, BOOL *reusing)
res = create_netconn(request->proxy ? request->proxy : request->server, request->security_flags,
(request->hdr.ErrorMask & INTERNET_ERROR_MASK_COMBINED_SEC_CERT) != 0,
request->connect_timeout, &netconn);
request->hdr.connect_timeout, &netconn);
if(res != ERROR_SUCCESS) {
ERR("create_netconn failed: %lu\n", res);
return res;
@ -5140,7 +5126,7 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *request, LPCWSTR lpszHeaders,
INTERNET_SendCallback(&request->hdr, request->hdr.dwContext,
INTERNET_STATUS_SENDING_REQUEST, NULL, 0);
NETCON_set_timeout( request->netconn, TRUE, request->send_timeout );
NETCON_set_timeout( request->netconn, TRUE, request->hdr.send_timeout );
res = NETCON_send(request->netconn, ascii_req, len, 0, &cnt);
free(ascii_req);
if(res != ERROR_SUCCESS) {
@ -5820,7 +5806,6 @@ static void HTTPSESSION_Destroy(object_header_t *hdr)
static DWORD HTTPSESSION_QueryOption(object_header_t *hdr, DWORD option, void *buffer, DWORD *size, BOOL unicode)
{
http_session_t *ses = (http_session_t *)hdr;
switch(option) {
case INTERNET_OPTION_HANDLE_TYPE:
@ -5832,35 +5817,6 @@ static DWORD HTTPSESSION_QueryOption(object_header_t *hdr, DWORD option, void *b
*size = sizeof(DWORD);
*(DWORD*)buffer = INTERNET_HANDLE_TYPE_CONNECT_HTTP;
return ERROR_SUCCESS;
case INTERNET_OPTION_CONNECT_TIMEOUT:
TRACE("INTERNET_OPTION_CONNECT_TIMEOUT\n");
if (*size < sizeof(DWORD))
return ERROR_INSUFFICIENT_BUFFER;
*size = sizeof(DWORD);
*(DWORD *)buffer = ses->connect_timeout;
return ERROR_SUCCESS;
case INTERNET_OPTION_SEND_TIMEOUT:
TRACE("INTERNET_OPTION_SEND_TIMEOUT\n");
if (*size < sizeof(DWORD))
return ERROR_INSUFFICIENT_BUFFER;
*size = sizeof(DWORD);
*(DWORD *)buffer = ses->send_timeout;
return ERROR_SUCCESS;
case INTERNET_OPTION_RECEIVE_TIMEOUT:
TRACE("INTERNET_OPTION_RECEIVE_TIMEOUT\n");
if (*size < sizeof(DWORD))
return ERROR_INSUFFICIENT_BUFFER;
*size = sizeof(DWORD);
*(DWORD *)buffer = ses->receive_timeout;
return ERROR_SUCCESS;
}
return INET_QueryOption(hdr, option, buffer, size, unicode);
@ -5895,24 +5851,6 @@ static DWORD HTTPSESSION_SetOption(object_header_t *hdr, DWORD option, void *buf
if (!(ses->appInfo->proxyPassword = wcsdup(buffer))) return ERROR_OUTOFMEMORY;
return ERROR_SUCCESS;
}
case INTERNET_OPTION_CONNECT_TIMEOUT:
{
if (!buffer || size != sizeof(DWORD)) return ERROR_INVALID_PARAMETER;
ses->connect_timeout = *(DWORD *)buffer;
return ERROR_SUCCESS;
}
case INTERNET_OPTION_SEND_TIMEOUT:
{
if (!buffer || size != sizeof(DWORD)) return ERROR_INVALID_PARAMETER;
ses->send_timeout = *(DWORD *)buffer;
return ERROR_SUCCESS;
}
case INTERNET_OPTION_RECEIVE_TIMEOUT:
{
if (!buffer || size != sizeof(DWORD)) return ERROR_INVALID_PARAMETER;
ses->receive_timeout = *(DWORD *)buffer;
return ERROR_SUCCESS;
}
default: break;
}
@ -5979,9 +5917,9 @@ DWORD HTTP_Connect(appinfo_t *hIC, LPCWSTR lpszServerName,
session->userName = wcsdup(lpszUserName);
session->password = wcsdup(lpszPassword);
session->hostPort = serverPort;
session->connect_timeout = hIC->connect_timeout;
session->send_timeout = 0;
session->receive_timeout = 0;
session->hdr.connect_timeout = hIC->hdr.connect_timeout;
session->hdr.send_timeout = hIC->hdr.send_timeout;
session->hdr.receive_timeout = hIC->hdr.receive_timeout;
/* Don't send a handle created callback if this handle was created with InternetOpenUrl */
if (!(session->hdr.dwInternalFlags & INET_OPENURL))
@ -6057,7 +5995,7 @@ static DWORD HTTP_GetResponseHeaders(http_request_t *request, INT *len)
/* clear old response headers (eg. from a redirect response) */
HTTP_clear_response_headers( request );
NETCON_set_timeout( request->netconn, FALSE, request->receive_timeout );
NETCON_set_timeout( request->netconn, FALSE, request->hdr.receive_timeout );
do {
/*
* We should first receive 'HTTP/1.x nnn OK' where nnn is the status code.

View File

@ -106,6 +106,11 @@ typedef struct {
static ULONG max_conns = 2, max_1_0_conns = 4;
static ULONG connect_timeout = 60000;
static ULONG send_timeout = 60000;
static ULONG receive_timeout = 60000;
static ULONG data_send_timeout = 60000;
static ULONG data_receive_timeout = 60000;
static const WCHAR szInternetSettings[] =
L"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
@ -174,6 +179,17 @@ void *alloc_object(object_header_t *parent, const object_vtbl_t *vtbl, size_t si
if(parent) {
ret->lpfnStatusCB = parent->lpfnStatusCB;
ret->dwInternalFlags = parent->dwInternalFlags & INET_CALLBACKW;
ret->connect_timeout = parent->connect_timeout;
ret->send_timeout = parent->send_timeout;
ret->receive_timeout = parent->receive_timeout;
ret->data_send_timeout = parent->data_send_timeout;
ret->data_receive_timeout = parent->data_receive_timeout;
} else {
ret->connect_timeout = connect_timeout;
ret->send_timeout = send_timeout;
ret->receive_timeout = receive_timeout;
ret->data_send_timeout = data_send_timeout;
ret->data_receive_timeout = data_receive_timeout;
}
return ret;
@ -1147,17 +1163,6 @@ static DWORD APPINFO_QueryOption(object_header_t *hdr, DWORD option, void *buffe
return ERROR_SUCCESS;
}
case INTERNET_OPTION_CONNECT_TIMEOUT:
TRACE("INTERNET_OPTION_CONNECT_TIMEOUT\n");
if (*size < sizeof(ULONG))
return ERROR_INSUFFICIENT_BUFFER;
*(ULONG*)buffer = ai->connect_timeout;
*size = sizeof(ULONG);
return ERROR_SUCCESS;
case INTERNET_OPTION_PER_CONNECTION_OPTION: {
INTERNET_PER_CONN_OPTION_LISTW *con = buffer;
INTERNET_PER_CONN_OPTION_LISTA *conA = buffer;
@ -1241,16 +1246,6 @@ static DWORD APPINFO_SetOption(object_header_t *hdr, DWORD option, void *buf, DW
appinfo_t *ai = (appinfo_t*)hdr;
switch(option) {
case INTERNET_OPTION_CONNECT_TIMEOUT:
TRACE("INTERNET_OPTION_CONNECT_TIMEOUT\n");
if(size != sizeof(connect_timeout))
return ERROR_INTERNET_BAD_OPTION_LENGTH;
if(!*(ULONG*)buf)
return ERROR_BAD_ARGUMENTS;
ai->connect_timeout = *(ULONG*)buf;
return ERROR_SUCCESS;
case INTERNET_OPTION_USER_AGENT:
free(ai->agent);
if (!(ai->agent = wcsdup(buf))) return ERROR_OUTOFMEMORY;
@ -1381,7 +1376,6 @@ HINTERNET WINAPI InternetOpenW(LPCWSTR lpszAgent, DWORD dwAccessType,
lpwai->accessType = dwAccessType;
lpwai->proxyUsername = NULL;
lpwai->proxyPassword = NULL;
lpwai->connect_timeout = connect_timeout;
lpwai->agent = wcsdup(lpszAgent);
if(dwAccessType == INTERNET_OPEN_TYPE_PRECONFIG)
@ -3091,6 +3085,50 @@ static DWORD query_global_option(DWORD option, void *buffer, DWORD *size, BOOL u
*(ULONG*)buffer = connect_timeout;
*size = sizeof(ULONG);
return ERROR_SUCCESS;
case INTERNET_OPTION_SEND_TIMEOUT:
TRACE("INTERNET_OPTION_SEND_TIMEOUT\n");
if (*size < sizeof(ULONG))
return ERROR_INSUFFICIENT_BUFFER;
*(ULONG*)buffer = send_timeout;
*size = sizeof(ULONG);
return ERROR_SUCCESS;
case INTERNET_OPTION_RECEIVE_TIMEOUT:
TRACE("INTERNET_OPTION_RECEIVE_TIMEOUT\n");
if (*size < sizeof(ULONG))
return ERROR_INSUFFICIENT_BUFFER;
*(ULONG*)buffer = receive_timeout;
*size = sizeof(ULONG);
return ERROR_SUCCESS;
case INTERNET_OPTION_DATA_SEND_TIMEOUT:
TRACE("INTERNET_OPTION_DATA_SEND_TIMEOUT\n");
if (*size < sizeof(ULONG))
return ERROR_INSUFFICIENT_BUFFER;
*(ULONG*)buffer = data_send_timeout;
*size = sizeof(ULONG);
return ERROR_SUCCESS;
case INTERNET_OPTION_DATA_RECEIVE_TIMEOUT:
TRACE("INTERNET_OPTION_DATA_RECEIVE_TIMEOUT\n");
if (*size < sizeof(ULONG))
return ERROR_INSUFFICIENT_BUFFER;
*(ULONG*)buffer = data_receive_timeout;
*size = sizeof(ULONG);
return ERROR_SUCCESS;
}
@ -3125,6 +3163,57 @@ DWORD INET_QueryOption(object_header_t *hdr, DWORD option, void *buffer, DWORD *
case INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER:
WARN("Called on global option %lu\n", option);
return ERROR_INTERNET_INVALID_OPERATION;
case INTERNET_OPTION_CONNECT_TIMEOUT:
TRACE("INTERNET_OPTION_CONNECT_TIMEOUT\n");
if (*size < sizeof(ULONG))
return ERROR_INSUFFICIENT_BUFFER;
*(ULONG*)buffer = hdr->connect_timeout;
*size = sizeof(ULONG);
return ERROR_SUCCESS;
case INTERNET_OPTION_SEND_TIMEOUT:
TRACE("INTERNET_OPTION_SEND_TIMEOUT\n");
if (*size < sizeof(ULONG))
return ERROR_INSUFFICIENT_BUFFER;
*size = sizeof(ULONG);
*(ULONG *)buffer = hdr->send_timeout;
return ERROR_SUCCESS;
case INTERNET_OPTION_RECEIVE_TIMEOUT:
TRACE("INTERNET_OPTION_RECEIVE_TIMEOUT\n");
if (*size < sizeof(ULONG))
return ERROR_INSUFFICIENT_BUFFER;
*size = sizeof(ULONG);
*(ULONG *)buffer = hdr->receive_timeout;
return ERROR_SUCCESS;
case INTERNET_OPTION_DATA_SEND_TIMEOUT:
TRACE("INTERNET_OPTION_DATA_SEND_TIMEOUT\n");
if (*size < sizeof(ULONG))
return ERROR_INSUFFICIENT_BUFFER;
*size = sizeof(ULONG);
*(ULONG *)buffer = hdr->data_send_timeout;
return ERROR_SUCCESS;
case INTERNET_OPTION_DATA_RECEIVE_TIMEOUT:
TRACE("INTERNET_OPTION_DATA_RECEIVE_TIMEOUT\n");
if (*size < sizeof(ULONG))
return ERROR_INSUFFICIENT_BUFFER;
*size = sizeof(ULONG);
*(ULONG *)buffer = hdr->data_receive_timeout;
return ERROR_SUCCESS;
}
/* FIXME: we shouldn't call it here */
@ -3213,6 +3302,26 @@ DWORD INET_SetOption(object_header_t *hdr, DWORD option, void *buf, DWORD size)
return ERROR_INTERNET_INVALID_OPERATION;
case INTERNET_OPTION_REFRESH:
return ERROR_INTERNET_INCORRECT_HANDLE_TYPE;
case INTERNET_OPTION_CONNECT_TIMEOUT:
if (!buf || size != sizeof(ULONG)) return ERROR_INVALID_PARAMETER;
hdr->connect_timeout = *(ULONG *)buf;
return ERROR_SUCCESS;
case INTERNET_OPTION_SEND_TIMEOUT:
if (!buf || size != sizeof(ULONG)) return ERROR_INVALID_PARAMETER;
hdr->send_timeout = *(ULONG *)buf;
return ERROR_SUCCESS;
case INTERNET_OPTION_RECEIVE_TIMEOUT:
if (!buf || size != sizeof(ULONG)) return ERROR_INVALID_PARAMETER;
hdr->receive_timeout = *(ULONG *)buf;
return ERROR_SUCCESS;
case INTERNET_OPTION_DATA_SEND_TIMEOUT:
if (!buf || size != sizeof(ULONG)) return ERROR_INVALID_PARAMETER;
hdr->data_send_timeout = *(ULONG *)buf;
return ERROR_SUCCESS;
case INTERNET_OPTION_DATA_RECEIVE_TIMEOUT:
if (!buf || size != sizeof(ULONG)) return ERROR_INVALID_PARAMETER;
hdr->data_receive_timeout = *(ULONG *)buf;
return ERROR_SUCCESS;
}
return ERROR_INTERNET_INVALID_OPTION;
@ -3258,6 +3367,50 @@ static DWORD set_global_option(DWORD option, void *buf, DWORD size)
connect_timeout = *(ULONG*)buf;
return ERROR_SUCCESS;
case INTERNET_OPTION_SEND_TIMEOUT:
TRACE("INTERNET_OPTION_SEND_TIMEOUT\n");
if(size != sizeof(send_timeout))
return ERROR_INTERNET_BAD_OPTION_LENGTH;
if(!*(ULONG*)buf)
return ERROR_BAD_ARGUMENTS;
send_timeout = *(ULONG*)buf;
return ERROR_SUCCESS;
case INTERNET_OPTION_RECEIVE_TIMEOUT:
TRACE("INTERNET_OPTION_RECEIVE_TIMEOUT\n");
if(size != sizeof(receive_timeout))
return ERROR_INTERNET_BAD_OPTION_LENGTH;
if(!*(ULONG*)buf)
return ERROR_BAD_ARGUMENTS;
receive_timeout = *(ULONG*)buf;
return ERROR_SUCCESS;
case INTERNET_OPTION_DATA_SEND_TIMEOUT:
TRACE("INTERNET_OPTION_DATA_SEND_TIMEOUT\n");
if(size != sizeof(data_send_timeout))
return ERROR_INTERNET_BAD_OPTION_LENGTH;
if(!*(ULONG*)buf)
return ERROR_BAD_ARGUMENTS;
data_send_timeout = *(ULONG*)buf;
return ERROR_SUCCESS;
case INTERNET_OPTION_DATA_RECEIVE_TIMEOUT:
TRACE("INTERNET_OPTION_DATA_RECEIVE_TIMEOUT\n");
if(size != sizeof(data_receive_timeout))
return ERROR_INTERNET_BAD_OPTION_LENGTH;
if(!*(ULONG*)buf)
return ERROR_BAD_ARGUMENTS;
data_receive_timeout = *(ULONG*)buf;
return ERROR_SUCCESS;
case INTERNET_OPTION_SUPPRESS_BEHAVIOR:
FIXME("INTERNET_OPTION_SUPPRESS_BEHAVIOR stub\n");
@ -3383,18 +3536,6 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption,
FIXME("Option INTERNET_OPTION_REQUEST_PRIORITY (%ld): STUB\n", priority);
}
break;
case INTERNET_OPTION_CONNECT_TIMEOUT:
{
ULONG connecttimeout = *(ULONG *)lpBuffer;
FIXME("Option INTERNET_OPTION_CONNECT_TIMEOUT (%ld): STUB\n", connecttimeout);
}
break;
case INTERNET_OPTION_DATA_RECEIVE_TIMEOUT:
{
ULONG receivetimeout = *(ULONG *)lpBuffer;
FIXME("Option INTERNET_OPTION_DATA_RECEIVE_TIMEOUT (%ld): STUB\n", receivetimeout);
}
break;
case INTERNET_OPTION_RESET_URLCACHE_SESSION:
FIXME("Option INTERNET_OPTION_RESET_URLCACHE_SESSION: STUB\n");
break;
@ -3412,14 +3553,6 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption,
case INTERNET_OPTION_IGNORE_OFFLINE:
FIXME("Option INTERNET_OPTION_IGNORE_OFFLINE: STUB\n");
break;
case INTERNET_OPTION_SEND_TIMEOUT:
case INTERNET_OPTION_RECEIVE_TIMEOUT:
case INTERNET_OPTION_DATA_SEND_TIMEOUT:
{
ULONG timeout = *(ULONG *)lpBuffer;
FIXME("INTERNET_OPTION_SEND/RECEIVE_TIMEOUT/DATA_SEND_TIMEOUT %ld\n", timeout);
break;
}
case INTERNET_OPTION_CONNECT_RETRIES:
{
ULONG retries = *(ULONG *)lpBuffer;

View File

@ -240,6 +240,11 @@ struct _object_header_t
WH_TYPE htype;
const object_vtbl_t *vtbl;
HINTERNET hInternet;
ULONG connect_timeout;
ULONG send_timeout;
ULONG receive_timeout;
ULONG data_send_timeout;
ULONG data_receive_timeout;
BOOL valid_handle;
DWORD dwFlags;
DWORD_PTR dwContext;
@ -262,7 +267,6 @@ typedef struct
LPWSTR proxyUsername;
LPWSTR proxyPassword;
DWORD accessType;
DWORD connect_timeout;
} appinfo_t;
typedef struct
@ -273,9 +277,6 @@ typedef struct
LPWSTR userName;
LPWSTR password;
INTERNET_PORT hostPort; /* the final destination port of the request */
DWORD connect_timeout;
DWORD send_timeout;
DWORD receive_timeout;
} http_session_t;
#define HDR_ISREQUEST 0x0001
@ -317,9 +318,6 @@ typedef struct
LPWSTR verb;
netconn_t *netconn;
DWORD security_flags;
DWORD connect_timeout;
DWORD send_timeout;
DWORD receive_timeout;
LPWSTR version;
DWORD status_code;
LPWSTR statusText;

View File

@ -282,13 +282,59 @@ static void test_InternetQueryOptionA(void)
InternetCloseHandle(hinet);
/* Connect timeout */
val = 12345;
res = InternetSetOptionA(NULL, INTERNET_OPTION_CONNECT_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_CONNECT_TIMEOUT) failed (%lu)\n", GetLastError());
len = sizeof(val);
res = InternetQueryOptionA(NULL, INTERNET_OPTION_CONNECT_TIMEOUT, &val, &len);
ok(res, "InternetQueryOptionA failed %ld)\n", GetLastError());
ok(res, "InternetQueryOptionA(INTERNET_OPTION_CONNECT_TIMEOUT) failed %ld)\n", GetLastError());
ok(val == 12345, "val = %ld\n", val);
ok(len == sizeof(val), "len = %ld\n", len);
/* Receive Timeout */
val = 54321;
res = InternetSetOptionA(NULL, INTERNET_OPTION_RECEIVE_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_RECEIVE_TIMEOUT) failed (%lu)\n", GetLastError());
len = sizeof(val);
res = InternetQueryOptionA(NULL, INTERNET_OPTION_RECEIVE_TIMEOUT, &val, &len);
ok(res, "InternetQueryOptionA(INTERNET_OPTION_RECEIVE_TIMEOUT) failed %ld)\n", GetLastError());
ok(val == 54321, "val = %ld\n", val);
ok(len == sizeof(val), "len = %ld\n", len);
/* Send Timeout */
val = 12345;
res = InternetSetOptionA(NULL, INTERNET_OPTION_SEND_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_SEND_TIMEOUT) failed (%lu)\n", GetLastError());
len = sizeof(val);
res = InternetQueryOptionA(NULL, INTERNET_OPTION_SEND_TIMEOUT, &val, &len);
ok(res, "InternetQueryOptionA(INTERNET_OPTION_SEND_TIMEOUT) failed %ld)\n", GetLastError());
ok(val == 12345, "val = %ld\n", val);
ok(len == sizeof(val), "len = %ld\n", len);
/* Data Receive Timeout */
val = 54321;
res = InternetSetOptionA(NULL, INTERNET_OPTION_RECEIVE_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_RECEIVE_TIMEOUT) failed (%lu)\n", GetLastError());
len = sizeof(val);
res = InternetQueryOptionA(NULL, INTERNET_OPTION_RECEIVE_TIMEOUT, &val, &len);
ok(res, "InternetQueryOptionA(INTERNET_OPTION_RECEIVE_TIMEOUT) failed %ld)\n", GetLastError());
ok(val == 54321, "val = %ld\n", val);
ok(len == sizeof(val), "len = %ld\n", len);
/* Data Send Timeout */
val = 12345;
res = InternetSetOptionA(NULL, INTERNET_OPTION_DATA_SEND_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_DATA_SEND_TIMEOUT) failed (%lu)\n", GetLastError());
val = 0xdeadbeef;
len = sizeof(val);
res = InternetQueryOptionA(NULL, INTERNET_OPTION_DATA_SEND_TIMEOUT, &val, &len);
ok(res, "InternetQueryOptionA(INTERNET_OPTION_DATA_SEND_TIMEOUT) failed %ld)\n", GetLastError());
ok(val == 12345, "val = %ld\n", val);
ok(len == sizeof(val), "len = %ld\n", len);
@ -308,6 +354,7 @@ static void test_InternetQueryOptionA(void)
ok(!res, "InternetQueryOptionA(INTERNET_OPTION_MAX_CONNS_PER_SERVER) succeeded\n");
ok(GetLastError() == ERROR_INTERNET_INVALID_OPERATION, "GetLastError() = %lu\n", GetLastError());
/* Connect Timeout */
val = 2;
res = InternetSetOptionA(hinet, INTERNET_OPTION_MAX_CONNS_PER_SERVER, &val, sizeof(val));
ok(!res, "InternetSetOptionA(INTERNET_OPTION_MAX_CONNS_PER_SERVER) succeeded\n");
@ -315,7 +362,7 @@ static void test_InternetQueryOptionA(void)
len = sizeof(val);
res = InternetQueryOptionA(hinet, INTERNET_OPTION_CONNECT_TIMEOUT, &val, &len);
ok(res, "InternetQueryOptionA failed %ld)\n", GetLastError());
ok(res, "InternetQueryOptionA(INTERNET_OPTION_CONNECT_TIMEOUT) failed %ld)\n", GetLastError());
ok(val == 12345, "val = %ld\n", val);
ok(len == sizeof(val), "len = %ld\n", len);
@ -325,16 +372,141 @@ static void test_InternetQueryOptionA(void)
len = sizeof(val);
res = InternetQueryOptionA(hinet, INTERNET_OPTION_CONNECT_TIMEOUT, &val, &len);
ok(res, "InternetQueryOptionA failed %ld)\n", GetLastError());
ok(res, "InternetQueryOptionA(INTERNET_OPTION_CONNECT_TIMEOUT) failed %ld)\n", GetLastError());
ok(val == 1, "val = %ld\n", val);
ok(len == sizeof(val), "len = %ld\n", len);
/* Receive Timeout */
val = 60;
res = InternetSetOptionA(hinet, INTERNET_OPTION_RECEIVE_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_RECEIVE_TIMEOUT) failed (%lu)\n", GetLastError());
len = sizeof(val);
res = InternetQueryOptionA(NULL, INTERNET_OPTION_CONNECT_TIMEOUT, &val, &len);
ok(res, "InternetQueryOptionA failed %ld)\n", GetLastError());
ok(val == 12345, "val = %ld\n", val);
res = InternetQueryOptionA(hinet, INTERNET_OPTION_RECEIVE_TIMEOUT, &val, &len);
ok(res, "InternetQueryOptionA(INTERNET_OPTION_RECEIVE_TIMEOUT) failed %ld)\n", GetLastError());
ok(val == 60, "val = %ld\n", val);
ok(len == sizeof(val), "len = %ld\n", len);
/* Send Timeout */
val = 120;
res = InternetSetOptionA(hinet, INTERNET_OPTION_SEND_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_SEND_TIMEOUT) failed (%lu)\n", GetLastError());
len = sizeof(val);
res = InternetQueryOptionA(hinet, INTERNET_OPTION_SEND_TIMEOUT, &val, &len);
ok(res, "InternetQueryOptionA(INTERNET_OPTION_SEND_TIMEOUT) failed %ld)\n", GetLastError());
ok(val == 120, "val = %ld\n", val);
ok(len == sizeof(val), "len = %ld\n", len);
/* Data Receive Timeout */
val = 60;
res = InternetSetOptionA(hinet, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT) failed (%lu)\n", GetLastError());
len = sizeof(val);
res = InternetQueryOptionA(hinet, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &val, &len);
ok(res, "InternetQueryOptionA(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT) failed %ld)\n", GetLastError());
ok(val == 60, "val = %ld\n", val);
ok(len == sizeof(val), "len = %ld\n", len);
/* Data Send Timeout */
val = 120;
res = InternetSetOptionA(hinet, INTERNET_OPTION_DATA_SEND_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_DATA_SEND_TIMEOUT) failed (%lu)\n", GetLastError());
len = sizeof(val);
res = InternetQueryOptionA(hinet, INTERNET_OPTION_DATA_SEND_TIMEOUT, &val, &len);
ok(res, "InternetQueryOptionA(INTERNET_OPTION_DATA_SEND_TIMEOUT) failed %ld)\n", GetLastError());
ok(val == 120, "val = %ld\n", val);
ok(len == sizeof(val), "len = %ld\n", len);
/* Timeout inheritance */
val = 15000;
len = sizeof(val);
res = InternetSetOptionA(hinet, INTERNET_OPTION_CONNECT_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_CONNECT_TIMEOUT) failed (%lu)\n", GetLastError());
res = InternetSetOptionA(hinet, INTERNET_OPTION_SEND_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_SEND_TIMEOUT) failed (%lu)\n", GetLastError());
res = InternetSetOptionA(hinet, INTERNET_OPTION_RECEIVE_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_RECEIVE_TIMEOUT) failed (%lu)\n", GetLastError());
res = InternetSetOptionA(hinet, INTERNET_OPTION_DATA_SEND_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_DATA_SEND_TIMEOUT) failed (%lu)\n", GetLastError());
res = InternetSetOptionA(hinet, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT) failed (%lu)\n", GetLastError());
hurl = InternetConnectA(hinet,"www.winehq.org",INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);
val = 0xdeadbeef;
res = InternetQueryOptionA(hurl, INTERNET_OPTION_CONNECT_TIMEOUT, &val, &len);
ok(val == 15000, "failed to inherit INTERNET_OPTION_CONNECT_TIMEOUT on child connection (found %ld) - Error: %ld)\n", val, GetLastError());
val = 0xdeadbeef;
res = InternetQueryOptionA(hurl, INTERNET_OPTION_SEND_TIMEOUT, &val, &len);
ok(val == 15000, "failed to inherit INTERNET_OPTION_SEND_TIMEOUT on child connection (found %ld) - Error: %ld)\n", val, GetLastError());
val = 0xdeadbeef;
res = InternetQueryOptionA(hurl, INTERNET_OPTION_RECEIVE_TIMEOUT, &val, &len);
ok(val == 15000, "failed to inherit INTERNET_OPTION_RECEIVE_TIMEOUT on child connection (found %ld) - Error: %ld)\n", val, GetLastError());
val = 0xdeadbeef;
res = InternetQueryOptionA(hurl, INTERNET_OPTION_DATA_SEND_TIMEOUT, &val, &len);
ok(val == 15000, "failed to inherit INTERNET_OPTION_DATA_SEND_TIMEOUTt on child connection (found %ld) - Error: %ld)\n", val, GetLastError());
val = 0xdeadbeef;
res = InternetQueryOptionA(hurl, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &val, &len);
ok(val == 15000, "failed to inherit INTERNET_OPTION_DATA_RECEIVE_TIMEOUT on child connection (found %ld) - Error: %ld)\n", val, GetLastError());
val = 12345;
res = InternetSetOptionA(hinet, INTERNET_OPTION_CONNECT_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_CONNECT_TIMEOUT) failed (%lu)\n", GetLastError());
val = 0xdeadbeef;
res = InternetQueryOptionA(hurl, INTERNET_OPTION_CONNECT_TIMEOUT, &val, &len);
ok(val == 15000, "Connection handle inherited value (INTERNET_OPTION_CONNECT_TIMEOUT) as %ld\n", val);
res = InternetQueryOptionA(hinet, INTERNET_OPTION_CONNECT_TIMEOUT, &val, &len);
ok(val == 12345, "Parent handle set from inherited value (INTERNET_OPTION_CONNECT_TIMEOUT) as %ld\n", val);
val = 12345;
res = InternetSetOptionA(hinet, INTERNET_OPTION_SEND_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_SEND_TIMEOUT) failed (%lu)\n", GetLastError());
val = 0xdeadbeef;
res = InternetQueryOptionA(hurl, INTERNET_OPTION_SEND_TIMEOUT, &val, &len);
ok(val == 15000, "Connection handle inherited value (INTERNET_OPTION_SEND_TIMEOUT) as %ld\n", val);
res = InternetQueryOptionA(hinet, INTERNET_OPTION_SEND_TIMEOUT, &val, &len);
ok(val == 12345, "Parent handle set from inherited value (INTERNET_OPTION_SEND_TIMEOUT) as %ld\n", val);
val = 12345;
res = InternetSetOptionA(hinet, INTERNET_OPTION_RECEIVE_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_RECEIVE_TIMEOUT) failed (%lu)\n", GetLastError());
val = 0xdeadbeef;
res = InternetQueryOptionA(hurl, INTERNET_OPTION_RECEIVE_TIMEOUT, &val, &len);
ok(val == 15000, "Connection handle inherited value (INTERNET_OPTION_RECEIVE_TIMEOUT) as %ld\n", val);
res = InternetQueryOptionA(hinet, INTERNET_OPTION_RECEIVE_TIMEOUT, &val, &len);
ok(val == 12345, "Parent handle set from inherited value (INTERNET_OPTION_RECEIVE_TIMEOUT) as %ld\n", val);
val = 12345;
res = InternetSetOptionA(hinet, INTERNET_OPTION_DATA_SEND_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_DATA_SEND_TIMEOUT) failed (%lu)\n", GetLastError());
val = 0xdeadbeef;
res = InternetQueryOptionA(hurl, INTERNET_OPTION_DATA_SEND_TIMEOUT, &val, &len);
ok(val == 15000, "Connection handle inherited value (INTERNET_OPTION_DATA_SEND_TIMEOUT) as %ld\n", val);
res = InternetQueryOptionA(hinet, INTERNET_OPTION_DATA_SEND_TIMEOUT, &val, &len);
ok(val == 12345, "Parent handle set from inherited value (INTERNET_OPTION_DATA_SEND_TIMEOUT) as %ld\n", val);
val = 12345;
res = InternetSetOptionA(hinet, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &val, sizeof(val));
ok(res, "InternetSetOptionA(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT) failed (%lu)\n", GetLastError());
val = 0xdeadbeef;
res = InternetQueryOptionA(hurl, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &val, &len);
ok(val == 15000, "Connection handle inherited value (INTERNET_OPTION_DATA_RECEIVE_TIMEOUT) as %ld\n", val);
res = InternetQueryOptionA(hinet, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &val, &len);
ok(val == 12345, "Parent handle set from inherited value (INTERNET_OPTION_DATA_RECEIVE_TIMEOUT) as %ld\n", val);
InternetCloseHandle(hurl);
InternetCloseHandle(hinet);
}