All of lore.kernel.org
 help / color / mirror / Atom feed
From: Josh Steadmon <steadmon@google.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, sbeller@google.com, jonathantanmy@google.com,
	szeder.dev@gmail.com
Subject: [PATCH v5 0/1] Advertise multiple supported proto versions
Date: Fri, 16 Nov 2018 14:34:37 -0800	[thread overview]
Message-ID: <cover.1542407348.git.steadmon@google.com> (raw)
In-Reply-To: <cover.1542162201.git.steadmon@google.com>

Changes from V4: remove special cases around advertising version=0.

Add a registry of supported wire protocol versions that individual
commands can use to declare supported versions before contacting a
server. The client will then advertise all supported versions, while the
server will choose the first allowed version from the advertised
list.

Every command that acts as a client or server must now register its
supported protocol versions.


Josh Steadmon (1):
  protocol: advertise multiple supported versions

 builtin/archive.c           |   3 +
 builtin/clone.c             |   4 ++
 builtin/fetch-pack.c        |   4 ++
 builtin/fetch.c             |   5 ++
 builtin/ls-remote.c         |   5 ++
 builtin/pull.c              |   5 ++
 builtin/push.c              |   4 ++
 builtin/receive-pack.c      |   3 +
 builtin/send-pack.c         |   3 +
 builtin/upload-archive.c    |   3 +
 builtin/upload-pack.c       |   4 ++
 connect.c                   |  52 +++++++--------
 protocol.c                  | 122 +++++++++++++++++++++++++++++++++---
 protocol.h                  |  23 ++++++-
 remote-curl.c               |  27 +++++---
 t/t5551-http-fetch-smart.sh |   1 +
 t/t5570-git-daemon.sh       |   2 +-
 t/t5601-clone.sh            |  38 +++++------
 t/t5700-protocol-v1.sh      |   8 +--
 t/t5702-protocol-v2.sh      |  16 +++--
 transport-helper.c          |   6 ++
 21 files changed, 256 insertions(+), 82 deletions(-)

Range-diff against v4:
1:  3c023991c0 ! 1:  60f6f2fbd8 protocol: advertise multiple supported versions
    @@ -21,6 +21,12 @@
         Clients now advertise the full list of registered versions. Servers
         select the first allowed version from this advertisement.
     
    +    Additionally, remove special cases around advertising version=0.
    +    Previously we avoided adding version negotiation fields in server
    +    responses if it looked like the client wanted v0. However, including
    +    these fields does not change behavior, so it's better to have simpler
    +    code.
    +
         While we're at it, remove unnecessary externs from function declarations
         in protocol.h.
     
    @@ -245,18 +251,21 @@
      {
      	struct child_process *conn;
     @@
    + 		    prog, path, 0,
      		    target_host, 0);
      
    - 	/* If using a new version put that stuff here after a second null byte */
    +-	/* If using a new version put that stuff here after a second null byte */
     -	if (version > 0) {
    -+	if (strcmp(version_advert->buf, "version=0")) {
    - 		strbuf_addch(&request, '\0');
    +-		strbuf_addch(&request, '\0');
     -		strbuf_addf(&request, "version=%d%c",
     -			    version, '\0');
    -+		strbuf_addf(&request, "%s%c", version_advert->buf, '\0');
    - 	}
    +-	}
    ++	/* Add version fields after a second null byte */
    ++	strbuf_addch(&request, '\0');
    ++	strbuf_addf(&request, "%s%c", version_advert->buf, '\0');
      
      	packet_write(fd[1], request.buf, request.len);
    + 
     @@
       */
      static void push_ssh_options(struct argv_array *args, struct argv_array *env,
    @@ -264,9 +273,9 @@
     -			     enum protocol_version version, int flags)
     +			     const struct strbuf *version_advert, int flags)
      {
    - 	if (variant == VARIANT_SSH &&
    +-	if (variant == VARIANT_SSH &&
     -	    version > 0) {
    -+	    strcmp(version_advert->buf, "version=0")) {
    ++	if (variant == VARIANT_SSH) {
      		argv_array_push(args, "-o");
      		argv_array_push(args, "SendEnv=" GIT_PROTOCOL_ENVIRONMENT);
     -		argv_array_pushf(env, GIT_PROTOCOL_ENVIRONMENT "=version=%d",
    @@ -346,13 +355,13 @@
     -			if (version > 0) {
     -				argv_array_pushf(&conn->env_array, GIT_PROTOCOL_ENVIRONMENT "=version=%d",
     -						 version);
    -+			if (strcmp(version_advert.buf, "version=0")) {
    -+				argv_array_pushf(&conn->env_array,
    -+						 GIT_PROTOCOL_ENVIRONMENT "=%s",
    -+						 version_advert.buf);
    - 			}
    +-			}
    ++			argv_array_pushf(&conn->env_array,
    ++					 GIT_PROTOCOL_ENVIRONMENT "=%s",
    ++					 version_advert.buf);
      		}
      		argv_array_push(&conn->args, cmd.buf);
    + 
     
      diff --git a/protocol.c b/protocol.c
      --- a/protocol.c
    @@ -573,8 +582,7 @@
     +static int get_client_protocol_http_header(const struct strbuf *version_advert,
     +					   struct strbuf *header)
     +{
    -+	if (version_advert->len > 0 &&
    -+	    strcmp(version_advert->buf, "version=0")) {
    ++	if (version_advert->len > 0) {
     +		strbuf_addf(header, GIT_PROTOCOL_HEADER ": %s",
     +			    version_advert->buf);
     +
    @@ -629,6 +637,18 @@
      	if (argc < 2) {
      		error("remote-curl: usage: git remote-curl <remote> [<url>]");
     
    + diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh
    + --- a/t/t5551-http-fetch-smart.sh
    + +++ b/t/t5551-http-fetch-smart.sh
    +@@
    + > Accept: */*
    + > Accept-Encoding: ENCODINGS
    + > Pragma: no-cache
    ++> Git-Protocol: version=0
    + < HTTP/1.1 200 OK
    + < Pragma: no-cache
    + < Cache-Control: no-cache, max-age=0, must-revalidate
    +
      diff --git a/t/t5570-git-daemon.sh b/t/t5570-git-daemon.sh
      --- a/t/t5570-git-daemon.sh
      +++ b/t/t5570-git-daemon.sh
    @@ -642,6 +662,161 @@
      	>daemon.log &&
      	GIT_OVERRIDE_VIRTUAL_HOST=localhost \
     
    + diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
    + --- a/t/t5601-clone.sh
    + +++ b/t/t5601-clone.sh
    +@@
    + 
    + test_expect_success 'clone myhost:src uses ssh' '
    + 	git clone myhost:src ssh-clone &&
    +-	expect_ssh myhost src
    ++	expect_ssh "-o SendEnv=GIT_PROTOCOL" myhost src
    + '
    + 
    + test_expect_success !MINGW,!CYGWIN 'clone local path foo:bar' '
    +@@
    + 
    + test_expect_success 'bracketed hostnames are still ssh' '
    + 	git clone "[myhost:123]:src" ssh-bracket-clone &&
    +-	expect_ssh "-p 123" myhost src
    ++	expect_ssh "-o SendEnv=GIT_PROTOCOL -p 123" myhost src
    + '
    + 
    + test_expect_success 'OpenSSH variant passes -4' '
    + 	git clone -4 "[myhost:123]:src" ssh-ipv4-clone &&
    +-	expect_ssh "-4 -p 123" myhost src
    ++	expect_ssh "-o SendEnv=GIT_PROTOCOL -4 -p 123" myhost src
    + '
    + 
    + test_expect_success 'variant can be overridden' '
    +@@
    + 	GIT_SSH="$TRASH_DIRECTORY/uplink" &&
    + 	test_when_finished "GIT_SSH=\"\$TRASH_DIRECTORY/ssh\$X\"" &&
    + 	git clone "[myhost:123]:src" ssh-bracket-clone-sshlike-uplink &&
    +-	expect_ssh "-p 123" myhost src
    ++	expect_ssh "-o SendEnv=GIT_PROTOCOL -p 123" myhost src
    + '
    + 
    + test_expect_success 'plink is treated specially (as putty)' '
    +@@
    + 	copy_ssh_wrapper_as "$TRASH_DIRECTORY/plink" &&
    + 	GIT_SSH_VARIANT=ssh \
    + 	git clone "[myhost:123]:src" ssh-bracket-clone-variant-1 &&
    +-	expect_ssh "-p 123" myhost src
    ++	expect_ssh "-o SendEnv=GIT_PROTOCOL -p 123" myhost src
    + '
    + 
    + test_expect_success 'ssh.variant overrides plink detection' '
    + 	copy_ssh_wrapper_as "$TRASH_DIRECTORY/plink" &&
    + 	git -c ssh.variant=ssh \
    + 		clone "[myhost:123]:src" ssh-bracket-clone-variant-2 &&
    +-	expect_ssh "-p 123" myhost src
    ++	expect_ssh "-o SendEnv=GIT_PROTOCOL -p 123" myhost src
    + '
    + 
    + test_expect_success 'GIT_SSH_VARIANT overrides plink detection to plink' '
    +@@
    + }
    + 
    + test_expect_success !MINGW 'clone c:temp is ssl' '
    +-	test_clone_url c:temp c temp
    ++	test_clone_url c:temp "-o SendEnv=GIT_PROTOCOL" c temp
    + '
    + 
    + test_expect_success MINGW 'clone c:temp is dos drive' '
    +@@
    + for repo in rep rep/home/project 123
    + do
    + 	test_expect_success "clone host:$repo" '
    +-		test_clone_url host:$repo host $repo
    ++		test_clone_url host:$repo "-o SendEnv=GIT_PROTOCOL" host $repo
    + 	'
    + done
    + 
    +@@
    + for repo in rep rep/home/project 123
    + do
    + 	test_expect_success "clone [::1]:$repo" '
    +-		test_clone_url [::1]:$repo ::1 "$repo"
    ++		test_clone_url [::1]:$repo "-o SendEnv=GIT_PROTOCOL" ::1 "$repo"
    + 	'
    + done
    + #home directory
    + test_expect_success "clone host:/~repo" '
    +-	test_clone_url host:/~repo host "~repo"
    ++	test_clone_url host:/~repo "-o SendEnv=GIT_PROTOCOL" host "~repo"
    + '
    + 
    + test_expect_success "clone [::1]:/~repo" '
    +-	test_clone_url [::1]:/~repo ::1 "~repo"
    ++	test_clone_url [::1]:/~repo "-o SendEnv=GIT_PROTOCOL" ::1 "~repo"
    + '
    + 
    + # Corner cases
    +@@
    + for tcol in "" :
    + do
    + 	test_expect_success "clone ssh://host.xz$tcol/home/user/repo" '
    +-		test_clone_url "ssh://host.xz$tcol/home/user/repo" host.xz /home/user/repo
    ++		test_clone_url "ssh://host.xz$tcol/home/user/repo" "-o SendEnv=GIT_PROTOCOL" host.xz /home/user/repo
    + 	'
    + 	# from home directory
    + 	test_expect_success "clone ssh://host.xz$tcol/~repo" '
    +-	test_clone_url "ssh://host.xz$tcol/~repo" host.xz "~repo"
    ++	test_clone_url "ssh://host.xz$tcol/~repo" "-o SendEnv=GIT_PROTOCOL" host.xz "~repo"
    + '
    + done
    + 
    + # with port number
    + test_expect_success 'clone ssh://host.xz:22/home/user/repo' '
    +-	test_clone_url "ssh://host.xz:22/home/user/repo" "-p 22 host.xz" "/home/user/repo"
    ++	test_clone_url "ssh://host.xz:22/home/user/repo" "-o SendEnv=GIT_PROTOCOL -p 22 host.xz" "/home/user/repo"
    + '
    + 
    + # from home directory with port number
    + test_expect_success 'clone ssh://host.xz:22/~repo' '
    +-	test_clone_url "ssh://host.xz:22/~repo" "-p 22 host.xz" "~repo"
    ++	test_clone_url "ssh://host.xz:22/~repo" "-o SendEnv=GIT_PROTOCOL -p 22 host.xz" "~repo"
    + '
    + 
    + #IPv6
    +@@
    + do
    + 	ehost=$(echo $tuah | sed -e "s/1]:/1]/" | tr -d "[]")
    + 	test_expect_success "clone ssh://$tuah/home/user/repo" "
    +-	  test_clone_url ssh://$tuah/home/user/repo $ehost /home/user/repo
    ++	  test_clone_url ssh://$tuah/home/user/repo '-o SendEnv=GIT_PROTOCOL' $ehost /home/user/repo
    + 	"
    + done
    + 
    +@@
    + do
    + 	euah=$(echo $tuah | tr -d "[]")
    + 	test_expect_success "clone ssh://$tuah/~repo" "
    +-	  test_clone_url ssh://$tuah/~repo $euah '~repo'
    ++	  test_clone_url ssh://$tuah/~repo '-o SendEnv=GIT_PROTOCOL' $euah '~repo'
    + 	"
    + done
    + 
    +@@
    + do
    + 	euah=$(echo $tuah | tr -d "[]")
    + 	test_expect_success "clone ssh://$tuah:22/home/user/repo" "
    +-	  test_clone_url ssh://$tuah:22/home/user/repo '-p 22' $euah /home/user/repo
    ++	  test_clone_url ssh://$tuah:22/home/user/repo '-o SendEnv=GIT_PROTOCOL -p 22' $euah /home/user/repo
    + 	"
    + done
    + 
    +@@
    + do
    + 	euah=$(echo $tuah | tr -d "[]")
    + 	test_expect_success "clone ssh://$tuah:22/~repo" "
    +-	  test_clone_url ssh://$tuah:22/~repo '-p 22' $euah '~repo'
    ++	  test_clone_url ssh://$tuah:22/~repo '-o SendEnv=GIT_PROTOCOL -p 22' $euah '~repo'
    + 	"
    + done
    + 
    +
      diff --git a/t/t5700-protocol-v1.sh b/t/t5700-protocol-v1.sh
      --- a/t/t5700-protocol-v1.sh
      +++ b/t/t5700-protocol-v1.sh
-- 
2.19.1.1215.g8438c0b245-goog


  parent reply	other threads:[~2018-11-16 22:34 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-02 21:59 [PATCH 0/1] Limit client version advertisements Josh Steadmon
2018-10-02 21:59 ` [PATCH 1/1] protocol: limit max protocol version per service Josh Steadmon
2018-10-02 22:28   ` Stefan Beller
2018-10-03 21:33     ` Josh Steadmon
2018-10-03 22:47       ` Stefan Beller
2018-10-05  0:18         ` Josh Steadmon
2018-10-05 19:25           ` Stefan Beller
2018-10-10 23:53             ` Josh Steadmon
2018-10-12 23:30               ` Jonathan Nieder
2018-10-12 23:32               ` Jonathan Nieder
2018-10-12 23:45                 ` Josh Steadmon
2018-10-12 23:53                   ` Jonathan Nieder
2018-10-13  7:58                     ` Junio C Hamano
2018-10-12  1:02 ` [PATCH v2 0/1] Advertise multiple supported proto versions steadmon
2018-10-12  1:02   ` [PATCH v2 1/1] protocol: advertise multiple supported versions steadmon
2018-10-12 22:30     ` Stefan Beller
2018-10-22 22:55       ` Josh Steadmon
2018-10-23  0:37         ` Stefan Beller
2018-11-12 21:49   ` [PATCH v3 0/1] Advertise multiple supported proto versions steadmon
2018-11-12 21:49     ` [PATCH v3 1/1] protocol: advertise multiple supported versions steadmon
2018-11-12 22:33       ` Stefan Beller
2018-11-13  3:24         ` Re* " Junio C Hamano
2018-11-13 19:21           ` Stefan Beller
2018-11-14  2:31             ` Junio C Hamano
2018-11-13  4:01       ` Junio C Hamano
2018-11-13 22:53         ` Josh Steadmon
2018-11-14  2:38           ` Junio C Hamano
2018-11-14 19:57             ` Josh Steadmon
2018-11-16  2:45               ` Junio C Hamano
2018-11-16 19:59                 ` Josh Steadmon
2018-11-13 13:35       ` Junio C Hamano
2018-11-13 18:28       ` SZEDER Gábor
2018-11-13 23:03         ` Josh Steadmon
2018-11-14  0:47           ` SZEDER Gábor
2018-11-14  2:44         ` Junio C Hamano
2018-11-14 11:01           ` SZEDER Gábor
2018-11-14  2:30     ` [PATCH v4 0/1] Advertise multiple supported proto versions Josh Steadmon
2018-11-14  2:30       ` [PATCH v4 1/1] protocol: advertise multiple supported versions Josh Steadmon
2018-11-14 10:22       ` [PATCH v4 0/1] Advertise multiple supported proto versions Junio C Hamano
2018-11-14 19:51         ` Josh Steadmon
2018-11-16 10:46           ` Junio C Hamano
2018-11-16 22:34       ` Josh Steadmon [this message]
2018-11-16 22:34         ` [PATCH v5 1/1] protocol: advertise multiple supported versions Josh Steadmon
2018-12-14 20:20           ` Ævar Arnfjörð Bjarmason
2018-12-14 21:58             ` Josh Steadmon
2018-12-14 22:39               ` Ævar Arnfjörð Bjarmason
2018-12-18 23:05                 ` Josh Steadmon
2018-12-20 21:58 ` [PATCH v6 0/1] Advertise multiple supported proto versions Josh Steadmon
2018-12-20 21:58   ` [PATCH v6 1/1] protocol: advertise multiple supported versions Josh Steadmon
2019-02-05 19:42     ` Jonathan Tan
2019-02-07 23:58       ` Josh Steadmon
2019-02-11 18:53         ` Jonathan Tan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cover.1542407348.git.steadmon@google.com \
    --to=steadmon@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jonathantanmy@google.com \
    --cc=sbeller@google.com \
    --cc=szeder.dev@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.