Current section

Files

Jump to
novdom_dev_tools src lustre_dev_tools@server@proxy.erl
Raw

src/lustre_dev_tools@server@proxy.erl

-module(lustre_dev_tools@server@proxy).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([middleware/3, get/0]).
-export_type([proxy/0]).
-type proxy() :: {proxy, binary(), gleam@uri:uri()}.
-spec middleware(
gleam@http@request:request(mist@internal@http:connection()),
gleam@option:option(proxy()),
fun(() -> gleam@http@response:response(mist:response_data()))
) -> gleam@http@response:response(mist:response_data()).
middleware(Req, Proxy, K) ->
case Proxy of
none ->
K();
{some, {proxy, From, To}} ->
gleam@bool:lazy_guard(
not gleam@string:starts_with(erlang:element(8, Req), From),
K,
fun() ->
Internal_error = begin
_pipe = gleam@http@response:new(500),
gleam@http@response:set_body(
_pipe,
{bytes, gleam@bytes_builder:new()}
)
end,
_assert_subject = erlang:element(4, To),
{some, Host} = case _assert_subject of
{some, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail,
module => <<"lustre_dev_tools/server/proxy"/utf8>>,
function => <<"middleware"/utf8>>,
line => 39})
end,
Path = begin
_pipe@1 = erlang:element(8, Req),
_pipe@2 = gleam@string:replace(
_pipe@1,
From,
<<""/utf8>>
),
filepath:join(erlang:element(6, To), _pipe@2)
end,
_assert_subject@1 = mist:read_body(Req, (100 * 1024) * 1024),
{ok, Req@1} = case _assert_subject@1 of
{ok, _} -> _assert_subject@1;
_assert_fail@1 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail@1,
module => <<"lustre_dev_tools/server/proxy"/utf8>>,
function => <<"middleware"/utf8>>,
line => 44})
end,
_pipe@3 = erlang:setelement(
8,
erlang:setelement(
7,
erlang:setelement(6, Req@1, Host),
erlang:element(5, To)
),
Path
),
_pipe@4 = gleam@httpc:send_bits(_pipe@3),
_pipe@5 = gleam@result:map(
_pipe@4,
fun(_capture) ->
gleam@http@response:map(
_capture,
fun gleam_stdlib:wrap_list/1
)
end
),
_pipe@6 = gleam@result:map(
_pipe@5,
fun(_capture@1) ->
gleam@http@response:map(
_capture@1,
fun(Field@0) -> {bytes, Field@0} end
)
end
),
gleam@result:unwrap(_pipe@6, Internal_error)
end
)
end.
-spec get_proxy_from() -> lustre_dev_tools@cli:cli(gleam@option:option(binary())).
get_proxy_from() ->
lustre_dev_tools@cli:do(
lustre_dev_tools@cli:get_flags(),
fun(Flags) ->
lustre_dev_tools@cli:do(
lustre_dev_tools@cli:get_config(),
fun(Config) ->
Flag = gleam@result:nil_error(
glint:get_flag(
Flags,
lustre_dev_tools@cli@flag:proxy_from()
)
),
Toml = gleam@result:nil_error(
tom:get_string(
erlang:element(4, Config),
[<<"lustre-dev"/utf8>>,
<<"start"/utf8>>,
<<"proxy"/utf8>>,
<<"from"/utf8>>]
)
),
_pipe = gleam@result:'or'(Flag, Toml),
_pipe@1 = gleam@option:from_result(_pipe),
lustre_dev_tools@cli:return(_pipe@1)
end
)
end
).
-spec get_proxy_to() -> lustre_dev_tools@cli:cli(gleam@option:option(gleam@uri:uri())).
get_proxy_to() ->
lustre_dev_tools@cli:do(
lustre_dev_tools@cli:get_flags(),
fun(Flags) ->
lustre_dev_tools@cli:do(
lustre_dev_tools@cli:get_config(),
fun(Config) ->
Flag = gleam@result:nil_error(
glint:get_flag(
Flags,
lustre_dev_tools@cli@flag:proxy_to()
)
),
Toml = gleam@result:nil_error(
tom:get_string(
erlang:element(4, Config),
[<<"lustre-dev"/utf8>>,
<<"start"/utf8>>,
<<"proxy"/utf8>>,
<<"to"/utf8>>]
)
),
From = gleam@result:'or'(Flag, Toml),
gleam@bool:guard(
From =:= {error, nil},
lustre_dev_tools@cli:return(none),
fun() ->
{ok, From@1} = case From of
{ok, _} -> From;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail,
module => <<"lustre_dev_tools/server/proxy"/utf8>>,
function => <<"get_proxy_to"/utf8>>,
line => 94})
end,
case gleam@uri:parse(From@1) of
{ok, From@2} ->
lustre_dev_tools@cli:return({some, From@2});
{error, _} ->
lustre_dev_tools@cli:throw(
{invalid_proxy_target, From@1}
)
end
end
)
end
)
end
).
-spec get() -> lustre_dev_tools@cli:cli(gleam@option:option(proxy())).
get() ->
lustre_dev_tools@cli:do(
get_proxy_from(),
fun(From) ->
lustre_dev_tools@cli:do(
get_proxy_to(),
fun(To) -> case {From, To} of
{{some, From@1}, {some, To@1}} ->
lustre_dev_tools@cli:return(
{some, {proxy, From@1, To@1}}
);
{{some, _}, none} ->
lustre_dev_tools@cli:throw(
{incomplete_proxy, [<<"proxy-to"/utf8>>]}
);
{none, {some, _}} ->
lustre_dev_tools@cli:throw(
{incomplete_proxy, [<<"proxy-from"/utf8>>]}
);
{none, none} ->
lustre_dev_tools@cli:return(none)
end end
)
end
).