lib/sdk4me/client.rb in 4me-sdk-1.1.5 vs lib/sdk4me/client.rb in 4me-sdk-1.1.6

- old
+ new

@@ -298,20 +298,20 @@ end module SendWithRateLimitBlock # Wraps the _send method with retries when the server does not respond, see +initialize+ option +:rate_limit_block+ def _send(request, domain = @domain, port = @port, ssl = @ssl) - return super(request, domain, port, ssl) unless option(:block_at_rate_limit) - now = Time.now + return super(request, domain, port, ssl) unless option(:block_at_rate_limit) && option(:max_throttle_time) > 0 + now = nil timed_out = false - # respect the max_retry_time with fallback to max 1 hour and 1 minute wait time - max_retry_time = option(:max_retry_time) > 0 ? option(:max_retry_time) : 3660 begin _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 == 0 ? 300 : [_response.retry_after, 2].max - if (Time.now - now + retry_after) < max_retry_time + 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 @@ -326,24 +326,24 @@ # Wraps the _send method with retries when the server does not respond, see +initialize+ option +:retries+ def _send(request, domain = @domain, port = @port, ssl = @ssl) return super(request, domain, port, ssl) unless option(:max_retry_time) > 0 retries = 0 sleep_time = 1 - now = Time.now + now = nil timed_out = false begin _response = super(request, domain, port, ssl) - # throttling is handled separately - if !_response.success? && !_response.throttled? + now ||= Time.now + if _response.failure? sleep_time *= 2 if (Time.now - now + sleep_time) < option(:max_retry_time) @logger.warn { "Request failed, retry ##{retries += 1} in #{sleep_time} seconds: #{_response.message}" } sleep(sleep_time) else timed_out = true end end - end while !_response.success? && !_response.throttled? && !timed_out + end while _response.failure? && !timed_out _response end end Client.send(:prepend, SendWithRetries) end