Add: luci.http.splice to allow direct copying of data from a file

descriptor
This commit is contained in:
Steven Barth 2009-07-25 07:27:05 +00:00
parent 3194662054
commit b8ab3b9dac
3 changed files with 20 additions and 3 deletions

View file

@ -510,7 +510,7 @@ function Server.process(self, client, env)
headers["Content-Length"] = sourceout.len headers["Content-Length"] = sourceout.len
end end
end end
if not headers["Content-Length"] then if not headers["Content-Length"] and not close then
if message.env.SERVER_PROTOCOL == "HTTP/1.1" then if message.env.SERVER_PROTOCOL == "HTTP/1.1" then
headers["Transfer-Encoding"] = "chunked" headers["Transfer-Encoding"] = "chunked"
sinkout = chunksink(client) sinkout = chunksink(client)
@ -554,8 +554,15 @@ function Server.process(self, client, env)
if sourceout and stat then if sourceout and stat then
if util.instanceof(sourceout, IOResource) then if util.instanceof(sourceout, IOResource) then
stat, code, msg = sourceout.fd:copyz(client, sourceout.len) if not headers["Transfer-Encoding"] then
else stat, code, msg = sourceout.fd:copyz(client, sourceout.len)
sourceout = nil
else
sourceout = sourceout.fd:blocksource(nil, sourceout.len)
end
end
if sourceout then
stat, msg = ltn12.pump.all(sourceout, sinkout) stat, msg = ltn12.pump.all(sourceout, sinkout)
end end
end end

View file

@ -25,6 +25,7 @@ limitations under the License.
]]-- ]]--
module("luci.sgi.cgi", package.seeall) module("luci.sgi.cgi", package.seeall)
local ltn12 = require("luci.ltn12") local ltn12 = require("luci.ltn12")
require("nixio.util")
require("luci.http") require("luci.http")
require("luci.sys") require("luci.sys")
require("luci.dispatcher") require("luci.dispatcher")
@ -84,6 +85,8 @@ function run()
io.flush() io.flush()
io.close() io.close()
active = false active = false
elseif id == 6 then
data1:copyz(nixio.stdout, data2)
end end
end end
end end

View file

@ -258,6 +258,13 @@ function write(content, src_err)
end end
end end
--- Splice data from a filedescriptor to the client.
-- @param fp File descriptor
-- @param size Bytes to splice (optional)
function splice(fd, size)
coroutine.yield(6, fd, size)
end
--- Redirects the client to a new URL and closes the connection. --- Redirects the client to a new URL and closes the connection.
-- @param url Target URL -- @param url Target URL
function redirect(url) function redirect(url)