Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}