Avoid lacking fds
[project/luci.git] / libs / sgi-cgi / luasrc / sgi / cgi.lua
index d36d43f..3fec696 100644 (file)
@@ -25,14 +25,35 @@ limitations under the License.
 ]]--
 module("luci.sgi.cgi", package.seeall)
 local ltn12 = require("luci.ltn12")
+require("nixio.util")
 require("luci.http")
 require("luci.sys")
 require("luci.dispatcher")
 
+-- Limited source to avoid endless blocking
+local function limitsource(handle, limit)
+       limit = limit or 0
+       local BLOCKSIZE = ltn12.BLOCKSIZE
+
+       return function()
+               if limit < 1 then
+                       handle:close()
+                       return nil
+               else
+                       local read = (limit > BLOCKSIZE) and BLOCKSIZE or limit
+                       limit = limit - read
+
+                       local chunk = handle:read(read)
+                       if not chunk then handle:close() end
+                       return chunk
+               end
+       end
+end
+
 function run()
        local r = luci.http.Request(
                luci.sys.getenv(),
-               ltn12.source.file(io.stdin),
+               limitsource(io.stdin, tonumber(luci.sys.getenv("CONTENT_LENGTH"))),
                ltn12.sink.file(io.stderr)
        )
        
@@ -59,9 +80,14 @@ function run()
                                io.write(hcache)
                                io.write("\r\n")
                        elseif id == 4 then
-                               io.write(data1)
+                               io.write(tostring(data1 or ""))
                        elseif id == 5 then
+                               io.flush()
+                               io.close()
                                active = false
+                       elseif id == 6 then
+                               data1:copyz(nixio.stdout, data2)
+                               data1:close()
                        end
                end
        end