Current section
Files
Jump to
Current section
Files
lib/utils.ex
defmodule ElixirBceSdk.Utils do
@moduledoc """
module about some utility functions
"""
@bos_max_user_metadata_size 2 * 1024
def maybe_put(map, _key, nil), do: map
def maybe_put(map, key, value), do: Map.put(map, key, value)
def to_s(s) when is_map(s), do: Poison.encode!(s)
def to_s(s), do: to_string(s)
def to_s_down(s) when is_map(s), do: Poison.encode!(s) |> String.downcase()
def to_s_down(s), do: to_string(s) |> String.downcase()
def to_s_trim(s) when is_map(s), do: Poison.encode!(s) |> String.trim()
def to_s_trim(s), do: to_string(s) |> String.trim()
def urlencode(s), do: URI.encode(s, &URI.char_unreserved?(&1))
def to_s_encode(s) when is_map(s), do: Poison.encode!(s) |> urlencode()
def to_s_encode(s), do: to_string(s) |> urlencode()
def to_s_down_encode(s), do: to_s_down(s) |> urlencode()
def to_s_trim_encode(s), do: to_s_trim(s) |> urlencode()
def get_md5_from_file(file_name, buf_size \\ 8192) do
File.stream!(file_name, [], buf_size)
|> Enum.reduce(:crypto.hash_init(:md5), fn(line, acc) -> :crypto.hash_update(acc, line) end)
|> :crypto.hash_final()
|> Base.encode64()
end
def populate_headers_with_user_metadata(%{"user-metadata" => %{} = user_metadata} = headers) do
meta_size = 0
{headers, meta_size} = Enum.reduce(user_metadata, {headers, meta_size},fn {k,v}, acc ->
{headers, size} = acc
normalized_key = "x-bce-meta-" <> k
size = size + String.length(normalized_key)
size = size + String.length(v)
{Map.put(headers, normalized_key, v), size}
end)
if meta_size > @bos_max_user_metadata_size do
raise BceClientException, message: "metadata size should not be greater than #{@bos_max_user_metadata_size}"
end
Map.delete(headers, "user-metadata")
end
end