Current section

Files

Jump to
dove src dove@request.erl
Raw

src/dove@request.erl

-module(dove@request).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function]).
-export([encode/6]).
-spec is_valid_header_name(binary()) -> boolean().
is_valid_header_name(Name) ->
_pipe = Name,
_pipe@1 = gleam@string:to_utf_codepoints(_pipe),
_pipe@2 = gleam@list:map(_pipe@1, fun gleam@string:utf_codepoint_to_int/1),
gleam@list:all(_pipe@2, fun(Code) -> case Code of
_ when Code =< 32 ->
false;
_ when Code =:= 34 ->
false;
_ when Code =:= 40 ->
false;
_ when Code =:= 41 ->
false;
_ when Code =:= 44 ->
false;
_ when Code =:= 47 ->
false;
_ when Code =:= 58 ->
false;
_ when Code =:= 59 ->
false;
_ when Code =:= 60 ->
false;
_ when Code =:= 61 ->
false;
_ when Code =:= 62 ->
false;
_ when Code =:= 63 ->
false;
_ when Code =:= 64 ->
false;
_ when Code =:= 91 ->
false;
_ when Code =:= 92 ->
false;
_ when Code =:= 93 ->
false;
_ when Code =:= 123 ->
false;
_ when Code =:= 125 ->
false;
_ when Code =:= 127 ->
false;
_ ->
true
end end).
-spec is_valid_header_value(binary()) -> boolean().
is_valid_header_value(Name) ->
_pipe = Name,
_pipe@1 = gleam@string:to_utf_codepoints(_pipe),
_pipe@2 = gleam@list:map(_pipe@1, fun gleam@string:utf_codepoint_to_int/1),
gleam@list:all(_pipe@2, fun(Code) -> case Code of
_ when Code =< 31 ->
false;
_ when Code =:= 127 ->
false;
_ ->
true
end end).
-spec bail_if_invalid_header(
list({binary(), binary()}),
fun(() -> {ok, HHL} | {error, dove@error:error()})
) -> {ok, HHL} | {error, dove@error:error()}.
bail_if_invalid_header(Headers, Rest) ->
case gleam@list:find_map(
Headers,
fun(Header) ->
case [is_valid_header_name(erlang:element(1, Header)),
is_valid_header_value(erlang:element(2, Header))] of
[false, _] ->
{ok, {invalid_header_name, Header}};
[_, false] ->
{ok, {invalid_header_value, Header}};
[true, true] ->
{error, nil}
end
end
) of
{ok, Error} ->
{error, Error};
{error, nil} ->
Rest()
end.
-spec request_line(binary(), binary()) -> binary().
request_line(Method, Path) ->
_pipe = [Method, Path, <<"HTTP/1.1\r\n"/utf8>>],
gleam@string:join(_pipe, <<" "/utf8>>).
-spec encode_header({binary(), binary()}) -> binary().
encode_header(Header) ->
_pipe = [erlang:element(1, Header), erlang:element(2, Header)],
_pipe@1 = gleam@string:join(_pipe, <<":"/utf8>>),
gleam@string:append(_pipe@1, <<"\r\n"/utf8>>).
-spec encode(
binary(),
binary(),
binary(),
list({binary(), binary()}),
list({binary(), binary()}),
gleam@option:option(binary())
) -> {ok, bitstring()} | {error, dove@error:error()}.
encode(Host, Method, Path, Query_params, Headers, Body) ->
bail_if_invalid_header(
Headers,
fun() ->
Headers@1 = gleam@list:prepend(Headers, {<<"host"/utf8>>, Host}),
Path@1 = <<Path/binary,
(gleam@list:fold(
Query_params,
<<""/utf8>>,
fun(Acc, Param) -> case gleam@string:length(Acc) =:= 0 of
true ->
<<<<<<"?"/utf8,
(erlang:element(1, Param))/binary>>/binary,
"="/utf8>>/binary,
(erlang:element(2, Param))/binary>>;
false ->
<<<<<<<<Acc/binary, "&"/utf8>>/binary,
(erlang:element(1, Param))/binary>>/binary,
"="/utf8>>/binary,
(erlang:element(2, Param))/binary>>
end end
))/binary>>,
_pipe@1 = (<<<<<<(request_line(Method, Path@1))/binary,
(begin
_pipe = gleam@list:map(
Headers@1,
fun encode_header/1
),
gleam@string:join(_pipe, <<""/utf8>>)
end)/binary>>/binary,
"\r\n"/utf8>>/binary,
((case Body of
{some, Body@1} ->
Body@1;
none ->
<<""/utf8>>
end))/binary>>),
_pipe@2 = gleam_stdlib:identity(_pipe@1),
{ok, _pipe@2}
end
).