File: param.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 (103 lines) | stat: -rw-r--r-- 2,402 bytes parent folder | download | duplicates (3)
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
-- Copyright (C) Yichun Zhang (agentzh)


local ffi = require 'ffi'
local base = require "resty.core.base"
require "resty.core.phase"  -- for ngx.get_phase


local C = ffi.C
local ffi_str = ffi.string
local FFI_AGAIN = base.FFI_AGAIN
local FFI_OK = base.FFI_OK
local get_request = base.get_request
local get_string_buf = base.get_string_buf
local getmetatable = getmetatable
local ngx = ngx
local ngx_phase = ngx.get_phase


local _M = {
    version = base.version
}


ffi.cdef[[
    typedef unsigned char u_char;

    void ngx_http_lua_ffi_get_setby_param(ngx_http_request_t *r, int idx,
        u_char **data, size_t *len);
    int ngx_http_lua_ffi_get_body_filter_param_eof(ngx_http_request_t *r);
    int ngx_http_lua_ffi_get_body_filter_param_body(ngx_http_request_t *r,
        u_char **data_p, size_t *len_p);
    int ngx_http_lua_ffi_copy_body_filter_param_body(ngx_http_request_t *r,
        u_char *data);
]]
local data_p = ffi.new("unsigned char*[1]")
local len_p = ffi.new("size_t[1]")


local function get_setby_param(r, idx)
    C.ngx_http_lua_ffi_get_setby_param(r, idx, data_p, len_p)
    if len_p[0] == 0 then
        return nil
    end

    return ffi_str(data_p[0], len_p[0])
end


local function get_body_filter_param(r, idx)
    if idx == 1 then
        data_p[0] = nil
        local rc = C.ngx_http_lua_ffi_get_body_filter_param_body(r, data_p,
                                                                 len_p)
        if rc == FFI_AGAIN then
            local buf = get_string_buf(len_p[0])
            assert(C.ngx_http_lua_ffi_copy_body_filter_param_body(r, buf)
                   == FFI_OK)
            return ffi_str(buf, len_p[0])
        end

        if len_p[0] == 0 then
            return ""
        end

        return ffi_str(data_p[0], len_p[0])

    elseif idx == 2 then
        local rc = C.ngx_http_lua_ffi_get_body_filter_param_eof(r)
        return rc == 1

    else
        return nil
    end
end


local function get_param(tb, idx)
    local r = get_request()
    if not r then
        error("no request found")
    end

    local phase = ngx_phase()
    if phase == "set" then
        return get_setby_param(r, idx)
    end

    if phase == "body_filter" then
        return get_body_filter_param(r, idx)
    end

    error("API disabled in the current context")
end


do
    local mt = getmetatable(ngx.arg)
    mt.__index = get_param
end


return _M