public void ReceiveEventStreamInChunks() { // This simply verifies that chunked streaming works as expected and that events are being // parsed correctly regardless of how the chunks line up with the events. var eventData = new List <string>(); for (var i = 0; i < 200; i++) { eventData.Add(string.Format("data{0}", i) + new string('x', i % 7)); } var allBody = string.Concat(eventData.Select(data => "data:" + data + "\n\n")); var allEventsReceived = new TaskCompletionSource <bool>(); IEnumerable <string> MakeChunks() { var i = 0; for (var pos = 0; ;) { int chunkSize = i % 20 + 1; if (pos + chunkSize >= allBody.Length) { yield return(allBody.Substring(pos)); break; } yield return(allBody.Substring(pos, chunkSize)); pos += chunkSize; i++; } } try { Handler streamHandler = Handlers.StartChunks("text/event-stream") .Then(async ctx => { foreach (var s in MakeChunks()) { await Handlers.WriteChunkString(s)(ctx); } await allEventsReceived.Task; }); using (var server = HttpServer.Start(streamHandler)) { var expectedActions = new List <EventSink.Action>(); expectedActions.Add(EventSink.OpenedAction()); foreach (var data in eventData) { expectedActions.Add(EventSink.MessageReceivedAction(new MessageEvent(MessageEvent.DefaultName, data, server.Uri))); } var config = Configuration.Builder(server.Uri).LogAdapter(_testLogging).Build(); using (var es = new EventSource(config)) { var sink = new EventSink(es); _ = es.StartAsync(); sink.ExpectActions(expectedActions.ToArray()); } } } finally { allEventsReceived.SetResult(true); } }