diff options
Diffstat (limited to 'data/lighttpd/lighttpd-1.4.53/src/t/test_keyvalue.c')
-rw-r--r-- | data/lighttpd/lighttpd-1.4.53/src/t/test_keyvalue.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/data/lighttpd/lighttpd-1.4.53/src/t/test_keyvalue.c b/data/lighttpd/lighttpd-1.4.53/src/t/test_keyvalue.c new file mode 100644 index 000000000..83dac9236 --- /dev/null +++ b/data/lighttpd/lighttpd-1.4.53/src/t/test_keyvalue.c @@ -0,0 +1,124 @@ +#include "first.h" + +#undef NDEBUG +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> /* STDERR_FILENO */ + +#include "keyvalue.c" + +#ifdef HAVE_PCRE_H +static pcre_keyvalue_buffer * test_keyvalue_test_kvb_init (void) { + pcre_keyvalue_buffer *kvb = pcre_keyvalue_buffer_init(); + buffer *k = buffer_init(); + buffer *v = buffer_init(); + server srv; + + memset(&srv, 0, sizeof(srv)); + srv.errorlog_fd = STDERR_FILENO; + srv.errorlog_mode = ERRORLOG_FD; + srv.errorlog_buf = buffer_init(); + + buffer_copy_string_len(k, CONST_STR_LEN("^/foo($|\\?.+)")); + buffer_copy_string_len(v, CONST_STR_LEN("/foo/$1")); + assert(0 == pcre_keyvalue_buffer_append(&srv, kvb, k, v)); + buffer_copy_string_len(k, CONST_STR_LEN("^/bar(?:$|\\?(.+))")); + buffer_copy_string_len(v, CONST_STR_LEN("/?bar&$1")); + assert(0 == pcre_keyvalue_buffer_append(&srv, kvb, k, v)); + buffer_copy_string_len(k, CONST_STR_LEN("^/redirect(?:\\?(.*))?$")); + buffer_copy_string_len(v, CONST_STR_LEN("/?seg=%1&$1")); + assert(0 == pcre_keyvalue_buffer_append(&srv, kvb, k, v)); + buffer_copy_string_len(k, CONST_STR_LEN("^(/[^?]*)(?:\\?(.*))?$")); + buffer_copy_string_len(v, CONST_STR_LEN("/?file=$1&$2")); + assert(0 == pcre_keyvalue_buffer_append(&srv, kvb, k, v)); + + buffer_free(k); + buffer_free(v); + buffer_free(srv.errorlog_buf); + + return kvb; +} + +static void test_keyvalue_pcre_keyvalue_buffer_process (void) { + pcre_keyvalue_buffer *kvb = test_keyvalue_test_kvb_init(); + buffer *url = buffer_init(); + buffer *result = buffer_init(); + struct burl_parts_t burl; + cond_cache_t cache; + pcre_keyvalue_ctx ctx; + handler_t rc; + + ctx.burl = &burl; + burl.scheme = buffer_init(); + burl.authority = buffer_init(); + burl.port = 80; + burl.path = buffer_init(); + burl.query = buffer_init(); + buffer_copy_string_len(burl.scheme, CONST_STR_LEN("http")); + buffer_copy_string_len(burl.authority, CONST_STR_LEN("www.example.com")); + /* model outer conditional match of $HTTP["host"] =~ "^(www).example.com$" */ + ctx.cache = &cache; + memset(&cache, 0, sizeof(cache)); + cache.patterncount = 2; + cache.comp_value = burl.authority; + cache.matches[0] = 0; + cache.matches[1] = 15; + cache.matches[2] = 0; + cache.matches[3] = 3; + + /* converted from prior sparse tests/mod-redirect.t and tests/mod-rewrite.t + * (real-world use should prefer ${url.path} and ${qsa} in substitutions) + */ + + buffer_copy_string_len(url, CONST_STR_LEN("/foo")); + buffer_copy_string_len(burl.path, CONST_STR_LEN("/foo")); + buffer_clear(burl.query); + rc = pcre_keyvalue_buffer_process(kvb, &ctx, url, result); + assert(HANDLER_FINISHED == rc); + assert(buffer_is_equal_string(result, CONST_STR_LEN("/foo/"))); + + buffer_copy_string_len(url, CONST_STR_LEN("/foo?a=b")); + buffer_copy_string_len(burl.path, CONST_STR_LEN("/foo")); + buffer_copy_string_len(burl.query, CONST_STR_LEN("a=b")); + rc = pcre_keyvalue_buffer_process(kvb, &ctx, url, result); + assert(HANDLER_FINISHED == rc); + assert(buffer_is_equal_string(result, CONST_STR_LEN("/foo/?a=b"))); + + buffer_copy_string_len(url, CONST_STR_LEN("/bar?a=b")); + buffer_copy_string_len(burl.path, CONST_STR_LEN("/bar")); + buffer_copy_string_len(burl.query, CONST_STR_LEN("a=b")); + rc = pcre_keyvalue_buffer_process(kvb, &ctx, url, result); + assert(HANDLER_FINISHED == rc); + assert(buffer_is_equal_string(result, CONST_STR_LEN("/?bar&a=b"))); + + buffer_copy_string_len(url, CONST_STR_LEN("/nofile?a=b")); + buffer_copy_string_len(burl.path, CONST_STR_LEN("/nofile")); + buffer_copy_string_len(burl.query, CONST_STR_LEN("a=b")); + rc = pcre_keyvalue_buffer_process(kvb, &ctx, url, result); + assert(HANDLER_FINISHED == rc); + assert(buffer_is_equal_string(result, CONST_STR_LEN("/?file=/nofile&a=b"))); + + buffer_copy_string_len(url, CONST_STR_LEN("/redirect?a=b")); + buffer_copy_string_len(burl.path, CONST_STR_LEN("/redirect")); + buffer_copy_string_len(burl.query, CONST_STR_LEN("a=b")); + rc = pcre_keyvalue_buffer_process(kvb, &ctx, url, result); + assert(HANDLER_FINISHED == rc); + assert(buffer_is_equal_string(result, CONST_STR_LEN("/?seg=www&a=b"))); + + buffer_free(url); + buffer_free(result); + buffer_free(burl.scheme); + buffer_free(burl.authority); + buffer_free(burl.path); + buffer_free(burl.query); + pcre_keyvalue_buffer_free(kvb); +} +#endif + +int main (void) { + #ifdef HAVE_PCRE_H + test_keyvalue_pcre_keyvalue_buffer_process(); + #endif + return 0; +} |