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

[PATCH 2/5] http-backend: handle HTTP_GIT_PROTOCOL CGI variable

From
Jeff King <peff@peff.net>
Date
Sep 10, 2021, 14:05 UTC
Message-ID
<YTtmOfCzvxYrBxso@coredump.intra.peff.net>
In-Reply-To
<YTtleYs48A1NpUpp@coredump.intra.peff.net>

When a client requests the v2 protocol over HTTP, they set the Git-Protocol header. Webservers will generally make that available to our CGI as HTTP_GIT_PROTOCOL in the environment. However, that's not sufficient for upload-pack, etc, to respect it; they look in GIT_PROTOCOL (without the HTTP_ prefix).

Either the webserver or the CGI is responsible for relaying that HTTP header into the GIT_PROTOCOL variable. Traditionally, our tests have configured the webserver to do so, but that's a burden on the server admin. We can make this work out of the box by having the http-backend CGI copy the contents of HTTP_GIT_PROTOCOL to GIT_PROTOCOL.

There are no new tests here. By removing the SetEnvIf line from our test Apache config, we're now relying on this behavior of http-backend to trigger the v2 protocol there (and there are numerous tests that fail if this doesn't work).

There is one subtlety here: we copy HTTP_GIT_PROTOCOL only if there is no existing GIT_PROTOCOL variable. That leaves the webserver admin free to override the client's decision if they choose. This is unlikely to be useful in practice, but is more flexible. And indeed, it allows the v2-to-v0 fallback test added in the previous commit to continue working.

Signed-off-by: Jeff King <peff@peff.net>
---
 http-backend.c          | 4 ++++
 t/lib-httpd/apache.conf | 2 --
 2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/http-backend.c b/http-backend.c
index b329bf63f0..92ceb31f9a 100644
--- a/http-backend.c
+++ b/http-backend.c
@@ -739,6 +739,7 @@ static int bad_request(struct strbuf *hdr, const struct service_cmd *c)
 int cmd_main(int argc, const char **argv)
 {
 	char *method = getenv("REQUEST_METHOD");
+	const char *proto_header;
 	char *dir;
 	struct service_cmd *cmd = NULL;
 	char *cmd_arg = NULL;
@@ -789,6 +790,9 @@ int cmd_main(int argc, const char **argv)
 	http_config();
 	max_request_buffer = git_env_ulong("GIT_HTTP_MAX_REQUEST_BUFFER",
 					   max_request_buffer);
+	proto_header = getenv("HTTP_GIT_PROTOCOL");
+	if (proto_header)
+		setenv(GIT_PROTOCOL_ENVIRONMENT, proto_header, 0);
 
 	cmd->imp(&hdr, cmd_arg);
 	return 0;
diff --git a/t/lib-httpd/apache.conf b/t/lib-httpd/apache.conf
index 1321357d8b..180a41fe96 100644
--- a/t/lib-httpd/apache.conf
+++ b/t/lib-httpd/apache.conf
@@ -81,8 +81,6 @@ PassEnv GIT_TRACE
 PassEnv GIT_CONFIG_NOSYSTEM
 PassEnv GIT_TEST_SIDEBAND_ALL
 
-SetEnvIf Git-Protocol ".*" GIT_PROTOCOL=$0
-
 Alias /dumb/ www/
 Alias /auth/dumb/ www/auth/dumb/
 
-- 
2.33.0.731.g24eb83922d
Previous: Jeff KingNext: Jeff King
Message 13 of 20 in “Docs: web server must setenv GIT_PROTOCOL for v2”
  1. Docs: web server must setenv GIT_PROTOCOL for v2Konstantin Ryabitsev, Sep 4, 2021
  2. Jeff KingSep 4, 2021
  3. Junio C HamanoSep 7, 2021
  4. Konstantin RyabitsevSep 7, 2021
  5. Jeff KingSep 8, 2021
  6. Jeff KingSep 8, 2021
  7. Eric WongSep 8, 2021
  8. Junio C HamanoSep 9, 2021
  9. Junio C HamanoSep 9, 2021
  10. Jeff KingSep 10, 2021
  11. Jeff KingSep 10, 2021
  12. 1/5 t5551: test v2-to-v0 http protocol fallbackJeff King, Sep 10, 2021
  13. 2/5 http-backend: handle HTTP_GIT_PROTOCOL CGI variableJeff King, Sep 10, 2021
  14. 3/5 docs/http-backend: mention v2 protocolJeff King, Sep 10, 2021
  15. 4/5 docs/git: discuss server-side config for GIT_PROTOCOLJeff King, Sep 10, 2021
  16. 5/5 docs/protocol-v2: point readers transport config discussionJeff King, Sep 10, 2021
  17. Junio C HamanoSep 10, 2021
  18. Philippe BlainSep 9, 2021
  19. Junio C HamanoSep 10, 2021
  20. Jeff KingSep 10, 2021

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.