-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 => <>, 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 => <>, 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 => <>, 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.