diff options
author | Vadim Zhestikov <v.zhestikov@f5.com> | 2022-09-16 12:27:40 -0700 |
---|---|---|
committer | Vadim Zhestikov <v.zhestikov@f5.com> | 2022-09-16 12:27:40 -0700 |
commit | 003fb853b9d47e0df9df01ef2327010b9e8b2f38 (patch) | |
tree | d1e499855be25c54e10b4763b902265a603648c4 /nginx/ngx_http_js_module.c | |
parent | 4114518100434faabf6c38c5b54fa18ae641d176 (diff) | |
download | njs-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.c | 98 |
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; |