]> git.kaiwu.me - nginx.git/commitdiff
allow insertion range if its start or end is the same as existent one
authorIgor Sysoev <igor@sysoev.ru>
Fri, 16 Jan 2009 16:29:23 +0000 (16:29 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Fri, 16 Jan 2009 16:29:23 +0000 (16:29 +0000)
src/http/modules/ngx_http_geo_module.c

index 003f02c6b08a624cc67a0ba28cde56d5712e19f8..5535eb29907893e8f095dc4c7e9c0b7079629d8c 100644 (file)
@@ -615,12 +615,60 @@ ngx_http_geo_add_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx,
                 range[i + 2].end = range[i].end;
                 range[i + 2].value = range[i].value;
 
+                range[i + 1].start = (u_short) s;
+                range[i + 1].end = (u_short) e;
+                range[i + 1].value = ctx->value;
+
                 range[i].end = (u_short) (s - 1);
 
+                goto next;
+            }
+
+            if (s == (ngx_uint_t) range[i].start
+                && e < (ngx_uint_t) range[i].end)
+            {
+                /* shift the range start and insert the new range */
+
+                range = ngx_array_push(a);
+                if (range == NULL) {
+                    return NGX_CONF_ERROR;
+                }
+
+                range = a->elts;
+
+                ngx_memcpy(&range[i + 2], &range[i + 1],
+                           (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t));
+
+                range[i + 1].start = (u_short) (e + 1);
+
+                range[i].start = (u_short) s;
+                range[i].end = (u_short) e;
+                range[i].value = ctx->value;
+
+                goto next;
+            }
+
+            if (s > (ngx_uint_t) range[i].start
+                && e == (ngx_uint_t) range[i].end)
+            {
+                /* shift the range end and insert the new range */
+
+                range = ngx_array_push(a);
+                if (range == NULL) {
+                    return NGX_CONF_ERROR;
+                }
+
+                range = a->elts;
+
+                ngx_memcpy(&range[i + 2], &range[i + 1],
+                           (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t));
+
                 range[i + 1].start = (u_short) s;
                 range[i + 1].end = (u_short) e;
                 range[i + 1].value = ctx->value;
 
+                range[i].end = (u_short) (s - 1);
+
                 goto next;
             }