Module: wine Branch: master Commit: d0983e9ec2d7d1844d1aa473c7ed2092bc162374 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d0983e9ec2d7d1844d1aa473c7...
Author: Matijn Woudt tijnema@gmail.com Date: Fri Jan 29 01:45:15 2010 +0100
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 0f1ebb0..b1290e3 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;