xref: /lighttpd1.4/src/t/test_keyvalue.c (revision 49e9f0ac)
1 #include "first.h"
2 
3 #undef NDEBUG
4 #include <assert.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <unistd.h> /* STDERR_FILENO */
8 
9 #include "keyvalue.c"
10 
11 #ifdef HAVE_PCRE_H
12 static pcre_keyvalue_buffer * test_keyvalue_test_kvb_init (void) {
13     pcre_keyvalue_buffer *kvb = pcre_keyvalue_buffer_init();
14     buffer *k = buffer_init();
15     buffer *v = buffer_init();
16     server srv;
17 
18     memset(&srv, 0, sizeof(srv));
19     srv.errh = log_error_st_init(&srv.cur_ts, &srv.last_generated_debug_ts);
20 
21     buffer_copy_string_len(k, CONST_STR_LEN("^/foo($|\\?.+)"));
22     buffer_copy_string_len(v, CONST_STR_LEN("/foo/$1"));
23     assert(0 == pcre_keyvalue_buffer_append(&srv, kvb, k, v));
24     buffer_copy_string_len(k, CONST_STR_LEN("^/bar(?:$|\\?(.+))"));
25     buffer_copy_string_len(v, CONST_STR_LEN("/?bar&$1"));
26     assert(0 == pcre_keyvalue_buffer_append(&srv, kvb, k, v));
27     buffer_copy_string_len(k, CONST_STR_LEN("^/redirect(?:\\?(.*))?$"));
28     buffer_copy_string_len(v, CONST_STR_LEN("/?seg=%1&$1"));
29     assert(0 == pcre_keyvalue_buffer_append(&srv, kvb, k, v));
30     buffer_copy_string_len(k, CONST_STR_LEN("^(/[^?]*)(?:\\?(.*))?$"));
31     buffer_copy_string_len(v, CONST_STR_LEN("/?file=$1&$2"));
32     assert(0 == pcre_keyvalue_buffer_append(&srv, kvb, k, v));
33 
34     buffer_free(k);
35     buffer_free(v);
36     log_error_st_free(srv.errh);
37 
38     return kvb;
39 }
40 
41 static void test_keyvalue_pcre_keyvalue_buffer_process (void) {
42     pcre_keyvalue_buffer *kvb = test_keyvalue_test_kvb_init();
43     buffer *url = buffer_init();
44     buffer *result = buffer_init();
45     struct burl_parts_t burl;
46     cond_cache_t cache;
47     pcre_keyvalue_ctx ctx;
48     handler_t rc;
49 
50     ctx.burl = &burl;
51     burl.scheme    = buffer_init();
52     burl.authority = buffer_init();
53     burl.port      = 80;
54     burl.path      = buffer_init();
55     burl.query     = buffer_init();
56     buffer_copy_string_len(burl.scheme, CONST_STR_LEN("http"));
57     buffer_copy_string_len(burl.authority, CONST_STR_LEN("www.example.com"));
58     /* model outer conditional match of $HTTP["host"] =~ "^(www).example.com$" */
59     ctx.cache = &cache;
60     memset(&cache, 0, sizeof(cache));
61     cache.patterncount = 2;
62     cache.comp_value = burl.authority;
63     cache.matches[0] = 0;
64     cache.matches[1] = 15;
65     cache.matches[2] = 0;
66     cache.matches[3] = 3;
67 
68     /* converted from prior sparse tests/mod-redirect.t and tests/mod-rewrite.t
69      * (real-world use should prefer ${url.path} and ${qsa} in substitutions)
70      */
71 
72     buffer_copy_string_len(url, CONST_STR_LEN("/foo"));
73     buffer_copy_string_len(burl.path, CONST_STR_LEN("/foo"));
74     buffer_clear(burl.query);
75     rc = pcre_keyvalue_buffer_process(kvb, &ctx, url, result);
76     assert(HANDLER_FINISHED == rc);
77     assert(buffer_is_equal_string(result, CONST_STR_LEN("/foo/")));
78 
79     buffer_copy_string_len(url, CONST_STR_LEN("/foo?a=b"));
80     buffer_copy_string_len(burl.path, CONST_STR_LEN("/foo"));
81     buffer_copy_string_len(burl.query, CONST_STR_LEN("a=b"));
82     rc = pcre_keyvalue_buffer_process(kvb, &ctx, url, result);
83     assert(HANDLER_FINISHED == rc);
84     assert(buffer_is_equal_string(result, CONST_STR_LEN("/foo/?a=b")));
85 
86     buffer_copy_string_len(url, CONST_STR_LEN("/bar?a=b"));
87     buffer_copy_string_len(burl.path, CONST_STR_LEN("/bar"));
88     buffer_copy_string_len(burl.query, CONST_STR_LEN("a=b"));
89     rc = pcre_keyvalue_buffer_process(kvb, &ctx, url, result);
90     assert(HANDLER_FINISHED == rc);
91     assert(buffer_is_equal_string(result, CONST_STR_LEN("/?bar&a=b")));
92 
93     buffer_copy_string_len(url, CONST_STR_LEN("/nofile?a=b"));
94     buffer_copy_string_len(burl.path, CONST_STR_LEN("/nofile"));
95     buffer_copy_string_len(burl.query, CONST_STR_LEN("a=b"));
96     rc = pcre_keyvalue_buffer_process(kvb, &ctx, url, result);
97     assert(HANDLER_FINISHED == rc);
98     assert(buffer_is_equal_string(result, CONST_STR_LEN("/?file=/nofile&a=b")));
99 
100     buffer_copy_string_len(url, CONST_STR_LEN("/redirect?a=b"));
101     buffer_copy_string_len(burl.path, CONST_STR_LEN("/redirect"));
102     buffer_copy_string_len(burl.query, CONST_STR_LEN("a=b"));
103     rc = pcre_keyvalue_buffer_process(kvb, &ctx, url, result);
104     assert(HANDLER_FINISHED == rc);
105     assert(buffer_is_equal_string(result, CONST_STR_LEN("/?seg=www&a=b")));
106 
107     buffer_free(url);
108     buffer_free(result);
109     buffer_free(burl.scheme);
110     buffer_free(burl.authority);
111     buffer_free(burl.path);
112     buffer_free(burl.query);
113     pcre_keyvalue_buffer_free(kvb);
114 }
115 #endif
116 
117 int main (void) {
118   #ifdef HAVE_PCRE_H
119     test_keyvalue_pcre_keyvalue_buffer_process();
120   #endif
121     return 0;
122 }
123