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

[PATCH] http/remote-curl: coddle picky servers

From
Tay Ray Chuan <rctay89@gmail.com>
Date
Jan 21, 2010, 14:41 UTC
Message-ID
<20100121224100.624c9c9d.rctay89@gmail.com>
In-Reply-To
<20100121140054.GH18213@onerussian.com>

When "info/refs" is a static file and not behind a CGI handler, some servers may not handle a GET request for it with a query string appended (eg. "?foo=bar") properly.

If such a request fails, retry it sans the query string. In addition, ensure that the "smart" http protocol is not used (a service has to be specified with "?service=<service name>" to be conformant).

Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Reported-and-tested-by: Yaroslav Halchenko <debian@onerussian.com>
---
 remote-curl.c |   18 ++++++++++++++++--
 1 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/remote-curl.c b/remote-curl.c
index 1361006..a904164 100644
--- a/remote-curl.c
+++ b/remote-curl.c
@@ -102,7 +102,7 @@ static struct discovery* discover_refs(const char *service)
 	struct strbuf buffer = STRBUF_INIT;
 	struct discovery *last = last_discovery;
 	char *refs_url;
-	int http_ret, is_http = 0;
+	int http_ret, is_http = 0, proto_git_candidate = 1;

 	if (last && !strcmp(service, last->service))
 		return last;
@@ -121,6 +121,19 @@ static struct discovery* discover_refs(const char *service)

 	init_walker();
 	http_ret = http_get_strbuf(refs_url, &buffer, HTTP_NO_CACHE);
+
+	/* try again with "plain" url (no ? or & appended) */
+	if (http_ret != HTTP_OK) {
+		free(refs_url);
+		strbuf_reset(&buffer);
+
+		proto_git_candidate = 0;
+		strbuf_addf(&buffer, "%s/info/refs", url);
+		refs_url = strbuf_detach(&buffer, NULL);
+
+		http_ret = http_get_strbuf(refs_url, &buffer, HTTP_NO_CACHE);
+	}
+
 	switch (http_ret) {
 	case HTTP_OK:
 		break;
@@ -137,7 +150,8 @@ static struct discovery* discover_refs(const char *service)
 	last->buf_alloc = strbuf_detach(&buffer, &last->len);
 	last->buf = last->buf_alloc;

-	if (is_http && 5 <= last->len && last->buf[4] == '#') {
+	if (is_http && proto_git_candidate
+		&& 5 <= last->len && last->buf[4] == '#') {
 		/* smart HTTP response; validate that the service
 		 * pkt-line matches our request.
 		 */
--
1.6.6.1.337.g96bc8
Previous: Yaroslav HalchenkoNext: Shawn O. Pearce
Message 11 of 28 in “problem cloning via http since v1.6.6-rc0”
  1. Yaroslav HalchenkoJan 21, 2010
  2. Tay Ray ChuanJan 21, 2010
  3. Tay Ray ChuanJan 21, 2010
  4. Yaroslav HalchenkoJan 21, 2010
  5. Tay Ray ChuanJan 21, 2010
  6. Yaroslav HalchenkoJan 21, 2010
  7. Ilari LiusvaaraJan 21, 2010
  8. Tay Ray ChuanJan 21, 2010
  9. Tay Ray ChuanJan 21, 2010
  10. Yaroslav HalchenkoJan 21, 2010
  11. http/remote-curl: coddle picky serversTay Ray Chuan, Jan 21, 2010
  12. Shawn O. PearceJan 21, 2010
  13. Mike HommeyJan 21, 2010
  14. git fetch -v not at all verbose?Michael S. Tsirkin, Jan 21, 2010
  15. Shawn O. PearceJan 21, 2010
  16. Michael S. TsirkinJan 21, 2010
  17. Shawn O. PearceJan 21, 2010
  18. Michael S. TsirkinJan 21, 2010
  19. Thomas RastJan 21, 2010
  20. Junio C HamanoJan 21, 2010
  21. Michael S. TsirkinNov 3, 2010
  22. Junio C HamanoNov 3, 2010
  23. Tay Ray ChuanJan 21, 2010
  24. Shawn O. PearceJan 21, 2010
  25. Mike HommeyJan 21, 2010
  26. Mike HommeyJan 21, 2010
  27. Ilari LiusvaaraJan 21, 2010
  28. Tay Ray ChuanJan 21, 2010

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.