fix(s3): handle extra configured headers correctly
* Header names in config become atoms. (Probably because of blanket `unsafe_atom_key_map/1` in `emqx_config`) * Header names should be normalized to lowercase. (Otherwise signature will be incorrect)
This commit is contained in:
parent
d26f56e99b
commit
33ef964582
|
@ -388,7 +388,7 @@ with_path_and_query_only(Url, Fun) ->
|
||||||
|
|
||||||
%% Users provide headers as a map, but erlcloud expects a list of tuples with string keys and values.
|
%% Users provide headers as a map, but erlcloud expects a list of tuples with string keys and values.
|
||||||
headers_user_to_erlcloud_request(UserHeaders) ->
|
headers_user_to_erlcloud_request(UserHeaders) ->
|
||||||
[{to_list_string(K), V} || {K, V} <- maps:to_list(UserHeaders)].
|
[{string:to_lower(to_list_string(K)), V} || {K, V} <- maps:to_list(UserHeaders)].
|
||||||
|
|
||||||
%% Ehttpc returns operates on headers as a list of tuples with binary keys.
|
%% Ehttpc returns operates on headers as a list of tuples with binary keys.
|
||||||
%% Erlcloud expects a list of tuples with string values and lowcase string keys
|
%% Erlcloud expects a list of tuples with string values and lowcase string keys
|
||||||
|
@ -409,6 +409,8 @@ to_binary(Val) when is_binary(Val) -> Val.
|
||||||
|
|
||||||
to_list_string(Val) when is_binary(Val) ->
|
to_list_string(Val) when is_binary(Val) ->
|
||||||
binary_to_list(Val);
|
binary_to_list(Val);
|
||||||
|
to_list_string(Val) when is_atom(Val) ->
|
||||||
|
atom_to_list(Val);
|
||||||
to_list_string(Val) when is_list(Val) ->
|
to_list_string(Val) when is_list(Val) ->
|
||||||
Val.
|
Val.
|
||||||
|
|
||||||
|
|
|
@ -142,6 +142,22 @@ t_no_acl(Config) ->
|
||||||
|
|
||||||
ok = emqx_s3_client:put_object(Client, Key, <<"data">>).
|
ok = emqx_s3_client:put_object(Client, Key, <<"data">>).
|
||||||
|
|
||||||
|
t_extra_headers(Config0) ->
|
||||||
|
Config = [{extra_headers, #{'Content-Type' => <<"application/json">>}} | Config0],
|
||||||
|
Key = ?config(key, Config),
|
||||||
|
|
||||||
|
Client = client(Config),
|
||||||
|
Data = #{foo => bar},
|
||||||
|
ok = emqx_s3_client:put_object(Client, Key, emqx_utils_json:encode(Data)),
|
||||||
|
|
||||||
|
Url = emqx_s3_client:uri(Client, Key),
|
||||||
|
|
||||||
|
{ok, {{_StatusLine, 200, "OK"}, _Headers, Content}} = httpc:request(Url),
|
||||||
|
?_assertEqual(
|
||||||
|
Data,
|
||||||
|
emqx_utils_json:decode(Content)
|
||||||
|
).
|
||||||
|
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% Helpers
|
%% Helpers
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
@ -154,17 +170,22 @@ client(Config) ->
|
||||||
|
|
||||||
profile_config(Config) ->
|
profile_config(Config) ->
|
||||||
ProfileConfig0 = emqx_s3_test_helpers:base_config(?config(conn_type, Config)),
|
ProfileConfig0 = emqx_s3_test_helpers:base_config(?config(conn_type, Config)),
|
||||||
ProfileConfig1 = maps:put(
|
maps:fold(
|
||||||
bucket,
|
fun inject_config/3,
|
||||||
?config(bucket, Config),
|
ProfileConfig0,
|
||||||
ProfileConfig0
|
#{
|
||||||
),
|
bucket => ?config(bucket, Config),
|
||||||
ProfileConfig2 = emqx_utils_maps:deep_put(
|
[transport_options, pool_type] => ?config(pool_type, Config),
|
||||||
[transport_options, pool_type],
|
[transport_options, headers] => ?config(extra_headers, Config)
|
||||||
ProfileConfig1,
|
}
|
||||||
?config(pool_type, Config)
|
).
|
||||||
),
|
|
||||||
ProfileConfig2.
|
inject_config(_Key, undefined, ProfileConfig) ->
|
||||||
|
ProfileConfig;
|
||||||
|
inject_config(KeyPath, Value, ProfileConfig) when is_list(KeyPath) ->
|
||||||
|
emqx_utils_maps:deep_put(KeyPath, ProfileConfig, Value);
|
||||||
|
inject_config(Key, Value, ProfileConfig) ->
|
||||||
|
maps:put(Key, Value, ProfileConfig).
|
||||||
|
|
||||||
data(Size) ->
|
data(Size) ->
|
||||||
iolist_to_binary([$a || _ <- lists:seq(1, Size)]).
|
iolist_to_binary([$a || _ <- lists:seq(1, Size)]).
|
||||||
|
|
Loading…
Reference in New Issue