blob: 38c3a3a8a055668f989a91778d2397eb4700780d [file] [log] [blame]
--
-- Licensed to the Apache Software Foundation (ASF) under one or more
-- contributor license agreements. See the NOTICE file distributed with
-- this work for additional information regarding copyright ownership.
-- The ASF licenses this file to You under the Apache License, Version 2.0
-- (the "License"); you may not use this file except in compliance with
-- the License. You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
local http = require("resty.http")
local json = require("cjson.safe")
local dir_names = {}
local _M = {}
local function com_tab(pattern, data, deep)
deep = deep or 1
for k, v in pairs(pattern) do
dir_names[deep] = k
if type(v) == "table" then
local ok, err = com_tab(v, data[k], deep + 1)
if not ok then
return false, err
end
elseif v ~= data[k] then
return false, "path: " .. table.concat(dir_names, "->", 1, deep)
.. " expect: " .. tostring(v) .. " got: "
.. tostring(data[k])
end
end
return true
end
local methods = {
[ngx.HTTP_GET ] = "GET",
[ngx.HTTP_HEAD ] = "HEAD",
[ngx.HTTP_PUT ] = "PUT",
[ngx.HTTP_POST ] = "POST",
[ngx.HTTP_DELETE ] = "DELETE",
[ngx.HTTP_OPTIONS] = "OPTIONS",
[ngx.HTTP_PATCH] = "PATCH",
[ngx.HTTP_TRACE] = "TRACE",
}
function _M.test_ipv6(uri)
local sock = ngx.socket.tcp()
local ok, err = sock:connect("[::1]", 12345)
if not ok then
ngx.say("failed to connect: ", err)
return
end
ngx.say("connected: ", ok)
local req = "GET " .. uri .. " HTTP/1.0\r\nHost: localhost\r\n"
.. "Connection: close\r\n\r\n"
-- req = "OK"
-- ngx.log(ngx.WARN, "req: ", req)
local bytes, err = sock:send(req)
if not bytes then
ngx.say("failed to send request: ", err)
return
end
ngx.say("request sent: ", bytes)
while true do
local line, err, part = sock:receive()
if line then
ngx.say("received: ", line)
else
ngx.say("failed to receive a line: ", err, " [", part, "]")
break
end
end
ok, err = sock:close()
ngx.say("close: ", ok, " ", err)
end
function _M.test(uri, method, body, pattern)
if type(body) == "table" then
body = json.encode(body)
end
if type(pattern) == "table" then
pattern = json.encode(pattern)
end
if type(method) == "number" then
method = methods[method]
end
local httpc = http.new()
-- https://github.com/ledgetech/lua-resty-http
uri = ngx.var.scheme .. "://" .. ngx.var.server_addr
.. ":" .. ngx.var.server_port .. uri
local res = httpc:request_uri(uri,
{
method = method,
body = body,
keepalive = false,
headers = {
["Content-Type"] = "application/x-www-form-urlencoded",
},
}
)
if not res then
ngx.log(ngx.ERR, "failed http: ", err)
return nil, err
end
if res.status >= 300 then
return res.status, res.body
end
if pattern == nil then
return res.status, "passed", res.body
end
local res_data = json.decode(res.body)
if type(pattern) == "string" then
pattern = json.decode(pattern)
end
local ok, err = com_tab(pattern, res_data)
if not ok then
return 500, "failed, " .. err, res_data
end
return 200, "passed", res_data
end
function _M.read_file(path)
local f = assert(io.open(path, "rb"))
local cert = f:read("*all")
f:close()
return cert
end
return _M