Skip to content

Commit aa73938

Browse files
committed
save state between call of Run
1 parent 1ddddba commit aa73938

3 files changed

Lines changed: 51 additions & 20 deletions

File tree

EventSource4Net.Test/StringSplitterTest.cs

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ public class StringSplitterTest
99
[TestMethod]
1010
public void TestDoubleLineFeed()
1111
{
12+
string remainingText = string.Empty;
1213
string[] lines =
13-
StringSplitter.SplitIntoLines("test\n\n");
14+
StringSplitter.SplitIntoLines("test\n\n", out remainingText);
1415

1516
Assert.AreEqual(lines.Length, 2);
1617
Assert.AreEqual(lines[0], "test");
@@ -19,8 +20,9 @@ public void TestDoubleLineFeed()
1920
[TestMethod]
2021
public void TestDoubleCarriageReturn()
2122
{
23+
string remainingText = string.Empty;
2224
string[] lines =
23-
StringSplitter.SplitIntoLines("test\r\r");
25+
StringSplitter.SplitIntoLines("test\r\r", out remainingText);
2426

2527
Assert.AreEqual(lines.Length, 2);
2628
Assert.AreEqual(lines[0], "test");
@@ -29,8 +31,9 @@ public void TestDoubleCarriageReturn()
2931
[TestMethod]
3032
public void TestDoubleCarriageReturnLineFeedPair()
3133
{
34+
string remainingText = string.Empty;
3235
string[] lines =
33-
StringSplitter.SplitIntoLines("test\r\n\r\n");
36+
StringSplitter.SplitIntoLines("test\r\n\r\n", out remainingText);
3437

3538
Assert.AreEqual(lines.Length, 2);
3639
Assert.AreEqual(lines[0], "test");
@@ -39,8 +42,9 @@ public void TestDoubleCarriageReturnLineFeedPair()
3942
[TestMethod]
4043
public void TestTwoLines()
4144
{
45+
string remainingText = string.Empty;
4246
string[] lines =
43-
StringSplitter.SplitIntoLines("test\ntest2\n\n");
47+
StringSplitter.SplitIntoLines("test\ntest2\n\n", out remainingText);
4448

4549
Assert.AreEqual(lines.Length, 3);
4650
Assert.AreEqual(lines[0], "test");
@@ -50,14 +54,36 @@ public void TestTwoLines()
5054
[TestMethod]
5155
public void TestMixedSeparators()
5256
{
57+
string remainingText = string.Empty;
5358
string[] lines =
54-
StringSplitter.SplitIntoLines("test\ntest2\r\ntest3\r\r");
59+
StringSplitter.SplitIntoLines("test\ntest2\r\ntest3\r\r", out remainingText);
5560

5661
Assert.AreEqual(lines.Length, 4);
5762
Assert.AreEqual(lines[0], "test");
5863
Assert.AreEqual(lines[1], "test2");
5964
Assert.AreEqual(lines[2], "test3");
6065
Assert.AreEqual(lines[3], string.Empty);
66+
Assert.AreEqual(remainingText, string.Empty);
67+
}
68+
[TestMethod]
69+
public void TestRemainingTextNoCompleteRow()
70+
{
71+
string remainingText = string.Empty;
72+
string[] lines =
73+
StringSplitter.SplitIntoLines("test", out remainingText);
74+
75+
Assert.AreEqual(lines.Length, 0);
76+
Assert.AreEqual(remainingText, "test");
77+
}
78+
[TestMethod]
79+
public void TestRemainingTextAfterOneRow()
80+
{
81+
string remainingText = string.Empty;
82+
string[] lines =
83+
StringSplitter.SplitIntoLines("test\ntest2", out remainingText);
84+
85+
Assert.AreEqual(lines.Length, 1);
86+
Assert.AreEqual(remainingText, "test2");
6187
}
6288
}
6389
}

EventSource4Net/ConnectedState.cs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ class ConnectedState : IConnectionState
1313
{
1414
private static readonly slf4net.ILogger _logger = slf4net.LoggerFactory.GetLogger(typeof(ConnectedState));
1515

16+
private ServerSentEvent mSse = null;
17+
private string mRemainingText = string.Empty; // the text that is not ended with a lineending char is saved for next call.
1618
private HttpWebResponse mResponse;
1719
public EventSourceState State { get { return EventSourceState.OPEN; } }
1820

@@ -35,7 +37,7 @@ public Task<IConnectionState> Run(Action<ServerSentEvent> msgReceived, Cancellat
3537
byte[] buffer = new byte[1024 * 8];
3638
var taskRead = stream.ReadAsync(buffer, 0, buffer.Length, cancelToken);
3739

38-
try
40+
try
3941
{
4042
taskRead.Wait(cancelToken);
4143
}
@@ -50,18 +52,18 @@ public Task<IConnectionState> Run(Action<ServerSentEvent> msgReceived, Cancellat
5052
{
5153
//Console.WriteLine("ReadCallback {0} bytesRead", bytesRead);
5254
string text = Encoding.UTF8.GetString(buffer, 0, bytesRead);
53-
string[] lines = StringSplitter.SplitIntoLines(text);
54-
ServerSentEvent sse = null;
55+
text = mRemainingText + text;
56+
string[] lines = StringSplitter.SplitIntoLines(text, out mRemainingText);
5557
foreach (string line in lines)
5658
{
5759
if (cancelToken.IsCancellationRequested) break;
5860

5961
// Dispatch message if empty lne
60-
if (string.IsNullOrEmpty(line.Trim()) && sse != null)
62+
if (string.IsNullOrEmpty(line.Trim()) && mSse != null)
6163
{
6264
_logger.Trace("Message received");
63-
msgReceived(sse);
64-
sse = null;
65+
msgReceived(mSse);
66+
mSse = null;
6567
}
6668
else if (line.StartsWith(":"))
6769
{
@@ -83,26 +85,26 @@ public Task<IConnectionState> Run(Action<ServerSentEvent> msgReceived, Cancellat
8385

8486
if (String.Compare(fieldName, "event", true) == 0)
8587
{
86-
sse = sse ?? new ServerSentEvent();
87-
sse.EventType = fieldValue;
88+
mSse = mSse ?? new ServerSentEvent();
89+
mSse.EventType = fieldValue;
8890
}
8991
else if (String.Compare(fieldName, "data", true) == 0)
9092
{
91-
sse = sse ?? new ServerSentEvent();
92-
sse.Data = fieldValue + '\n';
93+
mSse = mSse ?? new ServerSentEvent();
94+
mSse.Data = fieldValue + '\n';
9395
}
9496
else if (String.Compare(fieldName, "id", true) == 0)
9597
{
96-
sse = sse ?? new ServerSentEvent();
97-
sse.LastEventId = fieldValue;
98+
mSse = mSse ?? new ServerSentEvent();
99+
mSse.LastEventId = fieldValue;
98100
}
99101
else if (String.Compare(fieldName, "retry", true) == 0)
100102
{
101103
int parsedRetry;
102104
if (int.TryParse(fieldValue, out parsedRetry))
103105
{
104-
sse = sse ?? new ServerSentEvent();
105-
sse.Retry = parsedRetry;
106+
mSse = mSse ?? new ServerSentEvent();
107+
mSse.Retry = parsedRetry;
106108
}
107109
}
108110
else

EventSource4Net/StringSplitter.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace EventSource4Net
88
{
99
public class StringSplitter
1010
{
11-
public static string[] SplitIntoLines(string text)
11+
public static string[] SplitIntoLines(string text, out string remainingText)
1212
{
1313
List<string> lines = new List<string>();
1414

@@ -38,6 +38,9 @@ public static string[] SplitIntoLines(string text)
3838
previous = c;
3939
}
4040

41+
// Save the last chars that is not followed by a lineending.
42+
remainingText = text.Substring(text.Length - lineLength);
43+
4144
return lines.ToArray();
4245
}
4346
}

0 commit comments

Comments
 (0)