#if !BESTHTTP_DISABLE_SIGNALR using System.Collections.Generic; using BestHTTP.SignalR.Messages; namespace BestHTTP.SignalR.Transports { /// /// A base class for implementations that must send the data in unique requests. These are currently the LongPolling and ServerSentEvents transports. /// public abstract class PostSendTransportBase : TransportBase { /// /// Sent out send requests. Keeping a reference to them for future use. /// protected List sendRequestQueue = new List(); public PostSendTransportBase(string name, Connection con) : base(name, con) { } #region Send Implementation protected override void SendImpl(string json) { var request = new HTTPRequest(Connection.BuildUri(RequestTypes.Send, this), HTTPMethods.Post, true, true, OnSendRequestFinished); request.FormUsage = Forms.HTTPFormUsage.UrlEncoded; request.AddField("data", json); Connection.PrepareRequest(request, RequestTypes.Send); // SaveLocal a lower priority then the default. This way requests that are sent out alongside with SignalR sent requests can be processed sooner. request.Priority = -1; request.Send(); sendRequestQueue.Add(request); } void OnSendRequestFinished(HTTPRequest req, HTTPResponse resp) { sendRequestQueue.Remove(req); // error reason if there is any. We will call the manager's Error function if it's not empty. string reason = string.Empty; switch (req.State) { // The request finished without any problem. case HTTPRequestStates.Finished: if (resp.IsSuccess) { HTTPManager.Logger.Information("Transport - " + this.Name, "Send - Request Finished Successfully! " + resp.DataAsText); if (!string.IsNullOrEmpty(resp.DataAsText)) { IServerMessage msg = TransportBase.Parse(Connection.JsonEncoder, resp.DataAsText); if (msg != null) Connection.OnMessage(msg); } } else reason = string.Format("Send - Request Finished Successfully, but the server sent an error. Status Code: {0}-{1} Message: {2}", resp.StatusCode, resp.Message, resp.DataAsText); break; // The request finished with an unexpected error. The request's Exception property may contain more info about the error. case HTTPRequestStates.Error: reason = "Send - Request Finished with Error! " + (req.Exception != null ? (req.Exception.Message + "\n" + req.Exception.StackTrace) : "No Exception"); break; // The request aborted, initiated by the user. case HTTPRequestStates.Aborted: reason = "Send - Request Aborted!"; break; // Connecting to the server is timed out. case HTTPRequestStates.ConnectionTimedOut: reason = "Send - Connection Timed Out!"; break; // The request didn't finished in the given time. case HTTPRequestStates.TimedOut: reason = "Send - Processing the request Timed Out!"; break; } if (!string.IsNullOrEmpty(reason)) Connection.Error(reason); } #endregion } } #endif