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
|
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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue