http.request: possibility to defer body receiving if sink is not specified

In this case, the first returned value is not `1`, but a function,
taking two optional arguments: `sink` and `step`.
If the function is run without a `sink`, it simply closes the handle,
ignoring the body.
This commit is contained in:
johnd0e 2024-09-11 17:07:54 +02:00
parent 1fad162690
commit 0278463377

View File

@ -368,8 +368,16 @@ end
local code, status = h:receivestatusline() local code, status = h:receivestatusline()
-- if it is an HTTP/0.9 server, simply get the body and we are done -- if it is an HTTP/0.9 server, simply get the body and we are done
if not code then if not code then
if nreqt.sink then
h:receive09body(status, nreqt.sink, nreqt.step) h:receive09body(status, nreqt.sink, nreqt.step)
return 1, 200 return 1, 200
else
return socket.protect(function(sink, step)
if sink then
return h:receive09body(status, sink, step or nreqt.step)
end
end), 200
end
elseif code == 408 then elseif code == 408 then
return 1, code return 1, code
end end
@ -387,11 +395,23 @@ end
return tredirect(reqt, headers.location) return tredirect(reqt, headers.location)
end end
-- here we are finally done -- here we are finally done
local receivebody
if shouldreceivebody(nreqt, code) then if shouldreceivebody(nreqt, code) then
if nreqt.sink then
h:receivebody(headers, nreqt.sink, nreqt.step) h:receivebody(headers, nreqt.sink, nreqt.step)
else
receivebody = socket.protect(function(sink, step)
local res, err
if sink then
res, err = h:receivebody(headers, sink, step or nreqt.step)
end end
h:close() h:close()
return 1, code, headers, status return res, err
end)
end
end
if not receivebody then h:close() end
return receivebody or 1, code, headers, status
end end
-- turns an url and a body into a generic request -- turns an url and a body into a generic request