Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions Sources/EventSource/ServerEvent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -79,14 +79,21 @@ public struct ServerEvent: EVEvent {

for row in rows {
// Skip the line if it is empty or it starts with a colon character
if row.isEmpty, row.first == ServerEventParser.colon {
if row.isEmpty || row.first == ServerEventParser.colon {
continue
}

let keyValue = row.split(separator: ServerEventParser.colon, maxSplits: 1)
let key = keyValue[0].utf8String.trimmingCharacters(in: .whitespaces)
let value = keyValue[safe: 1]?.utf8String.trimmingCharacters(in: .whitespaces)

let key = keyValue[0].utf8String

// If value starts with a SPACE character, remove it from value
let valueString = keyValue[safe: 1]?.utf8String
let value = if let valueString, valueString.hasPrefix(" ") {
String(valueString.dropFirst())
} else {
valueString
}

switch key {
case "id":
message.id = value
Expand Down
35 changes: 10 additions & 25 deletions Tests/EventSourceTests/EventParserTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -94,39 +94,24 @@ struct EventParserTests {
message 6
message 6-1

:

"""
let data = Data(text.utf8)

let events = parser.parse(data)

let event0Data = try #require(events[safe: 0]?.data)
#expect(event0Data == "test 1")

let event1ID = try #require(events[safe: 1]?.id)
let event1Data = try #require(events[safe: 1]?.data)
#expect(event1ID == "2")
#expect(event1Data == "test 2")

let event2 = try #require(events[safe: 2]?.event)
let event2Data = try #require(events[safe: 2]?.data)
#expect(event2 == "add")
#expect(event2Data == "test 3")

let event3ID = try #require(events[safe: 3]?.id)
let event3 = try #require(events[safe: 3]?.event)
let event3Data = try #require(events[safe: 3]?.data)
#expect(event3ID == "4")
#expect(event3 == "ping")
#expect(event3Data == "test 4")
// Due to extra spaces in the field names, the first four events failed to be interpreted correctly;
// therefore, only two events should be parsed
#expect(events.count == 2)

let event4Other = try #require(events[safe: 4]?.other?["test 5"])
#expect(event4Other == "")
let event1Other = try #require(events[safe: 0]?.other?["test 5"])
#expect(event1Other == "")

let event5Other1 = try #require(events[safe: 5]?.other?["message 6"])
let event5Other2 = try #require(events[safe: 5]?.other?["message 6-1"])
#expect(event5Other1 == "")
#expect(event5Other2 == "")
let event2Other1 = try #require(events[safe: 1]?.other?["message 6"])
let event2Other2 = try #require(events[safe: 1]?.other?["message 6-1"])
#expect(event2Other1 == "")
#expect(event2Other2 == "")
}

@Test func dataOnlyMode() async throws {
Expand Down