From 1550d5d035d87cdbd0f7041192c9dd2dd2aba03d Mon Sep 17 00:00:00 2001 From: Thierry Fournier Date: Thu, 21 Jan 2016 09:35:41 +0100 Subject: [PATCH] MINOR: lua: Add date functions This patch add date parsing function in Lua API. These function are usefull for parsing standard HTTP date provided in headers. --- src/hlua_fcn.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/src/hlua_fcn.c b/src/hlua_fcn.c index b4df09a52..a35ccfafe 100644 --- a/src/hlua_fcn.c +++ b/src/hlua_fcn.c @@ -22,6 +22,56 @@ int hlua_now(lua_State *L) return 1; } +/* This functions expects a Lua string as HTTP date, parse it and + * returns an integer containing the epoch format of the date, or + * nil if the parsing fails. + */ +static int hlua_parse_date(lua_State *L, int (*fcn)(const char *, int, struct tm*)) +{ + const char *str; + size_t len; + struct tm tm; + time_t time; + + str = luaL_checklstring(L, 1, &len); + + if (!fcn(str, len, &tm)) { + lua_pushnil(L); + return 1; + } + + /* This function considers the content of the broken-down time + * is exprimed in the UTC timezone. timegm don't care about + * the gnu variable tm_gmtoff. If gmtoff is set, or if you know + * the timezone from the broken-down time, it must be fixed + * after the conversion. + */ + time = timegm(&tm); + if (time == -1) { + lua_pushnil(L); + return 1; + } + + lua_pushinteger(L, (int)time); + return 1; +} +static int hlua_http_date(lua_State *L) +{ + return hlua_parse_date(L, parse_http_date); +} +static int hlua_imf_date(lua_State *L) +{ + return hlua_parse_date(L, parse_imf_date); +} +static int hlua_rfc850_date(lua_State *L) +{ + return hlua_parse_date(L, parse_rfc850_date); +} +static int hlua_asctime_date(lua_State *L) +{ + return hlua_parse_date(L, parse_asctime_date); +} + static void hlua_array_add_fcn(lua_State *L, const char *name, int (*function)(lua_State *L)) { @@ -33,5 +83,9 @@ static void hlua_array_add_fcn(lua_State *L, const char *name, int hlua_fcn_reg_core_fcn(lua_State *L) { hlua_array_add_fcn(L, "now", hlua_now); - return 1; + hlua_array_add_fcn(L, "http_date", hlua_http_date); + hlua_array_add_fcn(L, "imf_date", hlua_imf_date); + hlua_array_add_fcn(L, "rfc850_date", hlua_rfc850_date); + hlua_array_add_fcn(L, "asctime_date", hlua_asctime_date); + return 5; }