Commit 68039dca authored by Juan Lang's avatar Juan Lang Committed by Alexandre Julliard

winhttp: Implement connect timeout.

parent f18276fe
...@@ -287,15 +287,44 @@ BOOL netconn_close( netconn_t *conn ) ...@@ -287,15 +287,44 @@ BOOL netconn_close( netconn_t *conn )
return TRUE; return TRUE;
} }
BOOL netconn_connect( netconn_t *conn, const struct sockaddr *sockaddr, unsigned int addr_len ) BOOL netconn_connect( netconn_t *conn, const struct sockaddr *sockaddr, unsigned int addr_len, int timeout )
{ {
if (connect( conn->socket, sockaddr, addr_len ) == -1) BOOL ret = FALSE;
int res = 0, state;
if (timeout > 0)
{ {
WARN("unable to connect to host (%s)\n", strerror(errno)); state = 1;
set_last_error( sock_get_error( errno ) ); ioctlsocket( conn->socket, FIONBIO, &state );
return FALSE;
} }
return TRUE; if (connect( conn->socket, sockaddr, addr_len ) < 0)
{
res = sock_get_error( errno );
if (res == WSAEWOULDBLOCK || res == WSAEINPROGRESS)
{
struct pollfd pfd;
pfd.fd = conn->socket;
pfd.events = POLLOUT;
if (poll( &pfd, 1, timeout ) > 0)
ret = TRUE;
else
res = sock_get_error( errno );
}
}
else
ret = TRUE;
if (timeout > 0)
{
state = 0;
ioctlsocket( conn->socket, FIONBIO, &state );
}
if (!ret)
{
WARN("unable to connect to host (%d)\n", res);
set_last_error( res );
}
return ret;
} }
BOOL netconn_secure_connect( netconn_t *conn ) BOOL netconn_secure_connect( netconn_t *conn )
......
...@@ -925,7 +925,7 @@ static BOOL open_connection( request_t *request ) ...@@ -925,7 +925,7 @@ static BOOL open_connection( request_t *request )
} }
netconn_set_timeout( &request->netconn, TRUE, request->send_timeout ); netconn_set_timeout( &request->netconn, TRUE, request->send_timeout );
netconn_set_timeout( &request->netconn, FALSE, request->recv_timeout ); netconn_set_timeout( &request->netconn, FALSE, request->recv_timeout );
if (!netconn_connect( &request->netconn, (struct sockaddr *)&connect->sockaddr, slen )) if (!netconn_connect( &request->netconn, (struct sockaddr *)&connect->sockaddr, slen, request->connect_timeout ))
{ {
netconn_close( &request->netconn ); netconn_close( &request->netconn );
heap_free( addressW ); heap_free( addressW );
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(winhttp); WINE_DEFAULT_DEBUG_CHANNEL(winhttp);
#define DEFAULT_CONNECT_TIMEOUT 60000
#define DEFAULT_SEND_TIMEOUT 30000 #define DEFAULT_SEND_TIMEOUT 30000
#define DEFAULT_RECEIVE_TIMEOUT 30000 #define DEFAULT_RECEIVE_TIMEOUT 30000
...@@ -636,6 +637,7 @@ HINTERNET WINAPI WinHttpOpenRequest( HINTERNET hconnect, LPCWSTR verb, LPCWSTR o ...@@ -636,6 +637,7 @@ HINTERNET WINAPI WinHttpOpenRequest( HINTERNET hconnect, LPCWSTR verb, LPCWSTR o
list_add_head( &connect->hdr.children, &request->hdr.entry ); list_add_head( &connect->hdr.children, &request->hdr.entry );
if (!netconn_init( &request->netconn, request->hdr.flags & WINHTTP_FLAG_SECURE )) goto end; 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->send_timeout = DEFAULT_SEND_TIMEOUT;
request->recv_timeout = DEFAULT_RECEIVE_TIMEOUT; request->recv_timeout = DEFAULT_RECEIVE_TIMEOUT;
...@@ -1167,7 +1169,7 @@ BOOL WINAPI WinHttpSetTimeouts( HINTERNET handle, int resolve, int connect, int ...@@ -1167,7 +1169,7 @@ BOOL WINAPI WinHttpSetTimeouts( HINTERNET handle, int resolve, int connect, int
return FALSE; return FALSE;
} }
FIXME("resolve and connect timeout not supported\n"); FIXME("resolve timeout not supported\n");
if (!(request = (request_t *)grab_object( handle ))) if (!(request = (request_t *)grab_object( handle )))
{ {
...@@ -1182,6 +1184,8 @@ BOOL WINAPI WinHttpSetTimeouts( HINTERNET handle, int resolve, int connect, int ...@@ -1182,6 +1184,8 @@ BOOL WINAPI WinHttpSetTimeouts( HINTERNET handle, int resolve, int connect, int
return FALSE; return FALSE;
} }
request->connect_timeout = connect;
if (send < 0) send = 0; if (send < 0) send = 0;
request->send_timeout = send; request->send_timeout = send;
......
...@@ -139,6 +139,7 @@ typedef struct ...@@ -139,6 +139,7 @@ typedef struct
LPWSTR version; LPWSTR version;
LPWSTR raw_headers; LPWSTR raw_headers;
netconn_t netconn; netconn_t netconn;
int connect_timeout;
int send_timeout; int send_timeout;
int recv_timeout; int recv_timeout;
LPWSTR status_text; LPWSTR status_text;
...@@ -206,7 +207,7 @@ void send_callback( object_header_t *, DWORD, LPVOID, DWORD ); ...@@ -206,7 +207,7 @@ void send_callback( object_header_t *, DWORD, LPVOID, DWORD );
void close_connection( request_t * ); void close_connection( request_t * );
BOOL netconn_close( netconn_t * ); BOOL netconn_close( netconn_t * );
BOOL netconn_connect( netconn_t *, const struct sockaddr *, unsigned int ); BOOL netconn_connect( netconn_t *, const struct sockaddr *, unsigned int, int );
BOOL netconn_connected( netconn_t * ); BOOL netconn_connected( netconn_t * );
BOOL netconn_create( netconn_t *, int, int, int ); BOOL netconn_create( netconn_t *, int, int, int );
BOOL netconn_get_next_line( netconn_t *, char *, DWORD * ); BOOL netconn_get_next_line( netconn_t *, char *, DWORD * );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment