You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
2.3 KiB
Lua

-- @Author: detailyang
-- @Date: 2016-10-10 15:45:33
-- @Last Modified by: detailyang
-- @Last Modified time: 2017-02-19 13:29:41
-- https://www.w3.org/TR/cors/
local re_match = ngx.re.match
local _M = { _VERSION = '0.1.0'}
local Origin = 'Origin'
local AccessControlAllowOrigin = 'Access-Control-Allow-Origin'
local AccessControlExposeHeaders = 'Access-Control-Expose-Headers'
local AccessControlMaxAge = 'Access-Control-Max-Age'
local AccessControlAllowCredentials = 'Access-Control-Allow-Credentials'
local AccessControlAllowMethods = 'Access-Control-Allow-Methods'
local AccessControlAllowHeaders = 'Access-Control-Allow-Headers'
local mt = { __index = _M }
local allow_hosts = {}
local allow_headers = {}
local allow_methods = {}
local expose_headers = {}
local max_age = 3600
local allow_credentials = true
local join = table.concat
function _M.allow_host(host)
allow_hosts[#allow_hosts + 1] = host
end
function _M.allow_method(method)
allow_methods[#allow_methods + 1] = method
end
function _M.allow_header(header)
allow_headers[#allow_headers + 1] = header
end
function _M.expose_header(header)
expose_headers[#expose_headers + 1] = header
end
function _M.max_age(age)
max_age = age
end
function _M.allow_credentials(credentials)
allow_credentials = credentials
end
function _M.run()
local origin = ngx.req.get_headers()[Origin]
if not origin then
return
end
local matched = false
for k, v in pairs(allow_hosts) do
local from, to, err = ngx.re.find(origin, v, "jo")
if from then
matched = true
end
end
if matched == false then
return
end
ngx.header[AccessControlAllowOrigin] = origin
ngx.header[AccessControlMaxAge] = max_age
if #expose_headers >= 0 then
ngx.header[AccessControlExposeHeaders] = join(expose_headers, ',')
end
if #allow_headers >= 0 then
ngx.header[AccessControlAllowHeaders] = join(allow_headers, ',')
end
if #allow_methods >= 0 then
ngx.header[AccessControlAllowMethods] = join(allow_methods, ',')
end
if allow_credentials == true then
ngx.header[AccessControlAllowCredentials] = "true"
else
ngx.header[AccessControlAllowCredentials] = "false"
end
end
return _M