[smuxi: 5/10] Engine-Campfire: split messages on CR instead of trying to parse



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]