From 47bdf62e56e1829773aee0f29e21586c9a143e03 Mon Sep 17 00:00:00 2001 From: urmastalimaa Date: Thu, 7 Sep 2023 16:11:12 +0300 Subject: [PATCH] Support custom headers in freddy.deliver Headers are the main point for including message metadata in AMQP. Headers are already in use to propagate traces. Allow library users to add arbitrary headers themselves. --- README.md | 5 +++++ lib/freddy.rb | 3 +++ spec/freddy/freddy_spec.rb | 24 ++++++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/README.md b/README.md index eda7740..7f84267 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,11 @@ The message heading specify the `content-encoding` indicating the compression al freddy.deliver(destination, message, compress: 'zlib') ``` +#### Metadata through headers + +Send a message with arbitrary message metadata included in the message headers +freddy.deliver(destination, message, headers: {'my-key' => 'my-value'}) + ### Request delivery #### Expiring messages diff --git a/lib/freddy.rb b/lib/freddy.rb index 5cb7540..3edf38f 100644 --- a/lib/freddy.rb +++ b/lib/freddy.rb @@ -166,6 +166,8 @@ def tap_into(pattern_or_patterns, options = {}, &callback) # won't be discarded if timeout it set to 0 (default). # @option options [String] :compress (nil) # - 'zlib' - compresses the payload with zlib + # @option options [Hash] :headers (nil) + # Arbitrary headers to add as message metadata # @return [void] # # @example @@ -176,6 +178,7 @@ def deliver(destination, payload, options = {}) opts = {} opts[:expiration] = (timeout * 1000).to_i if timeout.positive? opts[:content_encoding] = compression_algorithm if compression_algorithm + opts[:headers] = options[:headers] if options[:headers] @send_and_forget_producer.produce(destination, payload, opts) end diff --git a/spec/freddy/freddy_spec.rb b/spec/freddy/freddy_spec.rb index 811ddca..e66b191 100644 --- a/spec/freddy/freddy_spec.rb +++ b/spec/freddy/freddy_spec.rb @@ -7,6 +7,13 @@ let(:destination2) { random_destination } let(:payload) { { pay: 'load' } } + before do + @bunny = Bunny.new(config) + @bunny.start() + end + + after { @bunny.close } + after { freddy.close } def respond_to(&block) @@ -72,6 +79,23 @@ def respond_to(&block) expect(@tapped_message).to eq(payload) end end + + it 'accepts custom headers' do + queue = exclusive_subscribe do |_info, metadata, _payload| + @metadata = metadata + end + freddy.deliver(queue, payload, headers: {'foo' => 'bar'}) + + wait_for { @metadata } + expect(@metadata[:headers]).to include({'foo' => 'bar'}) + end + end + + def exclusive_subscribe(&block) + channel = @bunny.create_channel + queue = channel.queue('', exclusive: true) + queue.subscribe(&block) + queue.name end context 'when making a synchronized request' do