From: Steven Barth Date: Thu, 3 Jul 2008 18:49:29 +0000 (+0000) Subject: * libs/httpd: Add limit for luci handler X-Git-Tag: 0.8.0~716 X-Git-Url: http://git.openwrt.org/?p=project%2Fluci.git;a=commitdiff_plain;h=280872baa79d20de093314e3cfcf2cea14434f83 * libs/httpd: Add limit for luci handler --- diff --git a/libs/httpd/luasrc/httpd/handler/luci.lua b/libs/httpd/luasrc/httpd/handler/luci.lua index 0937413935..65f3f01b25 100644 --- a/libs/httpd/luasrc/httpd/handler/luci.lua +++ b/libs/httpd/luasrc/httpd/handler/luci.lua @@ -23,12 +23,16 @@ local ltn12 = require("luci.ltn12") Luci = luci.util.class(luci.httpd.module.Handler) Response = luci.httpd.module.Response -function Luci.__init__(self) +function Luci.__init__(self, limit) luci.httpd.module.Handler.__init__(self) + self.limit = limit or 5 + self.running = {} + setmetatable(self.running, {__mode = "v"}) end function Luci.handle_head(self, ...) local response, sourceout = self:handle_get(...) + self.running = self.running - 1 return response end @@ -37,6 +41,11 @@ function Luci.handle_post(self, ...) end 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( request.env, sourcein, @@ -57,6 +66,7 @@ function Luci.handle_get(self, request, sourcein, sinkerr) status = 500 headers["Content-Type"] = "text/plain" local err = {id} + self.running = self.running - 1 return Response( status, headers ), function() return table.remove(err) end end