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

[PATCH v7 3/9] connect: re-derive a host:port string from the separate host and port variables

From
Mike Hommey <mh@glandium.org>
Date
May 21, 2016, 23:17 UTC
Message-ID
<20160521231732.4888-4-mh@glandium.org>
In-Reply-To
<20160521231732.4888-1-mh@glandium.org>

The last uses of the hostandport variable, besides being strdup'ed before being split into host and port, is to fill the host header in the git protocol and to test whether to proxy the request.

Instead of relying on parse_connect_url() to return a host:port string that makes sense there, re-derive one from the host and port variables. This will allow to refactor parse_connect_url() to return separate host and port strings.

Signed-off-by: Mike Hommey <mh@glandium.org>
---
 connect.c | 31 +++++++++++++++++++++++--------
 1 file changed, 23 insertions(+), 8 deletions(-)
diff --git a/connect.c b/connect.c
index 0cdbeb2..7cdaed1 100644
--- a/connect.c
+++ b/connect.c
@@ -695,18 +695,32 @@ struct child_process *git_connect(int fd[2], const char *url,
 		 * connect, unless the user has overridden us in
 		 * the environment.
 		 */
-		char *target_host = getenv("GIT_OVERRIDE_VIRTUAL_HOST");
-		if (target_host)
-			target_host = xstrdup(target_host);
-		else
-			target_host = xstrdup(hostandport);
+		struct strbuf target_host = STRBUF_INIT;
+		struct strbuf virtual_host = STRBUF_INIT;
+		const char *colon = strchr(host, ':');
+		char *override_vhost = getenv("GIT_OVERRIDE_VIRTUAL_HOST");
+
+		/* If the host contains a colon (ipv6 address), it needs to
+		 * be enclosed with square brackets. */
+		if (colon)
+			strbuf_addch(&target_host, '[');
+		strbuf_addstr(&target_host, host);
+		if (colon)
+			strbuf_addch(&target_host, ']');
+		if (port) {
+			strbuf_addch(&target_host, ':');
+			strbuf_addstr(&target_host, port);
+		}
+
+		strbuf_addstr(&virtual_host, override_vhost ? override_vhost
+							    : target_host.buf);
 
 		transport_check_allowed("git");
 
 		/* These underlying connection commands die() if they
 		 * cannot connect.
 		 */
-		if (git_use_proxy(hostandport))
+		if (git_use_proxy(target_host.buf))
 			conn = git_proxy_connect(fd, host, port);
 		else
 			git_tcp_connect(fd, host, port, flags);
@@ -720,8 +734,9 @@ struct child_process *git_connect(int fd[2], const char *url,
 		packet_write(fd[1],
 			     "%s %s%chost=%s%c",
 			     prog, path, 0,
-			     target_host, 0);
-		free(target_host);
+			     virtual_host.buf, 0);
+		strbuf_release(&virtual_host);
+		strbuf_release(&target_host);
 	} else {
 		conn = xmalloc(sizeof(*conn));
 		child_process_init(conn);
-- 
2.8.3.401.ga81c606.dirty
Previous: Mike HommeyNext: Mike Hommey
Message 13 of 19 in “connect: various cleanups”
  1. 0/9 connect: various cleanupsMike Hommey, May 21, 2016
  2. 1/9 connect: document why we sometimes call get_port after get_host_and_portMike Hommey, May 21, 2016
  3. Eric SunshineMay 22, 2016
  4. Torsten BögershausenMay 22, 2016
  5. Mike HommeyMay 22, 2016
  6. Torsten BögershausenMay 23, 2016
  7. Junio C HamanoMay 23, 2016
  8. Mike HommeyMay 23, 2016
  9. Torsten BögershausenMay 24, 2016
  10. Mike HommeyMay 25, 2016
  11. Torsten BögershausenMay 26, 2016
  12. 2/9 connect: call get_host_and_port() earlierMike Hommey, May 21, 2016
  13. 3/9 connect: re-derive a host:port string from the separate host and port variablesMike Hommey, May 21, 2016
  14. 4/9 connect: make parse_connect_url() return separated host and portMike Hommey, May 21, 2016
  15. 5/9 connect: group CONNECT_DIAG_URL handling codeMike Hommey, May 21, 2016
  16. 6/9 connect: make parse_connect_url() return the user part of the url as a separate valueMike Hommey, May 21, 2016
  17. 7/9 connect: change the --diag-url output to separate user and hostMike Hommey, May 21, 2016
  18. 8/9 connect: actively reject git:// urls with a user partMike Hommey, May 21, 2016
  19. 9/9 connect: move ssh command line preparation to a separate functionMike Hommey, May 21, 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.