ngx_int_t ngx_http_lua_set_by_chunk(lua_State *L, ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *args, size_t nargs) { size_t i; ngx_int_t rc; u_char *err_msg; size_t rlen; u_char *rdata; /* set Lua VM panic handler */ lua_atpanic(L, ngx_http_lua_atpanic); /* initialize nginx context in Lua VM, code chunk at stack top sp = 1 */ ngx_http_lua_set_by_lua_env(L, r, nargs, args); /* passing directive arguments to the user code */ for (i = 0; i < nargs; i++) { lua_pushlstring(L, (const char *) args[i].data, args[i].len); } #if (NGX_PCRE) /* XXX: work-around to nginx regex subsystem */ ngx_http_lua_pcre_malloc_init(r->pool); #endif /* protected call user code */ rc = lua_pcall(L, nargs, 1, 0); #if (NGX_PCRE) /* XXX: work-around to nginx regex subsystem */ ngx_http_lua_pcre_malloc_done(); #endif if (rc != 0) { /* error occured when running loaded code */ err_msg = (u_char *) lua_tostring(L, -1); if (err_msg != NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "(lua-error) %s", err_msg); lua_settop(L, 0); /* clear remaining elems on stack */ } return NGX_ERROR; } NGX_LUA_EXCEPTION_TRY { rdata = (u_char *) lua_tolstring(L, -1, &rlen); if (rdata) { val->data = ngx_pcalloc(r->pool, rlen); if (val->data == NULL) { return NGX_ERROR; } ngx_memcpy(val->data, rdata, rlen); val->len = rlen; } else { val->data = NULL; val->len = 0; } } NGX_LUA_EXCEPTION_CATCH { dd("nginx execution restored"); } /* clear Lua stack */ lua_settop(L, 0); return NGX_OK; }
ngx_int_t ngx_http_lua_set_by_chunk( lua_State *l, ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *args, size_t nargs ) { size_t i; ngx_int_t rc; // set Lua VM panic handler lua_atpanic(l, ngx_http_lua_atpanic); // initialize nginx context in Lua VM, code chunk at stack top sp = 1 ngx_http_lua_set_by_lua_env(l, r, nargs, args); // passing directive arguments to the user code for(i = 0; i < nargs; ++i) { lua_pushlstring(l, (const char*)args[i].data, args[i].len); } // protected call user code rc = lua_pcall(l, nargs, 1, 0); if(rc) { // error occured when running loaded code const char *err_msg = lua_tostring(l, -1); ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "(lua-error) %s", err_msg); lua_settop(l, 0); // clear remaining elems on stack assert(lua_gettop(l) == 0); return NGX_ERROR; } if(setjmp(ngx_http_lua_exception) == 0) { // try { size_t rlen; const char *rdata = lua_tolstring(l, -1, &rlen); if(rdata) { val->data = ngx_pcalloc(r->pool, rlen); if (val->data == NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate result buffer!"); return NGX_ERROR; } ngx_memcpy(val->data, rdata, rlen); val->len = rlen; } else { val->data = NULL; val->len = 0; } } else { // } catch dd("NginX execution restored"); } // clear Lua stack lua_settop(l, 0); return NGX_OK; }
ngx_int_t ngx_http_lua_set_by_chunk(lua_State *L, ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *args, size_t nargs, ngx_str_t *script) { size_t i; ngx_int_t rc; u_char *err_msg; size_t len; u_char *data; #if (NGX_PCRE) ngx_pool_t *old_pool; #endif dd("nargs: %d", (int) nargs); dd("set Lua VM panic handler"); lua_atpanic(L, ngx_http_lua_atpanic); NGX_LUA_EXCEPTION_TRY { dd("initialize nginx context in Lua VM, code chunk at " "stack top sp = 1"); ngx_http_lua_set_by_lua_env(L, r, nargs, args); /* passing directive arguments to the user code */ for (i = 0; i < nargs; i++) { lua_pushlstring(L, (const char *) args[i].data, args[i].len); } #if (NGX_PCRE) /* XXX: work-around to nginx regex subsystem */ old_pool = ngx_http_lua_pcre_malloc_init(r->pool); #endif lua_pushcfunction(L, ngx_http_lua_traceback); lua_insert(L, 1); /* put it under chunk and args */ dd("protected call user code"); rc = lua_pcall(L, nargs, 1, 1); dd("after protected call user code"); lua_remove(L, 1); /* remove traceback function */ #if (NGX_PCRE) /* XXX: work-around to nginx regex subsystem */ ngx_http_lua_pcre_malloc_done(old_pool); #endif if (rc != 0) { /* error occured when running loaded code */ err_msg = (u_char *) lua_tolstring(L, -1, &len); if (err_msg == NULL) { err_msg = (u_char *) "unknown reason"; len = sizeof("unknown reason") - 1; } ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "failed to run set_by_lua*: %*s", len, err_msg); lua_settop(L, 0); /* clear remaining elems on stack */ return NGX_ERROR; } data = (u_char *) lua_tolstring(L, -1, &len); if (data) { val->data = ngx_palloc(r->pool, len); if (val->data == NULL) { return NGX_ERROR; } ngx_memcpy(val->data, data, len); val->len = len; } else { val->data = NULL; val->len = 0; } } NGX_LUA_EXCEPTION_CATCH { dd("nginx execution restored"); return NGX_ERROR; } /* clear Lua stack */ lua_settop(L, 0); return NGX_OK; }
ngx_int_t ngx_http_lua_set_by_chunk(lua_State *L, ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *args, size_t nargs, ngx_str_t *script) { size_t i; ngx_int_t rc; u_char *err_msg; size_t rlen; u_char *rdata; #if (NGX_PCRE) ngx_pool_t *old_pool; #endif ngx_http_lua_ctx_t *ctx; ngx_http_cleanup_t *cln; dd("nargs: %d", (int) nargs); ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module); if (ctx == NULL) { ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_lua_ctx_t)); if (ctx == NULL) { return NGX_ERROR; } dd("setting new ctx: ctx = %p", ctx); ctx->cc_ref = LUA_NOREF; ctx->ctx_ref = LUA_NOREF; ngx_http_set_ctx(r, ctx, ngx_http_lua_module); } else { ngx_http_lua_reset_ctx(r, L, ctx); } if (ctx->cleanup == NULL) { cln = ngx_http_cleanup_add(r, 0); if (cln == NULL) { return NGX_ERROR; } cln->handler = ngx_http_lua_request_cleanup; cln->data = r; ctx->cleanup = &cln->handler; } /* set Lua VM panic handler */ lua_atpanic(L, ngx_http_lua_atpanic); /* initialize nginx context in Lua VM, code chunk at stack top sp = 1 */ ngx_http_lua_set_by_lua_env(L, r, nargs, args); /* passing directive arguments to the user code */ for (i = 0; i < nargs; i++) { lua_pushlstring(L, (const char *) args[i].data, args[i].len); } #if (NGX_PCRE) /* XXX: work-around to nginx regex subsystem */ old_pool = ngx_http_lua_pcre_malloc_init(r->pool); #endif /* protected call user code */ rc = lua_pcall(L, nargs, 1, 0); #if (NGX_PCRE) /* XXX: work-around to nginx regex subsystem */ ngx_http_lua_pcre_malloc_done(old_pool); #endif if (rc != 0) { /* error occured when running loaded code */ err_msg = (u_char *) lua_tostring(L, -1); if (err_msg != NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "(lua-error) %s", err_msg); lua_settop(L, 0); /* clear remaining elems on stack */ } return NGX_ERROR; } NGX_LUA_EXCEPTION_TRY { rdata = (u_char *) lua_tolstring(L, -1, &rlen); if (rdata) { val->data = ngx_pcalloc(r->pool, rlen); if (val->data == NULL) { return NGX_ERROR; } ngx_memcpy(val->data, rdata, rlen); val->len = rlen; } else { val->data = NULL; val->len = 0; } } NGX_LUA_EXCEPTION_CATCH { dd("nginx execution restored"); } /* clear Lua stack */ lua_settop(L, 0); return NGX_OK; }