Current section

Files

Jump to
erlcloud src erlcloud_sqs.erl
Raw

src/erlcloud_sqs.erl

%% Amazon Simple Queue Service (SQS)
-module(erlcloud_sqs).
-export([configure/2, configure/3, new/2, new/3]).
-export([
add_permission/3, add_permission/4,
change_message_visibility/3, change_message_visibility/4,
create_queue/1, create_queue/2, create_queue/3,
delete_message/2, delete_message/3,
delete_queue/1, delete_queue/2,
purge_queue/1, purge_queue/2,
get_queue_attributes/1, get_queue_attributes/2, get_queue_attributes/3,
list_queues/0, list_queues/1, list_queues/2,
receive_message/1, receive_message/2, receive_message/3, receive_message/4,
receive_message/5, receive_message/6,
remove_permission/2, remove_permission/3,
send_message/2, send_message/3, send_message/4,
set_queue_attributes/2, set_queue_attributes/3,
send_message_batch/2, send_message_batch/3, send_message_batch/4,
delete_message_batch/2, delete_message_batch/3,
change_message_visibility_batch/3, change_message_visibility_batch/4
]).
-include("erlcloud.hrl").
-include("erlcloud_aws.hrl").
-define(API_VERSION, "2012-11-05").
-define(SEND_BATCH_FIELD(N, F, V), {"SendMessageBatchRequestEntry." ++ N ++ F, V}).
-define(DELETE_BATCH_FIELD(N, F, V), {"DeleteMessageBatchRequestEntry." ++ N ++ F, V}).
-define(CHANGE_VISIBILITY_BATCH_FIELD(N, F, V), {"ChangeMessageVisibilityBatchRequestEntry." ++ N ++ F, V}).
-type(sqs_permission() :: all | send_message | receive_message | delete_message |
change_message_visibility | get_queue_attributes).
-type(sqs_acl() :: [{string(), sqs_permission()}]).
-type(sqs_msg_attribute_name() :: all | sender_id | sent_timestamp |
approximate_receive_count |
approximate_first_receive_timestamp |
wait_time_seconds |
receive_message_wait_time_seconds).
-type(sqs_queue_attribute_name() :: all | approximate_number_of_messages |
approximate_number_of_messages_not_visible | visibility_timeout |
created_timestamp | last_modified_timestamp | policy |
queue_arn).
-type(batch_entry() :: [{string(), string()}]).
-spec new(string(), string()) -> aws_config().
new(AccessKeyID, SecretAccessKey) ->
#aws_config{access_key_id=AccessKeyID,
secret_access_key=SecretAccessKey}.
-spec new(string(), string(), string()) -> aws_config().
new(AccessKeyID, SecretAccessKey, Host) ->
#aws_config{access_key_id=AccessKeyID,
secret_access_key=SecretAccessKey,
sqs_host=Host}.
-spec configure(string(), string()) -> ok.
configure(AccessKeyID, SecretAccessKey) ->
put(aws_config, new(AccessKeyID, SecretAccessKey)),
ok.
-spec configure(string(), string(), string()) -> ok.
configure(AccessKeyID, SecretAccessKey, Host) ->
put(aws_config, new(AccessKeyID, SecretAccessKey, Host)),
ok.
-spec add_permission(string(), string(), sqs_acl()) -> ok.
add_permission(QueueName, Label, Permissions) ->
add_permission(QueueName, Label, Permissions, default_config()).
-spec add_permission(string(), string(), sqs_acl(), aws_config()) -> ok.
add_permission(QueueName, Label, Permissions, Config)
when is_list(QueueName),
is_list(Label), length(Label) =< 80,
is_list(Permissions) ->
sqs_simple_request(Config, QueueName, "AddPermission",
[{"Label", Label}|erlcloud_aws:param_list(encode_permissions(Permissions), {"AWSAccountId", "ActionName"})]).
encode_permissions(Permissions) ->
[encode_permission(P) || P <- Permissions].
encode_permission({AccountId, Permission}) ->
{AccountId,
case Permission of
all -> "*";
send_message -> "SendMessage";
receive_message -> "ReceiveMessage";
delete_message -> "DeleteMessage";
change_message_visibility -> "ChangeMessageVisibility";
get_queue_attributes -> "GetQueueAttributes"
end}.
-spec change_message_visibility(string(), string(), 0..43200) -> ok.
change_message_visibility(QueueName, ReceiptHandle, VisibilityTimeout) ->
change_message_visibility(QueueName, ReceiptHandle, VisibilityTimeout,
default_config()).
-spec change_message_visibility(string(), string(), 0..43200, aws_config()) -> ok.
change_message_visibility(QueueName, ReceiptHandle, VisibilityTimeout, Config) ->
sqs_simple_request(Config, QueueName, "ChangeMessageVisibility",
[{"ReceiptHandle", ReceiptHandle}, {"VisibilityTimeout", VisibilityTimeout}]).
-spec create_queue(string()) -> proplist().
create_queue(QueueName) ->
create_queue(QueueName, default_config()).
-spec create_queue(string(), 0..43200 | none | aws_config()) -> proplist().
create_queue(QueueName, Config)
when is_record(Config, aws_config) ->
create_queue(QueueName, none, Config);
create_queue(QueueName, DefaultVisibilityTimeout) ->
create_queue(QueueName, DefaultVisibilityTimeout, default_config()).
-spec create_queue(string(), 0..43200 | none, aws_config()) -> proplist().
create_queue(QueueName, DefaultVisibilityTimeout, Config)
when is_list(QueueName),
(is_integer(DefaultVisibilityTimeout) andalso
DefaultVisibilityTimeout >= 0 andalso
DefaultVisibilityTimeout =< 43200) orelse
DefaultVisibilityTimeout =:= none ->
Doc = sqs_xml_request(Config, "/", "CreateQueue",
[{"QueueName", QueueName}, {"DefaultVisibilityTimeout", DefaultVisibilityTimeout}]),
erlcloud_xml:decode(
[
{queue_url, "CreateQueueResult/QueueUrl", text}
],
Doc
).
-spec delete_message(string(), string()) -> ok.
delete_message(QueueName, ReceiptHandle) ->
delete_message(QueueName, ReceiptHandle, default_config()).
-spec delete_message(string(), string(), aws_config()) -> ok.
delete_message(QueueName, ReceiptHandle, Config)
when is_list(QueueName), is_list(ReceiptHandle), is_record(Config, aws_config) ->
sqs_simple_request(Config, QueueName, "DeleteMessage",
[{"ReceiptHandle", ReceiptHandle}]).
-spec delete_queue(string()) -> ok.
delete_queue(QueueName) ->
delete_queue(QueueName, default_config()).
-spec delete_queue(string(), aws_config()) -> ok.
delete_queue(QueueName, Config)
when is_list(QueueName), is_record(Config, aws_config) ->
sqs_simple_request(Config, QueueName, "DeleteQueue", []).
-spec purge_queue(string()) -> ok.
purge_queue(QueueName) ->
purge_queue(QueueName, default_config()).
-spec purge_queue(string(), aws_config()) -> ok.
purge_queue(QueueName, Config)
when is_list(QueueName), is_record(Config, aws_config) ->
sqs_simple_request(Config, QueueName, "PurgeQueue", []).
-spec get_queue_attributes(string()) -> proplist().
get_queue_attributes(QueueName) ->
get_queue_attributes(QueueName, all).
-spec get_queue_attributes(string(), all | [sqs_queue_attribute_name()] | aws_config()) -> proplist().
get_queue_attributes(QueueName, Config)
when is_record(Config, aws_config) ->
get_queue_attributes(QueueName, all, Config);
get_queue_attributes(QueueName, AttributeNames) ->
get_queue_attributes(QueueName, AttributeNames, default_config()).
-spec get_queue_attributes(string(), all | [sqs_queue_attribute_name()], aws_config()) -> proplist().
get_queue_attributes(QueueName, all, Config) when is_record(Config, aws_config) ->
get_queue_attributes(QueueName, [all], Config);
get_queue_attributes(QueueName, AttributeNames, Config)
when is_list(QueueName), is_list(AttributeNames), is_record(Config, aws_config) ->
Doc = sqs_xml_request(Config, QueueName, "GetQueueAttributes",
erlcloud_aws:param_list([encode_attribute_name(N) || N <- AttributeNames], "AttributeName")),
Attrs = decode_attributes(xmerl_xpath:string("GetQueueAttributesResult/Attribute", Doc)),
[{decode_attribute_name(Name), decode_attribute_value(Name, Value)} || {Name, Value} <- Attrs].
encode_attribute_name(message_retention_period) -> "MessageRetentionPeriod";
encode_attribute_name(queue_arn) -> "QueueArn";
encode_attribute_name(maximum_message_size) -> "MaximumMessageSize";
encode_attribute_name(visibility_timeout) -> "VisibilityTimeout";
encode_attribute_name(approximate_number_of_messages) -> "ApproximateNumberOfMessages";
encode_attribute_name(approximate_number_of_messages_not_visible) -> "ApproximateNumberOfMessagesNotVisible";
encode_attribute_name(approximate_number_of_messages_delayed) -> "ApproximateNumberOfMessagesDelayed";
encode_attribute_name(last_modified_timestamp) -> "LastModifiedTimestamp";
encode_attribute_name(created_timestamp) -> "CreatedTimestamp";
encode_attribute_name(delay_seconds) -> "DelaySeconds";
encode_attribute_name(receive_message_wait_time_seconds) -> "ReceiveMessageWaitTimeSeconds";
encode_attribute_name(policy) -> "Policy";
encode_attribute_name(redrive_policy) -> "RedrivePolicy";
encode_attribute_name(all) -> "All".
decode_attribute_name("MessageRetentionPeriod") -> message_retention_period;
decode_attribute_name("QueueArn") -> queue_arn;
decode_attribute_name("MaximumMessageSize") -> maximum_message_size;
decode_attribute_name("VisibilityTimeout") -> visibility_timeout;
decode_attribute_name("ApproximateNumberOfMessages") -> approximate_number_of_messages;
decode_attribute_name("ApproximateNumberOfMessagesNotVisible") -> approximate_number_of_messages_not_visible;
decode_attribute_name("ApproximateNumberOfMessagesDelayed") -> approximate_number_of_messages_delayed;
decode_attribute_name("LastModifiedTimestamp") -> last_modified_timestamp;
decode_attribute_name("CreatedTimestamp") -> created_timestamp;
decode_attribute_name("DelaySeconds") -> delay_seconds;
decode_attribute_name("ReceiveMessageWaitTimeSeconds") -> receive_message_wait_time_seconds;
decode_attribute_name("Policy") -> policy;
decode_attribute_name("RedrivePolicy") -> redrive_policy.
decode_attribute_value("Policy", Value) -> Value;
decode_attribute_value("QueueArn", Value) -> Value;
decode_attribute_value("RedrivePolicy", Value) -> Value;
decode_attribute_value(_, Value) -> list_to_integer(Value).
-spec list_queues() -> [string()].
list_queues() ->
list_queues("").
-spec list_queues(string() | aws_config()) -> [string()].
list_queues(Config)
when is_record(Config, aws_config) ->
list_queues("", Config);
list_queues(QueueNamePrefix) ->
list_queues(QueueNamePrefix, default_config()).
-spec list_queues(string(), aws_config()) -> [string()].
list_queues(QueueNamePrefix, Config)
when is_list(QueueNamePrefix), is_record(Config, aws_config) ->
Doc = sqs_xml_request(Config, "/", "ListQueues",
[{"QueueNamePrefix", QueueNamePrefix}]),
erlcloud_xml:get_list("ListQueuesResult/QueueUrl", Doc).
-spec receive_message(string()) -> proplist().
receive_message(QueueName) ->
receive_message(QueueName, default_config()).
-spec receive_message(string(), [sqs_msg_attribute_name()] | all | aws_config()) -> proplist().
receive_message(QueueName, Config)
when is_record(Config, aws_config) ->
receive_message(QueueName, [], Config);
receive_message(QueueName, AttributeNames) ->
receive_message(QueueName, AttributeNames, default_config()).
-spec receive_message(string(), [sqs_msg_attribute_name()] | all, 1..10 | aws_config()) -> proplist().
receive_message(QueueName, AttributeNames, Config)
when is_record(Config, aws_config) ->
receive_message(QueueName, AttributeNames, 1, Config);
receive_message(QueueName, AttributeNames, MaxNumberOfMessages) ->
receive_message(QueueName, AttributeNames, MaxNumberOfMessages, default_config()).
-spec receive_message(string(), [sqs_msg_attribute_name()] | all, 1..10, 0..43200 | none | aws_config()) -> proplist().
receive_message(QueueName, AttributeNames, MaxNumberOfMessages, Config)
when is_record(Config, aws_config) ->
receive_message(QueueName, AttributeNames, MaxNumberOfMessages, none, Config);
receive_message(QueueName, AttributeNames, MaxNumberOfMessages, VisibilityTimeout) ->
receive_message(QueueName, AttributeNames, MaxNumberOfMessages,
VisibilityTimeout, default_config()).
-spec receive_message(string(), [sqs_msg_attribute_name()] | all, 1..10,
0..43200 | none, 0..20 | none | aws_config()) -> proplist().
receive_message(QueueName, AttributeNames, MaxNumberOfMessages,
VisibilityTimeout, Config)
when is_record(Config, aws_config) ->
receive_message(QueueName, AttributeNames, MaxNumberOfMessages,
VisibilityTimeout, none, Config);
receive_message(QueueName, AttributeNames, MaxNumberOfMessages,
VisibilityTimeout, WaitTimeSeconds) ->
receive_message(QueueName, AttributeNames, MaxNumberOfMessages,
VisibilityTimeout, WaitTimeSeconds, default_config()).
-spec receive_message(string(), [sqs_msg_attribute_name()] | all, 1..10,
0..43200 | none, 0..20 | none, aws_config()) -> proplist().
receive_message(QueueName, all, MaxNumberOfMessages, VisibilityTimeout,
WaitTimeoutSeconds, Config) when is_record(Config, aws_config) ->
receive_message(QueueName, [all], MaxNumberOfMessages,
VisibilityTimeout, WaitTimeoutSeconds, Config);
receive_message(QueueName, AttributeNames, MaxNumberOfMessages,
VisibilityTimeout, WaitTimeSeconds, Config)
when is_record(Config, aws_config), (is_list(AttributeNames) orelse AttributeNames =:= all),
MaxNumberOfMessages >= 1, MaxNumberOfMessages =< 10,
(VisibilityTimeout >= 0 andalso VisibilityTimeout =< 43200) orelse
VisibilityTimeout =:= none,
(WaitTimeSeconds >= 0 andalso WaitTimeSeconds =< 20) orelse
WaitTimeSeconds =:= none ->
InitialTimeout = erlcloud_aws:get_timeout(Config),
TotalTimeout = if
(WaitTimeSeconds =/= none andalso WaitTimeSeconds >= 0 andalso InitialTimeout =/= infinity) ->
InitialTimeout + (WaitTimeSeconds * 1000) ;
true -> InitialTimeout
end,
Doc = sqs_xml_request(Config#aws_config{timeout=TotalTimeout}, QueueName, "ReceiveMessage",
[
{"MaxNumberOfMessages", MaxNumberOfMessages},
{"VisibilityTimeout", VisibilityTimeout},
{"WaitTimeSeconds", WaitTimeSeconds}|
erlcloud_aws:param_list([encode_msg_attribute_name(N) || N <- AttributeNames], "AttributeName")
]
),
erlcloud_xml:decode(
[
{messages, "ReceiveMessageResult/Message", fun decode_messages/1}
],
Doc
).
encode_msg_attribute_name(all) -> "All";
encode_msg_attribute_name(sender_id) -> "SenderId";
encode_msg_attribute_name(sent_timestamp) -> "SentTimestamp";
encode_msg_attribute_name(approximate_receive_count) -> "ApproximateReceiveCount";
encode_msg_attribute_name(approximate_first_receive_timestamp) -> "ApproximateFirstReceiveTimestamp".
decode_msg_attribute_name("SenderId") -> sender_id;
decode_msg_attribute_name("SentTimestamp") -> sent_timestamp;
decode_msg_attribute_name("ApproximateReceiveCount") -> approximate_receive_count;
decode_msg_attribute_name("ApproximateFirstReceiveTimestamp") -> approximate_first_receive_timestamp.
decode_messages(Messages) ->
[decode_message(Message) || Message <- Messages].
decode_message(Message) ->
erlcloud_xml:decode(
[
{body, "Body", text},
{md5_of_body, "MD5OfBody", text},
{message_id, "MessageId", text},
{receipt_handle, "ReceiptHandle", text},
{attributes, "Attribute", fun decode_msg_attributes/1}
],
Message
).
decode_msg_attributes(Attrs) ->
[{decode_msg_attribute_name(Name),
case Name of "SenderId" -> Value; _ -> list_to_integer(Value) end} ||
{Name, Value} <- decode_attributes(Attrs)].
decode_attributes(Attrs) ->
[{erlcloud_xml:get_text("Name", Attr), erlcloud_xml:get_text("Value", Attr)} ||
Attr <- Attrs].
-spec remove_permission(string(), string()) -> ok.
remove_permission(QueueName, Label) ->
remove_permission(QueueName, Label, default_config()).
-spec remove_permission(string(), string(), aws_config()) -> ok.
remove_permission(QueueName, Label, Config)
when is_list(QueueName), is_list(Label), is_record(Config, aws_config) ->
sqs_simple_request(Config, QueueName, "RemovePermission",
[{"Label", Label}]).
-spec send_message(string(), string()) -> proplist().
send_message(QueueName, MessageBody) ->
send_message(QueueName, MessageBody, default_config()).
-spec send_message(string(), string(), 0..900 | none | aws_config()) -> proplist().
send_message(QueueName, MessageBody, Config)
when is_record(Config, aws_config) ->
send_message(QueueName, MessageBody, none, Config);
send_message(QueueName, MessageBody, DelaySeconds) ->
send_message(QueueName, MessageBody, DelaySeconds, default_config()).
-spec send_message(string(), string(), 0..900 | none, aws_config()) -> proplist().
send_message(QueueName, MessageBody, DelaySeconds, Config)
when is_list(QueueName), is_list(MessageBody), is_record(Config, aws_config),
(DelaySeconds >= 0 andalso DelaySeconds =< 900) orelse
DelaySeconds =:= none ->
Doc = sqs_xml_request(Config, QueueName, "SendMessage",
[{"MessageBody", MessageBody},
{"DelaySeconds", DelaySeconds}]),
erlcloud_xml:decode(
[
{message_id, "SendMessageResult/MessageId", text},
{md5_of_message_body, "SendMessageResult/MD5OfMessageBody", text}
],
Doc
).
-spec set_queue_attributes(string(), [{visibility_timeout, integer()} | {policy, string()}]) -> ok.
set_queue_attributes(QueueName, Attributes) ->
set_queue_attributes(QueueName, Attributes, default_config()).
-spec set_queue_attributes(string(), [{visibility_timeout, integer()} | {policy, string()}], aws_config()) -> ok.
set_queue_attributes(QueueName, Attributes, Config)
when is_list(QueueName), is_list(Attributes), is_record(Config, aws_config) ->
Params = lists:flatten(erlcloud_aws:param_list([encode_attribute_name(Name) || {Name, _} <- Attributes], "Attribute.Name"),
erlcloud_aws:param_list([Value || {_, Value} <- Attributes], "Attribute.Value")),
sqs_simple_request(Config, QueueName, "SetQueueAttributes", Params).
-spec send_message_batch(string(), [batch_entry()]) -> proplist().
send_message_batch(QueueName, BatchMessages) ->
send_message_batch(QueueName, BatchMessages, default_config()).
-spec send_message_batch(string(), [batch_entry()], 0..900 | none | aws_config()) -> proplist().
send_message_batch(QueueName, BatchMessages, Config)
when is_record(Config, aws_config) ->
send_message_batch(QueueName, BatchMessages, none, Config);
send_message_batch(QueueName, BatchMessages, DelaySeconds) ->
send_message_batch(QueueName, BatchMessages, DelaySeconds, default_config()).
-spec send_message_batch(string(), [batch_entry()], 0..900 | none, aws_config()) -> proplist().
send_message_batch(QueueName, [{Id, Body}|_]=BatchMessages, DelaySeconds, Config)
when is_list(QueueName), is_list(Id), is_list(Body), is_record(Config, aws_config),
(DelaySeconds >= 0 andalso DelaySeconds =< 900) orelse
DelaySeconds =:= none ->
{_, BatchRequestEntries} =
lists:foldr(fun({BatchId, MessageBody}, {N, Acc}) ->
{N + 1, [mk_send_batch_entry(N, BatchId, MessageBody, DelaySeconds)| Acc]}
end, {1, []}, BatchMessages),
Doc = sqs_xml_request(Config, QueueName, "SendMessageBatch",
lists:flatten(BatchRequestEntries)),
BatchResponse =
[{successful, "SendMessageBatchResult/SendMessageBatchResultEntry", fun decode_send_batch_successful/1},
{failed, "SendMessageBatchResult/BatchResultErrorEntry", fun decode_batch_result_error/1}],
erlcloud_xml:decode(BatchResponse, Doc).
-spec delete_message_batch(string(), [batch_entry()]) -> proplists:proplist().
delete_message_batch(QueueName, BatchReceiptHandles) ->
delete_message_batch(QueueName, BatchReceiptHandles, default_config()).
-spec delete_message_batch(string(), [batch_entry()], aws_config()) -> proplists:proplist() .
delete_message_batch(QueueName, [{Id, Handle}|_]=BatchReceiptHandles, Config)
when is_list(QueueName), is_list(Id), is_list(Handle),
is_record(Config, aws_config) ->
{_, BatchRequestEntries} =
lists:foldr(fun({BatchId, MessageBody}, {N, Acc}) ->
{N + 1, [mk_delete_batch_entry(N, BatchId, MessageBody)| Acc]}
end, {1, []}, BatchReceiptHandles),
Doc = sqs_xml_request(Config, QueueName, "DeleteMessageBatch",
lists:flatten(BatchRequestEntries)),
BatchResponse =
[{successful, "DeleteMessageBatchResult/DeleteMessageBatchResultEntry", fun decode_id_batch_successful/1},
{failed, "DeleteMessageBatchResult/BatchResultErrorEntry", fun decode_batch_result_error/1}],
erlcloud_xml:decode(BatchResponse, Doc).
-spec change_message_visibility_batch(string(), [batch_entry()], 0..43200) -> proplists:proplist().
change_message_visibility_batch(QueueName, BatchReceiptHandles, VisibilityTimeout) ->
change_message_visibility_batch(QueueName, BatchReceiptHandles, VisibilityTimeout,
default_config()).
-spec change_message_visibility_batch(string(), [batch_entry()], 0..43200, aws_config()) -> proplists:proplist().
change_message_visibility_batch(QueueName, [{Id, Handle}|_]=BatchReceiptHandles, VisibilityTimeout, Config)
when is_list(QueueName), is_list(Id), is_list(Handle), is_record(Config, aws_config) ->
{_, BatchRequestEntries} =
lists:foldr(fun({BatchId, MessageBody}, {N, Acc}) ->
{N + 1, [mk_ch_visibility_batch_entry(N, BatchId, MessageBody, VisibilityTimeout)| Acc]}
end, {1, []}, BatchReceiptHandles),
Doc = sqs_xml_request(Config, QueueName, "ChangeMessageVisibilityBatch",
lists:flatten(BatchRequestEntries)),
BatchResponse =
[{successful, "ChangeMessageVisibilityBatchResult/ChangeMessageVisibilityBatchResultEntry", fun decode_id_batch_successful/1},
{failed, "ChangeMessageVisibilityBatchResult/BatchResultErrorEntry", fun decode_batch_result_error/1}],
erlcloud_xml:decode(BatchResponse, Doc).
-spec mk_send_batch_entry(integer(), string(), string(), 0..900 | none) -> [{string(), integer() | string()}].
mk_send_batch_entry(N, MessageId, MessageBody, DelaySeconds) ->
N0 = integer_to_list(N),
[
?SEND_BATCH_FIELD(N0, ".Id", MessageId),
?SEND_BATCH_FIELD(N0, ".MessageBody", MessageBody),
?SEND_BATCH_FIELD(N0, ".DelaySeconds", DelaySeconds)
].
-spec mk_delete_batch_entry(integer(), string(), string()) -> [{string(), string()}].
mk_delete_batch_entry(N, MessageId, ReceiptHandle) ->
N0 = integer_to_list(N),
[
?DELETE_BATCH_FIELD(N0, ".Id", MessageId),
?DELETE_BATCH_FIELD(N0, ".ReceiptHandle", ReceiptHandle)
].
-spec mk_ch_visibility_batch_entry(integer(), string(), string(), 0..43200) -> [{string(), integer() | string()}].
mk_ch_visibility_batch_entry(N, MessageId, ReceiptHandle, VisibilityTimeout) ->
N0 = integer_to_list(N),
[
?CHANGE_VISIBILITY_BATCH_FIELD(N0, ".Id", MessageId),
?CHANGE_VISIBILITY_BATCH_FIELD(N0, ".ReceiptHandle", ReceiptHandle),
?CHANGE_VISIBILITY_BATCH_FIELD(N0, ".VisibilityTimeout", VisibilityTimeout)
].
decode_send_batch_successful(Nodes) ->
[erlcloud_xml:decode([
{id, "Id", text},
{message_id, "MessageId", text},
{md5_of_message_body, "MD5OfMessageBody", text}
], Node) || Node <- Nodes].
decode_id_batch_successful(Nodes) ->
[erlcloud_xml:decode([{id, "Id", text}], Node) || Node <- Nodes].
decode_batch_result_error(Nodes) ->
[erlcloud_xml:decode([
{id, "Id", text},
{sender_fault, "SenderFault", boolean},
{code, "Code", text},
{message, "Message", text}
], Node) || Node <- Nodes].
default_config() -> erlcloud_aws:default_config().
sqs_simple_request(Config, QueueName, Action, Params) ->
sqs_request(Config, QueueName, Action, Params),
ok.
sqs_xml_request(Config, QueueName, Action, Params) ->
case erlcloud_aws:aws_request_xml4(post, Config#aws_config.sqs_protocol,
Config#aws_config.sqs_host, Config#aws_config.sqs_port,
queue_path(QueueName),
[{"Action", Action}, {"Version", ?API_VERSION}|Params],
"sqs",Config)
of
{ok, Body} ->
Body;
{error, Reason} ->
erlang:error({aws_error, Reason})
end.
sqs_request(Config, QueueName, Action, Params) ->
case erlcloud_aws:aws_request4(post, Config#aws_config.sqs_protocol,
Config#aws_config.sqs_host, Config#aws_config.sqs_port,
queue_path(QueueName),
[{"Action", Action}, {"Version", ?API_VERSION}|Params],
"sqs", Config)
of
{ok, Body} ->
Body;
{error, Reason} ->
erlang:error({aws_error, Reason})
end.
queue_path([$/|QueueName]) -> [$/ |erlcloud_http:url_encode(QueueName)];
queue_path([$h,$t,$t,$p|_] = URL) ->
re:replace(URL, "^https?://[^/]*", "", [{return, list}]);
queue_path(QueueName) -> [$/ | erlcloud_http:url_encode(QueueName)].