Skip to content
This repository was archived by the owner on Jan 11, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/azure/core/http/http_request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ def default_headers(current_time)
headers["Content-MD5"] = Base64.strict_encode64(Digest::MD5.digest(body))
else
headers["Content-Length"] = "0"
headers["Content-Type"] = ""
end
end

Expand Down
12 changes: 8 additions & 4 deletions lib/azure/queue/queue_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,7 @@ def set_queue_acl(queue_name, options={})
# time-to-live value. If not specified, the default value is 0.
# * +:message_ttl+ - Integer. Specifies the time-to-live interval for the message, in seconds. The maximum
# time-to-live allowed is 7 days. If not specified, the default time-to-live is 7 days.
# * +:encode+ - Boolean. If set to true, the message will be base64 encoded.
# * +:timeout+ - Integer. A timeout in seconds.
#
# See http://msdn.microsoft.com/en-us/library/windowsazure/dd179346
Expand All @@ -310,7 +311,7 @@ def create_message(queue_name, message_text, options={})
end

uri = messages_uri(queue_name, query)
body = Serialization.message_to_xml(message_text)
body = Serialization.message_to_xml(message_text, options[:encode])

call(:post, uri, body, {})
nil
Expand Down Expand Up @@ -393,6 +394,7 @@ def delete_message(queue_name, message_id, pop_receipt, options={})
#
# Accepted key/value pairs in options parameter are:
# * +:number_of_messages+ - Integer. How many messages to return. (optional, Default: 1)
# * +:decode+ - Boolean. Boolean value indicating if the message should be base64 decoded.
# * +:timeout+ - Integer. A timeout in seconds.
#
# See http://msdn.microsoft.com/en-us/library/windowsazure/dd179472
Expand All @@ -408,7 +410,7 @@ def peek_messages(queue_name, options={})
uri = messages_uri(queue_name, query)
response = call(:get, uri)

messages = Serialization.queue_messages_from_xml(response.body)
messages = Serialization.queue_messages_from_xml(response.body, options[:decode])
messages
end

Expand All @@ -425,6 +427,7 @@ def peek_messages(queue_name, options={})
# Accepted key/value pairs in options parameter are:
# * +:number_of_messages+ - Integer. How many messages to return. (optional, Default: 1)
# * +:timeout+ - Integer. A timeout in seconds.
# * +:decode+ - Boolean. Boolean value indicating if the message should be base64 decoded.
#
# See http://msdn.microsoft.com/en-us/library/windowsazure/dd179474
#
Expand All @@ -439,7 +442,7 @@ def list_messages(queue_name, visibility_timeout, options={})
uri = messages_uri(queue_name, query)
response = call(:get, uri)

messages = Serialization.queue_messages_from_xml(response.body)
messages = Serialization.queue_messages_from_xml(response.body, options[:decode])
messages
end

Expand All @@ -459,6 +462,7 @@ def list_messages(queue_name, visibility_timeout, options={})
# ==== Options
#
# Accepted key/value pairs in options parameter are:
# * +:encode+ - Boolean. If set to true, the message will be base64 encoded.
# * +:timeout+ - Integer. A timeout in seconds.
#
# See http://msdn.microsoft.com/en-us/library/windowsazure/hh452234
Expand Down Expand Up @@ -498,7 +502,7 @@ def update_message(queue_name, message_id, pop_receipt, message_text, visibility
query["timeout"] = options[:timeout].to_s if options[:timeout]

uri = message_uri(queue_name, message_id, query)
body = Serialization.message_to_xml(message_text)
body = Serialization.message_to_xml(message_text, options[:encode])

response = call(:put, uri, body, {})
new_pop_receipt = response.headers["x-ms-popreceipt"]
Expand Down
18 changes: 12 additions & 6 deletions lib/azure/queue/serialization.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,24 +23,24 @@ module Queue
module Serialization
include Service::Serialization

def self.queue_messages_from_xml(xml)
def self.queue_messages_from_xml(xml, decode)
xml = slopify(xml)
expect_node("QueueMessagesList", xml)
results = []
return results unless (xml > "QueueMessage").any?

if xml.QueueMessage.count == 0
results.push(queue_message_from_xml(xml.QueueMessage))
results.push(queue_message_from_xml(xml.QueueMessage, decode))
else
xml.QueueMessage.each { |message_node|
results.push(queue_message_from_xml(message_node))
results.push(queue_message_from_xml(message_node, decode))
}
end

results
end

def self.queue_message_from_xml(xml)
def self.queue_message_from_xml(xml, decode)
xml = slopify(xml)
expect_node("QueueMessage", xml)

Expand All @@ -52,12 +52,18 @@ def self.queue_message_from_xml(xml)
msg.message_text = xml.MessageText.text if (xml > "MessageText").any?
msg.time_next_visible = xml.TimeNextVisible.text if (xml > "TimeNextVisible").any?
msg.pop_receipt = xml.PopReceipt.text if (xml > "PopReceipt").any?

msg.message_text = Base64.decode64(msg.message_text) if decode
end
end

def self.message_to_xml(message_text)
def self.message_to_xml(message_text, encode)
builder = Nokogiri::XML::Builder.new do |xml|
xml.QueueMessage { xml.MessageText message_text }
if encode
xml.QueueMessage { xml.MessageText Base64.encode64(message_text) }
else
xml.QueueMessage { xml.MessageText message_text }
end
end
builder.to_xml
end
Expand Down
2 changes: 0 additions & 2 deletions lib/azure/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ class << self
def to_s
[MAJOR, MINOR, UPDATE, PRE].compact.join('.')
end

end

end
end
79 changes: 79 additions & 0 deletions test/integration/queue/list_messages_encoded_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
#-------------------------------------------------------------------------
# Copyright (c) Microsoft. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#--------------------------------------------------------------------------
require "integration/test_helper"
require "azure/queue/queue_service"

describe Azure::Queue::QueueService do
subject { Azure::Queue::QueueService.new }

describe '#list_messages_encoded' do
let(:queue_name){ QueueNameHelper.name }
let(:message_text){ "some random text " + QueueNameHelper.name }
before {
subject.create_queue queue_name
subject.create_message queue_name, message_text, { :encode => true }
}
after { QueueNameHelper.clean }

it "returns a message from the queue, marking it as invisible" do
result = subject.list_messages queue_name, 3, { :decode => true }
result.wont_be_nil
result.wont_be_empty
result.length.must_equal 1
message = result[0]
message.message_text.must_equal message_text

# queue should be empty
result = subject.list_messages queue_name, 1, { :decode => true }
result.must_be_empty
end

it "returns multiple messages if passed the optional parameter" do
msg_text2 = "some random text " + QueueNameHelper.name
subject.create_message queue_name, msg_text2, { :encode => true }

result = subject.list_messages queue_name, 3, { :number_of_messages => 2, :decode => true }
result.wont_be_nil
result.wont_be_empty
result.length.must_equal 2
result[0].message_text.must_equal message_text
result[1].message_text.must_equal msg_text2
result[0].id.wont_equal result[1].id
end

it "the visibility_timeout parameter sets the message invisible for the period of time pending delete/update" do
result = subject.list_messages queue_name, 3, { :decode => true }
result.wont_be_nil
result.wont_be_empty
result.length.must_equal 1
message = result[0]
message.message_text.must_equal message_text

# queue should be empty
result = subject.list_messages queue_name, 1, { :decode => true }
result.must_be_empty

sleep(3)

# same message is back at the top of the queue after timeout period
result = subject.list_messages queue_name, 3, { :decode => true }
result.wont_be_nil
result.wont_be_empty
result.length.must_equal 1
message2 = result[0]
message2.id.must_equal message.id
end
end
end