summaryrefslogtreecommitdiffhomepage
path: root/libs
diff options
context:
space:
mode:
authorSteven Barth <steven@midlink.org>2009-07-25 07:27:05 +0000
committerSteven Barth <steven@midlink.org>2009-07-25 07:27:05 +0000
commitb8ab3b9dacab9c6d4344c60fdb4046087a24f233 (patch)
tree2d374430d2ef1919336061f3d5481e732f01d7ae /libs
parent3194662054cebfefc48c7ff3d3a5d7a3aa988b9a (diff)
Add: luci.http.splice to allow direct copying of data from a file
descriptor
Diffstat (limited to 'libs')
-rw-r--r--libs/lucid-http/luasrc/lucid/http/server.lua13
-rw-r--r--libs/sgi-cgi/luasrc/sgi/cgi.lua3
-rw-r--r--libs/web/luasrc/http.lua7
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)