File: time.lua

package info (click to toggle)
lua-resty-core 0.1.32-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,268 kB
  • sloc: sh: 207; perl: 143; makefile: 26
file content (183 lines) | stat: -rw-r--r-- 4,750 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
-- Copyright (C) Yichun Zhang (agentzh)


local ffi = require 'ffi'
local base = require "resty.core.base"


local error = error
local tonumber = tonumber
local type = type
local C = ffi.C
local ffi_new = ffi.new
local ffi_str = ffi.string
local time_val = ffi_new("long[1]")
local get_string_buf = base.get_string_buf
local ngx = ngx
local FFI_ERROR = base.FFI_ERROR
local subsystem = ngx.config.subsystem


local ngx_lua_ffi_now
local ngx_lua_ffi_time
local ngx_lua_ffi_monotonic_msec
local ngx_lua_ffi_today
local ngx_lua_ffi_localtime
local ngx_lua_ffi_utctime
local ngx_lua_ffi_update_time


if subsystem == 'http' then
    ffi.cdef[[
double ngx_http_lua_ffi_now(void);
long ngx_http_lua_ffi_time(void);
long ngx_http_lua_ffi_monotonic_msec(void);
void ngx_http_lua_ffi_today(unsigned char *buf);
void ngx_http_lua_ffi_localtime(unsigned char *buf);
void ngx_http_lua_ffi_utctime(unsigned char *buf);
void ngx_http_lua_ffi_update_time(void);
int ngx_http_lua_ffi_cookie_time(unsigned char *buf, long t);
void ngx_http_lua_ffi_http_time(unsigned char *buf, long t);
void ngx_http_lua_ffi_parse_http_time(const unsigned char *str, size_t len,
    long *time);
    ]]

    ngx_lua_ffi_now = C.ngx_http_lua_ffi_now
    ngx_lua_ffi_time = C.ngx_http_lua_ffi_time
    ngx_lua_ffi_monotonic_msec = C.ngx_http_lua_ffi_monotonic_msec
    ngx_lua_ffi_today = C.ngx_http_lua_ffi_today
    ngx_lua_ffi_localtime = C.ngx_http_lua_ffi_localtime
    ngx_lua_ffi_utctime = C.ngx_http_lua_ffi_utctime
    ngx_lua_ffi_update_time = C.ngx_http_lua_ffi_update_time

elseif subsystem == 'stream' then
    ffi.cdef[[
double ngx_stream_lua_ffi_now(void);
long ngx_stream_lua_ffi_time(void);
long ngx_stream_lua_ffi_monotonic_msec(void);
void ngx_stream_lua_ffi_today(unsigned char *buf);
void ngx_stream_lua_ffi_localtime(unsigned char *buf);
void ngx_stream_lua_ffi_utctime(unsigned char *buf);
void ngx_stream_lua_ffi_update_time(void);
    ]]

    ngx_lua_ffi_now = C.ngx_stream_lua_ffi_now
    ngx_lua_ffi_time = C.ngx_stream_lua_ffi_time
    ngx_lua_ffi_monotonic_msec = C.ngx_stream_lua_ffi_monotonic_msec
    ngx_lua_ffi_today = C.ngx_stream_lua_ffi_today
    ngx_lua_ffi_localtime = C.ngx_stream_lua_ffi_localtime
    ngx_lua_ffi_utctime = C.ngx_stream_lua_ffi_utctime
    ngx_lua_ffi_update_time = C.ngx_stream_lua_ffi_update_time
end


function ngx.now()
    local now = tonumber(ngx_lua_ffi_now())
    return now
end


function ngx.time()
    local time = tonumber(ngx_lua_ffi_time())
    return time
end


local function monotonic_msec()
    local msec = tonumber(ngx_lua_ffi_monotonic_msec())
    return msec
end


local function monotonic_time()
    local msec = tonumber(ngx_lua_ffi_monotonic_msec())
    local time = msec / 1000

    return time
end


function ngx.update_time()
    ngx_lua_ffi_update_time()
end


function ngx.today()
    -- the format of today is 2010-11-19
    local today_buf_size = 10
    local buf = get_string_buf(today_buf_size)
    ngx_lua_ffi_today(buf)
    return ffi_str(buf, today_buf_size)
end


function ngx.localtime()
    -- the format of localtime is 2010-11-19 20:56:31
    local localtime_buf_size = 19
    local buf = get_string_buf(localtime_buf_size)
    ngx_lua_ffi_localtime(buf)
    return ffi_str(buf, localtime_buf_size)
end


function ngx.utctime()
    -- the format of utctime is 2010-11-19 20:56:31
    local utctime_buf_size = 19
    local buf = get_string_buf(utctime_buf_size)
    ngx_lua_ffi_utctime(buf)
    return ffi_str(buf, utctime_buf_size)
end


if subsystem == 'http' then

function ngx.cookie_time(sec)
    if type(sec) ~= "number" then
        error("number argument only", 2)
    end

    -- the format of cookie time is Mon, 28-Sep-2038 06:00:00 GMT
    -- or Mon, 28-Sep-18 06:00:00 GMT
    local cookie_time_buf_size = 29
    local buf = get_string_buf(cookie_time_buf_size)
    local used_size = C.ngx_http_lua_ffi_cookie_time(buf, sec)
    return ffi_str(buf, used_size)
end


function ngx.http_time(sec)
    if type(sec) ~= "number" then
        error("number argument only", 2)
    end

    -- the format of http time is Mon, 28 Sep 1970 06:00:00 GMT
    local http_time_buf_size = 29
    local buf = get_string_buf(http_time_buf_size)
    C.ngx_http_lua_ffi_http_time(buf, sec)
    return ffi_str(buf, http_time_buf_size)
end


function ngx.parse_http_time(time_str)
    if type(time_str) ~= "string" then
        error("string argument only", 2)
    end

    C.ngx_http_lua_ffi_parse_http_time(time_str, #time_str, time_val)

    local res = time_val[0]
    if res == FFI_ERROR then
        return nil
    end

    local time = tonumber(res)
    return time
end

end

return {
    version = base.version,
    monotonic_msec = monotonic_msec,
    monotonic_time = monotonic_time
}