Packages
oidcc
3.2.0-beta.2
3.7.2
3.7.1
3.7.0
3.6.0
3.5.2
3.5.1
3.5.0
retired
3.4.0
3.3.0
3.2.6
3.2.5
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
3.2.0-beta.3
3.2.0-beta.2
retired
3.2.0-beta.1
retired
3.1.2
3.1.2-beta.1
retired
3.1.1
retired
3.1.0
retired
3.1.0-beta.2
retired
3.1.0-beta.1
retired
3.0.2
3.0.1
retired
3.0.0
retired
3.0.0-rc.6
retired
3.0.0-rc.5
retired
3.0.0-rc.4
retired
3.0.0-rc.3
retired
3.0.0-rc.2
retired
3.0.0-rc.1
retired
3.0.0-alpha.5
retired
3.0.0-alpha.4
retired
3.0.0-alpha.3
retired
3.0.0-alpha.2
retired
3.0.0-alpha.1
retired
2.0.0-alpha.2
retired
2.0.0-alpha.1
retired
1.8.1
retired
1.8.0
retired
1.7.0
retired
1.6.0
retired
1.5.1
retired
1.5.0
retired
1.4.0
retired
1.3.0
retired
1.2.1
retired
1.2.0
retired
1.1.0
retired
1.0.1
retired
1.0.0
retired
OpenID Connect client library for the BEAM.
Retired package: Security issue - DoS Vulnerability, see https://github.com/erlef/oidcc/security/advisories/GHSA-mj35-2rgf-cv8p
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
src/oidcc_backoff.erl
%%%-------------------------------------------------------------------
%% @doc Backoff Handling
%%
%% Based on `db_connection':
%% [https://github.com/elixir-ecto/db_connection/blob/8ef1f2ea54922873590b8939f2dad6b031c5b49c/lib/db_connection/backoff.ex#L24]
%% @end
%% @since 3.2.0
%%%-------------------------------------------------------------------
-module(oidcc_backoff).
-export_type([type/0]).
-export_type([min/0]).
-export_type([max/0]).
-export_type([state/0]).
-export([handle_retry/4]).
-type type() :: stop | exponential | random | random_exponential.
-type min() :: pos_integer().
-type max() :: pos_integer().
-opaque state() :: pos_integer() | {pos_integer(), pos_integer()}.
%% @private
-spec handle_retry(Type, Min, Max, State) -> stop | {Wait, State} when
Type :: type(), Min :: min(), Max :: max(), State :: undefined | state(), Wait :: pos_integer().
handle_retry(Type, Min, Max, State) when Min > 0, Max > 0, Max >= Min ->
priv_handle_retry(Type, Min, Max, State).
-spec priv_handle_retry(Type, Min, Max, State) -> stop | {Wait, State} when
Type :: type(), Min :: min(), Max :: max(), State :: undefined | state(), Wait :: pos_integer().
priv_handle_retry(stop, _Min, _Max, undefined) ->
stop;
priv_handle_retry(random, Min, Max, State) ->
{rand(Min, Max), State};
priv_handle_retry(exponential, Min, _Max, undefined) ->
{Min, Min};
priv_handle_retry(exponential, _Min, Max, State) ->
Wait = min(State * 2, Max),
{Wait, Wait};
priv_handle_retry(random_exponential, Min, Max, undefined) ->
Lower = max(Min, Max div 3),
priv_handle_retry(random_exponential, Min, Max, {Lower, Lower});
priv_handle_retry(random_exponential, _Min, Max, {Prev, Lower}) ->
NextMin = min(Prev, Lower),
NextMax = min(Prev * 3, Max),
Next = rand(NextMin, NextMax),
priv_handle_retry(random, NextMin, NextMax, {Next, Lower}).
rand(Min, Max) -> rand:uniform(Max - Min + 1) + Min - 1.