> Christopher Zimmermann wrote:
> 
> Tim Baumgard wrote:
>> The current behavior is redundant since SCRIPT_NAME, which is in the
>> RFC, and DOCUMENT_URI are always set to the same thing.
> 
> That's not always the case. DOCUMENT_URI is SCRIPT_NAME ^ PATH_INFO.
> If you want the original URI, you can always use REQUEST_URI and strip
> the query string, which is easy to do.

Right, it's using scriptlen in strndup(), which is explained a few lines
up in the code... Sorry for the noise on that.

>> So, instead of
>> considering what I sent previously, here's a diff for the
>> httpd.conf(5) man page that adds a list of the variables (and their
>> descriptions) that are given to the FastCGI handler. Making the
>> behavior for these values explicit should avoid any similar
>> confusion, and I'm sure it would be helpful in other ways as well.
> 
> Thanks for the effort. This will indeed be helpfull for many users.
> 
>> +.It Ic DOCUMENT_URI
>> +The URI path to the script.
> 
> Rather the canonicalised URI, possibly with '/' and/or index appended.
> NOT necessarily the path to the script; neither virtual nor physical (see 
> above).
> 
>> +.It Ic GATEWAY_INTERFACE
>> +The revision of the CGI specification used.
>> +.It Ic HTTP_*
>> +Additional HTTP headers the connected client sent in the request, if
>> +any.
>> +.It Ic HTTPS
>> +A variable that is set to
>> +.Qq on
>> +when the server has been configured to use TLS. This variable is not
>> +given otherwise.
> 
> Put REQUEST_PATH, DOCUMENT_URI, SCRIPT_NAME, PATH_INFO and
> SCRIPT_FILENAME here, they are best understood in context of each other.
> 
>> +.It Ic REQUEST_URI
>> +The request path and optional query string.
> 
> The _original_ request path.
> 
>> +.It Ic SCRIPT_FILENAME
>> +The absolute path to the script within the
>> +.Xr chroot 2
>> +directory.
> 
> Maybe add "physical path" ?
> 
>> +.It Ic SCRIPT_NAME
>> +The URI path to the script.
> 
> The RFC calls this "virtual".

Below is an updated diff for the man page to address your feedback. I
also included another small diff that fixes the QUERY_STRING variable
when no query string is given. The RFC states:

The server MUST set this variable; if the Script-URI does not include a
query component, the QUERY_STRING MUST be defined as an empty string
("").

(https://tools.ietf.org/html/rfc3875#section-4.1.7)

nginx follows the RFC, so I'm assuming that httpd's behavior is a
bug. The man page diff takes this change into account.


Index: httpd.conf.5
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/httpd.conf.5,v
retrieving revision 1.68
diff -u -p -r1.68 httpd.conf.5
--- httpd.conf.5        19 Jul 2015 05:17:27 -0000      1.68
+++ httpd.conf.5        18 Apr 2016 01:26:18 -0000
@@ -274,6 +274,62 @@ root directory of
 .Xr httpd 8
 and defaults to
 .Pa /run/slowcgi.sock .
+.Pp
+The FastCGI handler will be given the following variables:
+.Pp
+.Bl -tag -width GATEWAY_INTERFACE -offset indent -compact
+.It Ic DOCUMENT_ROOT
+The document root in which the script is located as configured by the
+.Ic root
+option for the server or location that matches the request.
+.It Ic GATEWAY_INTERFACE
+The revision of the CGI specification used.
+.It Ic HTTP_*
+Additional HTTP headers the connected client sent in the request, if
+any.
+.It Ic HTTPS
+A variable that is set to
+.Qq on
+when the server has been configured to use TLS. This variable is
+omitted otherwise.
+.It Ic REQUEST_URI
+The path and optional query string as requested by the connected client.
+.It Ic DOCUMENT_URI
+The canonicalized URI for the script, possibly with a slash or
+directory index file name appended.
+.It Ic SCRIPT_NAME
+The virtual URI path to the script.
+.It Ic PATH_INFO
+The optional path appended after the script name in the request path.
+This variable is an empty string if no path is appended after the
+script name.
+.It Ic SCRIPT_FILENAME
+The absolute, physical path to the script within the
+.Xr chroot 2
+directory.
+.It Ic QUERY_STRING
+The optional query string of the request. This variable is an empty
+string if there is no query string in the request.
+.It Ic REMOTE_ADDR
+The IP address of the connected client.
+.It Ic REMOTE_PORT
+The TCP source port of the connected client.
+.It Ic REMOTE_USER
+The remote user when using HTTP authentication.
+.It Ic REQUEST_METHOD
+The HTTP method the connected client used when making the request.
+.It Ic SERVER_ADDR
+The configured IP address of the server.
+.It Ic SERVER_NAME
+The name of the server.
+.It Ic SERVER_PORT
+The configured TCP server port of the server.
+.It Ic SERVER_PROTOCOL
+The revision of the HTTP specification used.
+.It Ic SERVER_SOFTWARE
+The server software name of
+.Xr httpd 8 .
+.El
 .It Ic hsts Oo Ar option Oc
 Enable HTTP Strict Transport Security.
 Valid options are:


Index: server_fcgi.c
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/server_fcgi.c,v
retrieving revision 1.67
diff -u -p -r1.67 server_fcgi.c
--- server_fcgi.c       23 Nov 2015 20:56:15 -0000      1.67
+++ server_fcgi.c       18 Apr 2016 01:26:49 -0000
@@ -242,12 +242,16 @@ server_fcgi(struct httpd *env, struct cl
                goto fail;
        }
 
-       if (desc->http_query)
+       if (desc->http_query) {
                if (fcgi_add_param(&param, "QUERY_STRING", desc->http_query,
                    clt) == -1) {
                        errstr = "failed to encode param";
                        goto fail;
                }
+       } else if (fcgi_add_param(&param, "QUERY_STRING", "", clt) == -1) {
+               errstr = "failed to encode param";
+               goto fail;
+       }
 
        if (fcgi_add_param(&param, "DOCUMENT_ROOT", srv_conf->root,
            clt) == -1) {

Reply via email to