using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using System.IO; using System.Threading; using System.Diagnostics; namespace Client.SSE { public class ConnectingState : IConnectionState { private Uri mUrl; private IWebRequesterFactory mWebRequesterFactory; private Dictionary headers; public EventSourceState State { get { return EventSourceState.CONNECTING; } } public ConnectingState(Uri url, IWebRequesterFactory webRequesterFactory, Dictionary headers) { if (url == null) throw new ArgumentNullException("Url cant be null"); if (webRequesterFactory == null) throw new ArgumentNullException("Factory cant be null"); mUrl = url; mWebRequesterFactory = webRequesterFactory; this.headers = headers; } public Task Run(Action donothing, CancellationToken cancelToken, Dictionary headers) { IWebRequester requester = mWebRequesterFactory.Create(); var taskResp = requester.Get(mUrl, headers); return taskResp.ContinueWith(tsk => { if (tsk.Status == TaskStatus.RanToCompletion && !cancelToken.IsCancellationRequested) { IServerResponse response = tsk.Result; if (response.StatusCode == HttpStatusCode.OK) { return new ConnectedState(response, mWebRequesterFactory, headers); } else { Trace.WriteLine("Failed to connect to: " + mUrl.ToString() + response ?? (" Http statuscode: " + response.StatusCode)); } } return new DisconnectedState(mUrl, mWebRequesterFactory, headers); }); } } }