Current section

Files

Jump to
dove src dove@response.erl
Raw

src/dove@response.erl

-module(dove@response).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function]).
-export([decode/1]).
-export_type([decode_result/0]).
-type decode_result() :: more |
{eoh, binary()} |
{header, {binary(), binary()}, binary()} |
{status_line, {{integer(), integer()}, integer(), binary()}, binary()}.
-spec decode_headers(binary(), list({binary(), binary()})) -> {ok,
{list({binary(), binary()}), binary()}} |
{error, dove@error:error()}.
decode_headers(Binary, Storage) ->
gleam@result:then(
begin
_pipe = dove_ffi:decode_header(Binary),
gleam@result:replace_error(_pipe, invalid_header)
end,
fun(Result) -> case Result of
{eoh, Rest} ->
{ok, {Storage, Rest}};
{header, Header, Rest@1} ->
decode_headers(Rest@1, gleam@list:append(Storage, [Header]));
more ->
{error, more_needed};
{status_line, _, _} ->
{error, wrong_packet_type}
end end
).
-spec decode(binary()) -> {ok,
{{integer(), list({binary(), binary()}), gleam@option:option(binary())},
binary()}} |
{error, dove@error:error()}.
decode(Response) ->
case dove_ffi:decode_status_line(Response) of
{ok, {status_line, {_, Status, _}, Rest}} ->
gleam@result:then(
decode_headers(Rest, []),
fun(_use0) ->
{Headers, Rest@1} = _use0,
case begin
_pipe = gleam@list:key_find(
Headers,
<<"content-length"/utf8>>
),
_pipe@1 = gleam@result:map(_pipe, fun gleam@int:parse/1),
gleam@result:flatten(_pipe@1)
end of
{ok, 0} ->
{ok, {{Status, Headers, none}, Rest@1}};
{error, nil} ->
{ok, {{Status, Headers, none}, Rest@1}};
{ok, Length} ->
Body = gleam@string:slice(Rest@1, 0, Length),
Rest@2 = gleam@string:slice(
Rest@1,
Length,
gleam@string:length(Rest@1)
),
{ok, {{Status, Headers, {some, Body}}, Rest@2}}
end
end
);
{ok, more} ->
{error, more_needed};
{error, nil} ->
{error, invalid_status_line};
_ ->
{error, wrong_packet_type}
end.