Skip to content

Commit

Permalink
http.request: possibility to defer body receiving if sink is not spec…
Browse files Browse the repository at this point in the history
…ified

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.
  • Loading branch information
johnd0e committed Sep 11, 2024
1 parent 1fad162 commit 0278463
Showing 1 changed file with 25 additions and 5 deletions.
30 changes: 25 additions & 5 deletions src/http.lua
Original file line number Diff line number Diff line change
Expand Up @@ -368,8 +368,16 @@ end
local code, status = h:receivestatusline()
-- if it is an HTTP/0.9 server, simply get the body and we are done
if not code then
h:receive09body(status, nreqt.sink, nreqt.step)
return 1, 200
if nreqt.sink then
h:receive09body(status, nreqt.sink, nreqt.step)
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
return 1, code
end
Expand All @@ -387,11 +395,23 @@ end
return tredirect(reqt, headers.location)
end
-- here we are finally done
local receivebody
if shouldreceivebody(nreqt, code) then
h:receivebody(headers, nreqt.sink, nreqt.step)
if nreqt.sink then
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
h:close()
return res, err
end)
end
end
h:close()
return 1, code, headers, status
if not receivebody then h:close() end
return receivebody or 1, code, headers, status
end

-- turns an url and a body into a generic request
Expand Down

0 comments on commit 0278463

Please sign in to comment.