Skip to content

Instantly share code, notes, and snippets.

@teamon
Created December 20, 2016 10:42
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save teamon/6bf2a0d6e34ec3bf0af7a33629ecfa18 to your computer and use it in GitHub Desktop.
Save teamon/6bf2a0d6e34ec3bf0af7a33629ecfa18 to your computer and use it in GitHub Desktop.
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