Fixed negative patterns combined with address rules.
This commit is contained in:
@@ -192,6 +192,7 @@ static nxt_http_route_rule_t *nxt_http_route_rule_create(nxt_task_t *task,
|
|||||||
nxt_mp_t *mp, nxt_conf_value_t *cv, nxt_bool_t case_sensitive,
|
nxt_mp_t *mp, nxt_conf_value_t *cv, nxt_bool_t case_sensitive,
|
||||||
nxt_http_route_pattern_case_t pattern_case);
|
nxt_http_route_pattern_case_t pattern_case);
|
||||||
static int nxt_http_pattern_compare(const void *one, const void *two);
|
static int nxt_http_pattern_compare(const void *one, const void *two);
|
||||||
|
static int nxt_http_addr_pattern_compare(const void *one, const void *two);
|
||||||
static nxt_int_t nxt_http_route_pattern_create(nxt_task_t *task, nxt_mp_t *mp,
|
static nxt_int_t nxt_http_route_pattern_create(nxt_task_t *task, nxt_mp_t *mp,
|
||||||
nxt_conf_value_t *cv, nxt_http_route_pattern_t *pattern,
|
nxt_conf_value_t *cv, nxt_http_route_pattern_t *pattern,
|
||||||
nxt_http_route_pattern_case_t pattern_case);
|
nxt_http_route_pattern_case_t pattern_case);
|
||||||
@@ -881,6 +882,12 @@ nxt_http_route_addr_rule_create(nxt_task_t *task, nxt_mp_t *mp,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (n > 1) {
|
||||||
|
nxt_qsort(addr_rule->addr_pattern, addr_rule->items,
|
||||||
|
sizeof(nxt_http_route_addr_pattern_t),
|
||||||
|
nxt_http_addr_pattern_compare);
|
||||||
|
}
|
||||||
|
|
||||||
return addr_rule;
|
return addr_rule;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -904,6 +911,18 @@ nxt_http_pattern_compare(const void *one, const void *two)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
nxt_http_addr_pattern_compare(const void *one, const void *two)
|
||||||
|
{
|
||||||
|
const nxt_http_route_addr_pattern_t *p1, *p2;
|
||||||
|
|
||||||
|
p1 = one;
|
||||||
|
p2 = two;
|
||||||
|
|
||||||
|
return (p2->base.negative - p1->base.negative);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static nxt_int_t
|
static nxt_int_t
|
||||||
nxt_http_route_pattern_create(nxt_task_t *task, nxt_mp_t *mp,
|
nxt_http_route_pattern_create(nxt_task_t *task, nxt_mp_t *mp,
|
||||||
nxt_conf_value_t *cv, nxt_http_route_pattern_t *pattern,
|
nxt_conf_value_t *cv, nxt_http_route_pattern_t *pattern,
|
||||||
@@ -1527,19 +1546,34 @@ static nxt_int_t
|
|||||||
nxt_http_route_addr_rule(nxt_http_request_t *r,
|
nxt_http_route_addr_rule(nxt_http_request_t *r,
|
||||||
nxt_http_route_addr_rule_t *addr_rule, nxt_sockaddr_t *sa)
|
nxt_http_route_addr_rule_t *addr_rule, nxt_sockaddr_t *sa)
|
||||||
{
|
{
|
||||||
uint32_t i, n;
|
uint32_t n;
|
||||||
|
nxt_bool_t matches;
|
||||||
nxt_http_route_addr_pattern_t *p;
|
nxt_http_route_addr_pattern_t *p;
|
||||||
|
|
||||||
n = addr_rule->items;
|
n = addr_rule->items;
|
||||||
|
p = &addr_rule->addr_pattern[0] - 1;
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
do {
|
||||||
p = &addr_rule->addr_pattern[i];
|
p++;
|
||||||
if (nxt_http_route_addr_pattern_match(p, sa)) {
|
n--;
|
||||||
|
|
||||||
|
matches = nxt_http_route_addr_pattern_match(p, sa);
|
||||||
|
|
||||||
|
if (p->base.negative) {
|
||||||
|
if (matches) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matches) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
} while (n > 0);
|
||||||
|
|
||||||
|
return p->base.negative;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user