-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, HQK} | {error, dove@error:error()}) ) -> {ok, HQK} | {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(), gleam@option:option(binary()), list({binary(), binary()}), gleam@option:option(bitstring()) ) -> {ok, bitstring()} | {error, dove@error:error()}. encode(Host, Method, Path, Query, Headers, Body) -> bail_if_invalid_header( Headers, fun() -> Headers@1 = gleam@list:prepend(Headers, {<<"host"/utf8>>, Host}), Path@1 = case Query of none -> Path; {some, Query@1} -> <<<>/binary, Query@1/binary>> end, _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>>), _pipe@2 = gleam_stdlib:identity(_pipe@1), _pipe@3 = gleam@bit_array:append(_pipe@2, case Body of {some, Body@1} -> Body@1; none -> <<>> end), {ok, _pipe@3} end ).