UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2025 Olaf Wintermann. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include "rewrite.h" 30 31 #include "../daemon/rewrite.h" 32 #include "../daemon/config.h" 33 #include <cx/mempool.h> 34 #include <cx/linked_list.h> 35 #include <string.h> 36 37 CX_TEST(test_rewrite_rule_create) { 38 CxMempool *mp = cxMempoolCreate(100, CX_MEMPOOL_TYPE_ADVANCED); 39 const CxAllocator *a = mp->allocator; 40 41 ServerConfiguration cfg = { NULL }; 42 cfg.a = a; 43 cfg.destr = cxLinkedListCreate(a, NULL, sizeof(ScfgDestr)); 44 45 CX_TEST_DO { 46 RewriteRule *rule = rewrite_rule_create(&cfg, cx_mutstr(NULL), cx_mutstr("/rewrite")); 47 CX_TEST_ASSERT(rule != NULL); 48 CX_TEST_ASSERT(!rule->has_regex); 49 CX_TEST_ASSERT(rule->url != NULL); 50 51 cxmutstr newuri = string_template_build_string(rule->url, a, NULL, NULL); 52 CX_TEST_ASSERT(!cx_strcmp(newuri, "/rewrite")); 53 54 RewriteRule *rule2 = rewrite_rule_create(&cfg, cx_mutstr("/path/(.*)/files/"), cx_mutstr("/rewrite/$1/")); 55 CX_TEST_ASSERT(rule2 != NULL); 56 CX_TEST_ASSERT(rule2->has_regex); 57 CX_TEST_ASSERT(rule2->url != NULL); 58 } 59 60 server_config_destroy(&cfg); 61 cxMempoolFree(mp); 62 } 63 64 CX_TEST(test_rewrite_url_no_regex) { 65 CxMempool *mp = cxMempoolCreate(100, CX_MEMPOOL_TYPE_ADVANCED); 66 const CxAllocator *a = mp->allocator; 67 68 ServerConfiguration cfg = { NULL }; 69 cfg.a = a; 70 cfg.destr = cxLinkedListCreate(a, NULL, sizeof(ScfgDestr)); 71 72 RewriteRule rule; 73 memset(&rule, 0, sizeof(RewriteRule)); 74 rule.url = string_template_compile(a, cx_str("/static/")); 75 76 RewriteRule rule2; 77 memset(&rule2, 0, sizeof(RewriteRule)); 78 rule2.url = string_template_compile(a, cx_str("/dynamic/$0")); 79 80 CX_TEST_DO { 81 char *new_url = NULL; 82 int r = rewrite_url(&rule, NULL, 0, a, "/previous/url", &new_url); 83 84 CX_TEST_ASSERT(r == 0); 85 CX_TEST_ASSERT(new_url != NULL); 86 CX_TEST_ASSERT(!strcmp(new_url, "/static/")); 87 88 new_url = NULL; 89 regmatch_t m; 90 m.rm_so = 6; 91 m.rm_eo = 9; 92 r = rewrite_url(&rule2, &m, 1, a, "/test/url", &new_url); 93 94 CX_TEST_ASSERT(r == 0); 95 CX_TEST_ASSERT(new_url != NULL); 96 CX_TEST_ASSERT(!strcmp(new_url, "/dynamic/url")); 97 } 98 99 server_config_destroy(&cfg); 100 cxMempoolFree(mp); 101 } 102 103 CX_TEST(test_rewrite_url) { 104 CxMempool *mp = cxMempoolCreate(100, CX_MEMPOOL_TYPE_ADVANCED); 105 const CxAllocator *a = mp->allocator; 106 107 ServerConfiguration cfg = { NULL }; 108 cfg.a = a; 109 cfg.destr = cxLinkedListCreate(a, NULL, sizeof(ScfgDestr)); 110 111 RewriteRule *rule0 = rewrite_rule_create(&cfg, cx_mutstr("test.*"), cx_mutstr("/rewrite")); 112 RewriteRule *rule1 = rewrite_rule_create(&cfg, cx_mutstr("/abc/(.*)\\.html"), cx_mutstr("/newpath/$1.md")); 113 RewriteRule *rule2 = rewrite_rule_create(&cfg, cx_mutstr("/abc/(.*)/dir/(.*)"), cx_mutstr("/new/$1/files/$2")); 114 115 CX_TEST_DO { 116 char *new_url = NULL; 117 int r = rewrite_url(rule0, NULL, 0, a, "nomatch", &new_url); 118 119 CX_TEST_ASSERT(r == 0); 120 CX_TEST_ASSERT(new_url == NULL); 121 122 r = rewrite_url(rule0, NULL, 0, a, "test_match", &new_url); 123 124 CX_TEST_ASSERT(r == 0); 125 CX_TEST_ASSERT(new_url != NULL); 126 CX_TEST_ASSERT(!strcmp(new_url, "/rewrite")); 127 128 new_url = NULL; 129 r = rewrite_url(rule1, NULL, 0, a, "/abc/index.html", &new_url); 130 131 CX_TEST_ASSERT(r == 0); 132 CX_TEST_ASSERT(new_url != NULL); 133 CX_TEST_ASSERT(!strcmp(new_url, "/newpath/index.md")); 134 135 new_url = NULL; 136 r = rewrite_url(rule2, NULL, 0, a, "/abc/sub/dir/index.html", &new_url); 137 138 CX_TEST_ASSERT(r == 0); 139 CX_TEST_ASSERT(new_url != NULL); 140 CX_TEST_ASSERT(!strcmp(new_url, "/new/sub/files/index.html")); 141 } 142 143 server_config_destroy(&cfg); 144 cxMempoolFree(mp); 145 } 146