From 97b306cbee6d105885a761e04274f661a0ec3757 Mon Sep 17 00:00:00 2001 From: Omar Polo Date: Sun, 27 Nov 2022 15:35:10 +0000 Subject: [PATCH] add an implicit fastcgi parameter: GEMINI_SEARCH_STRING MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit it’s the QUERY_STRING decoded if it’s a search-string (i.e. not a key-value pair.) It’s useful for scripts to avoid percent-decoding the querystring in the most common case of a query, because in Gemini querystrings key-value paired are not common. Idea from a discussion with Allen Sobot. --- fcgi.c | 9 +++++++++ gmid.conf.5 | 6 ++++++ iri.c | 4 +++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/fcgi.c b/fcgi.c index 4c71d8f..2d1dc86 100644 --- a/fcgi.c +++ b/fcgi.c @@ -344,6 +344,7 @@ void fcgi_req(struct client *c) { char addr[NI_MAXHOST], buf[22]; + char *qs; int e; time_t tim; struct tm tminfo; @@ -368,6 +369,14 @@ fcgi_req(struct client *c) fcgi_send_param(c->cgibev, "SERVER_PROTOCOL", "GEMINI"); fcgi_send_param(c->cgibev, "SERVER_SOFTWARE", GMID_VERSION); + if (*c->iri.query != '\0' && + strchr(c->iri.query, '=') == NULL && + (qs = strdup(c->iri.query)) != NULL) { + pct_decode_str(qs); + fcgi_send_param(c->cgibev, "GEMINI_SEARCH_STRING", qs); + free(qs); + } + TAILQ_FOREACH(p, &c->host->params, envs) { fcgi_send_param(c->cgibev, p->name, p->value); } diff --git a/gmid.conf.5 b/gmid.conf.5 index 93406f7..13717a3 100644 --- a/gmid.conf.5 +++ b/gmid.conf.5 @@ -286,6 +286,12 @@ Full path to the FastCGI script being executed. The full IRI of the request. .It Ev GEMINI_URL_PATH The path of the request. +.It Ev GEMINI_SEARCH_STRING +The decoded +.Ev QUERY_STRING +if defined in the request and if it doesn't contain any unencoded +.Sq = +characters, otherwise unset. .It Ev PATH_INFO The portion of the requested path that is derived from the the IRI path hierarchy following the part that identifies the script itself. diff --git a/iri.c b/iri.c index c1f9781..d62eef5 100644 --- a/iri.c +++ b/iri.c @@ -488,7 +488,9 @@ pct_decode_str(char *s) char *t; for (t = s; *t; ++t) { - if (*t == '%' && valid_pct_enc_string(t)) + if (*t == '+') + *t = ' '; + else if (*t == '%' && valid_pct_enc_string(t)) pct_decode(t); }