diff options
Diffstat (limited to 'src/mod_cml_lua.c')
-rw-r--r-- | src/mod_cml_lua.c | 170 |
1 files changed, 85 insertions, 85 deletions
diff --git a/src/mod_cml_lua.c b/src/mod_cml_lua.c index df2c806..8bfb1ab 100644 --- a/src/mod_cml_lua.c +++ b/src/mod_cml_lua.c @@ -23,7 +23,7 @@ typedef char HASHHEX[HASHHEXLEN+1]; #ifdef USE_OPENSSL #define IN const #else -#define IN +#define IN #endif #define OUT @@ -40,11 +40,11 @@ typedef struct { static const char * load_file(lua_State *L, void *data, size_t *size) { readme *rm = data; - + UNUSED(L); - + if (rm->done) return 0; - + *size = rm->st.size; rm->done = 1; return rm->st.start; @@ -52,47 +52,47 @@ static const char * load_file(lua_State *L, void *data, size_t *size) { static int lua_to_c_get_string(lua_State *L, const char *varname, buffer *b) { int curelem; - + lua_pushstring(L, varname); - + curelem = lua_gettop(L); lua_gettable(L, LUA_GLOBALSINDEX); - + /* it should be a table */ if (!lua_isstring(L, curelem)) { lua_settop(L, curelem - 1); - + return -1; } - + buffer_copy_string(b, lua_tostring(L, curelem)); - + lua_pop(L, 1); - + assert(curelem - 1 == lua_gettop(L)); - + return 0; } static int lua_to_c_is_table(lua_State *L, const char *varname) { int curelem; - + lua_pushstring(L, varname); - + curelem = lua_gettop(L); lua_gettable(L, LUA_GLOBALSINDEX); - + /* it should be a table */ if (!lua_istable(L, curelem)) { lua_settop(L, curelem - 1); - + return 0; } - + lua_settop(L, curelem - 1); - + assert(curelem - 1 == lua_gettop(L)); - + return 1; } @@ -100,7 +100,7 @@ static int c_to_lua_push(lua_State *L, int tbl, const char *key, size_t key_len, lua_pushlstring(L, key, key_len); lua_pushlstring(L, val, val_len); lua_settable(L, tbl); - + return 0; } @@ -109,21 +109,21 @@ int cache_export_get_params(lua_State *L, int tbl, buffer *qrystr) { size_t is_key = 1; size_t i; char *key = NULL, *val = NULL; - + key = qrystr->ptr; - + /* we need the \0 */ for (i = 0; i < qrystr->used; i++) { switch(qrystr->ptr[i]) { case '=': if (is_key) { val = qrystr->ptr + i + 1; - + qrystr->ptr[i] = '\0'; - + is_key = 0; } - + break; case '&': case '\0': /* fin symbol */ @@ -132,19 +132,19 @@ int cache_export_get_params(lua_State *L, int tbl, buffer *qrystr) { /* terminate the value */ qrystr->ptr[i] = '\0'; - - c_to_lua_push(L, tbl, + + c_to_lua_push(L, tbl, key, strlen(key), val, strlen(val)); } - + key = qrystr->ptr + i + 1; val = NULL; is_key = 1; break; } } - + return 0; } #if 0 @@ -152,21 +152,21 @@ int cache_export_cookie_params(server *srv, connection *con, plugin_data *p) { data_unset *d; UNUSED(srv); - + if (NULL != (d = array_get_element(con->request.headers, "Cookie"))) { data_string *ds = (data_string *)d; size_t key = 0, value = 0; size_t is_key = 1, is_sid = 0; size_t i; - + /* found COOKIE */ if (!DATA_IS_STRING(d)) return -1; if (ds->value->used == 0) return -1; - + if (ds->value->ptr[0] == '\0' || ds->value->ptr[0] == '=' || ds->value->ptr[0] == ';') return -1; - + buffer_reset(p->session_id); for (i = 0; i < ds->value->used; i++) { switch(ds->value->ptr[i]) { @@ -177,16 +177,16 @@ int cache_export_cookie_params(server *srv, connection *con, plugin_data *p) { is_sid = 1; } value = i + 1; - + is_key = 0; } - + break; case ';': if (is_sid) { buffer_copy_string_len(p->session_id, ds->value->ptr + value, i - value); } - + is_sid = 0; key = i + 1; value = 0; @@ -205,21 +205,21 @@ int cache_export_cookie_params(server *srv, connection *con, plugin_data *p) { } } } - + return 0; } #endif int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) { - lua_State *L; + lua_State *L; readme rm; int ret = -1; buffer *b = buffer_init(); int header_tbl = 0; - + rm.done = 0; stream_open(&rm.st, fn); - + /* push the lua file to the interpreter and see what happends */ L = luaL_newstate(); luaL_openlibs(L); @@ -230,18 +230,18 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) { lua_register(L, "file_isreg", f_file_isreg); lua_register(L, "file_isdir", f_file_isreg); lua_register(L, "dir_files", f_dir_files); - + #ifdef HAVE_MEMCACHE_H lua_pushliteral(L, "memcache_get_long"); lua_pushlightuserdata(L, p->conf.mc); lua_pushcclosure(L, f_memcache_get_long, 1); lua_settable(L, LUA_GLOBALSINDEX); - + lua_pushliteral(L, "memcache_get_string"); lua_pushlightuserdata(L, p->conf.mc); lua_pushcclosure(L, f_memcache_get_string, 1); lua_settable(L, LUA_GLOBALSINDEX); - + lua_pushliteral(L, "memcache_exists"); lua_pushlightuserdata(L, p->conf.mc); lua_pushcclosure(L, f_memcache_exists, 1); @@ -251,11 +251,11 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) { lua_pushliteral(L, "request"); lua_newtable(L); lua_settable(L, LUA_GLOBALSINDEX); - + lua_pushliteral(L, "request"); header_tbl = lua_gettop(L); lua_gettable(L, LUA_GLOBALSINDEX); - + c_to_lua_push(L, header_tbl, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri)); c_to_lua_push(L, header_tbl, CONST_STR_LEN("SCRIPT_NAME"), CONST_BUF_LEN(con->uri.path)); c_to_lua_push(L, header_tbl, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(con->physical.path)); @@ -263,84 +263,84 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) { if (!buffer_is_empty(con->request.pathinfo)) { c_to_lua_push(L, header_tbl, CONST_STR_LEN("PATH_INFO"), CONST_BUF_LEN(con->request.pathinfo)); } - + c_to_lua_push(L, header_tbl, CONST_STR_LEN("CWD"), CONST_BUF_LEN(p->basedir)); c_to_lua_push(L, header_tbl, CONST_STR_LEN("BASEURL"), CONST_BUF_LEN(p->baseurl)); - + /* register GET parameter */ lua_pushliteral(L, "get"); lua_newtable(L); lua_settable(L, LUA_GLOBALSINDEX); - + lua_pushliteral(L, "get"); header_tbl = lua_gettop(L); lua_gettable(L, LUA_GLOBALSINDEX); - + buffer_copy_string_buffer(b, con->uri.query); cache_export_get_params(L, header_tbl, b); buffer_reset(b); - /* 2 default constants */ + /* 2 default constants */ lua_pushliteral(L, "CACHE_HIT"); lua_pushboolean(L, 0); lua_settable(L, LUA_GLOBALSINDEX); - + lua_pushliteral(L, "CACHE_MISS"); lua_pushboolean(L, 1); lua_settable(L, LUA_GLOBALSINDEX); - + /* load lua program */ if (lua_load(L, load_file, &rm, fn->ptr) || lua_pcall(L,0,1,0)) { log_error_write(srv, __FILE__, __LINE__, "s", lua_tostring(L,-1)); - + goto error; } - + /* get return value */ ret = (int)lua_tonumber(L, -1); lua_pop(L, 1); - - /* fetch the data from lua */ + + /* fetch the data from lua */ lua_to_c_get_string(L, "trigger_handler", p->trigger_handler); - + if (0 == lua_to_c_get_string(L, "output_contenttype", b)) { response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_BUF_LEN(b)); } - + if (ret == 0) { /* up to now it is a cache-hit, check if all files exist */ - + int curelem; time_t mtime = 0; - + if (!lua_to_c_is_table(L, "output_include")) { log_error_write(srv, __FILE__, __LINE__, "s", "output_include is missing or not a table"); ret = -1; - + goto error; } - + lua_pushstring(L, "output_include"); - + curelem = lua_gettop(L); lua_gettable(L, LUA_GLOBALSINDEX); /* HOW-TO build a etag ? - * as we don't just have one file we have to take the stat() + * as we don't just have one file we have to take the stat() * from all base files, merge them and build the etag from * it later. - * + * * The mtime of the content is the mtime of the freshest base file - * + * * */ - + lua_pushnil(L); /* first key */ while (lua_next(L, curelem) != 0) { stat_cache_entry *sce = NULL; /* key' is at index -2 and value' at index -1 */ - + if (lua_isstring(L, -1)) { const char *s = lua_tostring(L, -1); @@ -360,18 +360,18 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) { /* a file is missing, call the handler to generate it */ if (!buffer_is_empty(p->trigger_handler)) { ret = 1; /* cache-miss */ - + log_error_write(srv, __FILE__, __LINE__, "s", "a file is missing, calling handler"); - + break; } else { /* handler not set -> 500 */ ret = -1; - + log_error_write(srv, __FILE__, __LINE__, "s", "a file missing and no handler set"); - + break; } break; @@ -389,12 +389,12 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) { "not a string"); break; } - + lua_pop(L, 1); /* removes value'; keeps key' for next iteration */ } - + lua_settop(L, curelem - 1); - + if (ret == 0) { data_string *ds; char timebuf[sizeof("Sat, 23 Jul 2005 21:20:01 GMT")]; @@ -406,9 +406,9 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) { /* no Last-Modified specified */ if ((mtime) && (NULL == ds)) { - + strftime(timebuf, sizeof(timebuf), "%a, %d %b %Y %H:%M:%S GMT", gmtime(&mtime)); - + response_header_overwrite(srv, con, CONST_STR_LEN("Last-Modified"), timebuf, sizeof(timebuf) - 1); @@ -424,9 +424,9 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) { tbuf.used = 0; tbuf.ptr = NULL; } - + if (HANDLER_FINISHED == http_response_handle_cachable(srv, con, &tbuf)) { - /* ok, the client already has our content, + /* ok, the client already has our content, * no need to send it again */ chunkqueue_reset(con->write_queue); @@ -436,24 +436,24 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) { chunkqueue_reset(con->write_queue); } } - + if (ret == 1 && !buffer_is_empty(p->trigger_handler)) { /* cache-miss */ buffer_copy_string_buffer(con->uri.path, p->baseurl); buffer_append_string_buffer(con->uri.path, p->trigger_handler); - + buffer_copy_string_buffer(con->physical.path, p->basedir); buffer_append_string_buffer(con->physical.path, p->trigger_handler); - + chunkqueue_reset(con->write_queue); } - + error: lua_close(L); - + stream_close(&rm.st); buffer_free(b); - + return ret /* cache-error */; } #else |