src/server/test/rewrite.c

Sun, 07 Dec 2025 20:16:02 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 07 Dec 2025 20:16:02 +0100
changeset 656
59dd1fb27639
parent 652
dd90c858eb74
permissions
-rw-r--r--

update uwproj

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2025 Olaf Wintermann. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include "rewrite.h"

#include "../daemon/rewrite.h"
#include "../daemon/config.h"
#include <cx/mempool.h>
#include <cx/linked_list.h>
#include <string.h>

CX_TEST(test_rewrite_rule_create) {
    CxMempool *mp = cxMempoolCreate(100, CX_MEMPOOL_TYPE_ADVANCED);
    const CxAllocator *a = mp->allocator;
    
    ServerConfiguration cfg = { NULL };
    cfg.a = a;
    cfg.destr = cxLinkedListCreate(a, NULL, sizeof(ScfgDestr));
    
    CX_TEST_DO {
        RewriteRule *rule = rewrite_rule_create(&cfg, cx_mutstr(NULL), cx_mutstr("/rewrite"));
        CX_TEST_ASSERT(rule != NULL);
        CX_TEST_ASSERT(!rule->has_regex);
        CX_TEST_ASSERT(rule->url != NULL);
        
        cxmutstr newuri = string_template_build_string(rule->url, a, NULL, NULL);
        CX_TEST_ASSERT(!cx_strcmp(newuri, "/rewrite"));
        
        RewriteRule *rule2 = rewrite_rule_create(&cfg, cx_mutstr("/path/(.*)/files/"), cx_mutstr("/rewrite/$1/"));
        CX_TEST_ASSERT(rule2 != NULL);
        CX_TEST_ASSERT(rule2->has_regex);
        CX_TEST_ASSERT(rule2->url != NULL);
    }
    
    server_config_destroy(&cfg);
    cxMempoolFree(mp);
}

CX_TEST(test_rewrite_url_no_regex) {
    CxMempool *mp = cxMempoolCreate(100, CX_MEMPOOL_TYPE_ADVANCED);
    const CxAllocator *a = mp->allocator;
    
    ServerConfiguration cfg = { NULL };
    cfg.a = a;
    cfg.destr = cxLinkedListCreate(a, NULL, sizeof(ScfgDestr));
    
    RewriteRule rule;
    memset(&rule, 0, sizeof(RewriteRule));
    rule.url = string_template_compile(a, cx_str("/static/"));
    
    RewriteRule rule2;
    memset(&rule2, 0, sizeof(RewriteRule));
    rule2.url = string_template_compile(a, cx_str("/dynamic/$0"));
    
    CX_TEST_DO {
        char *new_url = NULL;
        int r = rewrite_url(&rule, NULL, 0, a, "/previous/url", &new_url);
        
        CX_TEST_ASSERT(r == 0);
        CX_TEST_ASSERT(new_url != NULL);
        CX_TEST_ASSERT(!strcmp(new_url, "/static/"));
        
        new_url = NULL;
        regmatch_t m;
        m.rm_so = 6;
        m.rm_eo = 9;
        r = rewrite_url(&rule2, &m, 1, a, "/test/url", &new_url);
        
        CX_TEST_ASSERT(r == 0);
        CX_TEST_ASSERT(new_url != NULL);
        CX_TEST_ASSERT(!strcmp(new_url, "/dynamic/url"));
    }
    
    server_config_destroy(&cfg);
    cxMempoolFree(mp);
}

CX_TEST(test_rewrite_url) {
    CxMempool *mp = cxMempoolCreate(100, CX_MEMPOOL_TYPE_ADVANCED);
    const CxAllocator *a = mp->allocator;
    
    ServerConfiguration cfg = { NULL };
    cfg.a = a;
    cfg.destr = cxLinkedListCreate(a, NULL, sizeof(ScfgDestr));
    
    RewriteRule *rule0 = rewrite_rule_create(&cfg, cx_mutstr("test.*"), cx_mutstr("/rewrite"));
    RewriteRule *rule1 = rewrite_rule_create(&cfg, cx_mutstr("/abc/(.*)\\.html"), cx_mutstr("/newpath/$1.md"));
    RewriteRule *rule2 = rewrite_rule_create(&cfg, cx_mutstr("/abc/(.*)/dir/(.*)"), cx_mutstr("/new/$1/files/$2"));
    
    CX_TEST_DO {
        char *new_url = NULL;
        int r = rewrite_url(rule0, NULL, 0, a, "nomatch", &new_url);
        
        CX_TEST_ASSERT(r == 0);
        CX_TEST_ASSERT(new_url == NULL);
        
        r = rewrite_url(rule0, NULL, 0, a, "test_match", &new_url);
        
        CX_TEST_ASSERT(r == 0);
        CX_TEST_ASSERT(new_url != NULL);
        CX_TEST_ASSERT(!strcmp(new_url, "/rewrite"));
        
        new_url = NULL;
        r = rewrite_url(rule1, NULL, 0, a, "/abc/index.html", &new_url);
        
        CX_TEST_ASSERT(r == 0);
        CX_TEST_ASSERT(new_url != NULL);
        CX_TEST_ASSERT(!strcmp(new_url, "/newpath/index.md"));
        
        new_url = NULL;
        r = rewrite_url(rule2, NULL, 0, a, "/abc/sub/dir/index.html", &new_url);
        
        CX_TEST_ASSERT(r == 0);
        CX_TEST_ASSERT(new_url != NULL);
        CX_TEST_ASSERT(!strcmp(new_url, "/new/sub/files/index.html"));
    }
    
    server_config_destroy(&cfg);
    cxMempoolFree(mp);
}

mercurial