| |
| /* |
| * Copyright (C) Yichun Zhang (agentzh) |
| */ |
| |
| |
| #ifndef DDEBUG |
| #define DDEBUG 0 |
| #endif |
| #include "ddebug.h" |
| |
| |
| #include "ngx_http_lua_util.h" |
| #include "ngx_http_lua_ctx.h" |
| |
| |
| int |
| ngx_http_lua_ngx_get_ctx(lua_State *L) |
| { |
| ngx_http_request_t *r; |
| ngx_http_lua_ctx_t *ctx; |
| |
| r = ngx_http_lua_get_req(L); |
| if (r == NULL) { |
| return luaL_error(L, "no request found"); |
| } |
| |
| ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module); |
| if (ctx == NULL) { |
| return luaL_error(L, "no request ctx found"); |
| } |
| |
| if (ctx->ctx_ref == LUA_NOREF) { |
| ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
| "lua create ngx.ctx table for the current request"); |
| |
| lua_pushliteral(L, ngx_http_lua_ctx_tables_key); |
| lua_rawget(L, LUA_REGISTRYINDEX); |
| lua_createtable(L, 0 /* narr */, 4 /* nrec */); |
| lua_pushvalue(L, -1); |
| ctx->ctx_ref = luaL_ref(L, -3); |
| return 1; |
| } |
| |
| ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
| "lua fetching existing ngx.ctx table for the current " |
| "request"); |
| |
| lua_pushliteral(L, ngx_http_lua_ctx_tables_key); |
| lua_rawget(L, LUA_REGISTRYINDEX); |
| lua_rawgeti(L, -1, ctx->ctx_ref); |
| |
| return 1; |
| } |
| |
| |
| int |
| ngx_http_lua_ngx_set_ctx(lua_State *L) |
| { |
| ngx_http_request_t *r; |
| ngx_http_lua_ctx_t *ctx; |
| |
| r = ngx_http_lua_get_req(L); |
| if (r == NULL) { |
| return luaL_error(L, "no request found"); |
| } |
| |
| ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module); |
| if (ctx == NULL) { |
| return luaL_error(L, "no request ctx found"); |
| } |
| |
| return ngx_http_lua_ngx_set_ctx_helper(L, r, ctx, 3); |
| } |
| |
| |
| int |
| ngx_http_lua_ngx_set_ctx_helper(lua_State *L, ngx_http_request_t *r, |
| ngx_http_lua_ctx_t *ctx, int index) |
| { |
| if (index < 0) { |
| index = lua_gettop(L) + index + 1; |
| } |
| |
| if (ctx->ctx_ref == LUA_NOREF) { |
| ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
| "lua create ngx.ctx table for the current request"); |
| |
| lua_pushliteral(L, ngx_http_lua_ctx_tables_key); |
| lua_rawget(L, LUA_REGISTRYINDEX); |
| lua_pushvalue(L, index); |
| ctx->ctx_ref = luaL_ref(L, -2); |
| lua_pop(L, 1); |
| return 0; |
| } |
| |
| ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
| "lua fetching existing ngx.ctx table for the current " |
| "request"); |
| |
| lua_pushliteral(L, ngx_http_lua_ctx_tables_key); |
| lua_rawget(L, LUA_REGISTRYINDEX); |
| luaL_unref(L, -1, ctx->ctx_ref); |
| lua_pushvalue(L, index); |
| ctx->ctx_ref = luaL_ref(L, -2); |
| lua_pop(L, 1); |
| |
| return 0; |
| } |
| |
| |
| #ifndef NGX_HTTP_LUA_NO_FFI_API |
| int |
| ngx_http_lua_ffi_get_ctx_ref(ngx_http_request_t *r) |
| { |
| ngx_http_lua_ctx_t *ctx; |
| |
| ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module); |
| if (ctx == NULL) { |
| return NGX_HTTP_LUA_FFI_NO_REQ_CTX; |
| } |
| |
| return ctx->ctx_ref; |
| } |
| |
| |
| int |
| ngx_http_lua_ffi_set_ctx_ref(ngx_http_request_t *r, int ref) |
| { |
| ngx_http_lua_ctx_t *ctx; |
| |
| ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module); |
| if (ctx == NULL) { |
| return NGX_HTTP_LUA_FFI_NO_REQ_CTX; |
| } |
| |
| ctx->ctx_ref = ref; |
| return NGX_OK; |
| } |
| #endif /* NGX_HTTP_LUA_NO_FFI_API */ |
| |
| |
| /* vi:set ft=c ts=4 sw=4 et fdm=marker: */ |