Current section

Files

Jump to
ewe src ewe@internal@handler.erl
Raw

src/ewe@internal@handler.erl

-module(ewe@internal@handler).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/ewe/internal/handler.gleam").
-export([loop/2]).
-export_type([exit_reason/0, next/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-type exit_reason() :: normal | {abnormal, binary()}.
-type next() :: continue | {stop, exit_reason()}.
-file("src/ewe/internal/handler.gleam", 67).
?DOC(false).
-spec handle_resp_body(
gleam@http@request:request(ewe@internal@http:connection()),
gleam@http@response:response(ewe@internal@http:response_body()),
ewe@internal@http:response_body()
) -> next().
handle_resp_body(Req, Resp, Body) ->
Http_version@1 = case erlang:element(5, erlang:element(4, Req)) of
{some, Http_version} -> Http_version;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"ewe/internal/handler"/utf8>>,
function => <<"handle_resp_body"/utf8>>,
line => 72,
value => _assert_fail,
start => 1762,
'end' => 1822,
pattern_start => 1773,
pattern_end => 1798})
end,
Bytes@1 = case Body of
{text_data, Text} ->
gleam_stdlib:wrap_list(Text);
{string_tree_data, String_tree} ->
gleam_stdlib:wrap_list(String_tree);
{bits_data, Bits} ->
gleam@bytes_tree:from_bit_array(Bits);
{bytes_data, Bytes} ->
Bytes;
empty ->
gleam@bytes_tree:new();
_ ->
erlang:error(#{gleam_error => panic,
message => <<"`panic` expression evaluated."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"ewe/internal/handler"/utf8>>,
function => <<"handle_resp_body"/utf8>>,
line => 80})
end,
Sent = begin
_pipe = gleam@http@response:set_body(Resp, Bytes@1),
_pipe@1 = ewe@internal@http:append_default_headers(
_pipe,
Http_version@1
),
_pipe@2 = ewe@internal@encoder:encode_response(_pipe@1),
glisten@transport:send(
erlang:element(2, erlang:element(4, Req)),
erlang:element(3, erlang:element(4, Req)),
_pipe@2
)
end,
case Sent of
{ok, nil} ->
continue;
{error, _} ->
{stop, normal}
end.
-file("src/ewe/internal/handler.gleam", 48).
?DOC(false).
-spec call_handler(
gleam@http@request:request(ewe@internal@http:connection()),
fun((gleam@http@request:request(ewe@internal@http:connection())) -> gleam@http@response:response(ewe@internal@http:response_body())),
gleam@http@response:response(ewe@internal@http:response_body())
) -> next().
call_handler(Req, Handler, On_crash) ->
Resp = begin
_pipe = ewe_ffi:rescue(fun() -> Handler(Req) end),
_pipe@1 = gleam@result:map_error(_pipe, fun(_) -> On_crash end),
gleam@result:unwrap_both(_pipe@1)
end,
case Resp of
{response, _, _, {websocket_connection, Selector}} ->
_ = gleam_erlang_ffi:select(Selector),
{stop, normal};
{response, _, _, Body} ->
handle_resp_body(Req, Resp, Body)
end.
-file("src/ewe/internal/handler.gleam", 28).
?DOC(false).
-spec loop(
fun((gleam@http@request:request(ewe@internal@http:connection())) -> gleam@http@response:response(ewe@internal@http:response_body())),
gleam@http@response:response(ewe@internal@http:response_body())
) -> fun((ewe@internal@http:connection(), glisten:message(KKC), glisten:connection(KKC)) -> glisten:next(ewe@internal@http:connection(), glisten:message(KKC))).
loop(Handler, On_crash) ->
fun(Http_conn, Msg, _) ->
Msg@2 = case Msg of
{packet, Msg@1} -> Msg@1;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"ewe/internal/handler"/utf8>>,
function => <<"loop"/utf8>>,
line => 33,
value => _assert_fail,
start => 722,
'end' => 758,
pattern_start => 733,
pattern_end => 752})
end,
_pipe = ewe@internal@http:parse_request(Http_conn, Msg@2),
_pipe@1 = gleam@result:map(
_pipe,
fun(Req) -> case call_handler(Req, Handler, On_crash) of
continue ->
glisten:continue(Http_conn);
{stop, normal} ->
glisten:stop();
{stop, {abnormal, Reason}} ->
glisten:stop_abnormal(Reason)
end end
),
_pipe@2 = gleam@result:replace_error(_pipe@1, glisten:stop()),
gleam@result:unwrap_both(_pipe@2)
end.