From: Junio C Hamano Date: Mon, 28 Oct 2013 17:43:24 +0000 (-0700) Subject: Merge branch 'ew/keepalive' X-Git-Tag: v1.8.5-rc0~23 X-Git-Url: https://www.git.lorimer.id.au/gitweb.git/diff_plain/bb2fd90c7bbb4261aa1800a4c35b06dc5116a647?hp=2d99baab2f054926a1b26f7854fc50b701151bd7 Merge branch 'ew/keepalive' * ew/keepalive: http: use curl's tcp keepalive if available http: enable keepalive on TCP sockets --- diff --git a/http.c b/http.c index f3e1439d58..0ddb164a6f 100644 --- a/http.c +++ b/http.c @@ -260,6 +260,42 @@ static int has_cert_password(void) return 1; } +#if LIBCURL_VERSION_NUM >= 0x071900 +static void set_curl_keepalive(CURL *c) +{ + curl_easy_setopt(c, CURLOPT_TCP_KEEPALIVE, 1); +} + +#elif LIBCURL_VERSION_NUM >= 0x071000 +static int sockopt_callback(void *client, curl_socket_t fd, curlsocktype type) +{ + int ka = 1; + int rc; + socklen_t len = (socklen_t)sizeof(ka); + + if (type != CURLSOCKTYPE_IPCXN) + return 0; + + rc = setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&ka, len); + if (rc < 0) + warning("unable to set SO_KEEPALIVE on socket %s", + strerror(errno)); + + return 0; /* CURL_SOCKOPT_OK only exists since curl 7.21.5 */ +} + +static void set_curl_keepalive(CURL *c) +{ + curl_easy_setopt(c, CURLOPT_SOCKOPTFUNCTION, sockopt_callback); +} + +#else +static void set_curl_keepalive(CURL *c) +{ + /* not supported on older curl versions */ +} +#endif + static CURL *get_curl_handle(void) { CURL *result = curl_easy_init(); @@ -332,6 +368,8 @@ static CURL *get_curl_handle(void) curl_easy_setopt(result, CURLOPT_PROXYAUTH, CURLAUTH_ANY); } + set_curl_keepalive(result); + return result; }