diff --git a/EvtSource/EventSourceReader.cs b/EvtSource/EventSourceReader.cs index 07d467e..e179bb5 100644 --- a/EvtSource/EventSourceReader.cs +++ b/EvtSource/EventSourceReader.cs @@ -11,6 +11,7 @@ namespace EvtSource public class EventSourceReader : IDisposable { private const string DefaultEventType = "message"; + private const string EventStreamMimeType = "text/event-stream"; public delegate void MessageReceivedHandler(object sender, EventSourceMessageEventArgs e); public delegate void DisconnectEventHandler(object sender, DisconnectEventArgs e); @@ -80,7 +81,6 @@ public void Dispose() Hc.Dispose(); } - private async Task ReaderAsync() { try @@ -92,12 +92,13 @@ private async Task ReaderAsync() Hc.DefaultRequestHeaders.Remove("Last-Event-Id"); } + Hc.DefaultRequestHeaders.TryAddWithoutValidation("Accept", EventStreamMimeType); Hc.DefaultRequestHeaders.TryAddWithoutValidation("Last-Event-Id", LastEventId); } using (HttpResponseMessage response = await Hc.GetAsync(Uri, HttpCompletionOption.ResponseHeadersRead)) { response.EnsureSuccessStatusCode(); - if (response.Headers.TryGetValues("content-type", out IEnumerable ctypes) || ctypes?.Contains("text/event-stream") == false) + if (response.Headers.TryGetValues("content-type", out IEnumerable ctypes) || ctypes?.Contains(EventStreamMimeType) == false) { throw new ArgumentException("Specified URI does not return server-sent events"); } @@ -109,7 +110,7 @@ private async Task ReaderAsync() string id = string.Empty; var data = new StringBuilder(string.Empty); - while (true) + while (!sr.EndOfStream) { string line = await sr.ReadLineAsync(); if (line == string.Empty) @@ -169,6 +170,7 @@ private async Task ReaderAsync() break; } } + Disconnect(new Exception("stream ended. maybe timeout")); } } }