Created
December 20, 2016 10:42
-
-
Save teamon/6bf2a0d6e34ec3bf0af7a33629ecfa18 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defmodule Sync.Middleware.RateLimit do | |
@defaults [ | |
delay: 2000, | |
max_retries: 5 | |
] | |
def call(env, next, opts) do | |
opts = opts || [] | |
delay = Keyword.get(opts, :delay, @defaults[:delay]) | |
max_retries = Keyword.get(opts, :max_retries, @defaults[:max_retries]) | |
retry(env, next, delay, max_retries) | |
end | |
defp retry(env, next, _delay, retries) when retries <= 1 do | |
Tesla.run(env, next) | |
end | |
defp retry(env, next, delay, retries) do | |
case Tesla.run(env, next) do | |
%{status: 429} -> # rate limit exceeded | |
:timer.sleep(delay) | |
retry(env, next, delay, retries - 1) | |
response -> response | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment