[PATCH 2/3] winhttp: Add timeout for session handles and implement for WinHttpSetTimeouts
Matijn Woudt
tijnema at gmail.com
Fri Jan 29 09:23:28 CST 2010
-------------- next part --------------
From c8ea06d134a34b014a45a399ded996f3045d6155 Mon Sep 17 00:00:00 2001
From: Matijn Woudt <tijnema at gmail.com>
Date: Fri, 29 Jan 2010 01:45:15 +0100
Subject: [PATCH 2/3] winhttp: Add timeout for session handles and implement for WinHttpSetTimeouts
---
dlls/winhttp/session.c | 60 ++++++++++++++++++++++++++-------------
dlls/winhttp/tests/winhttp.c | 6 ++--
dlls/winhttp/winhttp_private.h | 3 ++
3 files changed, 46 insertions(+), 23 deletions(-)
diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c
index a4a4ec6..d3c5de7 100644
--- a/dlls/winhttp/session.c
+++ b/dlls/winhttp/session.c
@@ -173,6 +173,9 @@ HINTERNET WINAPI WinHttpOpen( LPCWSTR agent, DWORD access, LPCWSTR proxy, LPCWST
session->hdr.flags = flags;
session->hdr.refs = 1;
session->hdr.redirect_policy = WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP;
+ session->connect_timeout = DEFAULT_CONNECT_TIMEOUT;
+ session->send_timeout = DEFAULT_SEND_TIMEOUT;
+ session->recv_timeout = DEFAULT_RECEIVE_TIMEOUT;
list_init( &session->cookie_cache );
if (agent && !(session->agent = strdupW( agent ))) goto end;
@@ -668,9 +671,9 @@ HINTERNET WINAPI WinHttpOpenRequest( HINTERNET hconnect, LPCWSTR verb, LPCWSTR o
list_add_head( &connect->hdr.children, &request->hdr.entry );
if (!netconn_init( &request->netconn, request->hdr.flags & WINHTTP_FLAG_SECURE )) goto end;
- request->connect_timeout = DEFAULT_CONNECT_TIMEOUT;
- request->send_timeout = DEFAULT_SEND_TIMEOUT;
- request->recv_timeout = DEFAULT_RECEIVE_TIMEOUT;
+ request->connect_timeout = connect->session->connect_timeout;
+ request->send_timeout = connect->session->send_timeout;
+ request->recv_timeout = connect->session->recv_timeout;
if (!verb || !verb[0]) verb = getW;
if (!(request->verb = strdupW( verb ))) goto end;
@@ -1190,7 +1193,9 @@ WINHTTP_STATUS_CALLBACK WINAPI WinHttpSetStatusCallback( HINTERNET handle, WINHT
BOOL WINAPI WinHttpSetTimeouts( HINTERNET handle, int resolve, int connect, int send, int receive )
{
BOOL ret = TRUE;
+ object_header_t *hdr;
request_t *request;
+ session_t *session;
TRACE("%p, %d, %d, %d, %d\n", handle, resolve, connect, send, receive);
@@ -1203,34 +1208,49 @@ BOOL WINAPI WinHttpSetTimeouts( HINTERNET handle, int resolve, int connect, int
if (resolve > 0)
FIXME("resolve timeout (%d) not supported\n", resolve);
- if (!(request = (request_t *)grab_object( handle )))
+ if (!(hdr = grab_object( handle )))
{
set_last_error( ERROR_INVALID_HANDLE );
return FALSE;
}
- if (request->hdr.type != WINHTTP_HANDLE_TYPE_REQUEST)
+ switch(hdr->type)
{
- release_object( &request->hdr );
- set_last_error( ERROR_WINHTTP_INCORRECT_HANDLE_TYPE );
- return FALSE;
- }
+ case WINHTTP_HANDLE_TYPE_REQUEST:
+ request = (request_t *)hdr;
+ request->connect_timeout = connect;
- request->connect_timeout = connect;
+ if (send < 0) send = 0;
+ request->send_timeout = send;
- if (send < 0) send = 0;
- request->send_timeout = send;
+ if (receive < 0) receive = 0;
+ request->recv_timeout = receive;
- if (receive < 0) receive = 0;
- request->recv_timeout = receive;
+ if (netconn_connected( &request->netconn ))
+ {
+ if (netconn_set_timeout( &request->netconn, TRUE, send )) ret = FALSE;
+ if (netconn_set_timeout( &request->netconn, FALSE, receive )) ret = FALSE;
+ }
- if (netconn_connected( &request->netconn ))
- {
- if (netconn_set_timeout( &request->netconn, TRUE, send )) ret = FALSE;
- if (netconn_set_timeout( &request->netconn, FALSE, receive )) ret = FALSE;
- }
+ release_object( &request->hdr );
+ break;
- release_object( &request->hdr );
+ case WINHTTP_HANDLE_TYPE_SESSION:
+ session = (session_t *)hdr;
+ session->connect_timeout = connect;
+
+ if (send < 0) send = 0;
+ session->send_timeout = send;
+
+ if (receive < 0) receive = 0;
+ session->recv_timeout = receive;
+ break;
+
+ default:
+ release_object( hdr );
+ set_last_error( ERROR_WINHTTP_INCORRECT_HANDLE_TYPE );
+ return FALSE;
+ }
return ret;
}
diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c
index b1f213c..ea4883a 100644
--- a/dlls/winhttp/tests/winhttp.c
+++ b/dlls/winhttp/tests/winhttp.c
@@ -1064,15 +1064,15 @@ static void test_Timeouts (void)
SetLastError(0xdeadbeef);
ret = WinHttpSetTimeouts(ses, -1, -1, -1, -1);
- todo_wine ok(ret, "%u\n", GetLastError());
+ ok(ret, "%u\n", GetLastError());
SetLastError(0xdeadbeef);
ret = WinHttpSetTimeouts(ses, 0, 0, 0, 0);
- todo_wine ok(ret, "%u\n", GetLastError());
+ ok(ret, "%u\n", GetLastError());
SetLastError(0xdeadbeef);
ret = WinHttpSetTimeouts(ses, 0x0123, 0x4567, 0x89ab, 0xcdef);
- todo_wine ok(ret, "%u\n", GetLastError());
+ ok(ret, "%u\n", GetLastError());
SetLastError(0xdeadbeef);
value = 0xdeadbeef;
diff --git a/dlls/winhttp/winhttp_private.h b/dlls/winhttp/winhttp_private.h
index 73ac5ba..1054a42 100644
--- a/dlls/winhttp/winhttp_private.h
+++ b/dlls/winhttp/winhttp_private.h
@@ -96,6 +96,9 @@ typedef struct
object_header_t hdr;
LPWSTR agent;
DWORD access;
+ int connect_timeout;
+ int send_timeout;
+ int recv_timeout;
LPWSTR proxy_server;
LPWSTR proxy_bypass;
LPWSTR proxy_username;
--
1.6.3.3
More information about the wine-patches
mailing list