diff options
Diffstat (limited to 'libs/httpd/luasrc/httpd.lua')
-rw-r--r-- | libs/httpd/luasrc/httpd.lua | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/libs/httpd/luasrc/httpd.lua b/libs/httpd/luasrc/httpd.lua index d95de7d31..8cd946f33 100644 --- a/libs/httpd/luasrc/httpd.lua +++ b/libs/httpd/luasrc/httpd.lua @@ -15,27 +15,31 @@ $Id$ require("ltn12") require("socket") - require("luci.util") -require("luci.http.protocol") -require("luci.httpd.server") - -local srv = luci.httpd.server -local host = "0.0.0.0" -local port = 50000 +Daemon = luci.util.class() -server = socket.bind(host, port) -server:settimeout( 0, "t" ) - -reading = { server } -running = { } +function Daemon.__init__(self, threadlimit) + self.reading = {} + self.running = {} + self.handler = {} + self.threadlimit = threadlimit +end +function Daemon.register(self, socket, clhandler, errhandler) + table.insert( self.reading, socket ) + self.handler[socket] = { clhandler = clhandler, errhandler = errhandler } +end -while true do +function Daemon.run(self) + while true do + self:step() + end +end - local input = socket.select( reading, nil, 0.1 ) +function Daemon.step(self) + local input = socket.select( self.reading, nil, 0 ) -- accept new connections for i, connection in ipairs(input) do @@ -43,25 +47,29 @@ while true do local sock = connection:accept() -- check capacity - if #running < srv.MAX_CLIENTS then + if self.threadlimit and #running < self.threadlimit then - table.insert( running, { - coroutine.create( srv.client_handler ), + table.insert( self.running, { + coroutine.create( self.handler[connection].clhandler ), sock } ) -- reject client else - srv.error503( sock ) + if self.handler[connection].errhandler then + self.handler[connection].errhandler( sock ) + end + + sock:close() end end -- create client handler - for i, client in ipairs( running ) do + for i, client in ipairs( self.running ) do -- reap dead clients if coroutine.status( client[1] ) == "dead" then - table.remove( running, i ) + table.remove( self.running, i ) end coroutine.resume( client[1], client[2] ) |