blob: d256870ecd7a33a7aec49e9d2052c9cb8d1da5fb [file] [log] [blame] [raw]
/*
* Copyright (C) Xiaozhe Wang (chaoslawful)
* Copyright (C) Yichun Zhang (agentzh)
*/
#ifndef DDEBUG
#define DDEBUG 0
#endif
#include "ddebug.h"
#include "ngx_http_lua_time.h"
#include "ngx_http_lua_util.h"
static int ngx_http_lua_ngx_today(lua_State *L);
static int ngx_http_lua_ngx_time(lua_State *L);
static int ngx_http_lua_ngx_now(lua_State *L);
static int ngx_http_lua_ngx_localtime(lua_State *L);
static int ngx_http_lua_ngx_utctime(lua_State *L);
static int ngx_http_lua_ngx_cookie_time(lua_State *L);
static int ngx_http_lua_ngx_http_time(lua_State *L);
static int ngx_http_lua_ngx_parse_http_time(lua_State *L);
static int ngx_http_lua_ngx_update_time(lua_State *L);
static int ngx_http_lua_ngx_req_start_time(lua_State *L);
static int
ngx_http_lua_ngx_today(lua_State *L)
{
time_t now;
ngx_tm_t tm;
u_char buf[sizeof("2010-11-19") - 1];
now = ngx_time();
ngx_gmtime(now + ngx_cached_time->gmtoff * 60, &tm);
ngx_sprintf(buf, "%04d-%02d-%02d", tm.ngx_tm_year, tm.ngx_tm_mon,
tm.ngx_tm_mday);
lua_pushlstring(L, (char *) buf, sizeof(buf));
return 1;
}
static int
ngx_http_lua_ngx_localtime(lua_State *L)
{
ngx_tm_t tm;
u_char buf[sizeof("2010-11-19 20:56:31") - 1];
ngx_gmtime(ngx_time() + ngx_cached_time->gmtoff * 60, &tm);
ngx_sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", tm.ngx_tm_year,
tm.ngx_tm_mon, tm.ngx_tm_mday, tm.ngx_tm_hour, tm.ngx_tm_min,
tm.ngx_tm_sec);
lua_pushlstring(L, (char *) buf, sizeof(buf));
return 1;
}
static int
ngx_http_lua_ngx_time(lua_State *L)
{
lua_pushnumber(L, (lua_Number) ngx_time());
return 1;
}
static int
ngx_http_lua_ngx_now(lua_State *L)
{
ngx_time_t *tp;
tp = ngx_timeofday();
lua_pushnumber(L, (lua_Number) (tp->sec + tp->msec / 1000.0L));
return 1;
}
static int
ngx_http_lua_ngx_update_time(lua_State *L)
{
ngx_time_update();
return 0;
}
static int
ngx_http_lua_ngx_utctime(lua_State *L)
{
ngx_tm_t tm;
u_char buf[sizeof("2010-11-19 20:56:31") - 1];
ngx_gmtime(ngx_time(), &tm);
ngx_sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", tm.ngx_tm_year,
tm.ngx_tm_mon, tm.ngx_tm_mday, tm.ngx_tm_hour, tm.ngx_tm_min,
tm.ngx_tm_sec);
lua_pushlstring(L, (char *) buf, sizeof(buf));
return 1;
}
static int
ngx_http_lua_ngx_cookie_time(lua_State *L)
{
time_t t;
u_char *p;
u_char buf[sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1];
if (lua_gettop(L) != 1) {
return luaL_error(L, "expecting one argument");
}
t = (time_t) luaL_checknumber(L, 1);
p = buf;
p = ngx_http_cookie_time(p, t);
lua_pushlstring(L, (char *) buf, p - buf);
return 1;
}
static int
ngx_http_lua_ngx_http_time(lua_State *L)
{
time_t t;
u_char *p;
u_char buf[sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1];
if (lua_gettop(L) != 1) {
return luaL_error(L, "expecting one argument");
}
t = (time_t) luaL_checknumber(L, 1);
p = buf;
p = ngx_http_time(p, t);
lua_pushlstring(L, (char *) buf, p - buf);
return 1;
}
static int
ngx_http_lua_ngx_parse_http_time(lua_State *L)
{
u_char *p;
size_t len;
time_t time;
if (lua_gettop(L) != 1) {
return luaL_error(L, "expecting one argument");
}
p = (u_char *) luaL_checklstring(L, 1, &len);
time = ngx_http_parse_time(p, len);
if (time == NGX_ERROR) {
lua_pushnil(L);
return 1;
}
lua_pushnumber(L, (lua_Number) time);
return 1;
}
static int
ngx_http_lua_ngx_req_start_time(lua_State *L)
{
ngx_http_request_t *r;
r = ngx_http_lua_get_req(L);
if (r == NULL) {
return luaL_error(L, "no request found");
}
lua_pushnumber(L, (lua_Number) (r->start_sec + r->start_msec / 1000.0L));
return 1;
}
void
ngx_http_lua_inject_time_api(lua_State *L)
{
lua_pushcfunction(L, ngx_http_lua_ngx_utctime);
lua_setfield(L, -2, "utctime");
lua_pushcfunction(L, ngx_http_lua_ngx_time);
lua_setfield(L, -2, "get_now_ts"); /* deprecated */
lua_pushcfunction(L, ngx_http_lua_ngx_localtime);
lua_setfield(L, -2, "get_now"); /* deprecated */
lua_pushcfunction(L, ngx_http_lua_ngx_localtime);
lua_setfield(L, -2, "localtime");
lua_pushcfunction(L, ngx_http_lua_ngx_time);
lua_setfield(L, -2, "time");
lua_pushcfunction(L, ngx_http_lua_ngx_now);
lua_setfield(L, -2, "now");
lua_pushcfunction(L, ngx_http_lua_ngx_update_time);
lua_setfield(L, -2, "update_time");
lua_pushcfunction(L, ngx_http_lua_ngx_today);
lua_setfield(L, -2, "get_today"); /* deprecated */
lua_pushcfunction(L, ngx_http_lua_ngx_today);
lua_setfield(L, -2, "today");
lua_pushcfunction(L, ngx_http_lua_ngx_cookie_time);
lua_setfield(L, -2, "cookie_time");
lua_pushcfunction(L, ngx_http_lua_ngx_http_time);
lua_setfield(L, -2, "http_time");
lua_pushcfunction(L, ngx_http_lua_ngx_parse_http_time);
lua_setfield(L, -2, "parse_http_time");
}
void
ngx_http_lua_inject_req_time_api(lua_State *L)
{
lua_pushcfunction(L, ngx_http_lua_ngx_req_start_time);
lua_setfield(L, -2, "start_time");
}
/* vi:set ft=c ts=4 sw=4 et fdm=marker: */