3 HTTP server implementation for LuCI - core
4 (c) 2008 Freifunk Leipzig / Jo-Philipp Wich <xm@leipzig.freifunk.net>
5 (c) 2008 Steven Barth <steven@midlink.org>
7 Licensed under the Apache License, Version 2.0 (the "License");
8 you may not use this file except in compliance with the License.
9 You may obtain a copy of the License at
11 http://www.apache.org/licenses/LICENSE-2.0
17 module("luci.httpd", package.seeall)
20 THREAD_IDLEWAIT = 0.01
33 function Socket(ip, port)
34 local sock, err = socket.bind( ip, port )
37 sock:settimeout( 0, "t" )
43 function corecv(socket, ...)
44 threadi[socket] = true
47 local chunk, err, part = socket:receive(...)
49 if err ~= "timeout" then
50 threadi[socket] = false
51 return chunk, err, part
59 local sink = socket.sink("close-when-done", sock)
60 local f = ltn12.source.file(io.open("/home/steven/workspace/ffluci/host/www/luci-static/openwrt.org/cascade.css"))
61 local s = luci.fs.stat("/home/steven/workspace/ffluci/host/www/luci-static/openwrt.org/cascade.css", "size")
62 sink("HTTP/1.1 200 OK\r\nContent-Length: " ..s.."\r\nConnection: close\r\n\r\n")
65 eof = not ltn12.pump.step(f, sink)
70 function register(socket, s_clhandler, s_errhandler)
71 table.insert(reading, socket)
72 clhandler[socket] = s_clhandler
73 erhandler[socket] = s_errhandler
85 if not THREAD_LIMIT or threadc < THREAD_LIMIT then
87 for i, server in ipairs(reading) do
88 local client = server:accept()
92 threads[client] = coroutine.create(clhandler[server])
97 for client, thread in pairs(threads) do
98 coroutine.resume(thread, client)
100 if coroutine.status(thread) == "dead" then
101 threads[client] = nil
102 threadc = threadc - 1
103 elseif threadm[client] and threadm[client] + THREAD_TIMEOUT < now then
104 threads[client] = nil
105 threadc = threadc - 1
107 elseif not threadi[client] then
108 threadm[client] = now
114 socket.sleep(THREAD_IDLEWAIT)