From 2811cc9a77c17ac03aac9c1b582040827a76b0d9 Mon Sep 17 00:00:00 2001 From: Toni Uhlig Date: Tue, 27 Apr 2021 11:22:45 +0200 Subject: Squashed 'deps/cpp-httplib/' content from commit c58b005 git-subtree-dir: deps/cpp-httplib git-subtree-split: c58b00580ee66a248c2ef20334bb84319ccde310 --- example/ssesvr.cc | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 example/ssesvr.cc (limited to 'example/ssesvr.cc') diff --git a/example/ssesvr.cc b/example/ssesvr.cc new file mode 100644 index 0000000..4a58c66 --- /dev/null +++ b/example/ssesvr.cc @@ -0,0 +1,109 @@ +// +// sse.cc +// +// Copyright (c) 2020 Yuji Hirose. All rights reserved. +// MIT License +// + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace httplib; +using namespace std; + +class EventDispatcher { +public: + EventDispatcher() { + } + + void wait_event(DataSink *sink) { + unique_lock lk(m_); + int id = id_; + cv_.wait(lk, [&] { return cid_ == id; }); + if (sink->is_writable()) { sink->write(message_.data(), message_.size()); } + } + + void send_event(const string &message) { + lock_guard lk(m_); + cid_ = id_++; + message_ = message; + cv_.notify_all(); + } + +private: + mutex m_; + condition_variable cv_; + atomic_int id_ = 0; + atomic_int cid_ = -1; + string message_; +}; + +const auto html = R"( + + + + +SSE demo + + + + + +)"; + +int main(void) { + EventDispatcher ed; + + Server svr; + + svr.Get("/", [&](const Request & /*req*/, Response &res) { + res.set_content(html, "text/html"); + }); + + svr.Get("/event1", [&](const Request & /*req*/, Response &res) { + cout << "connected to event1..." << endl; + res.set_chunked_content_provider("text/event-stream", + [&](size_t /*offset*/, DataSink &sink) { + ed.wait_event(&sink); + return true; + }); + }); + + svr.Get("/event2", [&](const Request & /*req*/, Response &res) { + cout << "connected to event2..." << endl; + res.set_chunked_content_provider("text/event-stream", + [&](size_t /*offset*/, DataSink &sink) { + ed.wait_event(&sink); + return true; + }); + }); + + thread t([&] { + int id = 0; + while (true) { + this_thread::sleep_for(chrono::seconds(1)); + cout << "send event: " << id << std::endl; + std::stringstream ss; + ss << "data: " << id << "\n\n"; + ed.send_event(ss.str()); + id++; + } + }); + + svr.listen("localhost", 1234); +} -- cgit v1.2.3