From 2db71194de87a83f1e504f9664dd3ca74fd0a6c4 Mon Sep 17 00:00:00 2001 From: Rafal Nowosielski Date: Thu, 24 Jul 2014 04:15:24 +0200 Subject: [PATCH 1/2] Set timeout on remote (WinHTTP) to infinite #2147 --- src/transports/winhttp.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/transports/winhttp.c b/src/transports/winhttp.c index 1e46dfaee..b328988f1 100644 --- a/src/transports/winhttp.c +++ b/src/transports/winhttp.c @@ -212,6 +212,8 @@ static int winhttp_stream_connect(winhttp_stream *s) BOOL peerdist = FALSE; int error = -1; unsigned long disable_redirects = WINHTTP_DISABLE_REDIRECTS; + int default_timeout = -1; + /* Prepare URL */ git_buf_printf(&buf, "%s%s", t->connection_data.path, s->service_url); @@ -240,6 +242,8 @@ static int winhttp_stream_connect(winhttp_stream *s) goto on_error; } + WinHttpSetTimeouts(s->request, default_timeout, default_timeout, default_timeout, default_timeout); + /* Set proxy if necessary */ if (git_remote__get_http_proxy(t->owner->owner, !!t->connection_data.use_ssl, &proxy_url) < 0) goto on_error; @@ -467,6 +471,7 @@ static int winhttp_connect( int32_t port; const char *default_port = "80"; int error = -1; + int default_timeout = -1; /* Prepare port */ if (git__strtol32(&port, t->connection_data.port, NULL, 10) < 0) @@ -491,6 +496,9 @@ static int winhttp_connect( goto on_error; } + WinHttpSetTimeouts(t->session, default_timeout, default_timeout, default_timeout, default_timeout); + + /* Establish connection */ t->connection = WinHttpConnect( t->session, From 86d0a53cd64efd3c7045790ac308d187e5acc625 Mon Sep 17 00:00:00 2001 From: Rafal Nowosielski Date: Wed, 27 Aug 2014 01:30:47 +0200 Subject: [PATCH 2/2] Set timeout on remote (WinHTTP) should return error in case of failure. Connection timeout set to 1 minute. Read/Write timeout remains set to infinite #2147 --- src/transports/winhttp.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/transports/winhttp.c b/src/transports/winhttp.c index b328988f1..6efc01706 100644 --- a/src/transports/winhttp.c +++ b/src/transports/winhttp.c @@ -35,7 +35,8 @@ #define WINHTTP_OPTION_PEERDIST_EXTENSION_STATE 109 #define CACHED_POST_BODY_BUF_SIZE 4096 #define UUID_LENGTH_CCH 32 - +#define TIMEOUT_INFINITE -1 +#define DEFAULT_CONNECT_TIMEOUT 60000 #ifndef WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH #define WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH 0 #endif @@ -212,8 +213,8 @@ static int winhttp_stream_connect(winhttp_stream *s) BOOL peerdist = FALSE; int error = -1; unsigned long disable_redirects = WINHTTP_DISABLE_REDIRECTS; - int default_timeout = -1; - + int default_timeout = TIMEOUT_INFINITE; + int default_connect_timeout = DEFAULT_CONNECT_TIMEOUT; /* Prepare URL */ git_buf_printf(&buf, "%s%s", t->connection_data.path, s->service_url); @@ -242,8 +243,11 @@ static int winhttp_stream_connect(winhttp_stream *s) goto on_error; } - WinHttpSetTimeouts(s->request, default_timeout, default_timeout, default_timeout, default_timeout); - + if (!WinHttpSetTimeouts(s->request, default_timeout, default_connect_timeout, default_timeout, default_timeout)) { + giterr_set(GITERR_OS, "Failed to set timeouts for WinHTTP"); + goto on_error; + } + /* Set proxy if necessary */ if (git_remote__get_http_proxy(t->owner->owner, !!t->connection_data.use_ssl, &proxy_url) < 0) goto on_error; @@ -471,7 +475,8 @@ static int winhttp_connect( int32_t port; const char *default_port = "80"; int error = -1; - int default_timeout = -1; + int default_timeout = TIMEOUT_INFINITE; + int default_connect_timeout = DEFAULT_CONNECT_TIMEOUT; /* Prepare port */ if (git__strtol32(&port, t->connection_data.port, NULL, 10) < 0) @@ -496,7 +501,10 @@ static int winhttp_connect( goto on_error; } - WinHttpSetTimeouts(t->session, default_timeout, default_timeout, default_timeout, default_timeout); + if (!WinHttpSetTimeouts(t->session, default_timeout, default_connect_timeout, default_timeout, default_timeout)) { + giterr_set(GITERR_OS, "Failed to set timeouts for WinHTTP"); + goto on_error; + } /* Establish connection */