mirror of https://github.com/omar-polo/gmid.git
send all the params as per RFC3875 (CGI) and sync documentation
This commit is contained in:
parent
f5dc7eddd7
commit
e872053b20
56
fcgi.c
56
fcgi.c
|
@ -371,12 +371,37 @@ fcgi_error(struct bufferevent *bev, short err, void *d)
|
||||||
c->type = REQUEST_DONE;
|
c->type = REQUEST_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
path_translate(const char *path, struct location *loc, struct location *rloc,
|
||||||
|
char *buf, size_t len)
|
||||||
|
{
|
||||||
|
const char *root, *sufx;
|
||||||
|
|
||||||
|
buf[0] = '\0';
|
||||||
|
|
||||||
|
if (*loc->dir != '\0')
|
||||||
|
root = loc->dir;
|
||||||
|
else if (*rloc->dir != '\0')
|
||||||
|
root = rloc->dir;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
sufx = "";
|
||||||
|
if (*root != '\0')
|
||||||
|
sufx = root[strlen(root) - 1] == '/' ? "" : "/";
|
||||||
|
|
||||||
|
while (*path == '/')
|
||||||
|
path++;
|
||||||
|
|
||||||
|
snprintf(buf, len, "%s%s%s", root, sufx, path);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
fcgi_req(struct client *c, struct location *loc)
|
fcgi_req(struct client *c, struct location *loc)
|
||||||
{
|
{
|
||||||
char buf[22], path[GEMINI_URL_LEN];
|
char buf[22], path[GEMINI_URL_LEN], path_tr[PATH_MAX];
|
||||||
char *scriptname, *qs;
|
char *scriptname, *qs;
|
||||||
const char *stripped;
|
const char *stripped, *port;
|
||||||
size_t l;
|
size_t l;
|
||||||
time_t tim;
|
time_t tim;
|
||||||
struct tm tminfo;
|
struct tm tminfo;
|
||||||
|
@ -384,6 +409,16 @@ fcgi_req(struct client *c, struct location *loc)
|
||||||
|
|
||||||
fcgi_begin_request(c->cgibev);
|
fcgi_begin_request(c->cgibev);
|
||||||
|
|
||||||
|
stripped = strip_path(c->iri.path, loc->fcgi_strip);
|
||||||
|
if (*stripped != '/')
|
||||||
|
snprintf(path, sizeof(path), "/%s", stripped);
|
||||||
|
else
|
||||||
|
strlcpy(path, stripped, sizeof(path));
|
||||||
|
|
||||||
|
port = c->iri.host;
|
||||||
|
if (port == NULL || *port == '\0')
|
||||||
|
port = "1965";
|
||||||
|
|
||||||
scriptname = "";
|
scriptname = "";
|
||||||
TAILQ_FOREACH(p, &loc->params, envs) {
|
TAILQ_FOREACH(p, &loc->params, envs) {
|
||||||
if (!strcmp(p->name, "SCRIPT_NAME")) {
|
if (!strcmp(p->name, "SCRIPT_NAME")) {
|
||||||
|
@ -392,35 +427,36 @@ fcgi_req(struct client *c, struct location *loc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stripped = strip_path(c->iri.path, loc->fcgi_strip);
|
|
||||||
if (*stripped != '/')
|
|
||||||
snprintf(path, sizeof(path), "/%s", stripped);
|
|
||||||
else
|
|
||||||
strlcpy(path, stripped, sizeof(path));
|
|
||||||
|
|
||||||
l = strlen(scriptname);
|
l = strlen(scriptname);
|
||||||
while (l > 0 && scriptname[l - 1] == '/')
|
while (l > 0 && scriptname[l - 1] == '/')
|
||||||
l--;
|
l--;
|
||||||
if (!strncmp(scriptname, path, l) && (path[l] == '/' ||
|
if (!strncmp(scriptname, path, l) && (path[l] == '/' ||
|
||||||
path[l] == '\0')) {
|
path[l] == '\0')) {
|
||||||
fcgi_send_param(c->cgibev, "PATH_INFO", &path[l]);
|
fcgi_send_param(c->cgibev, "PATH_INFO", &path[l]);
|
||||||
|
path_translate(&path[l], loc, TAILQ_FIRST(&c->host->locations),
|
||||||
|
path_tr, sizeof(path_tr));
|
||||||
path[l] = '\0';
|
path[l] = '\0';
|
||||||
fcgi_send_param(c->cgibev, "SCRIPT_NAME", path);
|
fcgi_send_param(c->cgibev, "SCRIPT_NAME", path);
|
||||||
} else {
|
} else {
|
||||||
|
path_translate(stripped, loc, TAILQ_FIRST(&c->host->locations),
|
||||||
|
path_tr, sizeof(path_tr));
|
||||||
fcgi_send_param(c->cgibev, "PATH_INFO", stripped);
|
fcgi_send_param(c->cgibev, "PATH_INFO", stripped);
|
||||||
fcgi_send_param(c->cgibev, "SCRIPT_NAME", scriptname);
|
fcgi_send_param(c->cgibev, "SCRIPT_NAME", scriptname);
|
||||||
}
|
}
|
||||||
|
|
||||||
fcgi_send_param(c->cgibev, "GATEWAY_INTERFACE", "CGI/1.1");
|
fcgi_send_param(c->cgibev, "GATEWAY_INTERFACE", "CGI/1.1");
|
||||||
fcgi_send_param(c->cgibev, "GEMINI_URL_PATH", c->iri.path);
|
fcgi_send_param(c->cgibev, "PATH_TRANSLATED", path_tr);
|
||||||
fcgi_send_param(c->cgibev, "QUERY_STRING", c->iri.query);
|
fcgi_send_param(c->cgibev, "QUERY_STRING", c->iri.query);
|
||||||
fcgi_send_param(c->cgibev, "REMOTE_ADDR", c->rhost);
|
fcgi_send_param(c->cgibev, "REMOTE_ADDR", c->rhost);
|
||||||
fcgi_send_param(c->cgibev, "REMOTE_HOST", c->rhost);
|
fcgi_send_param(c->cgibev, "REMOTE_HOST", c->rhost);
|
||||||
fcgi_send_param(c->cgibev, "REQUEST_METHOD", "");
|
fcgi_send_param(c->cgibev, "REQUEST_METHOD", "GET");
|
||||||
fcgi_send_param(c->cgibev, "SERVER_NAME", c->iri.host);
|
fcgi_send_param(c->cgibev, "SERVER_NAME", c->iri.host);
|
||||||
|
fcgi_send_param(c->cgibev, "SERVER_PORT", port);
|
||||||
fcgi_send_param(c->cgibev, "SERVER_PROTOCOL", "GEMINI");
|
fcgi_send_param(c->cgibev, "SERVER_PROTOCOL", "GEMINI");
|
||||||
fcgi_send_param(c->cgibev, "SERVER_SOFTWARE", GMID_VERSION);
|
fcgi_send_param(c->cgibev, "SERVER_SOFTWARE", GMID_VERSION);
|
||||||
|
|
||||||
|
fcgi_send_param(c->cgibev, "GEMINI_URL_PATH", c->iri.path);
|
||||||
|
|
||||||
if (*c->iri.query != '\0' &&
|
if (*c->iri.query != '\0' &&
|
||||||
strchr(c->iri.query, '=') == NULL &&
|
strchr(c->iri.query, '=') == NULL &&
|
||||||
(qs = strdup(c->iri.query)) != NULL) {
|
(qs = strdup(c->iri.query)) != NULL) {
|
||||||
|
|
35
gmid.conf.5
35
gmid.conf.5
|
@ -11,7 +11,7 @@
|
||||||
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
.Dd July 24, 2023
|
.Dd August 18, 2023
|
||||||
.Dt GMID.CONF 5
|
.Dt GMID.CONF 5
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
|
@ -326,25 +326,25 @@ leading path components from the
|
||||||
.Pp
|
.Pp
|
||||||
The FastCGI handler will be given the following variables by default:
|
The FastCGI handler will be given the following variables by default:
|
||||||
.Bl -tag -width 24m
|
.Bl -tag -width 24m
|
||||||
.It Ev GATEWAY_INTERFACE
|
.\" .It Ev GEMINI_DOCUMENT_ROOT
|
||||||
.Dq CGI/1.1
|
.\" The root directory of the virtual host.
|
||||||
.It Ev GEMINI_DOCUMENT_ROOT
|
|
||||||
The root directory of the virtual host.
|
|
||||||
.It Ev GEMINI_SCRIPT_FILENAME
|
|
||||||
Full path to the FastCGI script being executed.
|
|
||||||
.It Ev GEMINI_URL
|
|
||||||
The full IRI of the request.
|
|
||||||
.It Ev GEMINI_URL_PATH
|
.It Ev GEMINI_URL_PATH
|
||||||
The path of the request.
|
Full path of the request.
|
||||||
.It Ev GEMINI_SEARCH_STRING
|
.It Ev GEMINI_SEARCH_STRING
|
||||||
The decoded
|
The decoded
|
||||||
.Ev QUERY_STRING
|
.Ev QUERY_STRING
|
||||||
if defined in the request and if it doesn't contain any unencoded
|
if defined in the request and if it doesn't contain any unencoded
|
||||||
.Sq =
|
.Sq =
|
||||||
characters, otherwise unset.
|
characters, otherwise unset.
|
||||||
|
.It Ev GATEWAY_INTERFACE
|
||||||
|
.Dq CGI/1.1
|
||||||
|
.It Ev AUTH_TYPE
|
||||||
|
The string "Certificate" if the client used a certificate, otherwise
|
||||||
|
unset.
|
||||||
.It Ev PATH_INFO
|
.It Ev PATH_INFO
|
||||||
The portion of the requested path that is derived from the the IRI
|
The portion of the requested path that is derived from the the IRI
|
||||||
path hierarchy following the part that identifies the script itself.
|
path hierarchy following
|
||||||
|
.Ev SCRIPT_NAME .
|
||||||
Can be unset.
|
Can be unset.
|
||||||
.It Ev PATH_TRANSLATED
|
.It Ev PATH_TRANSLATED
|
||||||
Present if and only if
|
Present if and only if
|
||||||
|
@ -362,9 +362,17 @@ The URL-encoded search or parameter string.
|
||||||
Textual representation of the client IP.
|
Textual representation of the client IP.
|
||||||
.It Ev REQUEST_METHOD
|
.It Ev REQUEST_METHOD
|
||||||
This is present only for RFC3875 (CGI) compliance.
|
This is present only for RFC3875 (CGI) compliance.
|
||||||
It's always set to the empty string.
|
It's always set to
|
||||||
|
.Dq GET .
|
||||||
.It Ev SCRIPT_NAME
|
.It Ev SCRIPT_NAME
|
||||||
The virtual URI path to the script.
|
The virtual URI path to the script.
|
||||||
|
Since it's impossible to determine in all cases the correct
|
||||||
|
.Ev SCRIPT_NAME
|
||||||
|
programmatically
|
||||||
|
.Nm gmid
|
||||||
|
assumes it's the empty string.
|
||||||
|
It is recommended to manually specify this parameter when serving a
|
||||||
|
sub-tree of a virtual host via FastCGI.
|
||||||
.It Ev SERVER_NAME
|
.It Ev SERVER_NAME
|
||||||
The name of the server
|
The name of the server
|
||||||
.It Ev SERVER_PORT
|
.It Ev SERVER_PORT
|
||||||
|
@ -374,9 +382,6 @@ The port the server is listening on.
|
||||||
.It Ev SERVER_SOFTWARE
|
.It Ev SERVER_SOFTWARE
|
||||||
The name and version of the server, i.e.
|
The name and version of the server, i.e.
|
||||||
.Dq gmid/1.8.4
|
.Dq gmid/1.8.4
|
||||||
.It Ev AUTH_TYPE
|
|
||||||
The string "Certificate" if the client used a certificate, otherwise
|
|
||||||
unset.
|
|
||||||
.It Ev REMOTE_USER
|
.It Ev REMOTE_USER
|
||||||
The subject of the client certificate if provided, otherwise unset.
|
The subject of the client certificate if provided, otherwise unset.
|
||||||
.It Ev TLS_CLIENT_ISSUER
|
.It Ev TLS_CLIENT_ISSUER
|
||||||
|
|
Loading…
Reference in New Issue