summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2020-11-01 09:43:46 -0500
committerDrew DeVault <sir@cmpwn.com>2020-11-01 09:43:46 -0500
commitf15bea6583de0adb6a81642f03c7d2b27ee7bd2b (patch)
treeef3c3355ea576030f35231b6d3950dfbe7e2c7b3 /src
parent70fadc21b9f586f4d850625ae155c2c31a3b7ac0 (diff)
downloadgmnisrv-f15bea6583de0adb6a81642f03c7d2b27ee7bd2b.tar.gz
gmnisrv-f15bea6583de0adb6a81642f03c7d2b27ee7bd2b.tar.xz
gmnisrv-f15bea6583de0adb6a81642f03c7d2b27ee7bd2b.zip
Implement regex route matching
Diffstat (limited to 'src')
-rw-r--r--src/serve.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/serve.c b/src/serve.c
index b877dd4..9d0bcf3 100644
--- a/src/serve.c
+++ b/src/serve.c
@@ -217,8 +217,22 @@ route_match(struct gmnisrv_route *route, const char *path, const char **revised)
*revised = &path[l];
}
return true;
- case ROUTE_REGEX:
- assert(0); // TODO
+ case ROUTE_REGEX:;
+ int ncapture = lre_get_capture_count(route->regex);
+ uint8_t **capture = NULL;
+ if (ncapture > 0) {
+ capture = malloc(sizeof(capture[0]) * ncapture * 2);
+ assert(capture);
+ }
+ int r = lre_exec(capture, route->regex,
+ (const uint8_t *)path, 0, strlen(path), 0, NULL);
+ if (r != 1) {
+ free(capture);
+ return false;
+ }
+ // TODO: Process captures and rewrites
+ *revised = path;
+ return true;
}
assert(0); // Invariant