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, 1)); 33 assert(pcre_keyvalue_buffer_append(errh, kvb, kvstr+2, kvstr+3, 1)); 34 assert(pcre_keyvalue_buffer_append(errh, kvb, kvstr+4, kvstr+5, 1)); 35 assert(pcre_keyvalue_buffer_append(errh, kvb, kvstr+6, kvstr+7, 1)); 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