Browse Source

Dispatch an SSE event with an empty type as "message"

An `event:` line without a value left the type empty, so the event
never reached on_event("message"), and on_message saw an empty type.
The HTML standard dispatches an event with an empty type as
"message".
yhirose 2 days ago
parent
commit
cc9d67404e
2 changed files with 10 additions and 1 deletions
  1. 2 1
      httplib.h
  2. 8 0
      test/test.cc

+ 2 - 1
httplib.h

@@ -5045,7 +5045,8 @@ inline bool SSEClient::parse_sse_line(const std::string &line, SSEMessage &msg,
 
 
   // Handle known fields
   // Handle known fields
   if (field == "event") {
   if (field == "event") {
-    msg.event = value;
+    // An empty event type is dispatched as "message" per the SSE spec
+    msg.event = value.empty() ? std::string("message") : std::move(value);
   } else if (field == "data") {
   } else if (field == "data") {
     // Multiple data lines are concatenated with newlines
     // Multiple data lines are concatenated with newlines
     if (has_data) { msg.data += "\n"; }
     if (has_data) { msg.data += "\n"; }

+ 8 - 0
test/test.cc

@@ -25263,6 +25263,14 @@ TEST_F(SSEParsingTest, EventWithoutDataResetsEventType) {
   EXPECT_EQ(msgs[0].data, "hello");
   EXPECT_EQ(msgs[0].data, "hello");
 }
 }
 
 
+TEST_F(SSEParsingTest, EmptyEventTypeIsMessage) {
+  // Also when the empty field replaces an earlier type
+  auto msgs = parse("event:\ndata: a\n\nevent: update\nevent:\ndata: b\n\n");
+  ASSERT_EQ(msgs.size(), 2u);
+  EXPECT_EQ(msgs[0].event, "message");
+  EXPECT_EQ(msgs[1].event, "message");
+}
+
 TEST_F(SSEParsingTest, EventWithoutDataUpdatesLastEventId) {
 TEST_F(SSEParsingTest, EventWithoutDataUpdatesLastEventId) {
   // The first connection sends only an id; the second echoes back the
   // The first connection sends only an id; the second echoes back the
   // Last-Event-ID it was reconnected with
   // Last-Event-ID it was reconnected with