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

Re: git http-push and MKCOL error (22/409)

From
Tay Ray Chuan <rctay89@gmail.com>
Date
Aug 17, 2009, 09:09 UTC
Message-ID
<20090817170943.180dbedd.rctay89@gmail.com>
In-Reply-To
<200908170725.09592.thomas.schlichter@web.de>
Hi,
On Mon, Aug 17, 2009 at 1:25 PM, Thomas Schlichter<thomas.schlichter@web.de> wrote:
Show 9 quoted lines
> Hmm. I hope you won't take this as an argument for not fixing it, because it
> is a clear regression! I tried git version 1.6.3.4, and it works flawlessly
> with exactly this server! Even during bisecting, some versions worked, some
> didn't (these after the mentioned commit...)
>
> So I think this commit didn't only refactor things, but unintentionally
> changed the behavior. And this must be the problem. As I'm not into this code,
> and the refactoring was not completely trivial, I was not able to quickly find
> the place where the behavior was changed...

Thomas, indeed you're right about this, the commit you noted in your earlier email (5424bc5) was indeed at fault.

The commit changed how urls was handled, and resulted (incorrectly) in an extra slash being added to the url. In other words, urls now look like this:

  http://server/repo.git//objects/2a/

This problem occurs only in http-push.c, because repo urls (http://server/repo.git) are always made to end with a slash there.

Btw, on my Apache 2.2.x server, this didn't crop up when I tested, while Thomas worked with a 2.0.x.

I've attached a patch below that hopefully fixes it.
-- >8 --
Subject: [PATCH] http.c: don't assume that urls don't end with slash

Make append_remote_object_url() (and by implication, get_remote_object_url) use end_url_with_slash() to ensure that the url ends with a slash.

Previously, they assumed that the url did not end with a slash and as a result appended a slash, sometimes errorneously.

This fixes an issue introduced in 5424bc5 ("http*: add helper methods for fetching objects (loose)"), where the append_remote_object_url() implementation in http-push.c, which assumed that urls end with a slash, was replaced by another one in http.c, which assumed urls did not end with a slash.

The above issue was raised by Thomas Schlichter:
  http://marc.info/?l=git&m=125043105231327
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
---
 http.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/http.c b/http.c
index 14d5357..eb0c669 100644
--- a/http.c
+++ b/http.c
@@ -719,7 +719,9 @@ void append_remote_object_url(struct strbuf *buf, const char *url,
 			      const char *hex,
 			      int only_two_digit_prefix)
 {
-	strbuf_addf(buf, "%s/objects/%.*s/", url, 2, hex);
+	end_url_with_slash(buf, url);
+
+	strbuf_addf(buf, "objects/%.*s/", 2, hex);
 	if (!only_two_digit_prefix)
 		strbuf_addf(buf, "%s", hex+2);
 }
--
1.6.4.dirty
Previous: Junio C HamanoNext: Thomas Schlichter
Message 11 of 12 in “git http-push and MKCOL error (22/409)”
  1. Thomas SchlichterAug 16, 2009
  2. Tay Ray ChuanAug 16, 2009
  3. Thomas SchlichterAug 16, 2009
  4. Tay Ray ChuanAug 17, 2009
  5. Thomas SchlichterAug 17, 2009
  6. Thomas SchlichterAug 17, 2009
  7. Junio C HamanoAug 16, 2009
  8. Tay Ray ChuanAug 17, 2009
  9. Thomas SchlichterAug 17, 2009
  10. Junio C HamanoAug 17, 2009
  11. Tay Ray ChuanAug 17, 2009
  12. Thomas SchlichterAug 17, 2009

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.