static ngx_int_t ngx_http_js_init_vm(ngx_http_request_t *r) { void **ext; ngx_http_js_ctx_t *ctx; ngx_pool_cleanup_t *cln; nxt_mem_cache_pool_t *mcp; ngx_http_js_loc_conf_t *jlcf; jlcf = ngx_http_get_module_loc_conf(r, ngx_http_js_module); if (jlcf->vm == NULL) { return NGX_DECLINED; } ctx = ngx_http_get_module_ctx(r, ngx_http_js_module); if (ctx == NULL) { ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_js_ctx_t)); if (ctx == NULL) { return NGX_ERROR; } ngx_http_set_ctx(r, ctx, ngx_http_js_module); } if (ctx->vm) { return NGX_OK; } mcp = ngx_http_js_create_mem_cache_pool(); if (mcp == NULL) { return NGX_ERROR; } cln = ngx_pool_cleanup_add(r->pool, 0); if (cln == NULL) { return NGX_ERROR; } cln->handler = ngx_http_js_cleanup_mem_cache_pool; cln->data = mcp; ext = ngx_palloc(r->pool, sizeof(void *)); if (ext == NULL) { return NGX_ERROR; } *ext = r; ctx->vm = njs_vm_clone(jlcf->vm, mcp, ext); if (ctx->vm == NULL) { return NGX_ERROR; } ctx->args = &jlcf->args[0]; return NGX_OK; }
static ngx_int_t ngx_http_js_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data) { njs_vm_t *vm = (njs_vm_t *) data; nxt_str_t value; njs_vm_t *nvm; ngx_pool_cleanup_t *cln; nxt_mem_cache_pool_t *mcp; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http js variable handler"); mcp = ngx_http_js_create_mem_cache_pool(); if (mcp == NULL) { return NGX_ERROR; } cln = ngx_pool_cleanup_add(r->pool, 0); if (cln == NULL) { return NGX_ERROR; } cln->handler = ngx_http_js_cleanup_mem_cache_pool; cln->data = mcp; nvm = njs_vm_clone(vm, mcp, (void **) &r); if (nvm == NULL) { return NGX_ERROR; } if (njs_vm_run(nvm) == NJS_OK) { if (njs_vm_retval(nvm, &value) != NJS_OK) { return NGX_ERROR; } v->len = value.len; v->valid = 1; v->no_cacheable = 0; v->not_found = 0; v->data = value.data; } else { njs_vm_exception(nvm, &value); ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "js exception: %*s", value.len, value.data); v->not_found = 1; } ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http js variable done"); return NGX_OK; }
static ngx_int_t ngx_http_js_handler(ngx_http_request_t *r) { nxt_str_t value; njs_vm_t *nvm; ngx_pool_cleanup_t *cln; nxt_mem_cache_pool_t *mcp; ngx_http_js_loc_conf_t *jlcf; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http js handler"); mcp = ngx_http_js_create_mem_cache_pool(); if (mcp == NULL) { return NGX_ERROR; } cln = ngx_pool_cleanup_add(r->pool, 0); if (cln == NULL) { return NGX_ERROR; } cln->handler = ngx_http_js_cleanup_mem_cache_pool; cln->data = mcp; jlcf = ngx_http_get_module_loc_conf(r, ngx_http_js_module); nvm = njs_vm_clone(jlcf->vm, mcp, (void **) &r); if (nvm == NULL) { return NGX_ERROR; } if (njs_vm_run(nvm) != NJS_OK) { njs_vm_exception(nvm, &value); ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "js exception: %*s", value.len, value.data); return NGX_ERROR; } return NGX_OK; }