local function splice_sync(sock, pipeout, pipein, file, cb)
local os = require "os"
- local posix = require "posix"
local ssize = 65536
local smode = nixio.splice_flags("move", "more")
local stat
-- This is probably the only forking http-client ;-)
- local pid, code, msg = posix.fork()
+ local pid, code, msg = nixio.fork()
if not pid then
return pid, code, msg
elseif pid == 0 then
file:close()
if not stat then
- posix.kill(pid)
- posix.wait(pid)
+ nixio.kill(pid, 15)
+ nixio.wait(pid)
return stat, code, msg
else
- pid, msg, code = posix.wait(pid)
+ pid, msg, code = nixio.wait(pid)
if msg == "exited" then
if code == 0 then
return true
cbs = cbs or {}
options.headers = options.headers or {}
local hdr = options.headers
+ local file, code, msg
- local file, code, msg = prepare_fd(target)
- if not file then
- return file, code, msg
- end
-
- local off = file:tell()
+ if target then
+ file, code, msg = prepare_fd(target)
+ if not file then
+ return file, code, msg
+ end
- -- Set content range
- if off > 0 then
- hdr.Range = hdr.Range or ("bytes=" .. off .. "-")
+ local off = file:tell()
+
+ -- Set content range
+ if off > 0 then
+ hdr.Range = hdr.Range or ("bytes=" .. off .. "-")
+ end
end
local code, resp, buffer, sock = httpc.request_raw(uri, options)
if not code then
-- No success
- file:close()
+ if file then
+ file:close()
+ end
return code, resp, buffer
elseif hdr.Range and code ~= 206 then
-- We wanted a part but we got the while file
sock:close()
- file:close()
+ if file then
+ file:close()
+ end
return nil, -4, code, resp
elseif not hdr.Range and code ~= 200 then
-- We encountered an error
sock:close()
- file:close()
+ if file then
+ file:close()
+ end
return nil, -4, code, resp
end
if cbs.on_header then
local stat = {cbs.on_header(file, code, resp)}
if stat[1] == false then
- file:close()
+ if file then
+ file:close()
+ end
sock:close()
return unpack(stat)
+ elseif stat[2] then
+ file = file and stat[2]
end
end
+
+ if not file then
+ return nil, -5, "no target given"
+ end
local chunked = resp.headers["Transfer-Encoding"] == "chunked"
local stat