[smuxi: 5/10] Engine-Campfire: split messages on CR instead of trying to parse
- From: Mirco M. M. Bauer <mmmbauer src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [smuxi: 5/10] Engine-Campfire: split messages on CR instead of trying to parse
- Date: Sun, 23 Aug 2015 11:09:21 +0000 (UTC)
commit d6dae4bdeffee070fd73e5beb10e5ca713fedda5
Author: Carlos MartÃn Nieto <cmn dwim me>
Date: Sat Aug 22 02:45:31 2015 +0200
Engine-Campfire: split messages on CR instead of trying to parse
We currently count the number of braces in order to determine when an
object definition is done. However, this has all sorts of problems
around quoting and strings.
It turns out that the server will send a CR as part of the newline it
sends between each message, which it won't produce inside the objects,
so we can split the message there and be confident that we're passing a
full object to the deserializer.
.../Protocols/Campfire/CampfireEventStream.cs | 42 +++++++------------
1 files changed, 16 insertions(+), 26 deletions(-)
---
diff --git a/src/Engine-Campfire/Protocols/Campfire/CampfireEventStream.cs
b/src/Engine-Campfire/Protocols/Campfire/CampfireEventStream.cs
index 6514d5c..8758913 100644
--- a/src/Engine-Campfire/Protocols/Campfire/CampfireEventStream.cs
+++ b/src/Engine-Campfire/Protocols/Campfire/CampfireEventStream.cs
@@ -140,37 +140,27 @@ namespace Smuxi.Engine
using (StreamReader reader = new StreamReader(res.GetResponseStream()))
{
- /* Stupid but easy way to figure out when we've reached the end of a JSON object */
- int brackets = 0;
StringBuilder bld = new StringBuilder();
while (!reader.EndOfStream) {
- var line = reader.ReadLine();
-
- for (int i = 0; i < line.Length; i++) {
- bld.Append(line[i]);
- switch (line[i]) {
- case '{':
- brackets++;
- break;
- case '}':
- brackets--;
- break;
- default:
- continue;
- }
+ var c = reader.Read();
- if (brackets == 0) {
- var str = bld.ToString().Trim();
- bld.Length = 0;
- var message = JsonSerializer.DeserializeFromString<Message>(str);
- if (MessageReceived != null) {
- var args = new MessageReceivedEventArgs(Chat, message);
- MessageReceived(this, args);
- }
- LastMessage = message.Id;
- }
+ /* The server uses CR to indicate when each message ends */
+ if (c != '\r') {
+ bld.Append((char)c);
+ continue;
}
+
+ var str = bld.ToString();
+ bld.Length = 0;
+
+ var message = JsonSerializer.DeserializeFromString<Message>(str);
+ if (MessageReceived != null) {
+ var args = new MessageReceivedEventArgs(Chat, message);
+ MessageReceived(this, args);
+ }
+
+ LastMessage = message.Id;
}
reader.Close();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]