http: avoid disconnecting on 404s for loose objects
404s are common when fetching loose objects on static HTTP servers, and reestablishing a connection for every single 404 adds additional latency. Signed-off-by: Eric Wong <e@80x24.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									43b8bba6b6
								
							
						
					
					
						commit
						17966c0a63
					
				|  | @ -488,6 +488,15 @@ static int fetch_object(struct walker *walker, unsigned char *sha1) | |||
| 		req->localfile = -1; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * we turned off CURLOPT_FAILONERROR to avoid losing a | ||||
| 	 * persistent connection and got CURLE_OK. | ||||
| 	 */ | ||||
| 	if (req->http_code == 404 && req->curl_result == CURLE_OK && | ||||
| 			(starts_with(req->url, "http://") || | ||||
| 			 starts_with(req->url, "https://"))) | ||||
| 		req->curl_result = CURLE_HTTP_RETURNED_ERROR; | ||||
|  | ||||
| 	if (obj_req->state == ABORTED) { | ||||
| 		ret = error("Request for %s aborted", hex); | ||||
| 	} else if (req->curl_result != CURLE_OK && | ||||
|  |  | |||
							
								
								
									
										16
									
								
								http.c
								
								
								
								
							
							
						
						
									
										16
									
								
								http.c
								
								
								
								
							|  | @ -1855,8 +1855,19 @@ static size_t fwrite_sha1_file(char *ptr, size_t eltsize, size_t nmemb, | |||
| 	unsigned char expn[4096]; | ||||
| 	size_t size = eltsize * nmemb; | ||||
| 	int posn = 0; | ||||
| 	struct http_object_request *freq = | ||||
| 		(struct http_object_request *)data; | ||||
| 	struct http_object_request *freq = data; | ||||
| 	struct active_request_slot *slot = freq->slot; | ||||
|  | ||||
| 	if (slot) { | ||||
| 		CURLcode c = curl_easy_getinfo(slot->curl, CURLINFO_HTTP_CODE, | ||||
| 						&slot->http_code); | ||||
| 		if (c != CURLE_OK) | ||||
| 			die("BUG: curl_easy_getinfo for HTTP code failed: %s", | ||||
| 				curl_easy_strerror(c)); | ||||
| 		if (slot->http_code >= 400) | ||||
| 			return size; | ||||
| 	} | ||||
|  | ||||
| 	do { | ||||
| 		ssize_t retval = xwrite(freq->localfile, | ||||
| 					(char *) ptr + posn, size - posn); | ||||
|  | @ -1977,6 +1988,7 @@ struct http_object_request *new_http_object_request(const char *base_url, | |||
| 	freq->slot = get_active_slot(); | ||||
|  | ||||
| 	curl_easy_setopt(freq->slot->curl, CURLOPT_FILE, freq); | ||||
| 	curl_easy_setopt(freq->slot->curl, CURLOPT_FAILONERROR, 0); | ||||
| 	curl_easy_setopt(freq->slot->curl, CURLOPT_WRITEFUNCTION, fwrite_sha1_file); | ||||
| 	curl_easy_setopt(freq->slot->curl, CURLOPT_ERRORBUFFER, freq->errorstr); | ||||
| 	curl_easy_setopt(freq->slot->curl, CURLOPT_URL, freq->url); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Eric Wong
						Eric Wong