details: https://hg.nginx.org/njs/rev/55dd0c0acb66 branches: changeset: 1378:55dd0c0acb66 user: Dmitry Volyntsev <xei...@nginx.com> date: Tue Apr 21 11:57:29 2020 +0000 description: HTTP: improved iteration over header objects with duplicates.
In 9e327cd3a33e duplicates were filtered out only for Cookie and X-Forwarded-For. diffstat: nginx/ngx_http_js_module.c | 54 ++++++++++++++++++++------------------------- src/njs.h | 2 + src/njs_vm.c | 7 +++++ 3 files changed, 33 insertions(+), 30 deletions(-) diffs (113 lines): diff -r 9c3d692d9f4c -r 55dd0c0acb66 nginx/ngx_http_js_module.c --- a/nginx/ngx_http_js_module.c Tue Apr 21 11:56:46 2020 +0000 +++ b/nginx/ngx_http_js_module.c Tue Apr 21 11:57:29 2020 +0000 @@ -801,19 +801,19 @@ static njs_int_t ngx_http_js_ext_keys_header(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys, ngx_list_t *headers) { - njs_int_t rc, cookie, x_for; + int64_t i, length; + njs_int_t rc; + njs_str_t hdr; ngx_uint_t item; + njs_value_t *start; ngx_list_part_t *part; ngx_table_elt_t *header, *h; part = &headers->part; item = 0; - - cookie = 0; - x_for = 0; + length = 0; while (part) { - if (item >= part->nelts) { part = part->next; item = 0; @@ -827,36 +827,30 @@ ngx_http_js_ext_keys_header(njs_vm_t *vm continue; } - if (h->key.len == njs_length("Cookie") - && ngx_strncasecmp(h->key.data, (u_char *) "Cookie", - h->key.len) == 0) - { - if (cookie) { - continue; + start = njs_vm_array_start(vm, keys); + + for (i = 0; i < length; i++) { + njs_value_string_get(njs_argument(start, i), &hdr); + + if (h->key.len == hdr.length + && ngx_strncasecmp(h->key.data, hdr.start, hdr.length) == 0) + { + break; } - - cookie = 1; } - if (h->key.len == njs_length("X-Forwarded-For") - && ngx_strncasecmp(h->key.data, (u_char *) "X-Forwarded-For", - h->key.len) == 0) - { - if (x_for) { - continue; + if (i == length) { + value = njs_vm_array_push(vm, keys); + if (value == NULL) { + return NJS_ERROR; } - x_for = 1; - } - - value = njs_vm_array_push(vm, keys); - if (value == NULL) { - return NJS_ERROR; - } - - rc = njs_vm_value_string_set(vm, value, h->key.data, h->key.len); - if (rc != NJS_OK) { - return NJS_ERROR; + rc = njs_vm_value_string_set(vm, value, h->key.data, h->key.len); + if (rc != NJS_OK) { + return NJS_ERROR; + } + + length++; } } diff -r 9c3d692d9f4c -r 55dd0c0acb66 src/njs.h --- a/src/njs.h Tue Apr 21 11:56:46 2020 +0000 +++ b/src/njs.h Tue Apr 21 11:57:29 2020 +0000 @@ -302,6 +302,8 @@ NJS_EXPORT njs_function_t *njs_vm_functi NJS_EXPORT njs_value_t *njs_vm_retval(njs_vm_t *vm); NJS_EXPORT void njs_vm_retval_set(njs_vm_t *vm, const njs_value_t *value); +/* Gets string value, no copy. */ +NJS_EXPORT void njs_value_string_get(njs_value_t *value, njs_str_t *dst); /* * Sets a byte string value. * start data is not copied and should not be freed. diff -r 9c3d692d9f4c -r 55dd0c0acb66 src/njs_vm.c --- a/src/njs_vm.c Tue Apr 21 11:56:46 2020 +0000 +++ b/src/njs_vm.c Tue Apr 21 11:57:29 2020 +0000 @@ -670,6 +670,13 @@ njs_vm_bind(njs_vm_t *vm, const njs_str_ } +void +njs_value_string_get(njs_value_t *value, njs_str_t *dst) +{ + njs_string_get(value, dst); +} + + njs_int_t njs_vm_value_string_set(njs_vm_t *vm, njs_value_t *value, const u_char *start, uint32_t size) _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel