Re: Mime-types: обновление
Здравствуйте, Максим. Как мне кажется шрифты ttf/otf часто используются, например в Mastodon. В Roundcube много файлов с расширением .less, которые можно отнести text/plain. К этому типу можно также отнести субтитры в формате ass, которые много где используются. С другими типами реже сталкивался. При составлении этого списка ориентировался на популярный сборник конфигураций - https://github.com/h5bp/server-configs-nginx который поддерживается сообществом. Настройки для gzip: https://github.com/h5bp/server-configs-nginx/blob/main/h5bp/web_performance/compression.conf MIME типы: https://github.com/h5bp/server-configs-nginx/blob/main/mime.types Там как раз таки прописаны распространённые варианты. Вы писали 21 ноября 2023 г., 22:43:08: > Hello! > On Mon, Nov 20, 2023 at 08:06:33AM +0300, izor...@gmail.com wrote: > Gzip-сжатие работает корректно независимо от того, какие именно > типы файлов сказано жать. Самое плохо, что может случиться от > отсутствия MIME-типов - gzip-сжатие для этих файлов будет > выключено, и соответственно общая эффективность сжатия упадёт. > Имеет смысл обсуждать ситуации, когда среди ответов есть заметный > процент файлов какого-либо типа, который можно (и хотелось бы) > жать, и в то же время nginx не умеет распознавать MIME-тип для > этих файлов по расширению. То есть типичному web-сайту приходится > и конфигурировать gzip_types, и в добавок прописывать MIME-типы > через types. > На вскидку я в списке по ссылке вижу следующие типы, которых > (или аналогов для соответствующих расширений) нет в mime.types > nginx'а: > application/ld+json > application/manifest+json > application/rdf+xml > application/x-web-app-manifest+json > application/xliff+xml > font/collection > font/otf > font/ttf > text/cache-manifest > text/calendar > text/csv > text/markdown > text/vcard > text/vnd.rim.location.xloc > В целом кажется, что для типичного web-сайта доля ответов с > файлами таких типов должна быть около нуля, и соответственно с > точки зрения gzip-сжатия полезность добавления этих типов примерно > такая же. > Возможно, из этого списка стоит добавить > application/manifest+json, text/csv и text/markdown, но скорее из > общих соображений. > Сейчас в nginx'е используется text/xml, и каких-либо причин менять > тип не прослеживается. > В то же время, базовые вопросы при изменении, если вдруг его > делать, ровно такие же: подобное изменение может потребовать > изменения конфигов, и соответственно должно быть явно > документировано, а равно соответствующих изменений в коде, если > тип где-то используется в коде (text/xml - используется). -- С уважением, Izorkin mailto:izor...@gmail.com ___ nginx-ru mailing list nginx-ru@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Limiting number of client TLS connections
Hello! On Mon, Nov 20, 2023 at 11:29:39PM +0800, Zero King wrote: > In our case, layer-4 firewall is difficult to introduce in the request > path. Would you consider rate limiting in Nginx a valid feature request? Firewall is expected to be much more effective solution compared to nginx (which has to work with already established connections at the application level). It might be a better idea to actually introduce a firewall if you need such limits (or, rather, make it possible to configure the one most likely already present). -- Maxim Dounin http://mdounin.ru/ ___ nginx mailing list nginx@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx
Re: Mime-types: обновление
Hello! On Mon, Nov 20, 2023 at 08:06:33AM +0300, izor...@gmail.com wrote: > Да, сложнее чем я думал... > Как минимум, я бы хотел куда-нибудь включить этот минимальный список > MIME-типов, чтобы корректно работало GZIP сжатие: > https://github.com/NixOS/nixpkgs/blob/3f21a22b5aafefa1845dec6f4a378a8f53d8681c/nixos/modules/services/web-servers/nginx/default.nix#L35-L68 > Некоторых из них нету в пакете mailpcap, поэтому иногда возникают > проблемы. Gzip-сжатие работает корректно независимо от того, какие именно типы файлов сказано жать. Самое плохо, что может случиться от отсутствия MIME-типов - gzip-сжатие для этих файлов будет выключено, и соответственно общая эффективность сжатия упадёт. Имеет смысл обсуждать ситуации, когда среди ответов есть заметный процент файлов какого-либо типа, который можно (и хотелось бы) жать, и в то же время nginx не умеет распознавать MIME-тип для этих файлов по расширению. То есть типичному web-сайту приходится и конфигурировать gzip_types, и в добавок прописывать MIME-типы через types. На вскидку я в списке по ссылке вижу следующие типы, которых (или аналогов для соответствующих расширений) нет в mime.types nginx'а: application/ld+json application/manifest+json application/rdf+xml application/x-web-app-manifest+json application/xliff+xml font/collection font/otf font/ttf text/cache-manifest text/calendar text/csv text/markdown text/vcard text/vnd.rim.location.xloc В целом кажется, что для типичного web-сайта доля ответов с файлами таких типов должна быть около нуля, и соответственно с точки зрения gzip-сжатия полезность добавления этих типов примерно такая же. Возможно, из этого списка стоит добавить application/manifest+json, text/csv и text/markdown, но скорее из общих соображений. > Засада с javascript... Не явных проблем с заменой application/xml > на text/xml случаем нету? Сейчас в nginx'е используется text/xml, и каких-либо причин менять тип не прослеживается. В то же время, базовые вопросы при изменении, если вдруг его делать, ровно такие же: подобное изменение может потребовать изменения конфигов, и соответственно должно быть явно документировано, а равно соответствующих изменений в коде, если тип где-то используется в коде (text/xml - используется). -- Maxim Dounin http://mdounin.ru/ ___ nginx-ru mailing list nginx-ru@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Патч ETags в NixOS
Здравствуйте, Maxim. Да, этот патч, забыл указать ссылку. Проверил без патча и добавлением строки `add_header Last-Modified "";` В ответе генерируется ETag: "1-4e", "1-75" и т.д. Если после изменения содержимого файла без изменения размера, то при запросе отдаётся файл из кеша, т.к. при этом ETag не изменяется. А если размер файла меняется, кеш обновляется. Вариант с использованием хеадера Last-Modified не подходит, может надо как-то учитывать путь к файлу для генерации ETag. Вы писали 20 ноября 2023 г., 5:57:08: > Hello! > On Sun, Nov 19, 2023 at 04:15:42PM +0300, izor...@gmail.com wrote: > Если я правильно понимаю, речь про вот этот патч: > https://github.com/NixOS/nixpkgs/blob/nixos-23.05/pkgs/servers/http/nginx/nix-etag-1.15.4.patch > Патч выглядит, скажем так, непригодным для включения куда-либо. > Если для задачи достаточно не выдавать пользователю Last-Modified, > а выдавать только ETag (этого, вероятно, будет достаточно как > минимум если в URI виден полный путь из /nix/store, включающий > hash, а также в остальных случаях, если на размер можно полагаться для > идентификации файлов), то просто убрать Last-Modified из ответов > можно стандартным механизмом add_header > (http://nginx.org/r/add_header): > add_header Last-Modified ""; > Соответственно у ответов будет только ETag, сформированный > nginx'ом из даты модификации файла (0 в случае /nix/store) и > размера файла. -- С уважением, Izorkin mailto:izor...@gmail.com ___ nginx-ru mailing list nginx-ru@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-ru
[njs] Moving out setTimeout() and clearTimeout() from njs core.
details: https://hg.nginx.org/njs/rev/dffdf7c50dfc branches: changeset: 2238:dffdf7c50dfc user: Dmitry Volyntsev date: Tue Nov 21 09:00:52 2023 -0800 description: Moving out setTimeout() and clearTimeout() from njs core. This functions are not part of the ECMAScript and should be implemented by host environment. diffstat: auto/sources |1 - external/njs_shell.c | 314 ++ nginx/ngx_http_js_module.c | 123 +--- nginx/ngx_js.c | 273 +- nginx/ngx_js.h | 46 ++- nginx/ngx_stream_js_module.c | 120 --- src/njs.h|2 - src/njs_builtin.c|6 - src/njs_main.h |1 - src/test/njs_unit_test.c | 24 --- test/shell_test.exp |2 +- 11 files changed, 580 insertions(+), 332 deletions(-) diffs (truncated from 1505 to 1000 lines): diff -r 896e7e271382 -r dffdf7c50dfc auto/sources --- a/auto/sources Tue Nov 21 08:57:09 2023 -0800 +++ b/auto/sources Tue Nov 21 09:00:52 2023 -0800 @@ -33,7 +33,6 @@ NJS_LIB_SRCS=" \ src/njs_scope.c \ src/njs_generator.c \ src/njs_disassembler.c \ - src/njs_timer.c \ src/njs_module.c \ src/njs_event.c \ src/njs_extern.c \ diff -r 896e7e271382 -r dffdf7c50dfc external/njs_shell.c --- a/external/njs_shell.c Tue Nov 21 08:57:09 2023 -0800 +++ b/external/njs_shell.c Tue Nov 21 09:00:52 2023 -0800 @@ -11,8 +11,6 @@ #include #include #include -#include -#include #if (!defined NJS_FUZZER_TARGET && defined NJS_HAVE_READLINE) @@ -70,7 +68,12 @@ typedef struct { typedef struct { -njs_vm_event_t vm_event; +NJS_RBTREE_NODE (node); +njs_function_t *function; +njs_value_t *args; +njs_uint_t nargs; +uint32_tid; + njs_queue_link_tlink; } njs_ev_t; @@ -85,7 +88,8 @@ typedef struct { typedef struct { njs_vm_t*vm; -njs_lvlhsh_tevents; /* njs_ev_t * */ +uint32_tevent_id; +njs_rbtree_tevents; /* njs_ev_t * */ njs_queue_t posted_events; njs_queue_t labels; @@ -120,6 +124,12 @@ static char *njs_completion_generator(co #endif +static njs_int_t njs_set_timeout(njs_vm_t *vm, njs_value_t *args, +njs_uint_t nargs, njs_index_t unused, njs_value_t *retval); +static njs_int_t njs_set_immediate(njs_vm_t *vm, njs_value_t *args, +njs_uint_t nargs, njs_index_t unused, njs_value_t *retval); +static njs_int_t njs_clear_timeout(njs_vm_t *vm, njs_value_t *args, +njs_uint_t nargs, njs_index_t unused, njs_value_t *retval); static njs_int_t njs_ext_console_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t magic, njs_value_t *retval); static njs_int_t njs_ext_console_time(njs_vm_t *vm, njs_value_t *args, @@ -127,17 +137,11 @@ static njs_int_t njs_ext_console_time(nj static njs_int_t njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused, njs_value_t *retval); -static njs_host_event_t njs_console_set_timer(njs_external_ptr_t external, -uint64_t delay, njs_vm_event_t vm_event); - -static void njs_console_clear_timer(njs_external_ptr_t external, -njs_host_event_t event); static void njs_console_log(njs_vm_t *vm, njs_external_ptr_t external, njs_log_level_t level, const u_char *start, size_t length); -static njs_int_t lvlhsh_key_test(njs_lvlhsh_query_t *lhq, void *data); -static void *lvlhsh_pool_alloc(void *pool, size_t size); -static void lvlhsh_pool_free(void *pool, void *p, size_t size); +static intptr_t njs_event_rbtree_compare(njs_rbtree_node_t *node1, +njs_rbtree_node_t *node2); njs_int_t njs_array_buffer_detach(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused, njs_value_t *retval); @@ -264,17 +268,7 @@ static njs_external_t njs_ext_262[] = { }; -static const njs_lvlhsh_proto_t lvlhsh_proto njs_aligned(64) = { -NJS_LVLHSH_LARGE_SLAB, -lvlhsh_key_test, -lvlhsh_pool_alloc, -lvlhsh_pool_free, -}; - - static njs_vm_ops_t njs_console_ops = { -njs_console_set_timer, -njs_console_clear_timer, NULL, njs_console_log, }; @@ -635,7 +629,8 @@ njs_console_init(njs_vm_t *vm, njs_conso { console->vm = vm; -njs_lvlhsh_init(>events); +console->event_id = 0; +njs_rbtree_init(>events, njs_event_rbtree_compare); njs_queue_init(>posted_events); njs_queue_init(>labels); @@ -649,6 +644,24 @@ njs_console_init(njs_vm_t *vm, njs_conso static njs_int_t +njs_function_bind(njs_vm_t *vm, const njs_str_t *name, +njs_function_native_t native, njs_bool_t ctor) +{ +njs_function_t *f; +njs_opaque_value_t value; + +f = njs_vm_function_alloc(vm, native, 1, ctor); +if (f == NULL) { +
[njs] Renaming ngx_js_retval() to ngx_js_exception().
details: https://hg.nginx.org/njs/rev/896e7e271382 branches: changeset: 2237:896e7e271382 user: Dmitry Volyntsev date: Tue Nov 21 08:57:09 2023 -0800 description: Renaming ngx_js_retval() to ngx_js_exception(). After previous commit ngx_js_retval() is only used for getting the exception value and should be renamed to better reflect the purpose. diffstat: nginx/ngx_http_js_module.c | 4 ++-- nginx/ngx_js.c | 14 -- nginx/ngx_js.h | 3 +-- nginx/ngx_stream_js_module.c | 8 4 files changed, 11 insertions(+), 18 deletions(-) diffs (115 lines): diff -r 1d13f6e877ad -r 896e7e271382 nginx/ngx_http_js_module.c --- a/nginx/ngx_http_js_module.cTue Nov 21 08:57:03 2023 -0800 +++ b/nginx/ngx_http_js_module.cTue Nov 21 08:57:09 2023 -0800 @@ -1401,7 +1401,7 @@ ngx_http_js_init_vm(ngx_http_request_t * } if (njs_vm_start(ctx->vm, njs_value_arg()) == NJS_ERROR) { -ngx_js_retval(ctx->vm, NULL, ); +ngx_js_exception(ctx->vm, ); ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "js exception: %V", ); @@ -4526,7 +4526,7 @@ ngx_http_js_handle_vm_event(ngx_http_req (ngx_int_t) rc, vm_event); if (rc == NJS_ERROR) { -ngx_js_retval(ctx->vm, NULL, ); +ngx_js_exception(ctx->vm, ); ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "js exception: %V", ); diff -r 1d13f6e877ad -r 896e7e271382 nginx/ngx_js.c --- a/nginx/ngx_js.cTue Nov 21 08:57:03 2023 -0800 +++ b/nginx/ngx_js.cTue Nov 21 08:57:09 2023 -0800 @@ -359,7 +359,7 @@ ngx_js_invoke(njs_vm_t *vm, ngx_str_t *f ret = njs_vm_invoke(vm, func, njs_value_arg(args), nargs, njs_value_arg(retval)); if (ret == NJS_ERROR) { -ngx_js_retval(vm, NULL, ); +ngx_js_exception(vm, ); ngx_log_error(NGX_LOG_ERR, log, 0, "js exception: %V", ); @@ -369,7 +369,7 @@ ngx_js_invoke(njs_vm_t *vm, ngx_str_t *f ret = njs_vm_run(vm); if (ret == NJS_ERROR) { -ngx_js_retval(vm, NULL, ); +ngx_js_exception(vm, ); ngx_log_error(NGX_LOG_ERR, log, 0, "js exception: %V", ); @@ -382,18 +382,12 @@ ngx_js_invoke(njs_vm_t *vm, ngx_str_t *f ngx_int_t -ngx_js_retval(njs_vm_t *vm, njs_opaque_value_t *retval, ngx_str_t *s) +ngx_js_exception(njs_vm_t *vm, ngx_str_t *s) { njs_int_t ret; njs_str_t str; -if (retval != NULL && njs_value_is_valid(njs_value_arg(retval))) { -ret = njs_vm_value_string(vm, , njs_value_arg(retval)); - -} else { -ret = njs_vm_exception_string(vm, ); -} - +ret = njs_vm_exception_string(vm, ); if (ret != NJS_OK) { return NGX_ERROR; } diff -r 1d13f6e877ad -r 896e7e271382 nginx/ngx_js.h --- a/nginx/ngx_js.hTue Nov 21 08:57:03 2023 -0800 +++ b/nginx/ngx_js.hTue Nov 21 08:57:09 2023 -0800 @@ -133,8 +133,7 @@ ngx_int_t ngx_js_call(njs_vm_t *vm, ngx_ njs_opaque_value_t *args, njs_uint_t nargs); ngx_int_t ngx_js_invoke(njs_vm_t *vm, ngx_str_t *fname, ngx_log_t *log, njs_opaque_value_t *args, njs_uint_t nargs, njs_opaque_value_t *retval); -ngx_int_t ngx_js_retval(njs_vm_t *vm, njs_opaque_value_t *retval, -ngx_str_t *s); +ngx_int_t ngx_js_exception(njs_vm_t *vm, ngx_str_t *s); njs_int_t ngx_js_ext_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t level, njs_value_t *retval); diff -r 1d13f6e877ad -r 896e7e271382 nginx/ngx_stream_js_module.c --- a/nginx/ngx_stream_js_module.c Tue Nov 21 08:57:03 2023 -0800 +++ b/nginx/ngx_stream_js_module.c Tue Nov 21 08:57:09 2023 -0800 @@ -754,7 +754,7 @@ ngx_stream_js_phase_handler(ngx_stream_s ret = ngx_stream_js_run_event(s, ctx, >events[NGX_JS_EVENT_UPLOAD], 0); if (ret != NJS_OK) { -ngx_js_retval(ctx->vm, NULL, ); +ngx_js_exception(ctx->vm, ); ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %V", ); @@ -841,7 +841,7 @@ ngx_stream_js_body_filter(ngx_stream_ses if (event->ev != NULL) { ret = ngx_stream_js_run_event(s, ctx, event, from_upstream); if (ret != NJS_OK) { -ngx_js_retval(ctx->vm, NULL, ); +ngx_js_exception(ctx->vm, ); ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %V", ); @@ -1063,7 +1063,7 @@ ngx_stream_js_init_vm(ngx_stream_session } if (njs_vm_start(ctx->vm, njs_value_arg()) == NJS_ERROR) { -ngx_js_retval(ctx->vm, NULL, ); +ngx_js_exception(ctx->vm, ); ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, "js exception: %V", ); @@ -1812,7 +1812,7 @@ ngx_stream_js_handle_event(ngx_stream_se (ngx_int_t) rc, vm_event); if (rc == NJS_ERROR) { -ngx_js_retval(ctx->vm, NULL, ); +
[njs] Modules: fixed js_set with Buffer values.
details: https://hg.nginx.org/njs/rev/1d13f6e877ad branches: changeset: 2236:1d13f6e877ad user: Dmitry Volyntsev date: Tue Nov 21 08:57:03 2023 -0800 description: Modules: fixed js_set with Buffer values. Previously, a Buffer value which contains invalid UTF-8 when returned as a value for js_set handler was mangled because the bytes value was converted to a string value. The fix is to use bytes value of Buffer, TypedArray and ArrayBuffer as is, and not convert it to a string first. diffstat: nginx/ngx_http_js_module.c | 8 +++--- nginx/ngx_stream_js_module.c | 8 +++--- nginx/t/js.t | 28 -- nginx/t/stream_js.t | 45 +-- 4 files changed, 75 insertions(+), 14 deletions(-) diffs (243 lines): diff -r 8e024f36e38e -r 1d13f6e877ad nginx/ngx_http_js_module.c --- a/nginx/ngx_http_js_module.cTue Nov 21 06:49:30 2023 -0800 +++ b/nginx/ngx_http_js_module.cTue Nov 21 08:57:03 2023 -0800 @@ -1250,7 +1250,7 @@ ngx_http_js_variable_set(ngx_http_reques ngx_int_t rc; njs_int_t pending; -ngx_str_t value; +njs_str_t value; ngx_http_js_ctx_t *ctx; rc = ngx_http_js_init_vm(r, ngx_http_js_request_proto_id); @@ -1285,15 +1285,15 @@ ngx_http_js_variable_set(ngx_http_reques return NGX_ERROR; } -if (ngx_js_retval(ctx->vm, >retval, ) != NGX_OK) { +if (ngx_js_string(ctx->vm, njs_value_arg(>retval), ) != NGX_OK) { return NGX_ERROR; } -v->len = value.len; +v->len = value.length; v->valid = 1; v->no_cacheable = 0; v->not_found = 0; -v->data = value.data; +v->data = value.start; return NGX_OK; } diff -r 8e024f36e38e -r 1d13f6e877ad nginx/ngx_stream_js_module.c --- a/nginx/ngx_stream_js_module.c Tue Nov 21 06:49:30 2023 -0800 +++ b/nginx/ngx_stream_js_module.c Tue Nov 21 08:57:03 2023 -0800 @@ -914,7 +914,7 @@ ngx_stream_js_variable_set(ngx_stream_se ngx_int_t rc; njs_int_t pending; -ngx_str_t value; +njs_str_t value; ngx_stream_js_ctx_t *ctx; rc = ngx_stream_js_init_vm(s, ngx_stream_js_session_proto_id); @@ -949,15 +949,15 @@ ngx_stream_js_variable_set(ngx_stream_se return NGX_ERROR; } -if (ngx_js_retval(ctx->vm, >retval, ) != NGX_OK) { +if (ngx_js_string(ctx->vm, njs_value_arg(>retval), ) != NGX_OK) { return NGX_ERROR; } -v->len = value.len; +v->len = value.length; v->valid = 1; v->no_cacheable = 0; v->not_found = 0; -v->data = value.data; +v->data = value.start; return NGX_OK; } diff -r 8e024f36e38e -r 1d13f6e877ad nginx/t/js.t --- a/nginx/t/js.t Tue Nov 21 06:49:30 2023 -0800 +++ b/nginx/t/js.t Tue Nov 21 08:57:03 2023 -0800 @@ -46,6 +46,7 @@ http { js_set $test_global test.global_obj; js_set $test_log test.log; js_set $test_internal test.sub_internal; +js_set $buffertest.buffer; js_set $test_except test.except; js_import test.js; @@ -95,6 +96,10 @@ http { js_content test.status; } +location /buffer_variable { +js_content test.buffer_variable; +} + location /request_body { js_content test.request_body; } @@ -171,6 +176,10 @@ EOF return 'variable=' + r.variables.remote_addr; } +function buffer(r) { +return Buffer.from([0xaa, 0xbb, 0xcc, 0xdd]); +} + function global_obj(r) { return 'global=' + global; } @@ -225,6 +234,10 @@ EOF r.log('SEE-LOG'); } +function buffer_variable(r) { +r.return(200, r.rawVariables.buffer.toString('hex')); +} + async function internal(r) { let reply = await r.subrequest('/sub_internal'); @@ -248,14 +261,15 @@ EOF function content_empty(r) { } -export default {njs:test_njs, method, version, addr, uri, +export default {njs:test_njs, method, version, addr, uri, buffer, variable, global_obj, status, request_body, internal, request_body_cache, send, return_method, sub_internal, -type, log, except, content_except, content_empty}; +type, log, buffer_variable, except, content_except, +content_empty}; EOF -$t->try_run('no njs available')->plan(27); +$t->try_run('no njs available')->plan(28); ### @@ -307,6 +321,14 @@ like(http_get('/internal'), qr/parent: f } + +TODO: { +local $TODO = 'not yet' unless has_version('0.8.3'); + +like(http_get('/buffer_variable'), qr/aabbccdd/, 'buffer variable'); + +} + http_get('/except'); http_get('/content_except'); diff -r 8e024f36e38e -r 1d13f6e877ad nginx/t/stream_js.t ---
[njs] Fixed memory overlapping.
details: https://hg.nginx.org/njs/rev/8e024f36e38e branches: changeset: 2235:8e024f36e38e user: Vadim Zhestikov date: Tue Nov 21 06:49:30 2023 -0800 description: Fixed memory overlapping. diffstat: src/njs_iterator.c | 22 ++ src/test/njs_unit_test.c | 3 +++ 2 files changed, 5 insertions(+), 20 deletions(-) diffs (66 lines): diff -r e4105b65d105 -r 8e024f36e38e src/njs_iterator.c --- a/src/njs_iterator.cWed Nov 15 15:08:18 2023 -0800 +++ b/src/njs_iterator.cTue Nov 21 06:49:30 2023 -0800 @@ -301,7 +301,6 @@ njs_object_iterate(njs_vm_t *vm, njs_ite njs_value_t *value, *entry, prop, character; const u_char*p, *end, *pos; njs_string_prop_t string_prop; -njs_object_value_t *object; value = njs_value_arg(>value); from = args->from; @@ -348,15 +347,7 @@ njs_object_iterate(njs_vm_t *vm, njs_ite if (njs_is_string(value) || njs_is_object_string(value)) { -if (njs_is_string(value)) { -object = njs_object_value_alloc(vm, NJS_OBJ_TYPE_STRING, 0, value); -if (njs_slow_path(object == NULL)) { -return NJS_ERROR; -} - -njs_set_object_value(njs_value_arg(>value), object); -} -else { +if (!njs_is_string(value)) { value = njs_object_value(value); } @@ -461,7 +452,6 @@ njs_object_iterate_reverse(njs_vm_t *vm, njs_value_t *entry, *value, prop, character; const u_char*p, *end, *pos; njs_string_prop_t string_prop; -njs_object_value_t *object; value = njs_value_arg(>value); from = args->from; @@ -510,15 +500,7 @@ njs_object_iterate_reverse(njs_vm_t *vm, if (njs_is_string(value) || njs_is_object_string(value)) { -if (njs_is_string(value)) { -object = njs_object_value_alloc(vm, NJS_OBJ_TYPE_STRING, 0, value); -if (njs_slow_path(object == NULL)) { -return NJS_ERROR; -} - -njs_set_object_value(njs_value_arg(>value), object); -} -else { +if (!njs_is_string(value)) { value = njs_object_value(value); } diff -r e4105b65d105 -r 8e024f36e38e src/test/njs_unit_test.c --- a/src/test/njs_unit_test.c Wed Nov 15 15:08:18 2023 -0800 +++ b/src/test/njs_unit_test.c Tue Nov 21 06:49:30 2023 -0800 @@ -12136,6 +12136,9 @@ static njs_unit_test_t njs_test[] = { njs_str("let e = AggregateError('abc'); e.errors"), njs_str("a,b,c") }, +{ njs_str("let e = AggregateError('1234567'); e.errors"), + njs_str("1,2,3,4,5,6,7") }, + { njs_str("let e = AggregateError([1, 2, 3], 'm'); e"), njs_str("AggregateError: m") }, ___ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel