net.http: Add support for streaming chunked/large responses
authorMatthew Wild <mwild1@gmail.com>
Wed, 21 Oct 2020 10:40:11 +0100
changeset 11189 409ce7686c11
parent 11188 2ede7f43ccfe
child 11190 15fe9f0bb483
net.http: Add support for streaming chunked/large responses
net/http.lua
--- a/net/http.lua	Wed Oct 21 10:34:16 2020 +0100
+++ b/net/http.lua	Wed Oct 21 10:40:11 2020 +0100
@@ -83,7 +83,24 @@
 			return;
 		end
 
+		local finalize_sink;
 		local function success_cb(r)
+			if r.partial then
+				-- Request should be streamed
+				log("debug", "Request '%s': partial response (%s%s)",
+					request.id,
+					r.chunked and "chunked, " or "",
+					r.body_length and ("%d bytes"):format(r.body_length) or "unknown length"
+				);
+				if request.streaming_handler then
+					log("debug", "Request '%s': Streaming via handler");
+					r.body_sink, finalize_sink = request.streaming_handler(r);
+				end
+				return;
+			elseif finalize_sink then
+				log("debug", "Request '%s': Finalizing response stream");
+				finalize_sink(r);
+			end
 			if request.callback then
 				request.callback(r.body, r.code, r, request);
 				request.callback = nil;
@@ -256,6 +273,7 @@
 		end
 		req.insecure = ex.insecure;
 		req.suppress_errors = ex.suppress_errors;
+		req.streaming_handler = ex.streaming_handler;
 	end
 
 	log("debug", "Making %s %s request '%s' to %s", req.scheme:upper(), method or "GET", req.id, (ex and ex.suppress_url and host_header) or u);