http: enable keepalive on TCP sockets
This is a follow up to commit e47a8583 (enable SO_KEEPALIVE for
connected TCP sockets, 2011-12-06).
Sockets may never receive notification of some link errors,
causing "git fetch" or similar processes to hang forever.
Enabling keepalive messages allows hung processes to error out
after a few minutes/hours depending on the keepalive settings of
the system.
I noticed this problem with some non-interactive cronjobs getting
hung when talking to HTTP servers.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
			
			
				maint
			
			
		
							parent
							
								
									e47a8583a2
								
							
						
					
					
						commit
						a15d069a19
					
				
							
								
								
									
										22
									
								
								http.c
								
								
								
								
							
							
						
						
									
										22
									
								
								http.c
								
								
								
								
							|  | @ -233,6 +233,24 @@ static int has_cert_password(void) | |||
| 		return 0; | ||||
| } | ||||
|  | ||||
| /* curl 7.25.0 has CURLOPT_TCP_KEEPALIVE, too, but we support older curl */ | ||||
| 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 CURL *get_curl_handle(void) | ||||
| { | ||||
| 	CURL *result = curl_easy_init(); | ||||
|  | @ -298,6 +316,10 @@ static CURL *get_curl_handle(void) | |||
| 	if (curl_http_proxy) | ||||
| 		curl_easy_setopt(result, CURLOPT_PROXY, curl_http_proxy); | ||||
|  | ||||
| #if LIBCURL_VERSION_NUM >= 0x071000 | ||||
| 	curl_easy_setopt(result, CURLOPT_SOCKOPTFUNCTION, sockopt_callback); | ||||
| #endif | ||||
|  | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Eric Wong
						Eric Wong