public static string Inspect(this IProtocolHandler message) { if (message == null) { return("null"); } var type = message.GetType(); string result = type.FullName + Environment.NewLine; var properties = type.GetProperties(); foreach (var property in properties) { if (!property.IsDefined(typeof(ProtoBuf.ProtoMemberAttribute), false)) { continue; } var specified = properties.FirstOrDefault(p => p.Name == property.Name + "Specified"); bool?hasField = null; if (specified != null) { hasField = specified.GetValue(message, null) as bool?; } result += " " + property.Name + ": " + FormatValue(hasField, property.GetValue(message, null)) + Environment.NewLine; } return(result); }
private void RegisterHandler(IProtocolHandler handler) { var type = handler.GetType(); foreach (var scheme in handler.Scheme) { if (!this.handlers.ContainsKey(scheme)) { this.handlers.Add(scheme.ToLower(), type); } } }
/// <summary> /// Handles the message. /// </summary> /// <param name="header">The header.</param> /// <param name="decoder">The decoder.</param> /// <param name="body">The body.</param> protected void HandleMessage(IMessageHeader header, Decoder decoder, string body) { IProtocolHandler handler = null; try { _handlersLock.TryEnterReadLock(-1); HandlersByProtocol.TryGetValue(header.Protocol, out handler); if (handler == null) { HandlersByProtocol.TryGetValue((int)v11.Protocols.Core, out handler); if (handler == null) // Socket has been closed { Logger.Trace($"Ignoring message on closed session: {EtpExtensions.Serialize(header)}"); return; } var message = $"Protocol handler not registered for protocol { header.Protocol }."; handler?.ProtocolException((int)EtpErrorCodes.UnsupportedProtocol, message, header.MessageId); return; } try { // Handle global Acknowledge request if (header.IsAcknowledgeRequested()) { handler.Acknowledge(header.MessageId); } if (Logger.IsVerboseEnabled()) { Logger.Verbose($"[{SessionId}] Handling message with {handler.GetType()}; Message: {EtpExtensions.Serialize(header)}"); } handler.HandleMessage(header, decoder, body); } catch (Exception ex) { Logger.Debug(ex); handler.ProtocolException((int)EtpErrorCodes.InvalidState, ex.Message, header.MessageId); } } finally { _handlersLock.ExitReadLock(); } }