aboutsummaryrefslogtreecommitdiff
path: root/nginx/ngx_http_js_module.c
diff options
context:
space:
mode:
authorVadim Zhestikov <v.zhestikov@f5.com>2022-09-16 12:27:40 -0700
committerVadim Zhestikov <v.zhestikov@f5.com>2022-09-16 12:27:40 -0700
commit003fb853b9d47e0df9df01ef2327010b9e8b2f38 (patch)
treed1e499855be25c54e10b4763b902265a603648c4 /nginx/ngx_http_js_module.c
parent4114518100434faabf6c38c5b54fa18ae641d176 (diff)
downloadnjs-003fb853b9d47e0df9df01ef2327010b9e8b2f38.tar.gz
njs-003fb853b9d47e0df9df01ef2327010b9e8b2f38.zip
Modules: added js_preload_object directive.
Diffstat (limited to 'nginx/ngx_http_js_module.c')
-rw-r--r--nginx/ngx_http_js_module.c98
1 files changed, 92 insertions, 6 deletions
diff --git a/nginx/ngx_http_js_module.c b/nginx/ngx_http_js_module.c
index e4db83fa..da09d35f 100644
--- a/nginx/ngx_http_js_module.c
+++ b/nginx/ngx_http_js_module.c
@@ -294,6 +294,13 @@ static ngx_command_t ngx_http_js_commands[] = {
0,
NULL },
+ { ngx_string("js_preload_object"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE13,
+ ngx_js_preload_object,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ 0,
+ NULL },
+
{ ngx_string("js_path"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
ngx_conf_set_str_array_slot,
@@ -1212,8 +1219,12 @@ ngx_http_js_init_vm(ngx_http_request_t *r)
{
njs_int_t rc;
ngx_str_t exception;
+ njs_str_t key;
+ ngx_uint_t i;
ngx_http_js_ctx_t *ctx;
+ njs_opaque_value_t retval;
ngx_pool_cleanup_t *cln;
+ ngx_js_named_path_t *preload;
ngx_http_js_loc_conf_t *jlcf;
jlcf = ngx_http_get_module_loc_conf(r, ngx_http_js_module);
@@ -1253,6 +1264,27 @@ ngx_http_js_init_vm(ngx_http_request_t *r)
cln->handler = ngx_http_js_cleanup_ctx;
cln->data = ctx;
+ /* bind objects from preload vm */
+
+ if (jlcf->preload_objects != NGX_CONF_UNSET_PTR) {
+ preload = jlcf->preload_objects->elts;
+
+ for (i = 0; i < jlcf->preload_objects->nelts; i++) {
+ key.start = preload[i].name.data;
+ key.length = preload[i].name.len;
+
+ rc = njs_vm_value(jlcf->preload_vm, &key, njs_value_arg(&retval));
+ if (rc != NJS_OK) {
+ return NGX_ERROR;
+ }
+
+ rc = njs_vm_bind(ctx->vm, &key, njs_value_arg(&retval), 0);
+ if (rc != NJS_OK) {
+ return NGX_ERROR;
+ }
+ }
+ }
+
if (njs_vm_start(ctx->vm) == NJS_ERROR) {
ngx_js_retval(ctx->vm, NULL, &exception);
@@ -1288,9 +1320,13 @@ ngx_http_js_cleanup_ctx(void *data)
static void
ngx_http_js_cleanup_vm(void *data)
{
- njs_vm_t *vm = data;
+ ngx_http_js_loc_conf_t *jlcf = data;
- njs_vm_destroy(vm);
+ njs_vm_destroy(jlcf->vm);
+
+ if (jlcf->preload_objects != NGX_CONF_UNSET_PTR) {
+ njs_vm_destroy(jlcf->preload_vm);
+ }
}
@@ -4172,8 +4208,8 @@ ngx_http_js_merge_vm(ngx_conf_t *cf, ngx_http_js_loc_conf_t *conf,
{
ngx_str_t *path, *s;
ngx_uint_t i;
- ngx_array_t *imports, *paths;
- ngx_js_named_path_t *import, *pi;
+ ngx_array_t *imports, *preload_objects, *paths;
+ ngx_js_named_path_t *import, *pi, *pij, *preload;
if (prev->imports != NGX_CONF_UNSET_PTR && prev->vm == NULL) {
if (ngx_http_js_init_conf_vm(cf, prev) != NGX_OK) {
@@ -4182,16 +4218,58 @@ ngx_http_js_merge_vm(ngx_conf_t *cf, ngx_http_js_loc_conf_t *conf,
}
if (conf->imports == NGX_CONF_UNSET_PTR
- && conf->paths == NGX_CONF_UNSET_PTR)
+ && conf->paths == NGX_CONF_UNSET_PTR
+ && conf->preload_objects == NGX_CONF_UNSET_PTR)
{
if (prev->vm != NULL) {
+ conf->preload_objects = prev->preload_objects;
conf->imports = prev->imports;
conf->paths = prev->paths;
conf->vm = prev->vm;
+
+ conf->preload_vm = prev->preload_vm;
+
return NGX_OK;
}
}
+ if (prev->preload_objects != NGX_CONF_UNSET_PTR) {
+ if (conf->preload_objects == NGX_CONF_UNSET_PTR) {
+ conf->preload_objects = prev->preload_objects;
+
+ } else {
+ preload_objects = ngx_array_create(cf->pool, 4,
+ sizeof(ngx_js_named_path_t));
+ if (preload_objects == NULL) {
+ return NGX_ERROR;
+ }
+
+ pij = prev->preload_objects->elts;
+
+ for (i = 0; i < prev->preload_objects->nelts; i++) {
+ preload = ngx_array_push(preload_objects);
+ if (preload == NULL) {
+ return NGX_ERROR;
+ }
+
+ *preload = pij[i];
+ }
+
+ pij = conf->preload_objects->elts;
+
+ for (i = 0; i < conf->preload_objects->nelts; i++) {
+ preload = ngx_array_push(preload_objects);
+ if (preload == NULL) {
+ return NGX_ERROR;
+ }
+
+ *preload = pij[i];
+ }
+
+ conf->preload_objects = preload_objects;
+ }
+ }
+
if (prev->imports != NGX_CONF_UNSET_PTR) {
if (conf->imports == NGX_CONF_UNSET_PTR) {
conf->imports = prev->imports;
@@ -4291,6 +4369,12 @@ ngx_http_js_init_conf_vm(ngx_conf_t *cf, ngx_http_js_loc_conf_t *conf)
static const njs_str_t line_number_key = njs_str("lineNumber");
static const njs_str_t file_name_key = njs_str("fileName");
+ if (conf->preload_objects != NGX_CONF_UNSET_PTR) {
+ if (ngx_js_init_preload_vm(cf, (ngx_js_conf_t *)conf) != NGX_OK) {
+ return NGX_ERROR;
+ }
+ }
+
size = 0;
import = conf->imports->elts;
@@ -4352,7 +4436,7 @@ ngx_http_js_init_conf_vm(ngx_conf_t *cf, ngx_http_js_loc_conf_t *conf)
}
cln->handler = ngx_http_js_cleanup_vm;
- cln->data = conf->vm;
+ cln->data = conf;
path.start = ngx_cycle->conf_prefix.data;
path.length = ngx_cycle->conf_prefix.len;
@@ -4619,6 +4703,7 @@ ngx_http_js_create_loc_conf(ngx_conf_t *cf)
* set by ngx_pcalloc():
*
* conf->vm = NULL;
+ * conf->preload_vm = NULL;
* conf->content = { 0, NULL };
* conf->header_filter = { 0, NULL };
* conf->body_filter = { 0, NULL };
@@ -4630,6 +4715,7 @@ ngx_http_js_create_loc_conf(ngx_conf_t *cf)
conf->paths = NGX_CONF_UNSET_PTR;
conf->imports = NGX_CONF_UNSET_PTR;
+ conf->preload_objects = NGX_CONF_UNSET_PTR;
conf->buffer_size = NGX_CONF_UNSET_SIZE;
conf->max_response_body_size = NGX_CONF_UNSET_SIZE;