void EventSource::parseEventStreamLine(unsigned position, Optional<unsigned> fieldLength, unsigned lineLength) { if (!lineLength) { if (!m_data.isEmpty()) dispatchMessageEvent(); m_eventName = { }; return; } if (fieldLength && !fieldLength.value()) return; StringView field { &m_receiveBuffer[position], fieldLength ? fieldLength.value() : lineLength }; unsigned step; if (!fieldLength) step = lineLength; else if (m_receiveBuffer[position + fieldLength.value() + 1] != ' ') step = fieldLength.value() + 1; else step = fieldLength.value() + 2; position += step; unsigned valueLength = lineLength - step; if (field == "data") { m_data.append(&m_receiveBuffer[position], valueLength); m_data.append('\n'); } else if (field == "event") m_eventName = { &m_receiveBuffer[position], valueLength }; else if (field == "id") m_currentlyParsedEventId = { &m_receiveBuffer[position], valueLength }; else if (field == "retry") { if (!valueLength) m_reconnectDelay = defaultReconnectDelay; else { // FIXME: Do we really want to ignore trailing garbage here? Should we be using the strict version instead? // FIXME: If we can't parse the value, should we leave m_reconnectDelay alone or set it to defaultReconnectDelay? bool ok; auto reconnectDelay = charactersToUInt64(&m_receiveBuffer[position], valueLength, &ok); if (ok) m_reconnectDelay = reconnectDelay; } } }
uint64_t StringImpl::toUInt64(bool* ok) { return charactersToUInt64(m_data, m_length, ok); }