Browse Source

Add Lua interface for new API function (#856)

bel2125 5 years ago
parent
commit
40c36423c2
3 changed files with 99 additions and 3 deletions
  1. 2 2
      src/civetweb.c
  2. 66 0
      src/mod_lua.inl
  3. 31 1
      test/page2.lua

+ 2 - 2
src/civetweb.c

@@ -7323,10 +7323,10 @@ mg_split_form_encoded(char *data,
 			break;
 		}
 		form_fields[num].name = data;
-		
+
 		/* find & or = */
 		b = data;
-		while ((*b != 0) && (*b != '&') && (*b != '=')) { 
+		while ((*b != 0) && (*b != '&') && (*b != '=')) {
 			b++;
 		}
 

+ 66 - 0
src/mod_lua.inl

@@ -1151,6 +1151,71 @@ lsp_get_var(lua_State *L)
 }
 
 
+/* mg.split_form_data */
+static int
+lsp_split_form_data(lua_State *L)
+{
+	int num_args = lua_gettop(L);
+	const char *in;
+	size_t len;
+	char *buf;
+	struct mg_context *ctx;
+
+	struct mg_header form_fields[MG_MAX_FORM_FIELDS] = {0};
+	int ret, i;
+
+	if (num_args != 1) {
+		return luaL_error(L, "invalid split_form_data() call");
+	}
+
+	lua_pushlightuserdata(L, (void *)&lua_regkey_ctx);
+	lua_gettable(L, LUA_REGISTRYINDEX);
+	ctx = (struct mg_context *)lua_touserdata(L, -1);
+
+	/* Get input (const string) */
+	in = lua_tolstring(L, 1, &len);
+
+	/* Create a modifyable copy */
+	buf = mg_malloc_ctx(len + 1, ctx);
+	if (buf == NULL) {
+		return luaL_error(L, "out of memory in invalid split_form_data() call");
+	}
+	memcpy(buf, in, len + 1);
+
+	/* mg_split_form_encoded does the real work */
+	ret = mg_split_form_encoded(buf, form_fields);
+
+	if (ret < 0) {
+		return luaL_error(L, "error in invalid split_form_data() call");
+	}
+
+	/* return a table */
+	lua_newtable(L);
+	for (i = 0; i < ret; i++) {
+
+		lua_newtable(L);
+		if (form_fields[i].name) {
+			lua_pushstring(L, form_fields[i].name);
+		} else {
+			lua_pushnil(L);
+		}
+		lua_setfield(L, -2, "name");
+		if (form_fields[i].value) {
+			lua_pushstring(L, form_fields[i].value);
+		} else {
+			lua_pushnil(L);
+		}
+		lua_setfield(L, -2, "value");
+
+		lua_rawseti(L, -2, i + 1);
+	}
+
+	mg_free(buf);
+
+	return 1;
+}
+
+
 /* mg.get_mime_type */
 static int
 lsp_get_mime_type(lua_State *L)
@@ -2361,6 +2426,7 @@ prepare_lua_environment(struct mg_context *ctx,
 
 	reg_function(L, "time", lsp_get_time);
 	reg_function(L, "get_var", lsp_get_var);
+	reg_function(L, "split_form_data", lsp_split_form_data);
 	reg_function(L, "get_cookie", lsp_get_cookie);
 	reg_function(L, "md5", lsp_md5);
 	reg_function(L, "url_encode", lsp_url_encode);

+ 31 - 1
test/page2.lua

@@ -1,7 +1,16 @@
 mg.write("HTTP/1.0 200 OK\r\n")
 mg.write("Content-Type: text/html\r\n")
 mg.write("\r\n")
-mg.write([[<html><body>
+mg.write([[<html>
+<head>
+<title>CivetWeb Lua test page2</title>
+<style>
+table, th, td {
+  border: 1px solid black;
+}
+</style>
+</head>
+<body>
 <p>This is Lua script example 2, served by the
 <a href="https://github.com/civetweb/civetweb">CivetWeb web server</a>,
 version ]] .. mg.version .. [[.
@@ -240,6 +249,27 @@ mg.write(htmlEsc(json.encode(demo_data_for_json)))
 mg.write("</pre>\n</p>\n")
 
 
+if mg.request_info.query_string then
+  qtab = mg.split_form_data(mg.request_info.query_string)
+  mg.write("<p>\nSplit form test:<br/>\n");
+  mg.write("<table>\n");
+  mg.write("<tr>\n");
+  mg.write("<th>#</th>\n");
+  mg.write("<th>name</th>\n");
+  mg.write("<th>value</th>\n");
+  mg.write("</tr>\n");
+  for n,t in pairs(qtab) do
+    mg.write("<tr>\n");
+    mg.write("<td>" .. n .. "</td>\n");
+    mg.write("<td>" .. tostring(t.name) .. "</td>\n");
+    mg.write("<td>" .. tostring(t.value) .. "</td>\n");
+    mg.write("</tr>\n");
+  end
+  mg.write("</table>\n");
+  mg.write("</p>\n");
+end
+
+
 -- Next section ...
 mg.write("\n<hr/>\n")