You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.8 KiB
100 lines
3.8 KiB
11 months ago
|
#if !BESTHTTP_DISABLE_SIGNALR
|
||
|
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
using BestHTTP.SignalR.Messages;
|
||
|
|
||
|
namespace BestHTTP.SignalR.Transports
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// A base class for implementations that must send the data in unique requests. These are currently the LongPolling and ServerSentEvents transports.
|
||
|
/// </summary>
|
||
|
public abstract class PostSendTransportBase : TransportBase
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Sent out send requests. Keeping a reference to them for future use.
|
||
|
/// </summary>
|
||
|
protected List<HTTPRequest> sendRequestQueue = new List<HTTPRequest>();
|
||
|
|
||
|
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);
|
||
|
|
||
|
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
|