summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/config.h1
-rw-r--r--src/config.c8
-rw-r--r--src/serve.c6
3 files changed, 14 insertions, 1 deletions
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 = &section[hostln + 1];
+ break;
case ':':
routing = ROUTE_PATH;
spec = &section[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) {