src/server/daemon/rewrite.c

changeset 646
f64ebb0c5fa9
parent 635
b85d45fd3b01
child 647
ffbc5076b4bf
--- 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;
+}

mercurial