Add: luci.http.splice to allow direct copying of data from a file
descriptor
This commit is contained in:
parent
3194662054
commit
b8ab3b9dac
3 changed files with 20 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue