* libs/httpd: Add limit for luci handler
This commit is contained in:
parent
f0a0e50378
commit
280872baa7
1 changed files with 11 additions and 1 deletions
|
@ -23,12 +23,16 @@ local ltn12 = require("luci.ltn12")
|
||||||
Luci = luci.util.class(luci.httpd.module.Handler)
|
Luci = luci.util.class(luci.httpd.module.Handler)
|
||||||
Response = luci.httpd.module.Response
|
Response = luci.httpd.module.Response
|
||||||
|
|
||||||
function Luci.__init__(self)
|
function Luci.__init__(self, limit)
|
||||||
luci.httpd.module.Handler.__init__(self)
|
luci.httpd.module.Handler.__init__(self)
|
||||||
|
self.limit = limit or 5
|
||||||
|
self.running = {}
|
||||||
|
setmetatable(self.running, {__mode = "v"})
|
||||||
end
|
end
|
||||||
|
|
||||||
function Luci.handle_head(self, ...)
|
function Luci.handle_head(self, ...)
|
||||||
local response, sourceout = self:handle_get(...)
|
local response, sourceout = self:handle_get(...)
|
||||||
|
self.running = self.running - 1
|
||||||
return response
|
return response
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -37,6 +41,11 @@ function Luci.handle_post(self, ...)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Luci.handle_get(self, request, sourcein, sinkerr)
|
function Luci.handle_get(self, request, sourcein, sinkerr)
|
||||||
|
if self.limit and #self.running >= self.limit then
|
||||||
|
return self:failure(503, "Overload")
|
||||||
|
end
|
||||||
|
table.insert(self.running, coroutine.running())
|
||||||
|
|
||||||
local r = luci.http.Request(
|
local r = luci.http.Request(
|
||||||
request.env,
|
request.env,
|
||||||
sourcein,
|
sourcein,
|
||||||
|
@ -57,6 +66,7 @@ function Luci.handle_get(self, request, sourcein, sinkerr)
|
||||||
status = 500
|
status = 500
|
||||||
headers["Content-Type"] = "text/plain"
|
headers["Content-Type"] = "text/plain"
|
||||||
local err = {id}
|
local err = {id}
|
||||||
|
self.running = self.running - 1
|
||||||
return Response( status, headers ), function() return table.remove(err) end
|
return Response( status, headers ), function() return table.remove(err) end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue