diff --git a/lib/azure/core/http/http_request.rb b/lib/azure/core/http/http_request.rb index c41cc995c5..2022fedfb2 100644 --- a/lib/azure/core/http/http_request.rb +++ b/lib/azure/core/http/http_request.rb @@ -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 diff --git a/lib/azure/queue/queue_service.rb b/lib/azure/queue/queue_service.rb index c66cff0aad..eb2a1076ba 100644 --- a/lib/azure/queue/queue_service.rb +++ b/lib/azure/queue/queue_service.rb @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 # @@ -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 @@ -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 @@ -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"] diff --git a/lib/azure/queue/serialization.rb b/lib/azure/queue/serialization.rb index 5468321967..e333f5174f 100644 --- a/lib/azure/queue/serialization.rb +++ b/lib/azure/queue/serialization.rb @@ -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) @@ -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 diff --git a/lib/azure/version.rb b/lib/azure/version.rb index 94e4f0c0ca..18e1ecd9e0 100644 --- a/lib/azure/version.rb +++ b/lib/azure/version.rb @@ -26,8 +26,6 @@ class << self def to_s [MAJOR, MINOR, UPDATE, PRE].compact.join('.') end - end - end end \ No newline at end of file diff --git a/test/integration/queue/list_messages_encoded_test.rb b/test/integration/queue/list_messages_encoded_test.rb new file mode 100644 index 0000000000..42fd971ea3 --- /dev/null +++ b/test/integration/queue/list_messages_encoded_test.rb @@ -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