Skip to content

Commit

Permalink
Modules: fixed process.env object.
Browse files Browse the repository at this point in the history
Previously, it ignored changes to environment variables introduced
with "env" directive.
  • Loading branch information
xeioex committed Nov 6, 2024
1 parent 8666e21 commit 07545f1
Show file tree
Hide file tree
Showing 3 changed files with 196 additions and 0 deletions.
4 changes: 4 additions & 0 deletions nginx/ngx_js.c
Original file line number Diff line number Diff line change
Expand Up @@ -3832,6 +3832,10 @@ ngx_js_init_conf_vm(ngx_conf_t *cf, ngx_js_loc_conf_t *conf,
ngx_pool_cleanup_t *cln;
ngx_js_named_path_t *import;

if (ngx_set_environment(cf->cycle, NULL) == NULL) {
return NGX_ERROR;
}

if (conf->preload_objects != NGX_CONF_UNSET_PTR) {
if (ngx_js_init_preload_vm(cf, (ngx_js_loc_conf_t *)conf) != NGX_OK) {
return NGX_ERROR;
Expand Down
84 changes: 84 additions & 0 deletions nginx/t/js_process.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#!/usr/bin/perl

# (C) Dmitry Volyntsev
# (C) Nginx, Inc.

# Tests for http njs module, process object.

###############################################################################

use warnings;
use strict;

use Test::More;
use Socket qw/ CRLF /;

BEGIN { use FindBin; chdir($FindBin::Bin); }

use lib 'lib';
use Test::Nginx;

###############################################################################

select STDERR; $| = 1;
select STDOUT; $| = 1;

my $t = Test::Nginx->new()->has(qw/http/)
->write_file_expand('nginx.conf', <<'EOF');
%%TEST_GLOBALS%%
daemon off;
events {
}
env FOO=bar;
env BAR=baz;
http {
%%TEST_GLOBALS_HTTP%%
js_import test.js;
server {
listen 127.0.0.1:8080;
server_name localhost;
location /argv {
js_content test.argv;
}
location /env {
js_content test.env;
}
}
}
EOF

$t->write_file('test.js', <<EOF);
function argv(r) {
var av = process.argv;
r.return(200,`\${Array.isArray(av)} \${av[0].indexOf('nginx') >= 0}`);
}
function env(r) {
var e = process.env[r.args.var];
r.return(200, e ? e : 'undefined');
}
export default { argv, env };
EOF

$t->try_run('no njs process object')->plan(4);

###############################################################################

like(http_get('/argv'), qr/true true/, 'argv');
like(http_get('/env?var=FOO'), qr/bar/, 'env FOO');
like(http_get('/env?var=BAR'), qr/baz/, 'env BAR');
like(http_get('/env?var=HOME'), qr/undefined/, 'env HOME');

###############################################################################
108 changes: 108 additions & 0 deletions nginx/t/stream_js_process.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
#!/usr/bin/perl

# (C) Dmitry Volyntsev
# (C) Nginx, Inc.

# Tests for stream njs module, process object.

###############################################################################

use warnings;
use strict;

use Test::More;

BEGIN { use FindBin; chdir($FindBin::Bin); }

use lib 'lib';
use Test::Nginx;
use Test::Nginx::Stream qw/ stream /;

###############################################################################

select STDERR; $| = 1;
select STDOUT; $| = 1;

my $t = Test::Nginx->new()->has(qw/stream stream_return/)
->write_file_expand('nginx.conf', <<'EOF');
%%TEST_GLOBALS%%
daemon off;
events {
}
env FOO=bar;
env BAR=baz;
stream {
%%TEST_GLOBALS_STREAM%%
js_import test.js;
js_set $env_foo test.env_foo;
js_set $env_bar test.env_bar;
js_set $env_home test.env_home;
js_set $argv test.argv;
server {
listen 127.0.0.1:8081;
return $env_foo;
}
server {
listen 127.0.0.1:8082;
return $env_bar;
}
server {
listen 127.0.0.1:8083;
return $env_home;
}
server {
listen 127.0.0.1:8084;
return $argv;
}
}
EOF

$t->write_file('test.js', <<EOF);
function env(s, v) {
var e = process.env[v];
return e ? e : 'undefined';
}
function env_foo(s) {
return env(s, 'FOO');
}
function env_bar(s) {
return env(s, 'BAR');
}
function env_home(s) {
return env(s, 'HOME');
}
function argv(r) {
var av = process.argv;
return `\${Array.isArray(av)} \${av[0].indexOf('nginx') >= 0}`;
}
export default { env_foo, env_bar, env_home, argv };
EOF

$t->try_run('no njs stream session object')->plan(4);

###############################################################################

is(stream('127.0.0.1:' . port(8081))->read(), 'bar', 'env.FOO');
is(stream('127.0.0.1:' . port(8082))->read(), 'baz', 'env.BAR');
is(stream('127.0.0.1:' . port(8083))->read(), 'undefined', 'env HOME');
is(stream('127.0.0.1:' . port(8084))->read(), 'true true', 'argv');

###############################################################################

0 comments on commit 07545f1

Please sign in to comment.