Packages
🐑 a fluffy Gleam web server
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
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([init/1, loop/4]).
-export_type([handler/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 handler() :: {http1,
ewe@internal@http1@handler:http1_handler(),
gleam@erlang@process:subject(nil)}.
-file("src/ewe/internal/handler.gleam", 20).
?DOC(false).
-spec init(any()) -> {handler(),
gleam@option:option(gleam@erlang@process:selector(nil))}.
init(_) ->
Subject = gleam@erlang@process:new_subject(),
Selector = begin
_pipe = gleam_erlang_ffi:new_selector(),
gleam@erlang@process:select(_pipe, Subject)
end,
{{http1, ewe@internal@http1@handler:init(), Subject}, {some, Selector}}.
-file("src/ewe/internal/handler.gleam", 31).
?DOC(false).
-spec loop(
fun((gleam@http@request:request(ewe@internal@http1:connection())) -> gleam@http@response:response(ewe@internal@http1:response_body())),
gleam@http@response:response(ewe@internal@http1:response_body()),
gleam@erlang@process:name(gleam@otp@factory_supervisor:message(fun(() -> {ok,
gleam@otp@actor:started(nil)} |
{error, gleam@otp@actor:start_error()}), nil)),
integer()
) -> fun((handler(), glisten:message(nil), glisten:connection(nil)) -> glisten:next(handler(), glisten:message(nil))).
loop(Handler, On_crash, Factory_name, Idle_timeout) ->
fun(State, Message, Conn) ->
Sender = erlang:element(4, Conn),
Conn@1 = ewe@internal@http1:transform_connection(Conn, Factory_name),
case {State, Message} of
{{http1, State@1, Self}, {packet, Message@1}} ->
Result = ewe@internal@http1@handler:handle_packet(
State@1,
Conn@1,
Message@1,
Sender,
Handler,
On_crash,
Idle_timeout
),
case Result of
{continue, State@2} ->
glisten:continue({http1, State@2, Self});
{http2_upgrade, {over_cleartext, _, _}} ->
logging:log(
debug,
<<"Received HTTP/2 cleartext upgrade request"/utf8>>
),
glisten:stop();
{http2_upgrade, _} ->
logging:log(
debug,
<<"Received HTTP/2 upgrade request"/utf8>>
),
glisten:stop();
stop ->
glisten:stop()
end;
{_, _} ->
glisten:stop()
end
end.