From 91f66201513a22df03abd3916d8c0698f3a2c009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 18 Jul 2023 14:22:23 +0200 Subject: [PATCH] fix: ensure SERVER_PORT is always set --- cgi.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/cgi.go b/cgi.go index a08f479..5a59b28 100644 --- a/cgi.go +++ b/cgi.go @@ -86,7 +86,7 @@ func populateEnv(request *http.Request) error { if scriptName != "" && !strings.HasPrefix(scriptName, "/") { scriptName = "/" + scriptName } - + if _, ok := fc.Env["PHP_SELF"]; !ok { fc.Env["PHP_SELF"] = fpath } @@ -134,8 +134,18 @@ func populateEnv(request *http.Request) error { // compliance with the CGI specification requires that // SERVER_PORT should only exist if it's a valid numeric value. // Info: https://www.ietf.org/rfc/rfc3875 Page 18 - if !serverPortOk && reqPort != "" { - fc.Env["SERVER_PORT"] = reqPort + if !serverPortOk { + // compliance with the CGI specification requires that + // the SERVER_PORT variable MUST be set to the TCP/IP port number on which this request is received from the client + // even if the port is the default port for the scheme and could otherwise be omitted from a URI. + // https://tools.ietf.org/html/rfc3875#section-4.1.15 + if reqPort != "" { + fc.Env["SERVER_PORT"] = reqPort + } else if fc.Env["REQUEST_SCHEME"] == "http" { + fc.Env["SERVER_PORT"] = "80" + } else if fc.Env["REQUEST_SCHEME"] == "https" { + fc.Env["SERVER_PORT"] = "443" + } } } else if !serverNameOk { // whatever, just assume there was no port