From 32913c35cd5f36b00056d3e239c0e85f1f0ed000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Wagner?= Date: Wed, 27 Jan 2021 20:57:18 +0100 Subject: [PATCH] implement handling of ROUTE_EXACT definitions This patchset implements the handling of exact routes as described in gmnisrvini(5). --- include/config.h | 1 + src/config.c | 8 +++++++- src/serve.c | 6 ++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/include/config.h b/include/config.h index fc7e9fb..f893b20 100644 --- a/include/config.h +++ b/include/config.h @@ -12,6 +12,7 @@ struct gmnisrv_tls { }; enum gmnisrv_routing { + ROUTE_EXACT, ROUTE_PATH, ROUTE_REGEX, }; diff --git a/src/config.c b/src/config.c index 7c1b655..c4c152c 100644 --- a/src/config.c +++ b/src/config.c @@ -152,12 +152,16 @@ conf_ini_handler(void *user, const char *section, const char *spec; char hostname[1024 + 1]; enum gmnisrv_routing routing; - size_t hostln = strcspn(section, ":~"); + size_t hostln = strcspn(section, "=:~"); switch (section[hostln]) { case '\0': routing = ROUTE_PATH; spec = "/"; break; + case '=': + routing = ROUTE_EXACT; + spec = §ion[hostln + 1]; + break; case ':': routing = ROUTE_PATH; spec = §ion[hostln + 1]; @@ -196,6 +200,7 @@ conf_ini_handler(void *user, const char *section, switch (route->routing) { case ROUTE_PATH: + case ROUTE_EXACT: route->path = strdup(spec); break; case ROUTE_REGEX: @@ -315,6 +320,7 @@ config_finish(struct gmnisrv_config *conf) while (route) { switch (route->routing) { case ROUTE_PATH: + case ROUTE_EXACT: free(route->path); break; case ROUTE_REGEX: diff --git a/src/serve.c b/src/serve.c index 99f122e..e891d42 100644 --- a/src/serve.c +++ b/src/serve.c @@ -337,6 +337,12 @@ route_match(struct gmnisrv_route *route, const char *path, char **revised) free(*revised); *revised = NULL; switch (route->routing) { + case ROUTE_EXACT:; + if (strlen(route->path)==strlen(path) && strncmp(path, route->path, strlen(route->path)) == 0 ) { + *revised = strdup(path); + return true; + } + return false; case ROUTE_PATH:; size_t l = strlen(route->path); if (strncmp(path, route->path, l) != 0) {