Current section

Files

Jump to
launchdarkly_server_sdk src ldclient_event_dispatch_httpc.erl
Raw

src/ldclient_event_dispatch_httpc.erl

%%-------------------------------------------------------------------
%% @doc Event dispatcher
%%
%% @end
%%-------------------------------------------------------------------
-module(ldclient_event_dispatch_httpc).
-behaviour(ldclient_event_dispatch).
%% Behavior callbacks
-export([send/4]).
%%===================================================================
%% Behavior callbacks
%%===================================================================
%% @doc Send events to LaunchDarkly event server
%%
%% @end
-spec send(JsonEvents :: binary(), PayloadId :: uuid:uuid(), Uri :: string(), SdkKey :: string()) -> ok.
send(JsonEvents, PayloadId, Uri, SdkKey) ->
Headers = [
{"Authorization", SdkKey},
{"X-LaunchDarkly-Event-Schema", ldclient_settings:get_event_schema()},
{"User-Agent", ldclient_settings:get_user_agent()},
{"X-LaunchDarkly-Payload-ID", uuid:uuid_to_string(PayloadId)}
],
{ok, {{Version, StatusCode, ReasonPhrase}, _Headers, _Body}} =
httpc:request(post, {Uri, Headers, "application/json", JsonEvents}, [], []),
Result = if
StatusCode < 400 -> ok;
true ->
case is_http_error_code_recoverable(StatusCode) of
true ->
{error, temporary, format_response(Version, StatusCode, ReasonPhrase)};
_ ->
{error, permanent, format_response(Version, StatusCode, ReasonPhrase)}
end
end,
Result.
%%===================================================================
%% Internal functions
%%===================================================================
-spec format_response(Version :: string(), StatusCode :: integer(), ReasonPhrase :: string()) ->
string().
format_response(Version, StatusCode, ReasonPhrase) ->
io_lib:format("~s ~b ~s", [Version, StatusCode, ReasonPhrase]).
-spec is_http_error_code_recoverable(StatusCode :: integer()) -> boolean().
is_http_error_code_recoverable(400) -> true;
is_http_error_code_recoverable(408) -> true;
is_http_error_code_recoverable(429) -> true;
is_http_error_code_recoverable(StatusCode) when StatusCode >= 500 -> true;
is_http_error_code_recoverable(_) -> false.