From 0278463377c4fe8717539549535b29b4296f2b2a Mon Sep 17 00:00:00 2001 From: johnd0e <1838643+johnd0e@users.noreply.github.com> Date: Wed, 11 Sep 2024 17:07:54 +0200 Subject: [PATCH] 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. --- src/http.lua | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/http.lua b/src/http.lua index 259eb2b..3659518 100644 --- a/src/http.lua +++ b/src/http.lua @@ -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 @@ -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