class Async::HTTP::Protocol::HTTP1::Server

def each(task: Task.current)

Server loop.
def each(task: Task.current)
	while request = next_request
		response = yield(request, self)
		
		return if @stream.closed?
		
		if response
			# Try to avoid holding on to request, to minimse GC overhead:
			head = request.head?
			
			unless request.body?
				# If there is no body, #finish is a no-op.
				request = nil
			end
			
			write_response(@version, response.status, response.headers, response.body, head)
		else
			# If the request failed to generate a response, it was an internal server error:
			write_response(@version, 500, {}, nil)
		end
		
		# Gracefully finish reading the request body if it was not already done so.
		request&.finish
		
		# This ensures we yield at least once every iteration of the loop and allow other fibers to execute.
		task.yield
	end
end

def fail_request(status)

def fail_request(status)
	@persistent = false
	write_response(@version, status, {}, nil)
end

def next_request

def next_request
	# The default is true.
	return nil unless @persistent
	
	request = Request.new(self)
	
	unless persistent?(request.version, request.headers)
		@persistent = false
	end
	
	return request
rescue Async::TimeoutError
	fail_request(408)
	raise
rescue
	fail_request(400)
	raise
end