-module(nine_cowboy_util).
-export([get_path/1, not_found/1, redirect/2, json_response/3, bearer/1, serve_priv_file/3, join_path/1]).
get_path(Req) ->
Path = cowboy_req:path(Req),
split_path(Path).
split_path(Path) ->
string:split(Path, <<"/">>, all).
not_found(#{req := Req} = Context) ->
Resp = cowboy_req:reply(
404,
#{<<"Content-Type">> => <<"text/plain">>},
<<"Not Found">>,
Req
),
Context#{resp => Resp}.
redirect(#{req := Req} = Context, RedirectPath) ->
Resp = cowboy_req:reply(
302,
#{<<"Location">> => RedirectPath},
<<>>,
Req
),
Context#{resp => Resp}.
bearer(Req) ->
case cowboy_req:header(<<"Authorization">>, Req, undefined) of
undefined -> undefined;
Bearer ->
case string:prefix(Bearer, <<"Bearer ">>) of
nomatch ->
undefined;
Token ->
Token
end
end.
json_response(Status, Body, Req) ->
cowboy_req:reply(
Status,
#{<<"Content-Type">> => <<"application/json">>},
thoas:encode(Body),
Req
).
serve_priv_file(App, Req, Path) ->
StrippedPath = strip_dots(Path),
PrivPath = filename:join(code:priv_dir(App), StrippedPath),
Mimetype = mimetypes:filename(PrivPath),
case file:read_file(PrivPath) of
{ok, Bin} ->
cowboy_req:reply(
200,
#{<<"Content-Type">> => Mimetype},
Bin,
Req
);
{error, _Error} ->
cowboy_req:reply(404, #{}, <<>>, Req)
end.
strip_dots(Path) ->
list_to_binary(string:trim(string:replace(Path, <<"..">>, <<>>, all), leading, "/")).
join_path(L) ->
join_path(L, []).
join_path([], Acc) ->
list_to_binary(lists:reverse(Acc));
join_path([Part], Acc) ->
join_path([], [Part | Acc]);
join_path([<<>> | T], Acc) ->
join_path(T, Acc);
join_path([H | T], Acc) ->
join_path(T, [[H, <<"/">>] | Acc]).