From d32f04a86356b8690f391755fa84b8fe72ea9334 Mon Sep 17 00:00:00 2001 From: Johannes Schmidt Date: Wed, 23 Jul 2025 09:44:13 +0200 Subject: [PATCH] Refactor EventsHandler to stream responses via chunked encoding --- lib/remote/eventshandler.cpp | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/lib/remote/eventshandler.cpp b/lib/remote/eventshandler.cpp index 813d5f41e..ac1fecb74 100644 --- a/lib/remote/eventshandler.cpp +++ b/lib/remote/eventshandler.cpp @@ -102,33 +102,27 @@ bool EventsHandler::HandleRequest( EventsSubscriber subscriber (std::move(eventTypes), HttpUtility::GetLastParameter(params, "filter"), l_ApiQuery); - server.StartDetectClientSideShutdown(); + IoBoundWorkSlot dontLockTheIoThread (yc); response.result(http::status::ok); response.set(http::field::content_type, "application/json"); + response.StartStreaming(true); + // Send response headers before waiting for the first event. + response.Flush(yc); - IoBoundWorkSlot dontLockTheIoThread (yc); - - http::async_write(stream, response, yc); - stream.async_flush(yc); - - asio::const_buffer newLine ("\n", 1); + auto encoder = response.GetJsonEncoder(); for (;;) { auto event (subscriber.GetInbox()->Shift(yc)); - if (event) { - String body = JsonEncode(event); - - boost::algorithm::replace_all(body, "\n", ""); - - asio::const_buffer payload (body.CStr(), body.GetLength()); - - asio::async_write(stream, payload, yc); - asio::async_write(stream, newLine, yc); - stream.async_flush(yc); - } else if (server.Disconnected()) { + if (response.IsClientDisconnected()) { return true; } + + if (event) { + encoder.Encode(event); + response.body() << '\n'; + response.Flush(yc); + } } }