Current section

Files

Jump to
mist src mist@encoder.erl
Raw

src/mist@encoder.erl

-module(mist@encoder).
-compile(no_auto_import).
-export([to_bit_builder/1, response_builder/2, status_to_bit_string/1, encode_headers/1]).
-spec to_bit_builder(
gleam@http@response:response(gleam@bit_builder:bit_builder())
) -> gleam@bit_builder:bit_builder().
to_bit_builder(Resp) ->
Body_size = gleam@bit_builder:byte_size(erlang:element(4, Resp)),
Headers = begin
_pipe = gleam@map:from_list(
[{<<"connection"/utf8>>, <<"keep-alive"/utf8>>}]
),
gleam@list:fold(
erlang:element(3, Resp),
_pipe,
fun(Defaults, Tup) ->
{Key, Value} = Tup,
gleam@map:insert(Defaults, Key, Value)
end
)
end,
Body_builder = case Body_size of
0 ->
gleam@bit_builder:new();
_@1 ->
_pipe@1 = gleam@bit_builder:new(),
_pipe@2 = gleam@bit_builder:append_builder(
_pipe@1,
erlang:element(4, Resp)
),
gleam@bit_builder:append(_pipe@2, <<"\r\n"/utf8>>)
end,
_pipe@3 = erlang:element(2, Resp),
_pipe@4 = response_builder(_pipe@3, gleam@map:to_list(Headers)),
gleam@bit_builder:append_builder(_pipe@4, Body_builder).
-spec response_builder(integer(), list({binary(), binary()})) -> gleam@bit_builder:bit_builder().
response_builder(Status, Headers) ->
Status_string = begin
_pipe = Status,
_pipe@1 = gleam@int:to_string(_pipe),
_pipe@2 = gleam@bit_builder:from_string(_pipe@1),
_pipe@3 = gleam@bit_builder:append(_pipe@2, <<" "/utf8>>),
gleam@bit_builder:append(_pipe@3, status_to_bit_string(Status))
end,
_pipe@4 = gleam@bit_builder:new(),
_pipe@5 = gleam@bit_builder:append(_pipe@4, <<"HTTP/1.1 "/utf8>>),
_pipe@6 = gleam@bit_builder:append_builder(_pipe@5, Status_string),
_pipe@7 = gleam@bit_builder:append(_pipe@6, <<"\r\n"/utf8>>),
_pipe@8 = gleam@bit_builder:append_builder(_pipe@7, encode_headers(Headers)),
gleam@bit_builder:append(_pipe@8, <<"\r\n"/utf8>>).
-spec status_to_bit_string(integer()) -> bitstring().
status_to_bit_string(Status) ->
case Status of
101 ->
<<"Switching Protocols"/utf8>>;
200 ->
<<"Ok"/utf8>>;
201 ->
<<"Created"/utf8>>;
202 ->
<<"Accepted"/utf8>>;
204 ->
<<"No Content"/utf8>>;
301 ->
<<"Moved Permanently"/utf8>>;
400 ->
<<"Bad Request"/utf8>>;
401 ->
<<"Unauthorized"/utf8>>;
403 ->
<<"Forbidden"/utf8>>;
404 ->
<<"Not Found"/utf8>>;
405 ->
<<"Method Not Allowed"/utf8>>;
500 ->
<<"Internal Server Error"/utf8>>;
502 ->
<<"Bad Gateway"/utf8>>;
503 ->
<<"Service Unavailable"/utf8>>;
504 ->
<<"Gateway Timeout"/utf8>>
end.
-spec encode_headers(list({binary(), binary()})) -> gleam@bit_builder:bit_builder().
encode_headers(Headers) ->
gleam@list:fold(
Headers,
gleam@bit_builder:new(),
fun(Builder, Tup) ->
{Header, Value} = Tup,
_pipe = Builder,
_pipe@1 = gleam@bit_builder:append_string(_pipe, Header),
_pipe@2 = gleam@bit_builder:append(_pipe@1, <<": "/utf8>>),
_pipe@3 = gleam@bit_builder:append_string(_pipe@2, Value),
gleam@bit_builder:append(_pipe@3, <<"\r\n"/utf8>>)
end
).