Current section
Files
Jump to
Current section
Files
src/glean@providers@http_utils.erl
-module(glean@providers@http_utils).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/glean/providers/http_utils.gleam").
-export([send_post/5]).
-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).
-file("src/glean/providers/http_utils.gleam", 53).
?DOC(false).
-spec apply_headers(
gleam@http@request:request(binary()),
list({binary(), binary()})
) -> gleam@http@request:request(binary()).
apply_headers(Req, Headers) ->
gleam@list:fold(
Headers,
Req,
fun(R, Header) ->
gleam@http@request:set_header(
R,
erlang:element(1, Header),
erlang:element(2, Header)
)
end
).
-file("src/glean/providers/http_utils.gleam", 113).
?DOC(false).
-spec is_retryable(integer()) -> boolean().
is_retryable(Status) ->
((((Status =:= 429) orelse (Status =:= 500)) orelse (Status =:= 502)) orelse (Status
=:= 503))
orelse (Status =:= 504).
-file("src/glean/providers/http_utils.gleam", 62).
?DOC(false).
-spec send_with_retry(
gleam@http@request:request(binary()),
glean@providers@config:provider_config(),
binary(),
integer(),
integer()
) -> {ok, binary()} | {error, glean@error:glean_error()}.
send_with_retry(Req, Config, Provider_name, Attempt, Delay_ms) ->
Http_result = begin
_pipe = gleam@httpc:configure(),
_pipe@1 = gleam@httpc:timeout(_pipe, erlang:element(6, Config)),
gleam@httpc:dispatch(_pipe@1, Req)
end,
case Http_result of
{error, response_timeout} ->
{error, {timeout, erlang:element(6, Config)}};
{error, _} ->
{error,
{provider_error,
Provider_name,
erlang:element(4, Config),
0,
<<"HTTP request failed"/utf8>>}};
{ok, Resp} ->
case erlang:element(2, Resp) of
200 ->
{ok, erlang:element(4, Resp)};
Status ->
case is_retryable(Status) andalso (Attempt < erlang:element(
8,
Config
)) of
true ->
gleam_erlang_ffi:sleep(Delay_ms),
send_with_retry(
Req,
Config,
Provider_name,
Attempt + 1,
Delay_ms * 2
);
false ->
{error,
{provider_error,
Provider_name,
erlang:element(4, Config),
Status,
erlang:element(4, Resp)}}
end
end
end.
-file("src/glean/providers/http_utils.gleam", 14).
?DOC(false).
-spec send_post(
glean@providers@config:provider_config(),
binary(),
binary(),
binary(),
list({binary(), binary()})
) -> {ok, binary()} | {error, glean@error:glean_error()}.
send_post(Config, Provider_name, Url, Body, Extra_headers) ->
Req_result = begin
_pipe = gleam@http@request:to(Url),
gleam@result:map_error(
_pipe,
fun(_) -> {config_error, <<"Invalid URL: "/utf8, Url/binary>>} end
)
end,
case Req_result of
{error, Err} ->
{error, Err};
{ok, Req} ->
Req@1 = begin
_pipe@1 = Req,
_pipe@2 = gleam@http@request:set_method(_pipe@1, post),
_pipe@3 = gleam@http@request:set_header(
_pipe@2,
<<"content-type"/utf8>>,
<<"application/json"/utf8>>
),
_pipe@4 = gleam@http@request:set_body(_pipe@3, Body),
_pipe@5 = apply_headers(_pipe@4, Extra_headers),
apply_headers(
_pipe@5,
gleam@list:map(
erlang:element(5, Config),
fun(H) ->
{erlang:element(1, H), erlang:element(2, H)}
end
)
)
end,
send_with_retry(
Req@1,
Config,
Provider_name,
0,
erlang:element(9, Config)
)
end.