diff options
author | jan <jan@152afb58-edef-0310-8abb-c4023f1b3aa9> | 2006-09-15 10:00:46 +0000 |
---|---|---|
committer | jan <jan@152afb58-edef-0310-8abb-c4023f1b3aa9> | 2006-09-15 10:00:46 +0000 |
commit | 9964c5f6e636aa66e7d2e6f5f6f53ad07694093d (patch) | |
tree | 8a243b1bf6202044a332b09cb4207a522b4e89fc | |
parent | b23a8437eb75d4c45850e16928a3315619a9f261 (diff) | |
download | lighttpd-9964c5f6e636aa66e7d2e6f5f6f53ad07694093d.tar.gz |
- added set() for .env[]
- added .RESTART_REQUEST
- fixed handling of .content = { { ... } } if offset is set, but no length
- added range checks for offset and length
git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.11-ssl-fixes@1299 152afb58-edef-0310-8abb-c4023f1b3aa9
-rw-r--r-- | src/mod_magnet.c | 132 |
1 files changed, 95 insertions, 37 deletions
diff --git a/src/mod_magnet.c b/src/mod_magnet.c index 6a42ccdd..b62138f8 100644 --- a/src/mod_magnet.c +++ b/src/mod_magnet.c @@ -21,6 +21,7 @@ #define MAGNET_CONFIG_RAW_URL "magnet.attract-raw-url-to" #define MAGNET_CONFIG_PHYSICAL_PATH "magnet.attract-physical-path-to" +#define MAGNET_RESTART_REQUEST 99 /* plugin config for all request/connections */ @@ -272,11 +273,11 @@ typedef struct { } type; } magnet_env_t; -static int magnet_env_get(lua_State *L) { - server *srv; - connection *con; +static buffer *magnet_env_get_buffer(server *srv, connection *con, const char *key) { + buffer *dest = NULL; + size_t i; - magnet_env_t env[] = { + const magnet_env_t env[] = { { "physical.path", MAGNET_ENV_PHYICAL_PATH }, { "physical.rel-path", MAGNET_ENV_PHYICAL_REL_PATH }, { "physical.doc-root", MAGNET_ENV_PHYICAL_DOC_ROOT }, @@ -285,28 +286,15 @@ static int magnet_env_get(lua_State *L) { { "uri.path-raw", MAGNET_ENV_URI_PATH_RAW }, { "uri.scheme", MAGNET_ENV_URI_SCHEME }, { "uri.authority", MAGNET_ENV_URI_AUTHORITY }, + { "uri.query", MAGNET_ENV_URI_QUERY }, { "request.method", MAGNET_ENV_REQUEST_METHOD }, { "request.uri", MAGNET_ENV_REQUEST_URI }, { "request.protocol", MAGNET_ENV_REQUEST_PROTOCOL }, - + { NULL, MAGNET_ENV_UNSET } }; - const char *key = luaL_checkstring(L, 2); - buffer *dest = NULL; - size_t i; - - - lua_pushstring(L, "lighty.srv"); - lua_gettable(L, LUA_REGISTRYINDEX); - srv = lua_touserdata(L, -1); - lua_pop(L, 1); - - lua_pushstring(L, "lighty.con"); - lua_gettable(L, LUA_REGISTRYINDEX); - con = lua_touserdata(L, -1); - lua_pop(L, 1); /** * map all internal variables to lua @@ -335,6 +323,28 @@ static int magnet_env_get(lua_State *L) { case MAGNET_ENV_UNSET: break; } + return dest; +} + +static int magnet_env_get(lua_State *L) { + server *srv; + connection *con; + + const char *key = luaL_checkstring(L, 2); + buffer *dest = NULL; + + lua_pushstring(L, "lighty.srv"); + lua_gettable(L, LUA_REGISTRYINDEX); + srv = lua_touserdata(L, -1); + lua_pop(L, 1); + + lua_pushstring(L, "lighty.con"); + lua_gettable(L, LUA_REGISTRYINDEX); + con = lua_touserdata(L, -1); + lua_pop(L, 1); + + dest = magnet_env_get_buffer(srv, con, key); + if (dest && dest->used) { lua_pushlstring(L, dest->ptr, dest->used - 1); } else { @@ -344,6 +354,36 @@ static int magnet_env_get(lua_State *L) { return 1; } +static int magnet_env_set(lua_State *L) { + server *srv; + connection *con; + + const char *key = luaL_checkstring(L, 2); + const char *val = luaL_checkstring(L, 3); + buffer *dest = NULL; + + lua_pushstring(L, "lighty.srv"); + lua_gettable(L, LUA_REGISTRYINDEX); + srv = lua_touserdata(L, -1); + lua_pop(L, 1); + + lua_pushstring(L, "lighty.con"); + lua_gettable(L, LUA_REGISTRYINDEX); + con = lua_touserdata(L, -1); + lua_pop(L, 1); + + if (NULL != (dest = magnet_env_get_buffer(srv, con, key))) { + buffer_copy_string(dest, val); + } else { + /* couldn't save */ + + return luaL_error(L, "couldn't store '%s' in lighty.env[]", key); + } + + return 0; +} + + static int magnet_copy_response_header(server *srv, connection *con, plugin_data *p, lua_State *L) { /** * get the environment of the function @@ -425,21 +465,32 @@ static int magnet_attach_content(server *srv, connection *con, plugin_data *p, l if (lua_isstring(L, -3)) { /* filename has to be a string */ buffer *fn = buffer_init(); stat_cache_entry *sce; - off_t off = 0; - off_t len = 0; - - if (lua_isnumber(L, -1)) { - off = lua_tonumber(L, -1); - } - - if (lua_isnumber(L, -2)) { - len = lua_tonumber(L, -2); - } buffer_copy_string(fn, lua_tostring(L, -3)); if (HANDLER_GO_ON == stat_cache_get_entry(srv, con, fn, &sce)) { - chunkqueue_append_file(con->write_queue, fn, off, sce->st.st_size); + off_t off = 0; + off_t len = 0; + + if (lua_isnumber(L, -1)) { + off = lua_tonumber(L, -1); + } + + if (lua_isnumber(L, -2)) { + len = lua_tonumber(L, -2); + } else { + len = sce->st.st_size; + } + + if (off < 0) { + return luaL_error(L, "offset for '%s' is negative", fn->ptr); + } + + if (len < off) { + return luaL_error(L, "offset > length for '%s'", fn->ptr); + } + + chunkqueue_append_file(con->write_queue, fn, off, len - off); } buffer_free(fn); @@ -545,6 +596,8 @@ static handler_t magnet_attract(server *srv, connection *con, plugin_data *p, bu lua_newtable(L); /* the meta-table for the request-table (sp += 1) */ lua_pushcfunction(L, magnet_env_get); /* (sp += 1) */ lua_setfield(L, -2, "__index"); /* (sp -= 1) */ + lua_pushcfunction(L, magnet_env_set); /* (sp += 1) */ + lua_setfield(L, -2, "__newindex"); /* (sp -= 1) */ lua_setmetatable(L, -2); /* tie the metatable to request (sp -= 1) */ lua_setfield(L, -2, "env"); /* content = {} (sp -= 1) */ @@ -564,6 +617,9 @@ static handler_t magnet_attract(server *srv, connection *con, plugin_data *p, bu lua_newtable(L); /* {} (sp += 1) */ lua_setfield(L, -2, "header"); /* header = {} (sp -= 1) */ + lua_pushinteger(L, MAGNET_RESTART_REQUEST); + lua_setfield(L, -2, "RESTART_REQUEST"); + lua_setfield(L, -2, "lighty"); /* lighty.* (sp -= 1) */ lua_newtable(L); /* the meta-table for the new env (sp += 1) */ @@ -576,10 +632,8 @@ static handler_t magnet_attract(server *srv, connection *con, plugin_data *p, bu if (lua_pcall(L, 0, 1, 0)) { log_error_write(srv, __FILE__, __LINE__, - "sbss", - "lua_pcall() failed for", - name, - "with:", + "ss", + "lua_pcall():", lua_tostring(L, -1)); lua_pop(L, 1); /* remove the error-msg and the function copy from the stack */ @@ -617,11 +671,15 @@ static handler_t magnet_attract(server *srv, connection *con, plugin_data *p, bu /* we are finished */ return HANDLER_FINISHED; - } + } else if (MAGNET_RESTART_REQUEST == lua_return_value) { + assert(lua_gettop(L) == 1); /* only the function should be on the stack */ - assert(lua_gettop(L) == 1); /* only the function should be on the stack */ + return HANDLER_COMEBACK; + } else { + assert(lua_gettop(L) == 1); /* only the function should be on the stack */ - return HANDLER_GO_ON; + return HANDLER_GO_ON; + } } URIHANDLER_FUNC(mod_magnet_uri_handler) { |