Skip to content

Commit 3ef7a7c

Browse files
authored
Merge pull request #36 from ruslandoga/allow-iodata
allow iodata in sign_v4
2 parents 936a954 + 6a9318d commit 3ef7a7c

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

src/aws_signature.erl

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ sign_v4(AccessKeyID, SecretAccessKey, Region, Service, DateTime, Method, URL, He
104104
Method :: binary(),
105105
URL :: binary(),
106106
Headers :: headers(),
107-
Body :: binary(),
107+
Body :: iodata(),
108108
Options :: [Option],
109109
Option ::
110110
{uri_encode_path, boolean()}
@@ -119,7 +119,7 @@ sign_v4(AccessKeyID, SecretAccessKey, Region, Service, DateTime, Method, URL, He
119119
is_binary(Method),
120120
is_binary(URL),
121121
is_list(Headers),
122-
is_binary(Body),
122+
(is_binary(Body) orelse is_list(Body)),
123123
is_list(Options) ->
124124
URIEncodePath = proplists:get_value(uri_encode_path, Options, true),
125125

@@ -699,6 +699,32 @@ sign_v4_reference_example_4_test() ->
699699

700700
?assertEqual(Actual, Expected).
701701

702+
sign_v4_iolist_body_test() ->
703+
AccessKeyID = <<"AKIAIOSFODNN7EXAMPLE">>,
704+
SecretAccessKey = <<"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY">>,
705+
Region = <<"us-east-1">>,
706+
Service = <<"s3">>,
707+
DateTime = {{2013, 5, 24}, {0, 0, 0}},
708+
Method = <<"PUT">>,
709+
URL = <<"https://examplebucket.s3.amazonaws.com/test%24file.text">>,
710+
Headers = [
711+
{<<"Host">>, <<"examplebucket.s3.amazonaws.com">>},
712+
{<<"Date">>, <<"Fri, 24 May 2013 00:00:00 GMT">>},
713+
{<<"X-Amz-Storage-Class">>, <<"REDUCED_REDUNDANCY">>}],
714+
Body = [<<"Welcome ">>, <<"to ">>, <<"Amazon S3.">>],
715+
716+
Actual = sign_v4(AccessKeyID, SecretAccessKey, Region, Service, DateTime, Method, URL, Headers, Body, [{uri_encode_path, false}]),
717+
718+
Expected = [
719+
{<<"Authorization">>, <<"AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class,Signature=98ad721746da40c64f1a55b78f14c238d841ea1380cd77a1b5971af0ece108bd">>},
720+
{<<"X-Amz-Content-SHA256">>, <<"44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072">>},
721+
{<<"X-Amz-Date">>, <<"20130524T000000Z">>},
722+
{<<"Host">>, <<"examplebucket.s3.amazonaws.com">>},
723+
{<<"Date">>, <<"Fri, 24 May 2013 00:00:00 GMT">>},
724+
{<<"X-Amz-Storage-Class">>, <<"REDUCED_REDUNDANCY">>}],
725+
726+
?assertEqual(Actual, Expected).
727+
702728
sign_v4_unsigned_payload_test() ->
703729
AccessKeyID = <<"AKIAIOSFODNN7EXAMPLE">>,
704730
SecretAccessKey = <<"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY">>,

src/aws_signature_utils.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ hmac_sha256(Key, Message) ->
2323
crypto_hmac(sha256, Key, Message).
2424

2525
%% @doc Creates a SHA256 hexdigest for `Value'.
26-
-spec sha256_hexdigest(binary()) -> binary().
26+
-spec sha256_hexdigest(iodata()) -> binary().
2727
sha256_hexdigest(Value) ->
2828
base16(crypto:hash(sha256, Value)).
2929

0 commit comments

Comments
 (0)