Skip to content

Commit 99948f7

Browse files
authored
Merge pull request #160 from phulien/master
Support generate presigned URL with tagging
2 parents d16d091 + 5140aae commit 99948f7

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

rebar.config

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{erl_opts, [nowarn_unused_type, debug_info, {d, maps_support}]}.
22
{deps, [{hackney, "1.18.0"},
33
{jsx, "3.0.0"},
4-
{aws_signature, "0.3.1"}
4+
{aws_signature, "0.3.3"}
55
]}.
66
{project_plugins, [rebar3_hex, rebar3_ex_doc, rebar3_check_app_calls]}.
77
{hex, [{doc, #{provider => ex_doc}}]}.

rebar.lock

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{"1.2.0",
2-
[{<<"aws_signature">>,{pkg,<<"aws_signature">>,<<"0.3.1">>},0},
2+
[{<<"aws_signature">>,{pkg,<<"aws_signature">>,<<"0.3.3">>},0},
33
{<<"certifi">>,{pkg,<<"certifi">>,<<"2.5.2">>},1},
44
{<<"hackney">>,{pkg,<<"hackney">>,<<"1.16.0">>},0},
55
{<<"idna">>,{pkg,<<"idna">>,<<"6.0.1">>},1},
@@ -11,7 +11,7 @@
1111
{<<"unicode_util_compat">>,{pkg,<<"unicode_util_compat">>,<<"0.5.0">>},2}]}.
1212
[
1313
{pkg_hash,[
14-
{<<"aws_signature">>, <<"67F369094CBD55FFA2BBD8CC713EDE14B195FCFB45C86665CD7C5AD010276148">>},
14+
{<<"aws_signature">>, <<"5844BEE0D3CC42EEFD21D236BBFAA8AA9B16E2F2B7EE79EDAECB321DB3FB6ADF">>},
1515
{<<"certifi">>, <<"B7CFEAE9D2ED395695DD8201C57A2D019C0C43ECAF8B8BCB9320B40D6662F340">>},
1616
{<<"hackney">>, <<"5096AC8E823E3A441477B2D187E30DD3FFF1A82991A806B2003845CE72CE2D84">>},
1717
{<<"idna">>, <<"1D038FB2E7668CE41FBF681D2C45902E52B3CB9E9C77B55334353B222C2EE50C">>},
@@ -22,7 +22,7 @@
2222
{<<"ssl_verify_fun">>, <<"CF344F5692C82D2CD7554F5EC8FD961548D4FD09E7D22F5B62482E5AEAEBD4B0">>},
2323
{<<"unicode_util_compat">>, <<"8516502659002CEC19E244EBD90D312183064BE95025A319A6C7E89F4BCCD65B">>}]},
2424
{pkg_hash_ext,[
25-
{<<"aws_signature">>, <<"50FC4DC1D1F7C2D0A8C63F455B3C66ECD74C1CF4C915C768A636F9227704A674">>},
25+
{<<"aws_signature">>, <<"87E8F42B8E49002AA8D0350A71D13D69EA91B9AFB4CA9B526AE36DB1D585C924">>},
2626
{<<"certifi">>, <<"3B3B5F36493004AC3455966991EAF6E768CE9884693D9968055AEEEB1E575040">>},
2727
{<<"hackney">>, <<"3BF0BEBBD5D3092A3543B783BF065165FA5D3AD4B899B836810E513064134E18">>},
2828
{<<"idna">>, <<"A02C8A1C4FD601215BB0B0324C8A6986749F807CE35F25449EC9E69758708122">>},

src/aws_s3_presigned_url.erl

+43-7
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
-module(aws_s3_presigned_url).
1010

1111
-export([ make_presigned_v4_url/5,
12-
make_presigned_v4_url/6
12+
make_presigned_v4_url/6,
13+
make_presigned_v4_url/7
1314
]).
1415

1516
-include_lib("hackney/include/hackney_lib.hrl").
@@ -23,6 +24,11 @@ make_presigned_v4_url(Client0, Method, ExpireSeconds, Bucket, Key) ->
2324

2425
-spec make_presigned_v4_url(map(), get | put, integer(), binary(), binary(),path|virtual_host) -> {ok, binary()}.
2526
make_presigned_v4_url(Client0, Method, ExpireSeconds, Bucket, Key, Style) ->
27+
make_presigned_v4_url(Client0, Method, ExpireSeconds, Bucket, Key, Style, undefined).
28+
29+
-spec make_presigned_v4_url(map(), get | put, integer(), binary(), binary(), path|virtual_host, undefined|binary()) ->
30+
{ok, binary()}.
31+
make_presigned_v4_url(Client0, Method, ExpireSeconds, Bucket, Key, Style, Tags) ->
2632
MethodBin = aws_request:method_to_binary(Method),
2733
Path = build_path(Client0,Bucket,Key,Style),
2834
Client = Client0#{service => <<"s3">>},
@@ -38,12 +44,20 @@ make_presigned_v4_url(Client0, Method, ExpireSeconds, Bucket, Key, Style) ->
3844
, {body_digest, <<"UNSIGNED-PAYLOAD">>}
3945
, {uri_encode_path, false} %% We already encode in build_path/4
4046
],
41-
Options = case SecurityToken of
42-
undefined ->
43-
Options0;
44-
_ ->
45-
[{session_token, hackney_url:urlencode(SecurityToken)} | Options0]
46-
end,
47+
Options1 =
48+
case SecurityToken of
49+
undefined ->
50+
Options0;
51+
_ ->
52+
[{session_token, hackney_url:urlencode(SecurityToken)} | Options0]
53+
end,
54+
Options =
55+
case Tags of
56+
undefined ->
57+
Options1;
58+
_ ->
59+
[{tags, Tags} | Options1]
60+
end,
4761
{ok, aws_signature:sign_v4_query_params(AccessKeyID, SecretAccessKey, Region, Service, Now, MethodBin, URL, Options)}.
4862

4963
%%====================================================================
@@ -197,4 +211,26 @@ presigned_url_virtual_host_style_test() ->
197211
?assertEqual(<<"3600">>, proplists:get_value(<<"X-Amz-Expires">>, ParsedQs)),
198212
?assertEqual(<<"Token">>, proplists:get_value(<<"X-Amz-Security-Token">>, ParsedQs)),
199213
?assertEqual(<<"host">>, proplists:get_value(<<"X-Amz-SignedHeaders">>, ParsedQs)).
214+
215+
presigned_url_tags_test() ->
216+
Client = aws_client:make_temporary_client(<<"AccessKeyID">>, <<"SecretAccessKey">>,
217+
<<"Token">>, <<"eu-west-1">>),
218+
{ok, Url} = aws_s3_presigned_url:make_presigned_v4_url(Client, put, 3600, <<"bucket">>, <<"key">>, path, <<"key1=value1&key2=value2">>),
219+
HackneyUrl = hackney_url:parse_url(Url),
220+
ParsedQs = hackney_url:parse_qs(HackneyUrl#hackney_url.qs),
221+
Credential = proplists:get_value(<<"X-Amz-Credential">>, ParsedQs),
222+
[AccessKeyId, _ShortDate, Region, Service, Request] = binary:split(Credential, <<"/">>, [global]),
223+
?assertEqual(https, HackneyUrl#hackney_url.scheme),
224+
?assertEqual(443, HackneyUrl#hackney_url.port),
225+
?assertEqual("s3.eu-west-1.amazonaws.com", HackneyUrl#hackney_url.host),
226+
?assertEqual(<<"/bucket/key">>, HackneyUrl#hackney_url.path),
227+
?assertEqual(7, length(ParsedQs)),
228+
?assertEqual(<<"AccessKeyID">>, AccessKeyId),
229+
?assertEqual(<<"eu-west-1">>, Region),
230+
?assertEqual(<<"s3">>, Service),
231+
?assertEqual(<<"aws4_request">>, Request),
232+
?assertEqual(<<"AWS4-HMAC-SHA256">>, proplists:get_value(<<"X-Amz-Algorithm">>, ParsedQs)),
233+
?assertEqual(<<"3600">>, proplists:get_value(<<"X-Amz-Expires">>, ParsedQs)),
234+
?assertEqual(<<"Token">>, proplists:get_value(<<"X-Amz-Security-Token">>, ParsedQs)),
235+
?assertEqual(<<"host;x-amz-tagging">>, proplists:get_value(<<"X-Amz-SignedHeaders">>, ParsedQs)).
200236
-endif.

0 commit comments

Comments
 (0)