diff options
| author | Drew DeVault <sir@cmpwn.com> | 2020-11-01 09:43:46 -0500 |
|---|---|---|
| committer | Drew DeVault <sir@cmpwn.com> | 2020-11-01 09:43:46 -0500 |
| commit | f15bea6583de0adb6a81642f03c7d2b27ee7bd2b (patch) | |
| tree | ef3c3355ea576030f35231b6d3950dfbe7e2c7b3 | |
| parent | 70fadc21b9f586f4d850625ae155c2c31a3b7ac0 (diff) | |
| download | gmnisrv-f15bea6583de0adb6a81642f03c7d2b27ee7bd2b.tar.gz gmnisrv-f15bea6583de0adb6a81642f03c7d2b27ee7bd2b.tar.xz gmnisrv-f15bea6583de0adb6a81642f03c7d2b27ee7bd2b.zip | |
Implement regex route matching
| -rw-r--r-- | src/serve.c | 18 |
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 |
