{"thread":{"id":"39023","subject":"[PATCH/RFC] connect.c: Ignore extra colon after hostname","startedAt":"2015-04-07T07:50:26Z","lastAt":"2015-04-07T17:57:50Z","messageCount":2,"participants":["Torsten Bögershausen","Eric Sunshine"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"259118","messageId":"55238C42.7020402@web.de","threadId":"39023","inReplyTo":null,"subject":"[PATCH/RFC] connect.c: Ignore extra colon after hostname","fromName":"Torsten Bögershausen","fromEmail":"tboegi@web.de","sentAt":"2015-04-07T07:50:26Z","receivedAt":"2015-04-07T07:50:26Z","isPatch":true,"sender":{"key":"tboegi@web.de","avatar":"https://avatars.githubusercontent.com/u/7138363?v=4"},"body":"Ignore an extra ':' at the end of the hostname in URL's like\n\"ssh://example.com:/path/to/repo\"\n\nThe colon is ment to separate a port number from the hostname.\nIf the port is empty, the colon should be ignored, see RFC 3986.\n\nIt had been working for URLs with ssh:// scheme, but was unintentionally\nbroken in 86ceb3, \"allow ssh://user@[2001:db8::1]/repo.git\"\n\nReported-by: Reid Woodbury Jr. <reidw@rawsound.com>\nSigned-off-by: Torsten Bögershausen <tboegi@web.de>\n---\nThanks everybody else for comments,\nI was especially not aware about the very details in RFC 3986,\nand now we should have some TC covering the \"now unbroken\". \n\n connect.c             |  2 ++\n t/t5500-fetch-pack.sh | 17 ++++++++++-------\n t/t5601-clone.sh      | 22 +++++++++++++---------\n 3 files changed, 25 insertions(+), 16 deletions(-)\n\ndiff --git a/connect.c b/connect.c\nindex ce0e121..14c924b 100644\n--- a/connect.c\n+++ b/connect.c\n@@ -310,6 +310,8 @@ static void get_host_and_port(char **host, const char **port)\n \t\tif (end != colon + 1 && *end == '\\0' && 0 <= portnr && portnr < 65536) {\n \t\t\t*colon = 0;\n \t\t\t*port = colon + 1;\n+\t\t} else if (!colon[1]) {\n+\t\t\t*colon = 0;\n \t\t}\n \t}\n }\ndiff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh\nindex 692d717..3a9b775 100755\n--- a/t/t5500-fetch-pack.sh\n+++ b/t/t5500-fetch-pack.sh\n@@ -576,13 +576,16 @@ do\n \tdo\n \t\tfor h in host user@host user@[::1] user@::1\n \t\tdo\n-\t\t\ttest_expect_success \"fetch-pack --diag-url $p://$h/$r\" '\n-\t\t\t\tcheck_prot_host_port_path $p://$h/$r $p \"$h\" NONE \"/$r\"\n-\t\t\t'\n-\t\t\t# \"/~\" -> \"~\" conversion\n-\t\t\ttest_expect_success \"fetch-pack --diag-url $p://$h/~$r\" '\n-\t\t\t\tcheck_prot_host_port_path $p://$h/~$r $p \"$h\" NONE \"~$r\"\n-\t\t\t'\n+\t\t\tfor c in \"\" :\n+\t\t\tdo\n+\t\t\t\ttest_expect_success \"fetch-pack --diag-url $p://$h$c/$r\" '\n+\t\t\t\t\tcheck_prot_host_port_path $p://$h/$r $p \"$h\" NONE \"/$r\"\n+\t\t\t\t'\n+\t\t\t\t# \"/~\" -> \"~\" conversion\n+\t\t\t\ttest_expect_success \"fetch-pack --diag-url $p://$h$c/~$r\" '\n+\t\t\t\t\tcheck_prot_host_port_path $p://$h/~$r $p \"$h\" NONE \"~$r\"\n+\t\t\t\t'\n+\t\t\tdone\n \t\tdone\n \t\tfor h in host User@host User@[::1]\n \t\tdo\ndiff --git a/t/t5601-clone.sh b/t/t5601-clone.sh\nindex 02b40b1..1f67bdd 100755\n--- a/t/t5601-clone.sh\n+++ b/t/t5601-clone.sh\n@@ -387,14 +387,18 @@ do\n done\n \n #with ssh:// scheme\n-test_expect_success 'clone ssh://host.xz/home/user/repo' '\n-\ttest_clone_url \"ssh://host.xz/home/user/repo\" host.xz \"/home/user/repo\"\n-'\n-\n-# from home directory\n-test_expect_success 'clone ssh://host.xz/~repo' '\n-\ttest_clone_url \"ssh://host.xz/~repo\" host.xz \"~repo\"\n+#ignore trailing colon\n+for tcol in \"\" :\n+do\n+\ttest_expect_success \"clone ssh://host.xz$tcol/home/user/repo\" '\n+\t\ttest_clone_url \"ssh://host.xz$tcol/home/user/repo\" host.xz /home/user/repo\n+\t'\n+\t# from home directory\n+\ttest_expect_success \"clone ssh://host.xz$tcol/~repo\" '\n+\ttest_clone_url \"ssh://host.xz$tcol/~repo\" host.xz \"~repo\"\n '\n+done\n+test_done\n \n # with port number\n test_expect_success 'clone ssh://host.xz:22/home/user/repo' '\n@@ -407,9 +411,9 @@ test_expect_success 'clone ssh://host.xz:22/~repo' '\n '\n \n #IPv6\n-for tuah in ::1 [::1] user@::1 user@[::1] [user@::1]\n+for tuah in ::1 [::1] [::1]: user@::1 user@[::1] user@[::1]: [user@::1] [user@::1]:\n do\n-\tehost=$(echo $tuah | tr -d \"[]\")\n+\tehost=$(echo $tuah | sed -e \"s/1]:/1]/ \"| tr -d \"[]\")\n \ttest_expect_success \"clone ssh://$tuah/home/user/repo\" \"\n \t  test_clone_url ssh://$tuah/home/user/repo $ehost /home/user/repo\n \t\"\n-- \n2.2.0.rc1.790.ge19fcd2\n"},{"id":"259144","messageId":"CAPig+cQZDPRa=2Oaur71OufeP2ECjOFK3JEwdRQNUYs49SySNg@mail.gmail.com","threadId":"39023","inReplyTo":"55238C42.7020402@web.de","subject":"Re: [PATCH/RFC] connect.c: Ignore extra colon after hostname","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2015-04-07T17:57:50Z","receivedAt":"2015-04-07T17:57:50Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Tue, Apr 7, 2015 at 3:50 AM, Torsten Bögershausen <tboegi@web.de> wrote:\n> Ignore an extra ':' at the end of the hostname in URL's like\n> \"ssh://example.com:/path/to/repo\"\n>\n> The colon is ment to separate a port number from the hostname.\n\ns/ment/meant/\n\nMore below.\n\n> If the port is empty, the colon should be ignored, see RFC 3986.\n>\n> It had been working for URLs with ssh:// scheme, but was unintentionally\n> broken in 86ceb3, \"allow ssh://user@[2001:db8::1]/repo.git\"\n>\n> Reported-by: Reid Woodbury Jr. <reidw@rawsound.com>\n> Signed-off-by: Torsten Bögershausen <tboegi@web.de>\n> ---\n> diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh\n> index 02b40b1..1f67bdd 100755\n> --- a/t/t5601-clone.sh\n> +++ b/t/t5601-clone.sh\n> @@ -387,14 +387,18 @@ do\n>  done\n>\n>  #with ssh:// scheme\n> -test_expect_success 'clone ssh://host.xz/home/user/repo' '\n> -       test_clone_url \"ssh://host.xz/home/user/repo\" host.xz \"/home/user/repo\"\n> -'\n> -\n> -# from home directory\n> -test_expect_success 'clone ssh://host.xz/~repo' '\n> -       test_clone_url \"ssh://host.xz/~repo\" host.xz \"~repo\"\n> +#ignore trailing colon\n> +for tcol in \"\" :\n> +do\n> +       test_expect_success \"clone ssh://host.xz$tcol/home/user/repo\" '\n> +               test_clone_url \"ssh://host.xz$tcol/home/user/repo\" host.xz /home/user/repo\n> +       '\n> +       # from home directory\n> +       test_expect_success \"clone ssh://host.xz$tcol/~repo\" '\n> +       test_clone_url \"ssh://host.xz$tcol/~repo\" host.xz \"~repo\"\n>  '\n> +done\n> +test_done\n\nUnwanted test_done crept in?\n\n>  # with port number\n>  test_expect_success 'clone ssh://host.xz:22/home/user/repo' '\n"}]}