Welcome! Log In Create A New Profile

Advanced

[nginx] Caseless location tree construction (ticket #90).

Maxim Dounin
September 23, 2013 01:02PM
details: http://hg.nginx.org/nginx/rev/fbaae7d1c033
branches:
changeset: 5388:fbaae7d1c033
user: Maxim Dounin <mdounin@mdounin.ru>
date: Mon Sep 23 19:37:06 2013 +0400
description:
Caseless location tree construction (ticket #90).

Location tree was always constructed using case-sensitive comparison, even
on case-insensitive systems. This resulted in incorrect operation if
uppercase letters were used in location directives. Notably, the
following config:

location /a { ... }
location /B { ... }

failed to properly map requests to "/B" into "location /B".

diffstat:

src/http/ngx_http.c | 11 +++++++----
src/http/ngx_http_core_module.c | 4 ++--
2 files changed, 9 insertions(+), 6 deletions(-)

diffs (50 lines):

diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c
--- a/src/http/ngx_http.c
+++ b/src/http/ngx_http.c
@@ -949,7 +949,8 @@ ngx_http_cmp_locations(const ngx_queue_t

#endif

- rc = ngx_strcmp(first->name.data, second->name.data);
+ rc = ngx_filename_cmp(first->name.data, second->name.data,
+ ngx_min(first->name.len, second->name.len) + 1);

if (rc == 0 && !first->exact_match && second->exact_match) {
/* an exact match must be before the same inclusive one */
@@ -975,8 +976,10 @@ ngx_http_join_exact_locations(ngx_conf_t
lq = (ngx_http_location_queue_t *) q;
lx = (ngx_http_location_queue_t *) x;

- if (ngx_strcmp(lq->name->data, lx->name->data) == 0) {
-
+ if (lq->name->len == lx->name->len
+ && ngx_filename_cmp(lq->name->data, lx->name->data, lx->name->len)
+ == 0)
+ {
if ((lq->exact && lx->exact) || (lq->inclusive && lx->inclusive)) {
ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
"duplicate location \"%V\" in %s:%ui",
@@ -1028,7 +1031,7 @@ ngx_http_create_locations_list(ngx_queue
lx = (ngx_http_location_queue_t *) x;

if (len > lx->name->len
- || (ngx_strncmp(name, lx->name->data, len) != 0))
+ || ngx_filename_cmp(name, lx->name->data, len) != 0)
{
break;
}
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -3219,9 +3219,9 @@ ngx_http_core_location(ngx_conf_t *cf, n

#if (NGX_PCRE)
if (clcf->regex == NULL
- && ngx_strncmp(clcf->name.data, pclcf->name.data, len) != 0)
+ && ngx_filename_cmp(clcf->name.data, pclcf->name.data, len) != 0)
#else
- if (ngx_strncmp(clcf->name.data, pclcf->name.data, len) != 0)
+ if (ngx_filename_cmp(clcf->name.data, pclcf->name.data, len) != 0)
#endif
{
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] Caseless location tree construction (ticket #90).

Maxim Dounin 888 September 23, 2013 01:02PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 162
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 500 on July 15, 2024
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready