git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/3] http: normalize curl results for dumb loose and alternates fetches

From
Jeff King <peff@peff.net>
Date
Mar 24, 2019, 12:09 UTC
Message-ID
<20190324120946.GB312@sigill.intra.peff.net>
In-Reply-To
<20190324120757.GA18684@sigill.intra.peff.net>

If the dumb-http walker encounters a 404 when fetching a loose object, it then looks at any http-alternates for the object. The 404 check is implemented by missing_target(), which checks not only the http code, but also that we got an http error from the CURLcode.

That broke when we stopped using CURLOPT_FAILONERROR in 17966c0a63 (http: avoid disconnecting on 404s for loose objects, 2016-07-11), since our CURLcode will now be CURLE_OK. As a result, fetching over dumb-http from a repository with alternates could result in Git printing "Unable to find abcd1234..." and aborting.

We could probably fix this just by loosening missing_target(). However, there's other code which looks at the curl result, and it would have to be tweaked as well. Instead, let's just normalize the result the same way the smart-http code does.

There's a similar case in processing the alternates (where we failover from "info/http-alternates" to "info/alternates"). We'll give it the same treatment.

After this patch, we should be hitting all code paths that need this normalization (notably absent here is the http_pack_request path, but it does not use FAILONERROR, nor missing_target()).

Signed-off-by: Jeff King <peff@peff.net>
---
 http-walker.c              |  8 ++++++++
 t/t5550-http-fetch-dumb.sh | 16 ++++++++++++++++
 2 files changed, 24 insertions(+)
diff --git a/http-walker.c b/http-walker.c
index 8ae5d76c6a..745436921d 100644
--- a/http-walker.c
+++ b/http-walker.c
@@ -98,6 +98,11 @@ static void process_object_response(void *callback_data)
 	process_http_object_request(obj_req->req);
 	obj_req->state = COMPLETE;
 
+	normalize_curl_result(&obj_req->req->curl_result,
+			      obj_req->req->http_code,
+			      obj_req->req->errorstr,
+			      sizeof(obj_req->req->errorstr));
+
 	/* Use alternates if necessary */
 	if (missing_target(obj_req->req)) {
 		fetch_alternates(walker, alt->base);
@@ -208,6 +213,9 @@ static void process_alternates_response(void *callback_data)
 	char *data;
 	int i = 0;
 
+	normalize_curl_result(&slot->curl_result, slot->http_code,
+			      curl_errorstr, sizeof(curl_errorstr));
+
 	if (alt_req->http_specific) {
 		if (slot->curl_result != CURLE_OK ||
 		    !alt_req->buffer->len) {
diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh
index 6d7d88ccc9..694b77c855 100755
--- a/t/t5550-http-fetch-dumb.sh
+++ b/t/t5550-http-fetch-dumb.sh
@@ -408,5 +408,21 @@ test_expect_success 'print HTTP error when any intermediate redirect throws erro
 	test_i18ngrep "unable to access.*/redir-to/502" stderr
 '
 
+test_expect_success 'fetching via http alternates works' '
+	parent=$HTTPD_DOCUMENT_ROOT_PATH/alt-parent.git &&
+	git init --bare "$parent" &&
+	git -C "$parent" --work-tree=. commit --allow-empty -m foo &&
+	git -C "$parent" update-server-info &&
+	commit=$(git -C "$parent" rev-parse HEAD) &&
+
+	child=$HTTPD_DOCUMENT_ROOT_PATH/alt-child.git &&
+	git init --bare "$child" &&
+	echo "../../alt-parent.git/objects" >"$child/objects/info/alternates" &&
+	git -C "$child" update-ref HEAD $commit &&
+	git -C "$child" update-server-info &&
+
+	git -c http.followredirects=true clone "$HTTPD_URL/dumb/alt-child.git"
+'
+
 stop_httpd
 test_done
-- 
2.21.0.705.g64cb90f133
Previous: Jeff KingNext: Jeff King
Message 13 of 14 in “[BUG] Cloning with git HEAD fails for some repositories”
  1. Heinrich SchuchardtMar 22, 2019
  2. Jeff KingMar 22, 2019
  3. Wolfgang DenkMar 22, 2019
  4. Jeff KingMar 22, 2019
  5. Eric WongMar 22, 2019
  6. Heinrich SchuchardtMar 22, 2019
  7. Eric WongMar 22, 2019
  8. Heinrich SchuchardtMar 22, 2019
  9. Eric WongMar 22, 2019
  10. Jeff KingMar 23, 2019
  11. 0/3 fix dumb-http fetch with alternatesJeff King, Mar 24, 2019
  12. 1/3 http: factor out curl result code normalizationJeff King, Mar 24, 2019
  13. 2/3 http: normalize curl results for dumb loose and alternates fetchesJeff King, Mar 24, 2019
  14. 3/3 http: use normalize_curl_result() instead of manual conversionJeff King, Mar 24, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.