* libs/httpd: Add limit for luci handler

This commit is contained in:
Steven Barth 2008-07-03 18:49:29 +00:00
parent f0a0e50378
commit 280872baa7

View file

@ -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