Sin descripción

PerseoGI f85f30a637 Apple frameworks: match CoreFoundation and CFNetwork linkage (#2317) hace 1 mes
.github 2de4c59bc2 Add Zstd support through meson (#2293) hace 1 mes
benchmark 0c08c378d7 Simplify benchmark hace 7 meses
cmake db561f5552 [cmake] FindBrotli: do not add `Brotli::` targets if they already exist (#2249) hace 3 meses
docker ac9ebb0ee3 Merge commit from fork hace 3 meses
example 51b704b902 Implement SSEClient (#2308) hace 1 mes
test 6da7f0c61c Fix port reuse problem hace 1 mes
.clang-format 260422b7d7 Format code hace 6 años
.gitattributes 177d8420a1 Added .gitattributes file to prevent git from changing line endings (#1872) hace 1 año
.gitignore 8bba34eebc Add New Streaming API support (#2281) hace 2 meses
.pre-commit-config.yaml c551e97297 Add .pre-commit-config.yaml hace 7 meses
CMakeLists.txt f85f30a637 Apple frameworks: match CoreFoundation and CFNetwork linkage (#2317) hace 1 mes
Dockerfile f4cc542d4b Fix Dockerfile problem with CMD hace 5 meses
LICENSE ca7b942196 Changed license to MIT hace 8 años
README-sse.md 51b704b902 Implement SSEClient (#2308) hace 1 mes
README-stream.md 1d36013fc3 Update README hace 2 meses
README.md 51b704b902 Implement SSEClient (#2308) hace 1 mes
docker-compose.yml ba638ff38e Update Docker support hace 1 año
httplib.h 98048a033a Merge commit from fork hace 1 mes
meson.build f85f30a637 Apple frameworks: match CoreFoundation and CFNetwork linkage (#2317) hace 1 mes
meson_options.txt 2de4c59bc2 Add Zstd support through meson (#2293) hace 1 mes
split.py c3613c6977 Update the split.py file (#2295) hace 1 mes

README-sse.md

SSEClient - Server-Sent Events Client

A simple, EventSource-like SSE client for C++11.

Features

  • Auto-reconnect: Automatically reconnects on connection loss
  • Last-Event-ID: Sends last received ID on reconnect for resumption
  • retry field: Respects server's reconnect interval
  • Event types: Supports custom event types via on_event()
  • Async support: Run in background thread with start_async()
  • C++11 compatible: No C++14/17/20 features required

Quick Start

httplib::Client cli("http://localhost:8080");
httplib::sse::SSEClient sse(cli, "/events");

sse.on_message([](const httplib::sse::SSEMessage &msg) {
    std::cout << "Event: " << msg.event << std::endl;
    std::cout << "Data: " << msg.data << std::endl;
});

sse.start();  // Blocking, with auto-reconnect

API Reference

SSEMessage

struct SSEMessage {
    std::string event;  // Event type (default: "message")
    std::string data;   // Event payload
    std::string id;     // Event ID
};

SSEClient

Constructor

// Basic
SSEClient(Client &client, const std::string &path);

// With custom headers
SSEClient(Client &client, const std::string &path, const Headers &headers);

Event Handlers

// Called for all events (or events without a specific handler)
sse.on_message([](const SSEMessage &msg) { });

// Called for specific event types
sse.on_event("update", [](const SSEMessage &msg) { });
sse.on_event("delete", [](const SSEMessage &msg) { });

// Called when connection is established
sse.on_open([]() { });

// Called on connection errors
sse.on_error([](httplib::Error err) { });

Configuration

// Set reconnect interval (default: 3000ms)
sse.set_reconnect_interval(5000);

// Set max reconnect attempts (default: 0 = unlimited)
sse.set_max_reconnect_attempts(10);

Control

// Blocking start with auto-reconnect
sse.start();

// Non-blocking start (runs in background thread)
sse.start_async();

// Stop the client (thread-safe)
sse.stop();

State

bool connected = sse.is_connected();
const std::string &id = sse.last_event_id();

Examples

Basic Usage

httplib::Client cli("http://localhost:8080");
httplib::sse::SSEClient sse(cli, "/events");

sse.on_message([](const httplib::sse::SSEMessage &msg) {
    std::cout << msg.data << std::endl;
});

sse.start();

With Custom Event Types

httplib::sse::SSEClient sse(cli, "/events");

sse.on_event("notification", [](const httplib::sse::SSEMessage &msg) {
    std::cout << "Notification: " << msg.data << std::endl;
});

sse.on_event("update", [](const httplib::sse::SSEMessage &msg) {
    std::cout << "Update: " << msg.data << std::endl;
});

sse.start();

Async with Stop

httplib::sse::SSEClient sse(cli, "/events");

sse.on_message([](const httplib::sse::SSEMessage &msg) {
    std::cout << msg.data << std::endl;
});

sse.start_async();  // Returns immediately

// ... do other work ...

sse.stop();  // Stop when done

With Custom Headers (e.g., Authentication)

httplib::Headers headers = {
    {"Authorization", "Bearer token123"}
};

httplib::sse::SSEClient sse(cli, "/events", headers);
sse.start();

Error Handling

sse.on_error([](httplib::Error err) {
    std::cerr << "Error: " << httplib::to_string(err) << std::endl;
});

sse.set_reconnect_interval(1000);
sse.set_max_reconnect_attempts(5);

sse.start();

SSE Protocol

The client parses SSE format according to the W3C specification:

event: custom-type
id: 123
data: {"message": "hello"}

data: simple message

: this is a comment (ignored)