Increase compatibility of SGI-CGI with CGI1.1 standard
[project/luci.git] / libs / sgi-cgi / luasrc / sgi / cgi.lua
index 0d5ba6f..15363a1 100644 (file)
@@ -29,15 +29,36 @@ 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)
        )
        
        local x = coroutine.create(luci.dispatcher.httpdispatch)
        local hcache = ""
+       local active = true
        
        while coroutine.status(x) ~= "dead" do
                local res, id, data1, data2 = coroutine.resume(x, r)
@@ -49,16 +70,21 @@ function run()
                        break;
                end
 
-               if id == 1 then
-                       io.write("Status: " .. tostring(data1) .. " " .. data2 .. "\r\n")
-               elseif id == 2 then
-                       hcache = hcache .. data1 .. ": " .. data2 .. "\r\n"
-               elseif id == 3 then
-                       io.write(hcache)
-                       io.write("\r\n")
-               elseif id == 4 then
-                       io.write(data1)
+               if active then
+                       if id == 1 then
+                               io.write("Status: " .. tostring(data1) .. " " .. data2 .. "\r\n")
+                       elseif id == 2 then
+                               hcache = hcache .. data1 .. ": " .. data2 .. "\r\n"
+                       elseif id == 3 then
+                               io.write(hcache)
+                               io.write("\r\n")
+                       elseif id == 4 then
+                               io.write(data1)
+                       elseif id == 5 then
+                               io.flush()
+                               io.close()
+                               active = false
+                       end
                end
-               
        end
 end