[mod_evhost] handle IPv6 literal addr; add tests
parent
40ded06b08
commit
142e54b2a8
|
@ -197,6 +197,20 @@ static void mod_evhost_parse_host(buffer *key, array *host, buffer *authority) {
|
|||
int first = 1;
|
||||
int i;
|
||||
|
||||
/*if (ptr == authority->ptr) return;*//*(no authority checked earlier)*/
|
||||
|
||||
if (*authority->ptr == '[') { /* authority is IPv6 literal address */
|
||||
colon = ptr;
|
||||
if (ptr[-1] != ']') {
|
||||
do { --ptr; } while (ptr > authority->ptr && ptr[-1] != ']');
|
||||
if (*ptr != ':') return; /*(should not happen for valid authority)*/
|
||||
colon = ptr;
|
||||
}
|
||||
ptr = authority->ptr;
|
||||
array_insert_key_value(host,CONST_STR_LEN("%0"),ptr,colon-ptr);
|
||||
return;
|
||||
}
|
||||
|
||||
/* first, find the domain + tld */
|
||||
for(; ptr > authority->ptr; --ptr) {
|
||||
if(*ptr == '.') {
|
||||
|
|
|
@ -22,16 +22,30 @@ static void test_mod_evhost_plugin_config_free(plugin_config *s) {
|
|||
free(s);
|
||||
}
|
||||
|
||||
struct ttt {
|
||||
const char *pattern;
|
||||
size_t plen;
|
||||
const char *expect;
|
||||
size_t elen;
|
||||
};
|
||||
|
||||
static void test_mod_evhost_build_doc_root_path_loop(struct ttt *tt, size_t nelts, buffer *authority, buffer *b, array *a) {
|
||||
for (size_t i = 0; i < nelts; ++i) {
|
||||
struct ttt *t = tt+i;
|
||||
plugin_config *s = test_mod_evhost_plugin_config_init();
|
||||
buffer_copy_string_len(s->path_pieces_raw, t->pattern, t->plen);
|
||||
assert(0 == mod_evhost_parse_pattern(s));
|
||||
mod_evhost_build_doc_root_path(b, a, authority, s->path_pieces, s->len);
|
||||
assert(buffer_is_equal_string(b, t->expect, t->elen));
|
||||
test_mod_evhost_plugin_config_free(s);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_mod_evhost_build_doc_root_path(void) {
|
||||
buffer *authority = buffer_init_string("host.example.org");
|
||||
buffer *authority = buffer_init();
|
||||
buffer *b = buffer_init();
|
||||
array *a = array_init();
|
||||
struct ttt {
|
||||
const char *pattern;
|
||||
size_t plen;
|
||||
const char *expect;
|
||||
size_t elen;
|
||||
} tt[] = {
|
||||
struct ttt tt1[] = { /* "host.example.org" */
|
||||
/* correct pattern not using dot notation */
|
||||
{ CONST_STR_LEN("/web/%3/"),
|
||||
CONST_STR_LEN("/web/host/") }
|
||||
|
@ -44,17 +58,25 @@ static void test_mod_evhost_build_doc_root_path(void) {
|
|||
/* other pattern 2 */
|
||||
,{ CONST_STR_LEN("/web/%3.\1/"),
|
||||
CONST_STR_LEN("/web/host.\1/") }
|
||||
,{ CONST_STR_LEN("/web/%0/"),
|
||||
CONST_STR_LEN("/web/example.org/") }
|
||||
}, tt2[] = { /* "example" */
|
||||
{ CONST_STR_LEN("/web/%0"),
|
||||
CONST_STR_LEN("/web/example/") }
|
||||
}, tt3[] = { /* "[::1]:80" */
|
||||
{ CONST_STR_LEN("/web/%0"),
|
||||
CONST_STR_LEN("/web/[::1]/") }
|
||||
};
|
||||
|
||||
for (size_t i = 0; i < sizeof(tt)/sizeof(tt[0]); ++i) {
|
||||
struct ttt *t = tt+i;
|
||||
plugin_config *s = test_mod_evhost_plugin_config_init();
|
||||
buffer_copy_string_len(s->path_pieces_raw, t->pattern, t->plen);
|
||||
assert(0 == mod_evhost_parse_pattern(s));
|
||||
mod_evhost_build_doc_root_path(b, a, authority, s->path_pieces, s->len);
|
||||
assert(buffer_is_equal_string(b, t->expect, t->elen));
|
||||
test_mod_evhost_plugin_config_free(s);
|
||||
}
|
||||
array_reset_data_strings(a);
|
||||
buffer_copy_string_len(authority, CONST_STR_LEN("host.example.org"));
|
||||
test_mod_evhost_build_doc_root_path_loop(tt1, sizeof(tt1)/sizeof(tt1[0]), authority, b, a);
|
||||
array_reset_data_strings(a);
|
||||
buffer_copy_string_len(authority, CONST_STR_LEN("example"));
|
||||
test_mod_evhost_build_doc_root_path_loop(tt2, sizeof(tt2)/sizeof(tt2[0]), authority, b, a);
|
||||
array_reset_data_strings(a);
|
||||
buffer_copy_string_len(authority, CONST_STR_LEN("[::1]:80"));
|
||||
test_mod_evhost_build_doc_root_path_loop(tt3, sizeof(tt3)/sizeof(tt3[0]), authority, b, a);
|
||||
|
||||
buffer_free(authority);
|
||||
buffer_free(b);
|
||||
|
|
Loading…
Reference in New Issue