class Gitlab::Triage::Network
Constants
- MINIMUM_RATE_LIMIT
- TokenNotFound
Attributes
adapter[R]
options[R]
Public Class Methods
new(adapter)
click to toggle source
# File lib/gitlab/triage/network.rb, line 18 def initialize(adapter) @adapter = adapter @options = adapter.options @cache = {} end
Public Instance Methods
post_api(url, body)
click to toggle source
# File lib/gitlab/triage/network.rb, line 64 def post_api(url, body) response = execute_with_retry( exception_types: Net::ReadTimeout, backoff_exceptions: Errors::Network::TooManyRequests) do puts Gitlab::Triage::UI.debug "post_api: #{url}" if options.debug @adapter.post(token, url, body) end rate_limit_debug(response) if options.debug rate_limit_wait(response) results = response.delete(:results) case results when Hash results.with_indifferent_access else raise_unexpected_response(results) end rescue Net::ReadTimeout {} end
query_api(url)
click to toggle source
# File lib/gitlab/triage/network.rb, line 28 def query_api(url) response = {} resources = [] begin print '.' url = response.fetch(:next_page_url) { url } response = execute_with_retry( exception_types: [Net::ReadTimeout, Errors::Network::InternalServerError], backoff_exceptions: Errors::Network::TooManyRequests) do puts Gitlab::Triage::UI.debug "query_api: #{url}" if options.debug @adapter.get(token, url) end results = response.delete(:results) case results when Array resources.concat(results) when Hash resources << results else raise_unexpected_response(results) end rate_limit_debug(response) if options.debug rate_limit_wait(response) end while response.delete(:more_pages) resources.map!(&:with_indifferent_access) rescue Net::ReadTimeout [] end
query_api_cached(url)
click to toggle source
# File lib/gitlab/triage/network.rb, line 24 def query_api_cached(url) @cache[url] || @cache[url] = query_api(url) end
Private Instance Methods
raise_unexpected_response(results)
click to toggle source
# File lib/gitlab/triage/network.rb, line 106 def raise_unexpected_response(results) raise Errors::Network::UnexpectedResponse, "Unexpected response: #{results.inspect}" end
rate_limit_debug(response)
click to toggle source
# File lib/gitlab/triage/network.rb, line 94 def rate_limit_debug(response) rate_limit_infos = "Rate limit remaining: #{response[:ratelimit_remaining]} (reset at #{response[:ratelimit_reset_at]})" puts Gitlab::Triage::UI.debug "rate_limit_infos: #{rate_limit_infos}" end
rate_limit_wait(response)
click to toggle source
# File lib/gitlab/triage/network.rb, line 99 def rate_limit_wait(response) return unless response.delete(:ratelimit_remaining) < MINIMUM_RATE_LIMIT puts Gitlab::Triage::UI.debug "Rate limit almost exceeded, sleeping for #{response[:ratelimit_reset_at] - Time.now} seconds" if options.debug sleep(1) until Time.now >= response[:ratelimit_reset_at] end
token()
click to toggle source
# File lib/gitlab/triage/network.rb, line 90 def token options.token || raise(TokenNotFound) end