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