| /** | |
| * Licensed to the Apache Software Foundation (ASF) under one or more | |
| * contributor license agreements. See the NOTICE file distributed with | |
| * this work for additional information regarding copyright ownership. | |
| * The ASF licenses this file to You under the Apache License, Version 2.0 | |
| * (the "License"); you may not use this file except in compliance with | |
| * the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #include "mod_lua.h" | |
| #include "lua_apr.h" | |
| APLOG_USE_MODULE(lua); | |
| req_table_t *ap_lua_check_apr_table(lua_State *L, int index) | |
| { | |
| req_table_t* t; | |
| luaL_checkudata(L, index, "Apr.Table"); | |
| t = lua_unboxpointer(L, index); | |
| return t; | |
| } | |
| void ap_lua_push_apr_table(lua_State *L, req_table_t *t) | |
| { | |
| lua_boxpointer(L, t); | |
| luaL_getmetatable(L, "Apr.Table"); | |
| lua_setmetatable(L, -2); | |
| } | |
| static int lua_table_set(lua_State *L) | |
| { | |
| req_table_t *t = ap_lua_check_apr_table(L, 1); | |
| const char *key = luaL_checkstring(L, 2); | |
| const char *val = luaL_optlstring(L, 3, NULL, NULL); | |
| if (!val) { | |
| apr_table_unset(t->t, key); | |
| return 0; | |
| } | |
| /* Unless it's the 'notes' table, check for newline chars */ | |
| /* t->r will be NULL in case of the connection notes, but since | |
| we aren't going to check anything called 'notes', we can safely | |
| disregard checking whether t->r is defined. | |
| */ | |
| if (strcmp(t->n, "notes") && ap_strchr_c(val, '\n')) { | |
| char *badchar; | |
| char *replacement = apr_pstrdup(t->r->pool, val); | |
| badchar = replacement; | |
| while ( (badchar = ap_strchr(badchar, '\n')) ) { | |
| *badchar = ' '; | |
| } | |
| ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, t->r, APLOGNO(02614) | |
| "mod_lua: Value for '%s' in table '%s' contains newline!", | |
| key, t->n); | |
| apr_table_set(t->t, key, replacement); | |
| } | |
| else { | |
| apr_table_set(t->t, key, val); | |
| } | |
| return 0; | |
| } | |
| static int lua_table_get(lua_State *L) | |
| { | |
| req_table_t *t = ap_lua_check_apr_table(L, 1); | |
| const char *key = luaL_checkstring(L, 2); | |
| const char *val = apr_table_get(t->t, key); | |
| lua_pushstring(L, val); | |
| return 1; | |
| } | |
| static const luaL_Reg lua_table_methods[] = { | |
| {"set", lua_table_set}, | |
| {"get", lua_table_get}, | |
| {0, 0} | |
| }; | |
| int ap_lua_init(lua_State *L, apr_pool_t *p) | |
| { | |
| luaL_newmetatable(L, "Apr.Table"); | |
| #if LUA_VERSION_NUM < 502 | |
| luaL_register(L, "apr_table", lua_table_methods); | |
| #else | |
| luaL_newlib(L, lua_table_methods); | |
| #endif | |
| lua_pushstring(L, "__index"); | |
| lua_pushstring(L, "get"); | |
| lua_gettable(L, 2); | |
| lua_settable(L, 1); | |
| lua_pushstring(L, "__newindex"); | |
| lua_pushstring(L, "set"); | |
| lua_gettable(L, 2); | |
| lua_settable(L, 1); | |
| return 0; | |
| } | |