Skip to content

Commit 6813662

Browse files
authored
Ruby EventSource ignores newlines at the beginning of event data (#24)
* fix parser to respect leading newlines in event data * more tests
1 parent 25074b2 commit 6813662

File tree

2 files changed

+71
-2
lines changed

2 files changed

+71
-2
lines changed

lib/ld-eventsource/impl/event_parser.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,17 @@ def reset_buffers
5353
@id = nil
5454
@type = nil
5555
@data = ""
56+
@have_data = false
5657
end
5758

5859
def process_field(name, value)
5960
case name
6061
when "event"
6162
@type = value.to_sym
6263
when "data"
63-
@data << "\n" if !@data.empty?
64+
@data << "\n" if @have_data
6465
@data << value
66+
@have_data = true
6567
when "id"
6668
@id = value
6769
when "retry"
@@ -73,7 +75,7 @@ def process_field(name, value)
7375
end
7476

7577
def maybe_create_event
76-
return nil if @data.empty?
78+
return nil if !@have_data
7779
StreamEvent.new(@type || :message, @data, @id)
7880
end
7981
end

spec/event_parser_spec.rb

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@
33
describe SSE::Impl::EventParser do
44
subject { SSE::Impl::EventParser }
55

6+
def verify_parsed_events(lines:, expected_events:)
7+
ep = subject.new(lines)
8+
output = ep.items.to_a
9+
expect(output).to eq(expected_events)
10+
end
11+
612
it "parses an event with all fields" do
713
lines = [
814
"event: abc",
@@ -42,6 +48,67 @@
4248
expect(output).to eq([ expected_event ])
4349
end
4450

51+
it "parses an event with empty data" do
52+
verify_parsed_events(
53+
lines: [
54+
"data:",
55+
""
56+
],
57+
expected_events: [
58+
SSE::StreamEvent.new(:message, "", nil)
59+
])
60+
end
61+
62+
it "parses an event with a leading blank data line" do
63+
verify_parsed_events(
64+
lines: [
65+
"data:",
66+
"data: abc",
67+
""
68+
],
69+
expected_events: [
70+
SSE::StreamEvent.new(:message, "\nabc", nil)
71+
])
72+
end
73+
74+
it "parses an event with multiple leading blank data lines" do
75+
verify_parsed_events(
76+
lines: [
77+
"data:",
78+
"data:",
79+
"data: abc",
80+
""
81+
],
82+
expected_events: [
83+
SSE::StreamEvent.new(:message, "\n\nabc", nil)
84+
])
85+
end
86+
87+
it "parses an event with a blank data line in the middle" do
88+
verify_parsed_events(
89+
lines: [
90+
"data: abc",
91+
"data:",
92+
"data: def",
93+
""
94+
],
95+
expected_events: [
96+
SSE::StreamEvent.new(:message, "abc\n\ndef", nil)
97+
])
98+
end
99+
100+
it "parses an event with a trailing blank data line" do
101+
verify_parsed_events(
102+
lines: [
103+
"data: abc",
104+
"data:",
105+
""
106+
],
107+
expected_events: [
108+
SSE::StreamEvent.new(:message, "abc\n", nil)
109+
])
110+
end
111+
45112
it "ignores comments" do
46113
lines = [
47114
":",

0 commit comments

Comments
 (0)