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.
101 lines
2.9 KiB
101 lines
2.9 KiB
#if !BESTHTTP_DISABLE_SOCKETIO |
|
|
|
using System; |
|
using System.Collections.Generic; |
|
|
|
namespace BestHTTP.SocketIO |
|
{ |
|
using BestHTTP.JSON; |
|
|
|
/// <summary> |
|
/// Helper class to parse and hold handshake information. |
|
/// </summary> |
|
public sealed class HandshakeData |
|
{ |
|
#region Public Handshake Data |
|
|
|
/// <summary> |
|
/// Session ID of this connection. |
|
/// </summary> |
|
public string Sid { get; private set; } |
|
|
|
/// <summary> |
|
/// List of possible upgrades. |
|
/// </summary> |
|
public List<string> Upgrades { get; private set; } |
|
|
|
/// <summary> |
|
/// What interval we have to set a ping message. |
|
/// </summary> |
|
public TimeSpan PingInterval { get; private set; } |
|
|
|
/// <summary> |
|
/// What time have to pass without an answer to our ping request when we can consider the connection disconnected. |
|
/// </summary> |
|
public TimeSpan PingTimeout { get; private set; } |
|
|
|
#endregion |
|
|
|
#region Helper Methods |
|
|
|
public bool Parse(string str) |
|
{ |
|
bool success = false; |
|
Dictionary<string, object> dict = Json.Decode(str, ref success) as Dictionary<string, object>; |
|
if (!success) |
|
return false; |
|
|
|
try |
|
{ |
|
this.Sid = GetString(dict, "sid"); |
|
this.Upgrades = GetStringList(dict, "upgrades"); |
|
this.PingInterval = TimeSpan.FromMilliseconds(GetInt(dict, "pingInterval")); |
|
this.PingTimeout = TimeSpan.FromMilliseconds(GetInt(dict, "pingTimeout")); |
|
} |
|
catch (Exception ex) |
|
{ |
|
BestHTTP.HTTPManager.Logger.Exception("HandshakeData", "Parse", ex); |
|
return false; |
|
} |
|
|
|
return true; |
|
} |
|
|
|
private static object Get(Dictionary<string, object> from, string key) |
|
{ |
|
object value; |
|
if (!from.TryGetValue(key, out value)) |
|
throw new System.Exception(string.Format("Can't get {0} from Handshake data!", key)); |
|
return value; |
|
} |
|
|
|
private static string GetString(Dictionary<string, object> from, string key) |
|
{ |
|
return Get(from, key) as string; |
|
} |
|
|
|
private static List<string> GetStringList(Dictionary<string, object> from, string key) |
|
{ |
|
List<object> value = Get(from, key) as List<object>; |
|
|
|
List<string> result = new List<string>(value.Count); |
|
for (int i = 0; i < value.Count; ++i) |
|
{ |
|
string str = value[i] as string; |
|
if (str != null) |
|
result.Add(str); |
|
} |
|
|
|
return result; |
|
} |
|
|
|
private static int GetInt(Dictionary<string, object> from, string key) |
|
{ |
|
return (int)(double)Get(from, key); |
|
} |
|
|
|
#endregion |
|
} |
|
} |
|
|
|
#endif
|
|
|