protected virtual ICommand ReadConnected(StompFrame frame)
        {
            _remoteWireFormatInfo = new WireFormatInfo();

            if (frame.HasProperty("version"))
            {
                _remoteWireFormatInfo.Version = Single.Parse(frame.RemoveProperty("version"),
                                                             CultureInfo.InvariantCulture);
                if (_remoteWireFormatInfo.Version > 1.0f)
                {
                    _encodeHeaders = true;
                }

                if (frame.HasProperty("session"))
                {
                    _remoteWireFormatInfo.Session = frame.RemoveProperty("session");
                }

                if (frame.HasProperty("heart-beat"))
                {
                    var hearBeats = frame.RemoveProperty("heart-beat")
                                    .Split(",".ToCharArray());
                    if (hearBeats.Length != 2)
                    {
                        throw new IoException("Malformed heartbeat property in Connected Frame.");
                    }

                    _remoteWireFormatInfo.WriteCheckInterval = Int32.Parse(hearBeats[0]
                                                                           .Trim());
                    _remoteWireFormatInfo.ReadCheckInterval = Int32.Parse(hearBeats[1]
                                                                          .Trim());
                }
            }
            else
            {
                _remoteWireFormatInfo.ReadCheckInterval  = 0;
                _remoteWireFormatInfo.WriteCheckInterval = 0;
                _remoteWireFormatInfo.Version            = 1.0f;
            }

            if (_connectedResponseId != -1)
            {
                var answer = new Response {
                    CorrelationId = _connectedResponseId
                };
                SendCommand(answer);
                _connectedResponseId = -1;
            }
            else
            {
                throw new IoException("Received Connected Frame without a set Response Id for it.");
            }

            return(_remoteWireFormatInfo);
        }
Exemple #2
0
        protected virtual ICommand CreateCommand(StompFrame frame)
        {
            var command = frame.Command;

            switch (command)
            {
            case "RECEIPT":
            {
                var text = frame.RemoveProperty(PropertyKeys.ReceiptId);
                if (text != null)
                {
                    var answer = new Response();
                    if (text.StartsWith("ignore:", StringComparison.Ordinal))
                    {
                        text = text.Substring("ignore:".Length);
                    }

                    answer.CorrelationId = Int32.Parse(text);
                    return(answer);
                }
            }
            break;

            case "CONNECTED":
                return(ReadConnected(frame));

            case "ERROR":
            {
                var text = frame.RemoveProperty(PropertyKeys.ReceiptId);

                if (text?.StartsWith("ignore:", StringComparison.Ordinal) == true)
                {
                    return new Response {
                               CorrelationId = Int32.Parse(text.Substring("ignore:".Length))
                    }
                }
                ;

                var answer = new ExceptionResponse();
                if (text != null)
                {
                    answer.CorrelationId = Int32.Parse(text);
                }

                var error = new BrokerError {
                    Message = frame.RemoveProperty(PropertyKeys.Message)
                };
                answer.Exception = error;
                return(answer);
            }

            case "KEEPALIVE":
                return(new KeepAliveInfo());

            case "MESSAGE":
                return(ReadMessage(frame));
            }

            if (Tracer.IsErrorEnabled)
            {
                Tracer.Error("Unknown command: " + frame.Command + " headers: " + frame.Properties);
            }

            return(null);
        }
Exemple #3
0
        protected virtual ICommand ReadMessage(StompFrame frame)
        {
            frame.RemoveProperty(PropertyKeys.Transformation);

            var message = new BytesMessage {
                Content = frame.Content
            };

            // Remove any receipt header we might have attached if the outbound command was
            // sent with response required set to true
            frame.RemoveProperty(PropertyKeys.Receipt);

            // Clear any attached content length headers as they aren't needed anymore and can
            // clutter the Message Properties.
            frame.RemoveProperty(PropertyKeys.ContentLength);

            message.Type             = frame.RemoveProperty(PropertyKeys.Type);
            message.Destination      = Destination.ConvertToDestination(frame.RemoveProperty(PropertyKeys.Destination), SkipDestinationNameFormatting);
            message.ReplyTo          = Destination.ConvertToDestination(frame.RemoveProperty(PropertyKeys.ReplyTo), SkipDestinationNameFormatting);
            message.TargetConsumerId = new(frame.RemoveProperty(PropertyKeys.Subscription));
            message.CorrelationId    = frame.RemoveProperty(PropertyKeys.CorrelationId);
            message.MessageId        = new(frame.RemoveProperty(PropertyKeys.MessageId));
            message.Persistent       = StompHelper.ToBool(frame.RemoveProperty(PropertyKeys.Persistent), false);

            // If it came from NMS.Stomp we added this header to ensure its reported on the
            // receiver side.
            if (frame.HasProperty(PropertyKeys.NmsxDeliveryMode))
            {
                message.Persistent = StompHelper.ToBool(frame.RemoveProperty(PropertyKeys.NmsxDeliveryMode), false);
            }

            if (frame.HasProperty(PropertyKeys.Priority))
            {
                message.Priority = Byte.Parse(frame.RemoveProperty(PropertyKeys.Priority));
            }

            if (frame.HasProperty(PropertyKeys.TimeStamp))
            {
                message.Timestamp = Int64.Parse(frame.RemoveProperty(PropertyKeys.TimeStamp));
            }

            if (frame.HasProperty(PropertyKeys.Expires))
            {
                message.Expiration = Int64.Parse(frame.RemoveProperty(PropertyKeys.Expires));
            }

            if (frame.RemoveProperty(PropertyKeys.Redelivered) != null)
            {
                message.RedeliveryCounter = 1;
            }

            // now lets add the generic headers
            foreach (var key in frame.Properties.Keys)
            {
                var value = frame.Properties[key];
                message.Headers[key] = value;
            }

            return(new MessageDispatch(message.TargetConsumerId, message.Destination, message, message.RedeliveryCounter));
        }
Exemple #4
0
        protected virtual ICommand ReadMessage(StompFrame frame)
        {
            Message message;

            frame.RemoveProperty("transformation");

            if (frame.HasProperty("content-length"))
            {
                message = new BytesMessage {
                    Content = frame.Content
                }
            }
            ;
            else
            {
                message = new TextMessage(Encoding.GetString(frame.Content, 0, frame.Content.Length));
            }

            // Remove any receipt header we might have attached if the outbound command was
            // sent with response required set to true
            frame.RemoveProperty("receipt");

            // Clear any attached content length headers as they aren't needed anymore and can
            // clutter the Message Properties.
            frame.RemoveProperty("content-length");

            message.Type             = frame.RemoveProperty("type");
            message.Destination      = Destination.ConvertToDestination(frame.RemoveProperty("destination"));
            message.ReplyTo          = Destination.ConvertToDestination(frame.RemoveProperty("reply-to"));
            message.TargetConsumerId = new ConsumerId(frame.RemoveProperty("subscription"));
            message.CorrelationId    = frame.RemoveProperty("correlation-id");
            message.MessageId        = new MessageId(frame.RemoveProperty("message-id"));
            message.Persistent       = StompHelper.ToBool(frame.RemoveProperty("persistent"), false);

            // If it came from NMS.Stomp we added this header to ensure its reported on the
            // receiver side.
            if (frame.HasProperty("NMSXDeliveryMode"))
            {
                message.Persistent = StompHelper.ToBool(frame.RemoveProperty("NMSXDeliveryMode"), false);
            }

            if (frame.HasProperty("priority"))
            {
                message.Priority = Byte.Parse(frame.RemoveProperty("priority"));
            }

            if (frame.HasProperty("timestamp"))
            {
                message.Timestamp = Int64.Parse(frame.RemoveProperty("timestamp"));
            }

            if (frame.HasProperty("expires"))
            {
                message.Expiration = Int64.Parse(frame.RemoveProperty("expires"));
            }

            if (frame.RemoveProperty("redelivered") != null)
            {
                message.RedeliveryCounter = 1;
            }

            // now lets add the generic headers
            foreach (var key in frame.Properties.Keys)
            {
                var value = frame.Properties[key];
                message.Headers[key] = value;
            }

            var dispatch = new MessageDispatch
            {
                Message           = message,
                ConsumerId        = message.TargetConsumerId,
                Destination       = message.Destination,
                RedeliveryCounter = message.RedeliveryCounter
            };

            return(dispatch);
        }