Matijn Woudt : winhttp: Add timeout for session handles and implement for WinHttpSetTimeouts.

Alexandre Julliard julliard at winehq.org
Fri Jan 29 10:56:37 CST 2010


Module: wine
Branch: master
Commit: d0983e9ec2d7d1844d1aa473c7ed2092bc162374
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d0983e9ec2d7d1844d1aa473c7ed2092bc162374

Author: Matijn Woudt <tijnema at 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;




More information about the wine-cvs mailing list