From 94f75e0d21cdfd85c134cbcbd11b9e722f808a94 Mon Sep 17 00:00:00 2001 From: MihaZupan Date: Tue, 6 Oct 2026 16:45:47 +0200 Subject: [PATCH] Reset SSE event type after an empty event block Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../Net/ServerSentEvents/SseParser_1.cs | 1 + .../tests/SseParserTests.cs | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/libraries/System.Net.ServerSentEvents/src/System/Net/ServerSentEvents/SseParser_1.cs b/src/libraries/System.Net.ServerSentEvents/src/System/Net/ServerSentEvents/SseParser_1.cs index fa0baf2825088e..f9cafd6d6f2b68 100644 --- a/src/libraries/System.Net.ServerSentEvents/src/System/Net/ServerSentEvents/SseParser_1.cs +++ b/src/libraries/System.Net.ServerSentEvents/src/System/Net/ServerSentEvents/SseParser_1.cs @@ -265,6 +265,7 @@ private bool ProcessLine(out SseItem sseItem) return true; } + _eventType = null; _lineBuffer.Discard(advance); sseItem = default; return false; diff --git a/src/libraries/System.Net.ServerSentEvents/tests/SseParserTests.cs b/src/libraries/System.Net.ServerSentEvents/tests/SseParserTests.cs index 842de991903fa8..2c8a3d7af52a17 100644 --- a/src/libraries/System.Net.ServerSentEvents/tests/SseParserTests.cs +++ b/src/libraries/System.Net.ServerSentEvents/tests/SseParserTests.cs @@ -168,6 +168,25 @@ await ReadAllEventsAsync(stream) : AssertSseItemEqual(new SseItem("This is the third message.", "message"), items[2]); } + [Theory] + [MemberData(nameof(NewlineTrickleAsyncData))] + public async Task Parse_EventWithoutData_ResetsEventType(string newline, bool trickle, bool useAsync) + { + using Stream stream = GetStream( + $"event: stale{newline}id: 2{newline}retry: 300{newline}{newline}" + + $"data: first{newline}data: second{newline}{newline}" + + $"event: stale{newline}{newline}data: third{newline}{newline}", trickle); + + List> items = useAsync ? + await ReadAllEventsAsync(stream) : + ReadAllEvents(stream); + + Assert.Equal(2, items.Count); + AssertSseItemEqual(new SseItem("first\nsecond", "message") + { EventId = "2", ReconnectionInterval = TimeSpan.FromMilliseconds(300) }, items[0]); + AssertSseItemEqual(new SseItem("third", "message"), items[1]); + } + [Theory] [MemberData(nameof(NewlineTrickleAsyncData))] public async Task Parse_HtmlSpec_Example2(string newline, bool trickle, bool useAsync)