aboutsummaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorOmar Polo <op@omarpolo.com>2021-05-09 18:23:36 +0000
committerOmar Polo <op@omarpolo.com>2021-05-09 18:23:36 +0000
commit8ad1c570242cd93f0802931621b49b2510b338e7 (patch)
tree361394003bca869780ace3a3391ff13b2439a6e2 /parse.y
parent50310aff335912edde625a5cde3729e34783fd7c (diff)
fastcgi: a first implementation
Not production-ready yet, but it's a start. This adds a third ``backend'' for gmid: until now there it served local files or CGI scripts, now FastCGI applications too. FastCGI is meant to be an improvement over CGI: instead of exec'ing a script for every request, it allows to open a single connection to an ``application'' and send the requests/receive the responses over that socket using a simple binary protocol. At the moment gmid supports three different methods of opening a fastcgi connection: - local unix sockets, with: fastcgi "/path/to/sock" - network sockets, with: fastcgi tcp "host" [port] port defaults to 9000 and can be either a string or a number - subprocess, with: fastcgi spawn "/path/to/program" the fastcgi protocol is done over the executed program stdin of these, the last is only for testing and may be removed in the future. P.S.: the fastcgi rule is per-location of course :)
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y67
1 files changed, 66 insertions, 1 deletions
diff --git a/parse.y b/parse.y
index 692037a..e3eff65 100644
--- a/parse.y
+++ b/parse.y
@@ -47,6 +47,8 @@ int check_strip_no(int);
int check_prefork_num(int);
void advance_loc(void);
void only_once(const void*, const char*);
+void only_oncei(int, const char*);
+int fastcgi_conf(char *, char *, char *);
%}
@@ -60,7 +62,8 @@ void only_once(const void*, const char*);
%token TIPV6 TPORT TPROTOCOLS TMIME TDEFAULT TTYPE TCHROOT TUSER TSERVER
%token TPREFORK TLOCATION TCERT TKEY TROOT TCGI TENV TLANG TLOG TINDEX TAUTO
-%token TSTRIP TBLOCK TRETURN TENTRYPOINT TREQUIRE TCLIENT TCA TALIAS
+%token TSTRIP TBLOCK TRETURN TENTRYPOINT TREQUIRE TCLIENT TCA TALIAS TTCP
+%token TFASTCGI TSPAWN
%token TERR
@@ -203,6 +206,29 @@ locopt : TAUTO TINDEX TBOOL { loc->auto_index = $3 ? 1 : -1; }
only_once(loc->default_mime, "default type");
loc->default_mime = $3;
}
+ | TFASTCGI TSPAWN TSTRING {
+ only_oncei(loc->fcgi, "fastcgi");
+ loc->fcgi = fastcgi_conf(NULL, NULL, $3);
+ }
+ | TFASTCGI TSTRING {
+ only_oncei(loc->fcgi, "fastcgi");
+ loc->fcgi = fastcgi_conf($2, NULL, NULL);
+ }
+ | TFASTCGI TTCP TSTRING TNUM {
+ char *c;
+ if (asprintf(&c, "%d", $4) == -1)
+ err(1, "asprintf");
+ only_oncei(loc->fcgi, "fastcgi");
+ loc->fcgi = fastcgi_conf($3, c, NULL);
+ }
+ | TFASTCGI TTCP TSTRING {
+ only_oncei(loc->fcgi, "fastcgi");
+ loc->fcgi = fastcgi_conf($3, xstrdup("9000"), NULL);
+ }
+ | TFASTCGI TTCP TSTRING TSTRING {
+ only_oncei(loc->fcgi, "fastcgi");
+ loc->fcgi = fastcgi_conf($3, $4, NULL);
+ }
| TINDEX TSTRING {
only_once(loc->index, "index");
loc->index = $2;
@@ -241,6 +267,7 @@ new_location(void)
l = xcalloc(1, sizeof(*l));
l->dirfd = -1;
+ l->fcgi = -1;
return l;
}
@@ -354,3 +381,41 @@ only_once(const void *ptr, const char *name)
if (ptr != NULL)
yyerror("`%s' specified more than once", name);
}
+
+void
+only_oncei(int i, const char *name)
+{
+ if (i != -1)
+ yyerror("`%s' specified more than once", name);
+}
+
+int
+fastcgi_conf(char *path, char *port, char *prog)
+{
+ struct fcgi *f;
+ int i;
+
+ for (i = 0; i < FCGI_MAX; ++i) {
+ f = &fcgi[i];
+
+ if (f->path == NULL) {
+ f->id = i;
+ f->path = path;
+ f->port = port;
+ f->prog = prog;
+ return i;
+ }
+
+ /* XXX: what to do with prog? */
+ if (!strcmp(f->path, path) &&
+ ((port == NULL && f->port == NULL) ||
+ !strcmp(f->port, port))) {
+ free(path);
+ free(port);
+ return i;
+ }
+ }
+
+ yyerror("too much `fastcgi' rules defined.");
+ return -1;
+}