From: Christopher Faulet Date: Thu, 6 Aug 2020 09:10:57 +0000 (+0200) Subject: MINOR: lua: Add support for regex as fetches and converters arguments X-Git-Tag: v2.3-dev3~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fd2e90608439cabcf12899f4e8dcc2d4c51c10c3;p=thirdparty%2Fhaproxy.git MINOR: lua: Add support for regex as fetches and converters arguments It means now regsub() converter is now exported to the lua. Map converters based on regex are not available because the map arguments are not supported. --- diff --git a/src/hlua.c b/src/hlua.c index 10fcf3affe..d2590d59d4 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -595,8 +595,9 @@ __LJMP int hlua_lua2arg_check(lua_State *L, int first, struct arg *argp, int i, idx; struct proxy *px; struct userlist *ul; + struct my_regex *reg; const char *msg = NULL; - char *sname, *pname; + char *sname, *pname, *err = NULL; idx = 0; min_arg = ARGM(mask); @@ -823,6 +824,22 @@ __LJMP int hlua_lua2arg_check(lua_State *L, int first, struct arg *argp, argp[idx].type = ARGT_MSK6; break; + case ARGT_REG: + if (argp[idx].type != ARGT_STR) { + msg = "string expected"; + goto error; + } + reg = regex_comp(argp[idx].data.str.area, !(argp[idx].type_flags & ARGF_REG_ICASE), 1, &err); + if (!reg) { + msg = lua_pushfstring(L, "error compiling regex '%s' : '%s'", + argp[idx].data.str.area, err); + free(err); + goto error; + } + argp[idx].type = ARGT_REG; + argp[idx].data.reg = reg; + break; + case ARGT_USR: if (argp[idx].type != ARGT_STR) { msg = "string expected"; @@ -851,7 +868,6 @@ __LJMP int hlua_lua2arg_check(lua_State *L, int first, struct arg *argp, break; case ARGT_MAP: - case ARGT_REG: msg = "type not yet supported"; goto error; break; @@ -876,6 +892,8 @@ __LJMP int hlua_lua2arg_check(lua_State *L, int first, struct arg *argp, for (i = 0; i < idx; i++) { if (argp[i].type == ARGT_STR) chunk_destroy(&argp[i].data.str); + else if (argp[i].type == ARGT_REG) + regex_free(argp[i].data.reg); } WILL_LJMP(luaL_argerror(L, first + idx, msg)); return 0; /* Never reached */ @@ -3373,6 +3391,8 @@ __LJMP static int hlua_run_sample_fetch(lua_State *L) for (i = 0; args[i].type != ARGT_STOP; i++) { if (args[i].type == ARGT_STR) chunk_destroy(&args[i].data.str); + else if (args[i].type == ARGT_REG) + regex_free(args[i].data.reg); } return 1; @@ -3380,6 +3400,8 @@ __LJMP static int hlua_run_sample_fetch(lua_State *L) for (i = 0; args[i].type != ARGT_STOP; i++) { if (args[i].type == ARGT_STR) chunk_destroy(&args[i].data.str); + else if (args[i].type == ARGT_REG) + regex_free(args[i].data.reg); } WILL_LJMP(lua_error(L)); return 0; /* Never reached */ @@ -3508,6 +3530,8 @@ __LJMP static int hlua_run_sample_conv(lua_State *L) for (i = 0; args[i].type != ARGT_STOP; i++) { if (args[i].type == ARGT_STR) chunk_destroy(&args[i].data.str); + else if (args[i].type == ARGT_REG) + regex_free(args[i].data.reg); } return 1; @@ -3515,6 +3539,8 @@ __LJMP static int hlua_run_sample_conv(lua_State *L) for (i = 0; args[i].type != ARGT_STOP; i++) { if (args[i].type == ARGT_STR) chunk_destroy(&args[i].data.str); + else if (args[i].type == ARGT_REG) + regex_free(args[i].data.reg); } WILL_LJMP(lua_error(L)); return 0; /* Never reached */