From 5ff416f72526e4d5a73454e615a3fd76b7bb3f36 Mon Sep 17 00:00:00 2001 From: Johannes Schmidt Date: Tue, 1 Jul 2025 16:30:32 +0200 Subject: [PATCH] Refactor EventsHandler to stream responses via HttpResponse::Write() --- lib/remote/eventshandler.cpp | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/lib/remote/eventshandler.cpp b/lib/remote/eventshandler.cpp index ea8db7bb7..d8160d9fe 100644 --- a/lib/remote/eventshandler.cpp +++ b/lib/remote/eventshandler.cpp @@ -98,32 +98,23 @@ bool EventsHandler::HandleRequest( EventsSubscriber subscriber (std::move(eventTypes), request.GetLastParameter("filter"), l_ApiQuery); - server.StartStreaming(); - response.result(http::status::ok); response.set(http::field::content_type, "application/json"); + response.StartStreaming(); IoBoundWorkSlot dontLockTheIoThread (yc); - http::async_write(stream, response, yc); - stream.async_flush(yc); - - asio::const_buffer newLine ("\n", 1); + auto writer = std::make_shared>(response); + JsonEncoder encoder(writer); for (;;) { - auto event (subscriber.GetInbox()->Shift(yc)); + 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 (event && response.IsWritable()) { + encoder.Encode(event); + response.body() << '\n'; + response.Write(yc); + } else { return true; } }