kong/spec/03-plugins/12-request-size-limiting/01-access_spec.lua (261 lines of code) (raw):
local handler = require "kong.plugins.request-size-limiting.handler"
local helpers = require "spec.helpers"
local cjson = require "cjson"
local size_units = handler.size_units
local unit_multiplication_factor = handler.unit_multiplication_factor
local TEST_SIZE = 2
local MB = 2^20
for _, strategy in helpers.each_strategy() do
describe("Plugin: request-size-limiting (access) [#" .. strategy .. "]", function()
local proxy_client
lazy_setup(function()
local bp = helpers.get_db_utils(strategy, {
"routes",
"services",
"plugins",
})
local route = bp.routes:insert {
hosts = { "limit.com" },
}
bp.plugins:insert {
name = "request-size-limiting",
route = { id = route.id },
config = {
allowed_payload_size = TEST_SIZE,
}
}
local route2 = bp.routes:insert {
hosts = { "required.com" },
}
bp.plugins:insert {
name = "request-size-limiting",
route = { id = route2.id },
config = {
allowed_payload_size = TEST_SIZE,
require_content_length = true,
}
}
for _, unit in ipairs(size_units) do
local route = bp.routes:insert {
hosts = { string.format("limit_%s.com", unit) },
}
bp.plugins:insert {
name = "request-size-limiting",
route = { id = route.id },
config = {
allowed_payload_size = TEST_SIZE,
size_unit = unit
}
}
end
assert(helpers.start_kong({
database = strategy,
nginx_conf = "spec/fixtures/custom_nginx.template",
}))
proxy_client = helpers.proxy_client()
end)
lazy_teardown(function()
if proxy_client then
proxy_client:close()
end
helpers.stop_kong()
end)
describe("with Content-Length", function()
it("works if size is lower than limit", function()
local body = string.rep("a", (TEST_SIZE * MB))
local res = assert(proxy_client:request {
method = "POST",
path = "/request",
body = body,
headers = {
["Host"] = "limit.com",
["Content-Length"] = #body
}
})
assert.res_status(200, res)
end)
it("works if size is lower than limit and Expect header", function()
local body = string.rep("a", (TEST_SIZE * MB))
local res = assert(proxy_client:request {
method = "POST",
path = "/request",
body = body,
headers = {
["Host"] = "limit.com",
["Expect"] = "100-continue",
["Content-Length"] = #body
}
})
assert.res_status(200, res)
end)
it("blocks if size is greater than limit", function()
local body = string.rep("a", (TEST_SIZE * MB) + 1)
local res = assert(proxy_client:request {
method = "POST",
path = "/request",
body = body,
headers = {
["Host"] = "limit.com",
["Content-Length"] = #body
}
})
local body = assert.res_status(413, res)
local json = cjson.decode(body)
assert.same({ message = "Request size limit exceeded" }, json)
end)
it("blocks if size is greater than limit and Expect header", function()
local body = string.rep("a", (TEST_SIZE * MB) + 1)
local res = assert(proxy_client:request {
method = "POST",
path = "/request",
body = body,
headers = {
["Host"] = "limit.com",
["Expect"] = "100-continue",
["Content-Length"] = #body
}
})
local body = assert.res_status(417, res)
local json = cjson.decode(body)
assert.same({ message = "Request size limit exceeded" }, json)
end)
for _, unit in ipairs(size_units) do
it("blocks if size is greater than limit when unit in " .. unit, function()
local body = string.rep("a", (TEST_SIZE * unit_multiplication_factor[unit]) + 1)
local res = assert(proxy_client:request {
method = "POST",
path = "/request",
body = body,
headers = {
["Host"] = string.format("limit_%s.com", unit),
["Content-Length"] = #body
}
})
local body = assert.res_status(413, res)
local json = cjson.decode(body)
assert.same({ message = "Request size limit exceeded" }, json)
end)
end
for _, unit in ipairs(size_units) do
it("works if size is less than limit when unit in " .. unit, function()
local body = string.rep("a", (TEST_SIZE * unit_multiplication_factor[unit]) - 1)
local res = assert(proxy_client:request {
method = "POST",
path = "/request",
body = body,
headers = {
["Host"] = string.format("limit_%s.com", unit),
["Content-Length"] = #body
}
})
assert.res_status(200, res)
end)
end
end)
describe("without Content-Length", function()
it("works if size is lower than limit", function()
local body = string.rep("a", (TEST_SIZE * MB))
local res = assert(proxy_client:request {
dont_add_content_length = true,
method = "GET", -- if POST, then lua-rsty-http adds content-length anyway
path = "/request",
body = body,
headers = {
["Host"] = "limit.com"
}
})
assert.res_status(200, res)
end)
it("works if size is lower than limit and Expect header", function()
local body = string.rep("a", (TEST_SIZE * MB))
local res = assert(proxy_client:request {
dont_add_content_length = true,
method = "GET", -- if POST, then lua-rsty-http adds content-length anyway
path = "/request",
body = body,
headers = {
["Host"] = "limit.com",
["Expect"] = "100-continue"
}
})
assert.res_status(200, res)
end)
it("blocks if size is greater than limit", function()
local body = string.rep("a", (TEST_SIZE * MB) + 1)
local res = assert(proxy_client:request {
dont_add_content_length = true,
method = "GET", -- if POST, then lua-rsty-http adds content-length anyway
path = "/request",
body = body,
headers = {
["Host"] = "limit.com"
}
})
local body = assert.res_status(413, res)
local json = cjson.decode(body)
assert.same({ message = "Request size limit exceeded" }, json)
end)
it("blocks if size is greater than limit and Expect header", function()
local body = string.rep("a", (TEST_SIZE * MB) + 1)
local res = assert(proxy_client:request {
dont_add_content_length = true,
method = "GET", -- if POST, then lua-rsty-http adds content-length anyway
path = "/request",
body = body,
headers = {
["Host"] = "limit.com",
["Expect"] = "100-continue"
}
})
local body = assert.res_status(417, res)
local json = cjson.decode(body)
assert.same({ message = "Request size limit exceeded" }, json)
end)
for _, unit in ipairs(size_units) do
it("blocks if size is greater than limit when unit in " .. unit, function()
local body = string.rep("a", (TEST_SIZE * unit_multiplication_factor[unit]) + 1)
local res = assert(proxy_client:request {
dont_add_content_length = true,
method = "GET", -- if POST, then lua-rsty-http adds content-length anyway
path = "/request",
body = body,
headers = {
["Host"] = string.format("limit_%s.com", unit),
}
})
local body = assert.res_status(413, res)
local json = cjson.decode(body)
assert.same({ message = "Request size limit exceeded" }, json)
end)
end
for _, unit in ipairs(size_units) do
it("works if size is less than limit when unit in " .. unit, function()
local body = string.rep("a", (TEST_SIZE * unit_multiplication_factor[unit]))
local res = assert(proxy_client:request {
dont_add_content_length = true,
method = "GET", -- if POST, then lua-rsty-http adds content-length anyway
path = "/request",
body = body,
headers = {
["Host"] = string.format("limit_%s.com", unit),
}
})
assert.res_status(200, res)
end)
end
end)
describe("Content-Length header required", function()
it("blocks if header is not provided", function()
local res = assert(proxy_client:request {
dont_add_content_length = true,
method = "GET", -- if POST, then lua-rsty-http adds content-length anyway
path = "/request",
headers = {
["Host"] = "required.com",
}
})
assert.response(res).has.status(411)
end)
end)
end)
end