void EventSource::parseEventStream() { unsigned position = 0; unsigned size = m_receiveBuffer.size(); while (position < size) { if (m_discardTrailingNewline) { if (m_receiveBuffer[position] == '\n') ++position; m_discardTrailingNewline = false; } Optional<unsigned> lineLength; Optional<unsigned> fieldLength; for (unsigned i = position; !lineLength && i < size; ++i) { switch (m_receiveBuffer[i]) { case ':': if (!fieldLength) fieldLength = i - position; break; case '\r': m_discardTrailingNewline = true; FALLTHROUGH; case '\n': lineLength = i - position; break; } } if (!lineLength) break; parseEventStreamLine(position, fieldLength, lineLength.value()); position += lineLength.value() + 1; // EventSource.close() might've been called by one of the message event handlers. // Per spec, no further messages should be fired after that. if (m_state == CLOSED) break; } // FIXME: The following operation makes it clear that m_receiveBuffer should be some other type, // perhaps a Deque or a circular buffer of some sort. if (position == size) m_receiveBuffer.clear(); else if (position) m_receiveBuffer.remove(0, position); }
void EventSource::parseEventStream() { unsigned int bufPos = 0; unsigned int bufSize = m_receiveBuf.size(); while (bufPos < bufSize) { if (m_discardTrailingNewline) { if (m_receiveBuf[bufPos] == '\n') bufPos++; m_discardTrailingNewline = false; } int lineLength = -1; int fieldLength = -1; for (unsigned int i = bufPos; lineLength < 0 && i < bufSize; i++) { switch (m_receiveBuf[i]) { case ':': if (fieldLength < 0) fieldLength = i - bufPos; break; case '\r': m_discardTrailingNewline = true; case '\n': lineLength = i - bufPos; break; } } if (lineLength < 0) break; parseEventStreamLine(bufPos, fieldLength, lineLength); bufPos += lineLength + 1; // EventSource.close() might've been called by one of the message event handlers. // Per spec, no further messages should be fired after that. if (m_state == CLOSED) break; } if (bufPos == bufSize) m_receiveBuf.clear(); else if (bufPos) m_receiveBuf.erase(m_receiveBuf.begin(),m_receiveBuf.begin()+bufPos); //m_receiveBuf.remove(0, bufPos); }
void EventSource::parseEventStream() { unsigned int bufPos = 0; unsigned int bufSize = m_receiveBuf.size(); while (bufPos < bufSize) { if (m_discardTrailingNewline) { if (m_receiveBuf[bufPos] == '\n') bufPos++; m_discardTrailingNewline = false; } int lineLength = -1; int fieldLength = -1; for (unsigned int i = bufPos; lineLength < 0 && i < bufSize; i++) { switch (m_receiveBuf[i]) { case ':': if (fieldLength < 0) fieldLength = i - bufPos; break; case '\r': m_discardTrailingNewline = true; case '\n': lineLength = i - bufPos; break; } } if (lineLength < 0) break; parseEventStreamLine(bufPos, fieldLength, lineLength); bufPos += lineLength + 1; } if (bufPos == bufSize) m_receiveBuf.clear(); else if (bufPos) m_receiveBuf.remove(0, bufPos); }
void EventSource::parseEventStream() { unsigned int bufPos = 0; unsigned int bufSize = m_receiveBuf.size(); for (;;) { int lineLength = -1; int fieldLength = -1; int carriageReturn = 0; for (unsigned int i = bufPos; lineLength < 0 && i < bufSize; i++) { switch (m_receiveBuf[i]) { case ':': if (fieldLength < 0) fieldLength = i - bufPos; break; case '\n': if (i > bufPos && m_receiveBuf[i - 1] == '\r') { carriageReturn++; i--; } lineLength = i - bufPos; break; } } if (lineLength < 0) break; parseEventStreamLine(bufPos, fieldLength, lineLength); bufPos += lineLength + carriageReturn + 1; } if (bufPos == bufSize) m_receiveBuf.clear(); else if (bufPos) m_receiveBuf.remove(0, bufPos); }