Hi,

My name is Bertrand Mansion, I live in Paris, France, I have been
mostly programming in PHP for the last few years and I am very excited
about mod_lua since I consider Lua is superior in many ways. I have
followed the development of mod_wombat and noticed that you changed
the way headers_in and headers_out are accessed, they were previously
tables, now only headers_in can be accessed through a headers_in()
method. I have written a method to have access to headers_out as well.
I am not sure it is perfect since I haven't coded with Lua and apr C
APIs before and many you thought already about something more clever.

Anyway, with this patch, you can do:
r:headers_out('Location', 'http://www.example.com') -- set the Location header
r:headers_out('Location) -- return the current value for header Location
r:headers_out('Location', nil) -- unset the Location header

There might be other options I haven't implemented for example:

r.headers_out['Location'] = 'http://www.example.com' -- like in
previous versions of mod_wombat
  or
r:headers_out{Location = 'http://www.example.com} -- but then it
becomes harder to unset a header (?)
  or
r.headers_out:set('Location', 'http://www.example.com')
r.headers_out:get('Location')
r.headers_out:unset('Location')

HTH

-----
Bertrand Mansion
Mamasam
--- lua_request.c
+++ (clipboard)
@@ -447,6 +447,41 @@
     return 1;
 }
 
+static int req_headers_out(lua_State *L)
+{
+    const char *key;
+    const char *value;
+
+    request_rec *r = apl_check_request_rec(L, 1);
+
+    key = luaL_checkstring(L, 2);
+
+    if (lua_isnone(L, 3) == 1) {
+        /* getting a value from headers_out */
+        value = apr_table_get(r->headers_out, key);
+        if (value) {
+            lua_pushstring(L, value);
+        }
+        else {
+            lua_pushnil(L);
+        }
+    }
+    else {
+        if (lua_isnil(L, 3) == 1) {
+            value = apr_table_get(r->headers_out, key);
+            if (value) {
+                apr_table_unset(r->headers_out, key);
+            }
+        }
+        else {
+            value = luaL_checkstring(L, 3);
+            apr_table_set(r->headers_out, key, value);
+        }        
+    }
+
+    return 1;
+}
+
 /* handle r.status = 201 */
 static int req_newindex(lua_State *L)
 {
@@ -604,6 +639,8 @@
 
     apr_hash_set(dispatch, "headers_in", APR_HASH_KEY_STRING,
                  makefun(&req_headers_in, APL_REQ_FUNTYPE_LUACFUN, p));
+    apr_hash_set(dispatch, "headers_out", APR_HASH_KEY_STRING,
+                 makefun(&req_headers_out, APL_REQ_FUNTYPE_LUACFUN, p));
 
     lua_pushlightuserdata(L, dispatch);
     lua_setfield(L, LUA_REGISTRYINDEX, "Apache2.Request.dispatch");
@@ -668,4 +705,4 @@
     lua_boxpointer(L, r);
     luaL_getmetatable(L, "Apache2.Request");
     lua_setmetatable(L, -2);
-}
\ No newline at end of file
+}

Reply via email to