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", 111).
?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 => 116,
value => _assert_fail,
start => 3427,
'end' => 3487,
pattern_start => 3438,
pattern_end => 3463})
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 => 124})
end,
Sent = begin
_pipe = gleam@http@response:set_body(Resp, Bytes@1),
_pipe@1 = ewe@internal@http:append_default_headers(
_pipe,
Req,
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", 85).
?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@2 = gleam@result:map_error(_pipe, fun(_) -> _pipe@1 = On_crash,
gleam@http@response:set_header(
_pipe@1,
<<"connection"/utf8>>,
<<"close"/utf8>>
) end),
gleam@result:unwrap_both(_pipe@2)
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", 43).
?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((nil, glisten:message(KPH), glisten:connection(KPH)) -> glisten:next(nil, glisten:message(KPH))).
loop(Handler, On_crash) ->
fun(State, Msg, Conn) ->
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 => 48,
value => _assert_fail,
start => 1401,
'end' => 1437,
pattern_start => 1412,
pattern_end => 1431})
end,
Http_conn = ewe@internal@http:transform_connection(Conn),
Parsed = ewe@internal@http:parse_request(
Http_conn,
ewe@internal@buffer:new(Msg@2)
),
case Parsed of
{ok, Req} ->
case call_handler(Req, Handler, On_crash) of
continue ->
glisten:continue(State);
{stop, normal} ->
glisten:stop();
{stop, {abnormal, Reason}} ->
glisten:stop_abnormal(Reason)
end;
{error, Reason@1} ->
Status = case Reason@1 of
invalid_version ->
505;
_ ->
400
end,
_ = begin
_pipe = gleam@http@response:new(Status),
_pipe@1 = gleam@http@response:set_body(
_pipe,
gleam@bytes_tree:new()
),
_pipe@2 = gleam@http@response:set_header(
_pipe@1,
<<"connection"/utf8>>,
<<"close"/utf8>>
),
_pipe@3 = ewe@internal@encoder:encode_response(_pipe@2),
glisten@transport:send(
erlang:element(2, Http_conn),
erlang:element(3, Http_conn),
_pipe@3
)
end,
glisten:stop()
end
end.