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