diff -r 0c85c4cd0dd8 -r f64ebb0c5fa9 src/server/daemon/rewrite.c --- a/src/server/daemon/rewrite.c Sun Nov 30 18:25:55 2025 +0100 +++ b/src/server/daemon/rewrite.c Mon Dec 01 21:16:45 2025 +0100 @@ -26,4 +26,61 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "rewrite.h" \ No newline at end of file +#include "rewrite.h" + +typedef struct RVar { + cxstring str; + regmatch_t *match; + int nmatch; +} RVar; + +static cxmutstr get_var( + const CxAllocator *a, + StringTemplateSegment *seg, + RVar *vardata, + WSBool *free_str) +{ + if(seg->type != STRING_SEGMENT_NUM_PLACEHOLDER || seg->num < 0 || seg->num >= vardata->nmatch) { + return (cxmutstr){NULL, 0}; + } + regmatch_t m = vardata->match[seg->num]; + if(m.rm_eo == -1 || m.rm_so == -1) { + return (cxmutstr){NULL, 0}; + } + cxstring ret = cx_strsubsl(vardata->str, m.rm_so, m.rm_eo-m.rm_so); + return (cxmutstr){(char*)ret.ptr, ret.length}; +} + +int rewrite_url( + RewriteRule *rule, + regmatch_t *match, + int nmatch, + const CxAllocator *a, + const char *url, + char **new_url) +{ + *new_url = NULL; + + RVar vars; + vars.str = cx_str(url); + vars.match = match; + vars.nmatch = nmatch; + + regmatch_t rewrite_match[WS_REWRITE_NMATCH]; + if(rule->has_regex) { + if(regexec(&rule->regex, url, 0, rewrite_match, WS_REWRITE_NMATCH) != 0) { + return 0; + } + vars.match = rewrite_match; + vars.nmatch = WS_REWRITE_NMATCH; + } + + // build new url + cxmutstr newstr = string_template_build_string(rule->url, a, (strtpl_var_func)get_var, &vars); + if(newstr.length == 0) { + return 1; + } + *new_url = newstr.ptr; + + return 0; +}