|
@@ -33,25 +33,40 @@ static int handle_lsp_request(struct mg_connection *, const char *,
|
|
|
|
|
|
static void reg_string(struct lua_State *L, const char *name, const char *val)
|
|
|
{
|
|
|
- lua_pushstring(L, name);
|
|
|
- lua_pushstring(L, val);
|
|
|
- lua_rawset(L, -3);
|
|
|
+ if (name!=NULL && val!=NULL) {
|
|
|
+ lua_pushstring(L, name);
|
|
|
+ lua_pushstring(L, val);
|
|
|
+ lua_rawset(L, -3);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void reg_int(struct lua_State *L, const char *name, int val)
|
|
|
{
|
|
|
- lua_pushstring(L, name);
|
|
|
- lua_pushinteger(L, val);
|
|
|
- lua_rawset(L, -3);
|
|
|
+ if (name!=NULL) {
|
|
|
+ lua_pushstring(L, name);
|
|
|
+ lua_pushinteger(L, val);
|
|
|
+ lua_rawset(L, -3);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void reg_boolean(struct lua_State *L, const char *name, int val)
|
|
|
+{
|
|
|
+ if (name!=NULL) {
|
|
|
+ lua_pushstring(L, name);
|
|
|
+ lua_pushboolean(L, val != 0);
|
|
|
+ lua_rawset(L, -3);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void reg_function(struct lua_State *L, const char *name,
|
|
|
lua_CFunction func, struct mg_connection *conn)
|
|
|
{
|
|
|
- lua_pushstring(L, name);
|
|
|
- lua_pushlightuserdata(L, conn);
|
|
|
- lua_pushcclosure(L, func, 1);
|
|
|
- lua_rawset(L, -3);
|
|
|
+ if (name!=NULL && func!=NULL) {
|
|
|
+ lua_pushstring(L, name);
|
|
|
+ lua_pushlightuserdata(L, conn);
|
|
|
+ lua_pushcclosure(L, func, 1);
|
|
|
+ lua_rawset(L, -3);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static int lsp_sock_close(lua_State *L)
|
|
@@ -263,7 +278,7 @@ static int lsp_redirect(lua_State *L)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void prepare_lua_environment(struct mg_connection *conn, lua_State *L)
|
|
|
+static void prepare_lua_environment(struct mg_connection *conn, lua_State *L, const char *script_name)
|
|
|
{
|
|
|
const struct mg_request_info *ri = mg_get_request_info(conn);
|
|
|
extern void luaL_openlibs(lua_State *);
|
|
@@ -302,6 +317,7 @@ static void prepare_lua_environment(struct mg_connection *conn, lua_State *L)
|
|
|
reg_function(L, "redirect", lsp_redirect, conn);
|
|
|
reg_string(L, "version", CIVETWEB_VERSION);
|
|
|
reg_string(L, "document_root", conn->ctx->config[DOCUMENT_ROOT]);
|
|
|
+ reg_string(L, "auth_domain", conn->ctx->config[AUTHENTICATION_DOMAIN]);
|
|
|
|
|
|
// Export request_info
|
|
|
lua_pushstring(L, "request_info");
|
|
@@ -313,14 +329,24 @@ static void prepare_lua_environment(struct mg_connection *conn, lua_State *L)
|
|
|
reg_int(L, "remote_ip", ri->remote_ip);
|
|
|
reg_int(L, "remote_port", ri->remote_port);
|
|
|
reg_int(L, "num_headers", ri->num_headers);
|
|
|
+ reg_int(L, "server_port", ntohs(conn->client.lsa.sin.sin_port));
|
|
|
+
|
|
|
+ if (conn->request_info.remote_user != NULL) {
|
|
|
+ reg_string(L, "remote_user", conn->request_info.remote_user);
|
|
|
+ reg_string(L, "auth_type", "Digest");
|
|
|
+ }
|
|
|
+
|
|
|
lua_pushstring(L, "http_headers");
|
|
|
lua_newtable(L);
|
|
|
for (i = 0; i < ri->num_headers; i++) {
|
|
|
reg_string(L, ri->http_headers[i].name, ri->http_headers[i].value);
|
|
|
}
|
|
|
lua_rawset(L, -3);
|
|
|
- lua_rawset(L, -3);
|
|
|
|
|
|
+ reg_boolean(L, "https", conn->ssl != NULL);
|
|
|
+ reg_string(L, "script_name", script_name);
|
|
|
+
|
|
|
+ lua_rawset(L, -3);
|
|
|
lua_setglobal(L, "mg");
|
|
|
|
|
|
// Register default mg.onerror function
|
|
@@ -355,7 +381,7 @@ void mg_exec_lua_script(struct mg_connection *conn, const char *path,
|
|
|
lua_State *L;
|
|
|
|
|
|
if (path != NULL && (L = luaL_newstate()) != NULL) {
|
|
|
- prepare_lua_environment(conn, L);
|
|
|
+ prepare_lua_environment(conn, L, path);
|
|
|
lua_pushcclosure(L, &lua_error_handler, 0);
|
|
|
|
|
|
lua_pushglobaltable(L);
|
|
@@ -414,7 +440,7 @@ static int handle_lsp_request(struct mg_connection *conn, const char *path,
|
|
|
} else {
|
|
|
// We're not sending HTTP headers here, Lua page must do it.
|
|
|
if (ls == NULL) {
|
|
|
- prepare_lua_environment(conn, L);
|
|
|
+ prepare_lua_environment(conn, L, path);
|
|
|
if (conn->ctx->callbacks.init_lua != NULL) {
|
|
|
conn->ctx->callbacks.init_lua(conn, L);
|
|
|
}
|
|
@@ -439,7 +465,7 @@ static void * new_lua_websocket(const char * script, struct mg_connection *conn)
|
|
|
assert(conn->lua_websocket_state == NULL);
|
|
|
L = luaL_newstate();
|
|
|
if (L) {
|
|
|
- prepare_lua_environment(conn, L);
|
|
|
+ prepare_lua_environment(conn, L, script);
|
|
|
if (conn->ctx->callbacks.init_lua != NULL) {
|
|
|
conn->ctx->callbacks.init_lua(conn, L);
|
|
|
}
|