URI: 
       Make CGI environment more conformant to RFC3875. - geomyidae - A small C-based gopherd.
  HTML git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
   DIR LICENSE
       ---
   DIR commit 4db13c5e462c939ad71bc0d1bf0cdbe117770d54
   DIR parent 06a070824c9fcbc590986c1931ca6266463a613f
  HTML 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(-)
       ---
   DIR 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,
   DIR 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 *