add a c function for .send and .sendc
[project/uhttpd.git] / lua.c
diff --git a/lua.c b/lua.c
index e404add..0b06a33 100644 (file)
--- a/lua.c
+++ b/lua.c
@@ -89,6 +89,19 @@ static int uh_lua_recv(lua_State *L)
        }
 }
 
+static int uh_lua_send(lua_State *L)
+{
+       const char *buf;
+       size_t len;
+
+       buf = luaL_checklstring(L, 1, &len);
+       if (len > 0)
+               len = write(STDOUT_FILENO, buf, len);
+
+       lua_pushnumber(L, len);
+       return 1;
+}
+
 static int
 uh_lua_strconvert(lua_State *L, int (*convert)(char *, int, const char *, int))
 {
@@ -138,13 +151,10 @@ static lua_State *uh_lua_state_init(void)
        /* build uhttpd api table */
        lua_newtable(L);
 
-       /* 
-        * use print as send and sendc implementation,
-        * chunked transfer is handled in the main server
-        */
-       lua_getglobal(L, "print");
-       lua_pushvalue(L, -1);
-       lua_setfield(L, -3, "send");
+       lua_pushcfunction(L, uh_lua_send);
+       lua_setfield(L, -2, "send");
+
+       lua_pushcfunction(L, uh_lua_send);
        lua_setfield(L, -2, "sendc");
 
        lua_pushcfunction(L, uh_lua_recv);
@@ -192,11 +202,13 @@ error:
 
 static void lua_main(struct client *cl, struct path_info *pi, const char *url)
 {
+       struct blob_attr *cur;
        const char *error;
        struct env_var *var;
        lua_State *L = _L;
        int path_len, prefix_len;
        char *str;
+       int rem;
 
        lua_getglobal(L, UH_LUA_CB);
 
@@ -227,6 +239,13 @@ static void lua_main(struct client *cl, struct path_info *pi, const char *url)
        lua_pushnumber(L, 0.9 + (cl->request.version / 10.0));
        lua_setfield(L, -2, "HTTP_VERSION");
 
+       lua_newtable(L);
+       blob_for_each_attr(cur, cl->hdr.head, rem) {
+               lua_pushstring(L, blobmsg_data(cur));
+               lua_setfield(L, -2, blobmsg_name(cur));
+       }
+       lua_setfield(L, -2, "headers");
+
        switch(lua_pcall(L, 1, 0, 0)) {
        case LUA_ERRMEM:
        case LUA_ERRRUN: