Module: Sdk4me::SendWithRateLimitBlock

Included in:
Client
Defined in:
lib/sdk4me/client.rb

Instance Method Summary collapse

Instance Method Details

#_send(request, domain = @domain, port = @port, ssl = @ssl) ⇒ Object

Wraps the _send method with retries when the server does not respond, see initialize option :rate_limit_block



328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
# File 'lib/sdk4me/client.rb', line 328

def _send(request, domain = @domain, port = @port, ssl = @ssl)
  return super(request, domain, port, ssl) unless option(:block_at_rate_limit) && option(:max_throttle_time).positive?

  now = nil
  timed_out = false
  response = nil
  loop do
    response = super(request, domain, port, ssl)
    now ||= Time.now
    if response.throttled?
      # if no Retry-After is not provided, the 4me server is very busy, wait 5 minutes
      retry_after = response.retry_after.zero? ? 300 : [response.retry_after, 2].max
      if (Time.now - now + retry_after) < option(:max_throttle_time)
        @logger.warn { "Request throttled, trying again in #{retry_after} seconds: #{response.message}" }
        sleep(retry_after)
      else
        timed_out = true
      end
    end
    break unless response.throttled? && !timed_out
  end
  response
end