Re: [PATCH] Docs: web server must setenv GIT_PROTOCOL for v2
From: Junio C Hamano <hidden>
Date: 2021-09-09 17:28:54
Jeff King [off-list ref] writes:
On Wed, Sep 08, 2021 at 06:48:47AM -0400, Jeff King wrote:quoted
Both of the included examples here have been tested to work. The one for lighttpd is a little less direct than I'd like, but I couldn't find a way to directly set an environment variable to the value of a request header. From my reading of the documentation, lighttpd will set HTTP_GIT_PROTOCOL automatically, but git-http-backend looks only at GIT_PROTOCOL. Arguably http-backend should do this translation itself.
Nice. These headers get HTTP_* prefixed as a security measure when servers expose them to their configuration mechanisms because these names are attacker controlled. I had a flawed mental model in which the servers' configuration controls which one of these resulting HTTP_* headers are passed to CGI and externals selectively, but if servers pass all HTTP_* environment variables to CGI and externals without any filtering, the patch you gave here is the most logical solution. Will queue.
quoted hunk
-- >8 -- Subject: [PATCH] http-backend: handle HTTP_GIT_PROTOCOL CGI variable When a client requests the v2 protocol over HTTP, they set the Git-Protocol header. Webservers will generaly 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. Signed-off-by: Jeff King <redacted> --- 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..2f4b4c11de 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, 1); cmd->imp(&hdr, cmd_arg); return 0;diff --git a/t/lib-httpd/apache.conf b/t/lib-httpd/apache.conf index afa91e38b0..71761e3299 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/