From 28e3b19ca114cc499d02c32bd470670b349c09bf Mon Sep 17 00:00:00 2001
From: Matthew Wild <mwild1@gmail.com>
Date: Thu, 9 Feb 2023 22:37:54 +0000
Subject: net.http: Add missing log parameter

---
 net/http.lua | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/net/http.lua b/net/http.lua
index 332ee250..aa435719 100644
--- a/net/http.lua
+++ b/net/http.lua
@@ -94,7 +94,7 @@ local function request_reader(request, data, err)
 					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");
+					log("debug", "Request '%s': Streaming via handler", request.id);
 					r.body_sink, finalize_sink = request.streaming_handler(r);
 				end
 				return;
-- 
cgit v1.2.3


From 0fd88a07a4951d6e06e20f7c3dcc5c115cd78ace Mon Sep 17 00:00:00 2001
From: Matthew Wild <mwild1@gmail.com>
Date: Thu, 9 Feb 2023 22:57:32 +0000
Subject: net.http.parser: Improve handling of responses without content-length

This ensures that we support responses without a content-length header, and
allow streaming them through the streaming handler interface. An example of
such a response would be Server-Sent Events streams.
---
 net/http/parser.lua           | 17 +++++++++++------
 spec/net_http_parser_spec.lua |  6 +++---
 2 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/net/http/parser.lua b/net/http/parser.lua
index 7fbade4c..b95d9017 100644
--- a/net/http/parser.lua
+++ b/net/http/parser.lua
@@ -130,10 +130,13 @@ function httpstream.new(success_cb, error_cb, parser_type, options_cb)
 							partial = true;
 						};
 					end
-					if len and len > bodylimit then
+					if not len or len > bodylimit then
 						-- Early notification, for redirection
 						success_cb(packet);
-						if not packet.body_sink then error = true; return error_cb("content-length-limit-exceeded"); end
+						if not packet.body_sink and (len and len > bodylimit) then
+							error = true;
+							return error_cb("content-length-limit-exceeded");
+						end
 					end
 					if chunked and not packet.body_sink then
 						success_cb(packet);
@@ -174,9 +177,11 @@ function httpstream.new(success_cb, error_cb, parser_type, options_cb)
 						end
 					elseif packet.body_sink then
 						local chunk = buffer:read_chunk(len);
-						while chunk and len > 0 do
+						while chunk and (not len or len > 0) do
 							if packet.body_sink:write(chunk) then
-								len = len - #chunk;
+								if len then
+									len = len - #chunk;
+								end
 								chunk = buffer:read_chunk(len);
 							else
 								error = true;
@@ -188,9 +193,9 @@ function httpstream.new(success_cb, error_cb, parser_type, options_cb)
 							packet.partial = nil;
 							success_cb(packet);
 						end
-					elseif buffer:length() >= len then
+					elseif not len or buffer:length() >= len then -- or not len
 						assert(not chunked)
-						packet.body = buffer:read(len) or "";
+						packet.body = len and buffer:read(len) or buffer:read_chunk() or "";
 						state = nil;
 						packet.partial = nil;
 						success_cb(packet);
diff --git a/spec/net_http_parser_spec.lua b/spec/net_http_parser_spec.lua
index f71cad20..ed70c431 100644
--- a/spec/net_http_parser_spec.lua
+++ b/spec/net_http_parser_spec.lua
@@ -87,7 +87,7 @@ o
 
 ]],
 				{
-					body = "Hello", count = 2;
+					body = "Hello", count = 3;
 				}
 			);
 		end);
@@ -116,7 +116,7 @@ o
 
 ]],
 				{
-					body = "Hello", count = 3;
+					body = "Hello", count = 4;
 				}
 			);
 		end);
@@ -129,7 +129,7 @@ o
 		assert.equal("25930f021785ae14053a322c2dbc1897c3769720", sha1(data, true), "test data malformed");
 
 		test_stream(data, {
-			body = string.rep("~", 11085), count = 2;
+			body = string.rep("~", 11085), count = 3;
 		});
 	end);
 end);
-- 
cgit v1.2.3