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

[PATCH v6 2/9] connect: only match the host with core.gitProxy

From
Mike Hommey <mh@glandium.org>
Date
May 17, 2016, 01:35 UTC
Message-ID
<20160517013554.22578-3-mh@glandium.org>
In-Reply-To
<20160517013554.22578-1-mh@glandium.org>

Currently, core.gitProxy doesn't actually match purely on domain names as documented: it also matches ports.

So a core.gitProxy value like "script for kernel.org" doesn't make the script called for an url like git://kernel.org:port/path, while it is called for git://kernel.org/path.

This per-port behavior seems like an oversight rather than a deliberate choice, so, make git://kernel.org:port/path call the gitProxy script in the case described above.

However, if people have been relying on this behavior, git now fails with an error message inviting for a configuration change.

Signed-off-by: Mike Hommey <mh@glandium.org>
---
 connect.c              | 20 +++++++++++++++++---
 t/t5532-fetch-proxy.sh |  8 +++++++-
 2 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/connect.c b/connect.c
index d3448c2..0f48cde 100644
--- a/connect.c
+++ b/connect.c
@@ -490,6 +490,8 @@ static void git_tcp_connect(int fd[2], const char *host, const char *port,
 }
 
 
+static char *get_port(char *host);
+
 static char *git_proxy_command;
 
 static int git_proxy_command_options(const char *var, const char *value,
@@ -517,10 +519,14 @@ static int git_proxy_command_options(const char *var, const char *value,
 			/* matches everybody */
 			matchlen = strlen(value);
 		else {
-			hostlen = strlen(for_pos + 5);
+			struct strbuf host = STRBUF_INIT;
+			char *port;
+			strbuf_addstr(&host, for_pos + 5);
+			port = get_port(host.buf);
+			hostlen = strlen(host.buf);
 			if (rhost_len < hostlen)
 				matchlen = -1;
-			else if (!strncmp(for_pos + 5,
+			else if (!strncmp(host.buf,
 					  rhost_name + rhost_len - hostlen,
 					  hostlen) &&
 				 ((rhost_len == hostlen) ||
@@ -528,6 +534,14 @@ static int git_proxy_command_options(const char *var, const char *value,
 				matchlen = for_pos - value;
 			else
 				matchlen = -1;
+			if (matchlen > 0 && port)
+				die("core.gitProxy only supports \"for "
+				    "host/domain\", not \"for host:port\".\n"
+				    "Please change your configuration "
+				    "accordingly.\nPlease note that the port "
+				    "is given as second argument to the proxy "
+				    "script.\n");
+			strbuf_release(&host);
 		}
 		if (0 <= matchlen) {
 			/* core.gitproxy = none for kernel.org */
@@ -706,7 +720,7 @@ struct child_process *git_connect(int fd[2], const char *url,
 		/* These underlying connection commands die() if they
 		 * cannot connect.
 		 */
-		if (git_use_proxy(hostandport))
+		if (git_use_proxy(host))
 			conn = git_proxy_connect(fd, host, port);
 		else
 			git_tcp_connect(fd, host, port, flags);
diff --git a/t/t5532-fetch-proxy.sh b/t/t5532-fetch-proxy.sh
index 51c9669..efa80f8 100755
--- a/t/t5532-fetch-proxy.sh
+++ b/t/t5532-fetch-proxy.sh
@@ -33,7 +33,9 @@ test_expect_success 'setup proxy script' '
 
 test_expect_success 'setup local repo' '
 	git remote add fake git://example.com/remote &&
-	git config core.gitproxy ./proxy
+	git remote add fake_b git://example.org/remote &&
+	git config core.gitproxy "./proxy for example.com" &&
+	git config --add core.gitproxy "./proxy for example.org:9418"
 '
 
 test_expect_success 'fetch through proxy works' '
@@ -43,4 +45,8 @@ test_expect_success 'fetch through proxy works' '
 	test_cmp expect actual
 '
 
+test_expect_success 'core.gitProxy with port fails' '
+	test_must_fail git fetch fake_b
+'
+
 test_done
-- 
2.8.2.411.ga570dec.dirty
Previous: Mike HommeyNext: Junio C Hamano
Message 7 of 17 in “connect: various cleanups”
  1. 0/9 connect: various cleanupsMike Hommey, May 17, 2016
  2. 1/9 connect: call get_host_and_port() earlierMike Hommey, May 17, 2016
  3. Junio C HamanoMay 20, 2016
  4. Mike HommeyMay 20, 2016
  5. Junio C HamanoMay 20, 2016
  6. Mike HommeyMay 20, 2016
  7. 2/9 connect: only match the host with core.gitProxyMike Hommey, May 17, 2016
  8. Junio C HamanoMay 20, 2016
  9. Mike HommeyMay 20, 2016
  10. Junio C HamanoMay 20, 2016
  11. 3/9 connect: fill the host header in the git protocol with the host and port variablesMike Hommey, May 17, 2016
  12. 4/9 connect: make parse_connect_url() return separated host and portMike Hommey, May 17, 2016
  13. 5/9 connect: group CONNECT_DIAG_URL handling codeMike Hommey, May 17, 2016
  14. 6/9 connect: make parse_connect_url() return the user part of the url as a separate valueMike Hommey, May 17, 2016
  15. 7/9 connect: change the --diag-url output to separate user and hostMike Hommey, May 17, 2016
  16. 8/9 connect: actively reject git:// urls with a user partMike Hommey, May 17, 2016
  17. 9/9 connect: move ssh command line preparation to a separate functionMike Hommey, May 17, 2016

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.