summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrew Clayton <andrew@digital-domain.net>2022-05-06 19:41:02 +0100
committerAndrew Clayton <andrew@digital-domain.net>2022-07-20 23:28:02 +0100
commiteebaff42eaef94f67f2232fc551f6d43c90c2e5c (patch)
treee4b6fcb882c1c611377eec9c535c99a1f53d1d1d
parenta1cda6455f5ab0b361d403bd7c183ebec92fb59a (diff)
downloadunit-eebaff42eaef94f67f2232fc551f6d43c90c2e5c.tar.gz
unit-eebaff42eaef94f67f2232fc551f6d43c90c2e5c.tar.bz2
Var: added a $dollar variable that translates to a '$'.
Allow $dollar (or ${dollar}) to translate to a literal $ to allow support for sub-delimiters in URIs. It is possible to have URLs like https://example.com/path/15$1588/9925$2976.html and thus it would be useful to be able to specify them in various bits of the unit config such as the location setting. However this hadn't been possible due to $ being used to denote variables for substitution. E.g $host. As was noted in the below GitHub issue it was suggested by @VBart to use $sign to represent a literal $, however I feel $dollar is more appropriate so we have a variable named after the thing it represents, also @tippexs found[0] that &dollar is used in HTML to represent a $, so there is some somewhat related precedent. (The other idea to use $$ was rejected in my original pull-request[1] for this issue.) This means the above URL could be specified as https://example.com/path/15${dollar}1588/9925${dollar}2976.html in the unit config. This is done by adding a variable called 'dollar' which is loaded into the variables hash table which translates into a literal $. This is then handled in nxt_var_next_part() where variables are parsed for lookup and $dollar is set for substitution by a literal '$'. Actual variable substitution happens in nxt_var_query_finish(). [0]: https://github.com/nginx/unit/pull/693#issuecomment-1130412323 [1]: https://github.com/nginx/unit/pull/693 Closes: https://github.com/nginx/unit/issues/675
-rw-r--r--docs/changes.xml7
-rw-r--r--src/nxt_http_variables.c14
2 files changed, 21 insertions, 0 deletions
diff --git a/docs/changes.xml b/docs/changes.xml
index f8745641..66965311 100644
--- a/docs/changes.xml
+++ b/docs/changes.xml
@@ -62,6 +62,13 @@ increased the applications' startup timeout.
</para>
</change>
+<change type="feature">
+<para>
+added a new variable, $dollar, that translates to a literal "$" during
+variable substitution.
+</para>
+</change>
+
</changes>
diff --git a/src/nxt_http_variables.c b/src/nxt_http_variables.c
index 837ef7b0..5a632b24 100644
--- a/src/nxt_http_variables.c
+++ b/src/nxt_http_variables.c
@@ -7,6 +7,8 @@
#include <nxt_http.h>
+static nxt_int_t nxt_http_var_dollar(nxt_task_t *task, nxt_str_t *str,
+ void *ctx, uint16_t field);
static nxt_int_t nxt_http_var_method(nxt_task_t *task, nxt_str_t *str,
void *ctx, uint16_t field);
static nxt_int_t nxt_http_var_request_uri(nxt_task_t *task, nxt_str_t *str,
@@ -41,6 +43,9 @@ static nxt_int_t nxt_http_var_cookie(nxt_task_t *task, nxt_str_t *str,
static nxt_var_decl_t nxt_http_vars[] = {
{
+ .name = nxt_string("dollar"),
+ .handler = nxt_http_var_dollar,
+ }, {
.name = nxt_string("method"),
.handler = nxt_http_var_method,
}, {
@@ -97,6 +102,15 @@ nxt_http_register_variables(void)
static nxt_int_t
+nxt_http_var_dollar(nxt_task_t *task, nxt_str_t *str, void *ctx, uint16_t field)
+{
+ nxt_str_set(str, "$");
+
+ return NXT_OK;
+}
+
+
+static nxt_int_t
nxt_http_var_method(nxt_task_t *task, nxt_str_t *str, void *ctx, uint16_t field)
{
nxt_http_request_t *r;