commit 4db13c5e462c939ad71bc0d1bf0cdbe117770d54
parent 06a070824c9fcbc590986c1931ca6266463a613f
Author: Christoph Lohmann <20h@r-36.net>
Date: Fri, 6 Jun 2025 21:23:02 +0200
Make CGI environment more conformant to RFC3875.
Diffstat:
M | handlr.c | | | 10 | ++++++++++ |
M | ind.c | | | 62 | ++++++++++++++++++++++++++++++-------------------------------- |
2 files changed, 40 insertions(+), 32 deletions(-)
diff --git a/handlr.c b/handlr.c
@@ -139,6 +139,12 @@ handlebin(int sock, char *file, char *port, char *base, char *args,
}
}
+/*
+ * See RFC3875 5 NPH Scripts
+ *
+ * In gopher, with no header parsing, this allows bi-directional
+ * long-running communications. One example would be raw HTTP emulation.
+ */
void
handlecgi(int sock, char *file, char *port, char *base, char *args,
char *sear, char *ohost, char *chost, char *bhost, int istls,
@@ -188,6 +194,10 @@ handlecgi(int sock, char *file, char *port, char *base, char *args,
}
}
+/*
+ * This is RFC3875 NPH Scripts
+ * plus parsing of GPH syntax for easier gophermap portability.
+ */
void
handledcgi(int sock, char *file, char *port, char *base, char *args,
char *sear, char *ohost, char *chost, char *bhost, int istls,
diff --git a/ind.c b/ind.c
@@ -539,53 +539,52 @@ setcgienviron(char *file, char *path, char *port, char *base, char *args,
char *sear, char *ohost, char *chost, char *bhost, int istls,
char *sel, char *traverse)
{
- /*
- * TODO: Clean environment from possible unsafe environment variables.
- * But then it is the responsibility of the script writer.
- */
- unsetenv("AUTH_TYPE");
+ /* RFC3875 4.1.1 */
+ setenv("AUTH_TYPE", "", 1);
+ /* RFC3875 4.1.2 */
unsetenv("CONTENT_LENGTH");
+ /* RFC3875 4.1.3 */
unsetenv("CONTENT_TYPE");
+ /* RFC3875 4.1.4 */
setenv("GATEWAY_INTERFACE", "CGI/1.1", 1);
- /* TODO: Separate, if run like rest.dcgi. */
- setenv("SCRIPT_NAME", path+strlen(base), 1);
- setenv("SCRIPT_FILENAME", path, 1);
-
- setenv("QUERY_STRING", args, 1);
- setenv("SELECTOR", sel, 1);
- setenv("REQUEST", sel, 1);
+ /* RFC3875 4.1.5 */
setenv("PATH_INFO", traverse, 1);
-
+ /* RFC3875 4.1.6 */
+ setenv("PATH_TRANSLATED", traverse, 1);
+ /* RFC3875 4.1.7 */
+ setenv("QUERY_STRING", args, 1);
+ /* RFC3875 4.1.8 */
setenv("REMOTE_ADDR", chost, 1);
- /*
- * Don't do a reverse lookup on every call. Only do when needed, in
- * the script. The RFC allows us to set the IP to the value.
- */
+ /* RFC3875 4.1.9 */
setenv("REMOTE_HOST", chost, 1);
- /* Please do not implement identd here. */
+ /* RFC3875 4.1.10 */
unsetenv("REMOTE_IDENT");
+ /* RFC3875 4.1.11 */
unsetenv("REMOTE_USER");
- /* Make PHP happy. */
- setenv("REDIRECT_STATUS", "", 1);
- /*
- * Only GET is possible in gopher. POST emulation would be really
- * ugly.
- */
+ /* RFC3875 4.1.12 */
setenv("REQUEST_METHOD", "GET", 1);
+ /* RFC3875 4.1.13 */
+ setenv("SCRIPT_NAME", path+strlen(base), 1);
+ /* RFC3875 4.1.14 */
setenv("SERVER_NAME", ohost, 1);
+ /* RFC3875 4.1.15 */
setenv("SERVER_PORT", port, 1);
- setenv("SERVER_LISTEN_NAME", bhost, 1);
- if (istls) {
- setenv("SERVER_PROTOCOL", "gophers/1.0", 1);
- } else {
- setenv("SERVER_PROTOCOL", "gopher/1.0", 1);
- }
+ /* RFC3875 4.1.16 */
+ setenv("SERVER_PROTOCOL", "gopher/1.0", 1);
+ /* RFC3875 4.1.17 */
setenv("SERVER_SOFTWARE", "geomyidae", 1);
- setenv("X_GOPHER_SEARCH", sear, 1);
+ /* GOPHER-specific variables */
+ setenv("GOPHER_SELECTOR", sel, 1);
+ setenv("GOPHER_REQUEST", sel, 1);
+ setenv("GOPHER_SEARCH", sear, 1);
/* legacy compatibility */
setenv("SEARCHREQUEST", sear, 1);
+ setenv("SCRIPT_FILENAME", path, 1);
+ /* Make PHP happy. */
+ setenv("REDIRECT_STATUS", "", 1);
+ setenv("SERVER_LISTEN_NAME", bhost, 1);
if (istls) {
setenv("GOPHERS", "on", 1);
setenv("HTTPS", "on", 1);
@@ -593,7 +592,6 @@ setcgienviron(char *file, char *path, char *port, char *base, char *args,
unsetenv("GOPHERS");
unsetenv("HTTPS");
}
-
}
char *