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