1 |
|
-module(mod_http_upload_api). |
2 |
|
|
3 |
|
-export([get_urls/5, get_urls_mongooseimctl/5]). |
4 |
|
|
5 |
|
-ignore_xref([get_urls_mongooseimctl/5]). |
6 |
|
|
7 |
|
-spec get_urls_mongooseimctl(Domain :: jid:lserver(), Filename :: binary(), Size :: pos_integer(), |
8 |
|
ContentType :: binary() | undefined, Timeout :: pos_integer()) -> |
9 |
|
{ok | error, string()}. |
10 |
|
get_urls_mongooseimctl(_Domain, _Filename, Size, _ContentType, _Timeout) when Size =< 0 -> |
11 |
:-( |
{error, "size must be positive integer"}; |
12 |
|
get_urls_mongooseimctl(_Domain, _Filename, _Size, _ContentType, Timeout) when Timeout =< 0 -> |
13 |
:-( |
{error, "timeout must be positive integer"}; |
14 |
|
get_urls_mongooseimctl(Domain, Filename, Size, ContentType, Timeout) -> |
15 |
:-( |
case get_urls(Domain, Filename, Size, ContentType, Timeout) of |
16 |
|
{ok, #{<<"putUrl">> := PutURL, <<"getUrl">> := GetURL, <<"headers">> := Headers}} -> |
17 |
:-( |
{ok, generate_output_message(PutURL, GetURL, Headers)}; |
18 |
|
{_, Message} -> |
19 |
:-( |
{error, Message} |
20 |
|
end. |
21 |
|
|
22 |
|
-spec get_urls(Domain :: jid:lserver(), Filename :: nonempty_binary(), Size :: pos_integer(), |
23 |
|
ContentType :: binary() | null | undefined, Timeout :: pos_integer()) -> |
24 |
|
{ok, #{binary() => term()}} |
25 |
|
| {size_error | timeout_error | module_not_loaded_error | domain_not_found | |
26 |
|
file_too_large_error, string()}. |
27 |
|
get_urls(Domain, Filename, Size, ContentType, Timeout) -> |
28 |
:-( |
ContentType1 = content_type(ContentType), |
29 |
:-( |
case mongoose_domain_api:get_domain_host_type(Domain) of |
30 |
|
{ok, HostType} -> |
31 |
:-( |
check_module_and_get_urls(HostType, Filename, Size, ContentType1, Timeout); |
32 |
|
_ -> |
33 |
:-( |
{domain_not_found, "domain does not exist"} |
34 |
|
end. |
35 |
|
|
36 |
:-( |
content_type(null) -> undefined; |
37 |
:-( |
content_type(<<>>) -> undefined; |
38 |
:-( |
content_type(Binary) -> Binary. |
39 |
|
|
40 |
|
check_module_and_get_urls(HostType, Filename, Size, ContentType, Timeout) -> |
41 |
:-( |
case gen_mod:is_loaded(HostType, mod_http_upload) of |
42 |
|
true -> |
43 |
:-( |
case mod_http_upload:get_urls(HostType, Filename, Size, ContentType, Timeout) of |
44 |
|
{PutURL, GetURL, Headers} -> |
45 |
:-( |
Headers1 = lists:map(fun({Name, Value}) -> {ok, #{<<"name">> => Name, <<"value">> => Value}} end, |
46 |
|
maps:to_list(Headers)), |
47 |
:-( |
{ok, #{<<"putUrl">> => PutURL, <<"getUrl">> => GetURL, |
48 |
|
<<"headers">> => Headers1}}; |
49 |
|
file_too_large_error -> |
50 |
:-( |
{file_too_large_error, |
51 |
|
"Declared file size exceeds the host's maximum file size."} |
52 |
|
end; |
53 |
|
false -> |
54 |
:-( |
{module_not_loaded_error, "mod_http_upload is not loaded for this host"} |
55 |
|
end. |
56 |
|
|
57 |
|
-spec generate_output_message(PutURL :: binary(), |
58 |
|
GetURL :: binary(), |
59 |
|
Headers :: [{ok, map()}]) -> string(). |
60 |
|
generate_output_message(PutURL, GetURL, Headers) -> |
61 |
:-( |
PutURLOutput = url_output("PutURL:", PutURL), |
62 |
:-( |
GetURLOutput = url_output("GetURL:", GetURL), |
63 |
:-( |
HeadersOutput = headers_output(Headers), |
64 |
:-( |
lists:flatten([PutURLOutput, GetURLOutput, HeadersOutput]). |
65 |
|
|
66 |
|
url_output(Name, Url) -> |
67 |
:-( |
io_lib:format("~s ~s~n", [Name, Url]). |
68 |
|
|
69 |
|
headers_output(Headers) -> |
70 |
:-( |
List = [{Name, Value} || {ok, #{<<"name">> := Name, <<"value">> := Value}} <- Headers], |
71 |
:-( |
io_lib:format("Header: ~p~n", [List]). |