#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);
}