Remove ServerSentEvents class
Now that SSE is in the core, this code is no longer used or required.
Most of it now exists (in function) in http/server_sent_event.hpp.
Remove the dead code.
Tested: Code compiles
Change-Id: I346d1cea566a46157a6667ca472e59b17dfa9b19
Signed-off-by: Ed Tanous <edtanous@google.com>
diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index b05a38d..c0c57ac 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -23,7 +23,6 @@
#include "random.hpp"
#include "registries.hpp"
#include "registries_selector.hpp"
-#include "server_sent_events.hpp"
#include "str_utility.hpp"
#include "utility.hpp"
#include "utils/json_utils.hpp"
diff --git a/redfish-core/include/server_sent_events.hpp b/redfish-core/include/server_sent_events.hpp
deleted file mode 100644
index e9ff212..0000000
--- a/redfish-core/include/server_sent_events.hpp
+++ /dev/null
@@ -1,292 +0,0 @@
-
-/*
-// Copyright (c) 2020 Intel Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-*/
-#pragma once
-
-#include "logging.hpp"
-
-#include <boost/asio/ip/tcp.hpp>
-#include <boost/beast/http/buffer_body.hpp>
-#include <boost/beast/http/message.hpp>
-#include <boost/beast/http/read.hpp>
-#include <boost/beast/http/serializer.hpp>
-#include <boost/beast/http/write.hpp>
-#include <boost/beast/version.hpp>
-
-#include <cstdlib>
-#include <functional>
-#include <iostream>
-#include <memory>
-#include <queue>
-#include <string>
-
-namespace crow
-{
-
-static constexpr uint8_t maxReqQueueSize = 50;
-
-enum class SseConnState
-{
- startInit,
- initInProgress,
- initialized,
- initFailed,
- sendInProgress,
- sendFailed,
- idle,
- suspended,
- closed
-};
-
-class ServerSentEvents : public std::enable_shared_from_this<ServerSentEvents>
-{
- private:
- std::shared_ptr<boost::asio::ip::tcp::socket> sseConn;
- std::queue<std::pair<uint64_t, std::string>> requestDataQueue;
- std::string outBuffer;
- SseConnState state{SseConnState::startInit};
- int retryCount{0};
- int maxRetryAttempts{5};
-
- void sendEvent(const std::string& id, const std::string& msg)
- {
- if (msg.empty())
- {
- BMCWEB_LOG_DEBUG << "Empty data, bailing out.";
- return;
- }
-
- if (state == SseConnState::sendInProgress)
- {
- return;
- }
- state = SseConnState::sendInProgress;
-
- if (!id.empty())
- {
- outBuffer += "id: ";
- outBuffer.append(id.begin(), id.end());
- outBuffer += "\n";
- }
-
- outBuffer += "data: ";
- for (char character : msg)
- {
- outBuffer += character;
- if (character == '\n')
- {
- outBuffer += "data: ";
- }
- }
- outBuffer += "\n\n";
-
- doWrite();
- }
-
- void doWrite()
- {
- if (outBuffer.empty())
- {
- BMCWEB_LOG_DEBUG << "All data sent successfully.";
- // Send is successful, Lets remove data from queue
- // check for next request data in queue.
- requestDataQueue.pop();
- state = SseConnState::idle;
- checkQueue();
- return;
- }
-
- sseConn->async_write_some(
- boost::asio::buffer(outBuffer.data(), outBuffer.size()),
- [self(shared_from_this())](
- const boost::beast::error_code& ec,
- [[maybe_unused]] const std::size_t& bytesTransferred) {
- self->outBuffer.erase(0, bytesTransferred);
-
- if (ec == boost::asio::error::eof)
- {
- // Send is successful, Lets remove data from queue
- // check for next request data in queue.
- self->requestDataQueue.pop();
- self->state = SseConnState::idle;
- self->checkQueue();
- return;
- }
-
- if (ec)
- {
- BMCWEB_LOG_ERROR << "async_write_some() failed: "
- << ec.message();
- self->state = SseConnState::sendFailed;
- self->checkQueue();
- return;
- }
- BMCWEB_LOG_DEBUG << "async_write_some() bytes transferred: "
- << bytesTransferred;
-
- self->doWrite();
- });
- }
-
- void startSSE()
- {
- if (state == SseConnState::initInProgress)
- {
- return;
- }
- state = SseConnState::initInProgress;
-
- BMCWEB_LOG_DEBUG << "starting SSE connection ";
- using BodyType = boost::beast::http::buffer_body;
- auto response =
- std::make_shared<boost::beast::http::response<BodyType>>(
- boost::beast::http::status::ok, 11);
- auto serializer =
- std::make_shared<boost::beast::http::response_serializer<BodyType>>(
- *response);
-
- // TODO: Add hostname in http header.
- response->set(boost::beast::http::field::server, "iBMC");
- response->set(boost::beast::http::field::content_type,
- "text/event-stream");
- response->body().data = nullptr;
- response->body().size = 0;
- response->body().more = true;
-
- boost::beast::http::async_write_header(
- *sseConn, *serializer,
- [this, response,
- serializer](const boost::beast::error_code& ec,
- [[maybe_unused]] const std::size_t& bytesTransferred) {
- if (ec)
- {
- BMCWEB_LOG_ERROR << "Error sending header" << ec;
- state = SseConnState::initFailed;
- checkQueue();
- return;
- }
-
- BMCWEB_LOG_DEBUG << "startSSE Header sent.";
- state = SseConnState::initialized;
- checkQueue();
- });
- }
-
- void checkQueue(const bool newRecord = false)
- {
- if (requestDataQueue.empty())
- {
- BMCWEB_LOG_DEBUG << "requestDataQueue is empty\n";
- return;
- }
-
- if (retryCount >= maxRetryAttempts)
- {
- BMCWEB_LOG_ERROR << "Maximum number of retries is reached.";
-
- // Clear queue.
- while (!requestDataQueue.empty())
- {
- requestDataQueue.pop();
- }
-
- // TODO: Take 'DeliveryRetryPolicy' action.
- // For now, doing 'SuspendRetries' action.
- state = SseConnState::suspended;
- return;
- }
-
- if ((state == SseConnState::initFailed) ||
- (state == SseConnState::sendFailed))
- {
- if (newRecord)
- {
- // We are already running async wait and retry.
- // Since record is added to queue, it gets the
- // turn in FIFO.
- return;
- }
-
- retryCount++;
- // TODO: Perform async wait for retryTimeoutInterval before proceed.
- }
- else
- {
- // reset retry count.
- retryCount = 0;
- }
-
- switch (state)
- {
- case SseConnState::initInProgress:
- case SseConnState::sendInProgress:
- case SseConnState::suspended:
- case SseConnState::startInit:
- case SseConnState::closed:
- // do nothing
- break;
- case SseConnState::initFailed:
- {
- startSSE();
- break;
- }
- case SseConnState::initialized:
- case SseConnState::idle:
- case SseConnState::sendFailed:
- {
- std::pair<uint64_t, std::string> reqData =
- requestDataQueue.front();
- sendEvent(std::to_string(reqData.first), reqData.second);
- break;
- }
- }
- }
-
- public:
- ServerSentEvents(const ServerSentEvents&) = delete;
- ServerSentEvents& operator=(const ServerSentEvents&) = delete;
- ServerSentEvents(ServerSentEvents&&) = delete;
- ServerSentEvents& operator=(ServerSentEvents&&) = delete;
-
- explicit ServerSentEvents(
- const std::shared_ptr<boost::asio::ip::tcp::socket>& adaptor) :
- sseConn(adaptor)
- {
- startSSE();
- }
-
- ~ServerSentEvents() = default;
-
- void sendData(const uint64_t& id, const std::string& data)
- {
- if (state == SseConnState::suspended)
- {
- return;
- }
-
- if (requestDataQueue.size() <= maxReqQueueSize)
- {
- requestDataQueue.emplace(id, data);
- checkQueue(true);
- }
- else
- {
- BMCWEB_LOG_ERROR << "Request queue is full. So ignoring data.";
- }
- }
-};
-
-} // namespace crow