From a579e7ffc0d524886cf5c65c97284c2b2c3d958a Mon Sep 17 00:00:00 2001 From: fbrosson Date: Sat, 26 Mar 2016 11:14:21 +0000 Subject: [PATCH] [mod_ssi] Add SSI vars SCRIPT_{URI,URL} and REQUEST_SCHEME (fixes #2721) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a proposal to add to lighttpd the famous SSI variables SCRIPT_URI and SCRIPT_URL (known to Apache users), as well as a bonus ENV variable called REQUEST_SCHEME. SCRIPT_URI and SCRIPT_URL will be available as SSI variables from within documents handled by mod_ssi. They can be used like any other SSI var with the "#echo var" command: Webmasters willing to display links to the W3C Validator will be able to use: ">… instead of the generic http://validator.w3.org/check?uri=referer link which does not work on some (most?) browsers which do not send referers when the link itself resides in a document sent through https. REQUEST_SCHEME will be available both as an environment variable. It is defined as "http" or "https", depending on the scheme of the connection. It is safe to use this name as it does not conflict with any existing variable on Apache or Nginx. This is slightly different from the HTTPS var which is often added by webadmins on their server's configuration. EDIT: Some Apache modules also define REQUEST_SCHEME with the same possible values as this proposal. From: fbrosson git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@3124 152afb58-edef-0310-8abb-c4023f1b3aa9 --- NEWS | 1 + src/mod_ssi.c | 43 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 15c004d0..dc5020f5 100644 --- a/NEWS +++ b/NEWS @@ -48,6 +48,7 @@ NEWS * [unittests] add test_buffer and test_base64 unit tests * [buffer] refactor buffer_path_simplify (fixes #2560) * validate return values from strtol, strtoul (fixes #2564) + * [mod_ssi] Add SSI vars SCRIPT_{URI,URL} and REQUEST_SCHEME (fixes #2721) - 1.4.39 - 2016-01-02 * [core] fix memset_s call (fixes #2698) diff --git a/src/mod_ssi.c b/src/mod_ssi.c index a34e2c90..14433993 100644 --- a/src/mod_ssi.c +++ b/src/mod_ssi.c @@ -277,6 +277,11 @@ static int build_ssi_cgi_vars(server *srv, connection *con, plugin_data *p) { ssi_env_add(p->ssi_cgi_env, CONST_STRING("DOCUMENT_ROOT"), con->physical.doc_root->ptr); ssi_env_add(p->ssi_cgi_env, CONST_STRING("REQUEST_URI"), con->request.uri->ptr); + + if (!buffer_string_is_empty(con->uri.scheme)) { + ssi_env_add(p->ssi_cgi_env, CONST_STRING("REQUEST_SCHEME"), con->uri.scheme->ptr); + } + ssi_env_add(p->ssi_cgi_env, CONST_STRING("QUERY_STRING"), buffer_is_empty(con->uri.query) ? "" : con->uri.query->ptr); ssi_env_add(p->ssi_cgi_env, CONST_STRING("REQUEST_METHOD"), get_http_method_name(con->request.http_method)); ssi_env_add(p->ssi_cgi_env, CONST_STRING("REDIRECT_STATUS"), "200"); @@ -330,8 +335,17 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const struct { const char *var; - enum { SSI_ECHO_UNSET, SSI_ECHO_DATE_GMT, SSI_ECHO_DATE_LOCAL, SSI_ECHO_DOCUMENT_NAME, SSI_ECHO_DOCUMENT_URI, - SSI_ECHO_LAST_MODIFIED, SSI_ECHO_USER_NAME } type; + enum { + SSI_ECHO_UNSET, + SSI_ECHO_DATE_GMT, + SSI_ECHO_DATE_LOCAL, + SSI_ECHO_DOCUMENT_NAME, + SSI_ECHO_DOCUMENT_URI, + SSI_ECHO_LAST_MODIFIED, + SSI_ECHO_USER_NAME, + SSI_ECHO_SCRIPT_URI, + SSI_ECHO_SCRIPT_URL, + } type; } echovars[] = { { "DATE_GMT", SSI_ECHO_DATE_GMT }, { "DATE_LOCAL", SSI_ECHO_DATE_LOCAL }, @@ -339,6 +353,8 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const { "DOCUMENT_URI", SSI_ECHO_DOCUMENT_URI }, { "LAST_MODIFIED", SSI_ECHO_LAST_MODIFIED }, { "USER_NAME", SSI_ECHO_USER_NAME }, + { "SCRIPT_URI", SSI_ECHO_SCRIPT_URI }, + { "SCRIPT_URL", SSI_ECHO_SCRIPT_URL }, { NULL, SSI_ECHO_UNSET } }; @@ -413,7 +429,7 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const buffer_free(b); break; } - case SSI_ECHO_LAST_MODIFIED: { + case SSI_ECHO_LAST_MODIFIED: { time_t t = sce->st.st_mtime; if (0 == strftime(buf, sizeof(buf), p->timefmt->ptr, localtime(&t))) { @@ -457,6 +473,27 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->uri.path)); break; } + case SSI_ECHO_SCRIPT_URI: { + if (!buffer_string_is_empty(con->uri.scheme) && !buffer_string_is_empty(con->uri.authority)) { + chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->uri.scheme)); + chunkqueue_append_mem(con->write_queue, CONST_STR_LEN("://")); + chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->uri.authority)); + chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->request.uri)); + if (!buffer_string_is_empty(con->uri.query)) { + chunkqueue_append_mem(con->write_queue, CONST_STR_LEN("?")); + chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->uri.query)); + } + } + break; + } + case SSI_ECHO_SCRIPT_URL: { + chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->request.uri)); + if (!buffer_string_is_empty(con->uri.query)) { + chunkqueue_append_mem(con->write_queue, CONST_STR_LEN("?")); + chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->uri.query)); + } + break; + } default: { data_string *ds; /* check if it is a cgi-var or a ssi-var */