Re: Mime-types: обновление

2023-11-21 Thread izorkin
Здравствуйте, Максим.

Как мне кажется шрифты 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

2023-11-21 Thread Maxim Dounin
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: обновление

2023-11-21 Thread Maxim Dounin
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

2023-11-21 Thread izorkin
Здравствуйте, 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.

2023-11-21 Thread Dmitry Volyntsev
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().

2023-11-21 Thread Dmitry Volyntsev
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.

2023-11-21 Thread Dmitry Volyntsev
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.

2023-11-21 Thread Vadim Zhestikov via nginx-devel
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