From f0ac9196099c7384f2cef16b0890f974ea30b641 Mon Sep 17 00:00:00 2001
From: Kim Alvefur <zash@zash.se>
Date: Sat, 13 Feb 2021 13:38:56 +0100
Subject: net.http.server: Don't pause early streaming uploads

Fixes that otherwise it would wait for the request to be done after
receiving the head of the request, when it's meant to select a target
for where to store the data, instead of waiting after receiving the
request for when the request has been handled.
---
 net/http/server.lua | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/net/http/server.lua b/net/http/server.lua
index 7c79edee..df87283a 100644
--- a/net/http/server.lua
+++ b/net/http/server.lua
@@ -109,11 +109,20 @@ function runner_callbacks:error(err)
 	self.data.conn:close();
 end
 
+local function noop() end
 function listener.onconnect(conn)
 	local session = { conn = conn };
 	local secure = conn:ssl() and true or nil;
 	session.thread = async.runner(function (request)
-		local wait, done = async.waiter();
+		local wait, done;
+		if request.partial == true then
+			-- Have the header for a request, we want to receive the rest
+			-- when we've decided where the data should go.
+			wait, done = noop, noop;
+		else -- Got the entire request
+			-- Hold off on receiving more incoming requests until this one has been handled.
+			wait, done = async.waiter();
+		end
 		handle_request(conn, request, done); wait();
 	end, runner_callbacks, session);
 	local function success_cb(request)
-- 
cgit v1.2.3