From b8ab3b9dacab9c6d4344c60fdb4046087a24f233 Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Sat, 25 Jul 2009 07:27:05 +0000 Subject: [PATCH] Add: luci.http.splice to allow direct copying of data from a file descriptor --- libs/lucid-http/luasrc/lucid/http/server.lua | 13 ++++++++++--- libs/sgi-cgi/luasrc/sgi/cgi.lua | 3 +++ libs/web/luasrc/http.lua | 7 +++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/libs/lucid-http/luasrc/lucid/http/server.lua b/libs/lucid-http/luasrc/lucid/http/server.lua index 00c6b8416..0fe947316 100644 --- a/libs/lucid-http/luasrc/lucid/http/server.lua +++ b/libs/lucid-http/luasrc/lucid/http/server.lua @@ -510,7 +510,7 @@ function Server.process(self, client, env) headers["Content-Length"] = sourceout.len 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 headers["Transfer-Encoding"] = "chunked" sinkout = chunksink(client) @@ -554,8 +554,15 @@ function Server.process(self, client, env) if sourceout and stat then if util.instanceof(sourceout, IOResource) then - stat, code, msg = sourceout.fd:copyz(client, sourceout.len) - else + if not headers["Transfer-Encoding"] then + 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) end end diff --git a/libs/sgi-cgi/luasrc/sgi/cgi.lua b/libs/sgi-cgi/luasrc/sgi/cgi.lua index 15363a1a1..f2c6f6957 100644 --- a/libs/sgi-cgi/luasrc/sgi/cgi.lua +++ b/libs/sgi-cgi/luasrc/sgi/cgi.lua @@ -25,6 +25,7 @@ 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") @@ -84,6 +85,8 @@ function run() io.flush() io.close() active = false + elseif id == 6 then + data1:copyz(nixio.stdout, data2) end end end diff --git a/libs/web/luasrc/http.lua b/libs/web/luasrc/http.lua index bac997952..d34e253a5 100644 --- a/libs/web/luasrc/http.lua +++ b/libs/web/luasrc/http.lua @@ -258,6 +258,13 @@ function write(content, src_err) 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. -- @param url Target URL function redirect(url) -- 2.11.0