Beispiel #1
0
        public void TestBadDecode()
        {
            var bytes = new byte[] { (byte)0xff, 99 };
            IMessage <byte[]> message = new Steeltoe.Messaging.Support.GenericMessage <byte[]>(bytes);

            Assert.Throws <ArgumentOutOfRangeException>(() => EmbeddedHeaderUtils.ExtractHeaders(message, false));
        }
Beispiel #2
0
        public void TestConfigurableHeaders()
        {
            var message = MessageBuilder <byte[]>
                          .WithPayload(Encoding.UTF8.GetBytes("Hello"))
                          .SetHeader("foo", "bar")
                          .SetHeader("baz", "quxx")
                          .SetHeader("contentType", "text/plain")
                          .Build();

            var headers  = new string[] { "foo" };
            var embedded = EmbeddedHeaderUtils.EmbedHeaders(new MessageValues(message), EmbeddedHeaderUtils.HeadersToEmbed(headers));

            Assert.Equal(0xff, embedded[0]);
            var embeddedString = Encoding.UTF8.GetString(embedded);

            Assert.Equal("\u0002\u000BcontentType\u0000\u0000\u0000\u000C\"text/plain\"\u0003foo\u0000\u0000\u0000\u0005\"bar\"Hello", embeddedString.Substring(1));
            var extracted = EmbeddedHeaderUtils.ExtractHeaders(MessageBuilder <byte[]> .WithPayload(embedded).Build(), false);

            Assert.Equal("Hello", Encoding.UTF8.GetString((byte[])extracted.Payload));
            Assert.Equal("bar", extracted["foo"]);
            Assert.Null(extracted["baz"]);
            Assert.Equal("text/plain", extracted["contentType"]);
            Assert.Null(extracted["timestamp"]);

            var extractedWithRequestHeaders = EmbeddedHeaderUtils.ExtractHeaders(MessageBuilder <byte[]> .WithPayload(embedded).Build(), true);

            Assert.Equal("bar", extractedWithRequestHeaders["foo"]);
            Assert.Null(extractedWithRequestHeaders["baz"]);
            Assert.Equal("text/plain", extractedWithRequestHeaders["contentType"]);
            Assert.NotNull(extractedWithRequestHeaders["timestamp"]);
            Assert.NotNull(extractedWithRequestHeaders["id"]);
            Assert.IsType <long>(extractedWithRequestHeaders["timestamp"]);
            Assert.IsType <Guid>(extractedWithRequestHeaders["id"]);
        }
            public override IMessage PreSend(IMessage message, IMessageChannel channel)
            {
                if (message.Payload is byte[] &&
                    !message.Headers.ContainsKey(BinderHeaders.NATIVE_HEADERS_PRESENT) &&
                    EmbeddedHeaderUtils.MayHaveEmbeddedHeaders((byte[])message.Payload))
                {
                    MessageValues messageValues;
                    try
                    {
                        messageValues = EmbeddedHeaderUtils.ExtractHeaders((IMessage <byte[]>)message, true);
                    }
                    catch (Exception)
                    {
                        /*
                         * debug() rather then error() since we don't know for sure that it
                         * really is a message with embedded headers, it just meets the
                         * criteria in EmbeddedHeaderUtils.mayHaveEmbeddedHeaders().
                         */

                        // this.logger?.LogDebug(EmbeddedHeaderUtils.DecodeExceptionMessage(message), e);
                        messageValues = new MessageValues(message);
                    }

                    return(messageValues.ToMessage());
                }

                return(message);
            }
            private IMessage SerializeAndEmbedHeadersIfApplicable(IMessage message)
            {
                var transformed = new MessageValues(message);

                object payload;

                if (embedHeaders)
                {
                    transformed.TryGetValue(MessageHeaders.CONTENT_TYPE, out var contentType);

                    // transform content type headers to String, so that they can be properly
                    // embedded in JSON
                    if (contentType != null)
                    {
                        transformed[MessageHeaders.CONTENT_TYPE] = contentType.ToString();
                    }

                    payload = EmbeddedHeaderUtils.EmbedHeaders(transformed, embeddedHeaders);
                }
                else
                {
                    payload = transformed.Payload;
                }

                return(IntegrationServices.MessageBuilderFactory.WithPayload(payload).CopyHeaders(transformed.Headers).Build());
            }
Beispiel #5
0
        public void TestHeaderEmbeddingMissingHeader()
        {
            var message = MessageBuilder <byte[]>
                          .WithPayload(Encoding.UTF8.GetBytes("Hello"))
                          .SetHeader("foo", "bar")
                          .Build();

            var embedded = EmbeddedHeaderUtils.EmbedHeaders(new MessageValues(message), "foo", "baz");

            Assert.Equal(0xff, embedded[0]);
            var embeddedString = Encoding.UTF8.GetString(embedded);

            Assert.Equal("\u0001\u0003foo\u0000\u0000\u0000\u0005\"bar\"Hello", embeddedString.Substring(1));
        }
Beispiel #6
0
        public void TestHeaderExtractionWithDirectPayload()
        {
            var message = MessageBuilder <byte[]>
                          .WithPayload(Encoding.UTF8.GetBytes("Hello"))
                          .SetHeader("foo", "bar")
                          .SetHeader("baz", "quxx")
                          .Build();

            var embedded = EmbeddedHeaderUtils.EmbedHeaders(new MessageValues(message), "foo", "baz");

            Assert.Equal(0xff, embedded[0]);
            var embeddedString = Encoding.UTF8.GetString(embedded);

            Assert.Equal("\u0002\u0003foo\u0000\u0000\u0000\u0005\"bar\"\u0003baz\u0000\u0000\u0000\u0006\"quxx\"Hello", embeddedString.Substring(1));

            var extracted = EmbeddedHeaderUtils.ExtractHeaders(embedded);

            Assert.Equal("Hello", Encoding.UTF8.GetString((byte[])extracted.Payload));
            Assert.Equal("bar", extracted["foo"]);
            Assert.Equal("quxx", extracted["baz"]);
        }
Beispiel #7
0
        public void TestUnicodeHeader()
        {
            var message = IntegrationMessageBuilder <byte[]>
                          .WithPayload(Encoding.UTF8.GetBytes("Hello"))
                          .SetHeader("foo", "bar")
                          .SetHeader("baz", "ØØØØØØØØ")
                          .Build();

            var embedded = EmbeddedHeaderUtils.EmbedHeaders(new MessageValues(message), "foo", "baz");

            Assert.Equal(0xff, embedded[0]);
            var embeddedString = Encoding.UTF8.GetString(embedded);

            Assert.Equal("\u0002\u0003foo\u0000\u0000\u0000\u0005\"bar\"\u0003baz\u0000\u0000\u0000\u0012\"ØØØØØØØØ\"Hello", embeddedString.Substring(1));

            var extracted = EmbeddedHeaderUtils.ExtractHeaders(IntegrationMessageBuilder <byte[]> .WithPayload(embedded).Build(), false);

            Assert.Equal("Hello", Encoding.UTF8.GetString((byte[])extracted.Payload));
            Assert.Equal("bar", extracted["foo"]);
            Assert.Equal("ØØØØØØØØ", extracted["baz"]);
        }
Beispiel #8
0
        public void TestEmbedded()
        {
            var searchDirectories            = GetSearchDirectories("TestBinder");
            IServiceProvider serviceProvider = CreateStreamsContainer(
                searchDirectories,
                "spring:cloud:stream:bindings:foo:consumer:headerMode=" + HeaderMode.EmbeddedHeaders.ToString()).BuildServiceProvider();
            var messageConverter = serviceProvider.GetService <ISmartMessageConverter>();

            Assert.NotNull(messageConverter);

            var binder = serviceProvider.GetService <IBinder>() as AbstractPollableMessageSourceBinder;

            Assert.NotNull(binder);

            var configurer = serviceProvider.GetService <MessageConverterConfigurer>();

            Assert.NotNull(configurer);

            var setter        = binder.GetType().GetProperty("MessageSourceDelegate").GetSetMethod();
            var messageSource = new TestFuncMessageSource(() =>
            {
                var original = new MessageValues(
                    Encoding.UTF8.GetBytes("foo"),
                    new Dictionary <string, object>()
                {
                    { MessageHeaders.CONTENT_TYPE, "application/octet-stream" }
                });
                var payload = new byte[0];
                try
                {
                    payload = EmbeddedHeaderUtils.EmbedHeaders(original, MessageHeaders.CONTENT_TYPE);
                }
                catch (Exception e)
                {
                    Assert.NotNull(e);
                }

                return(Message.Create <byte[]>(payload));
            });

            setter.Invoke(binder, new object[] { messageSource });

            var options = serviceProvider.GetService <IOptions <BindingServiceOptions> >();

            options.Value.Bindings.TryGetValue("foo", out var bindingOptions);
            Assert.Equal(HeaderMode.EmbeddedHeaders, bindingOptions.Consumer.HeaderMode);

            var pollableSource = new DefaultPollableMessageSource(serviceProvider.GetService <IApplicationContext>(), messageConverter);

            configurer.ConfigurePolledMessageSource(pollableSource, "foo");
            pollableSource.AddInterceptor(new TestEmbededChannelInterceptor());

            binder.BindConsumer("foo", "bar", pollableSource, bindingOptions.Consumer);

            var handler = new TestConvertSimpleHandler();

            Assert.True(pollableSource.Poll(handler));

            Assert.IsType <string>(handler.Payload);
            var str = handler.Payload as string;

            Assert.Equal("FOO", str);
            handler.Message.Headers.TryGetValue(MessageHeaders.CONTENT_TYPE, out var contentType);
            Assert.Equal("application/octet-stream", contentType.ToString());
        }