lib/gitlab/request.rb in gitlab-4.17.0 vs lib/gitlab/request.rb in gitlab-4.18.0

- old
+ new

@@ -6,10 +6,11 @@ module Gitlab # @private class Request include HTTParty format :json + maintain_method_across_redirects true headers 'Accept' => 'application/json', 'Content-Type' => 'application/x-www-form-urlencoded' parser(proc { |body, _| parse(body) }) attr_accessor :private_token, :endpoint @@ -46,11 +47,22 @@ unless params[:unauthenticated] params[:headers] ||= {} params[:headers].merge!(authorization_header) end - validate self.class.send(method, @endpoint + path, params) + retries_left = params[:ratelimit_retries] || 3 + begin + response = self.class.send(method, endpoint + path, params) + validate response + rescue Gitlab::Error::TooManyRequests => e + retries_left -= 1 + raise e if retries_left.zero? + + wait_time = response.headers['Retry-After'] || 2 + sleep(wait_time.to_i) + retry + end end end # Checks the response code for common errors. # Returns parsed response for successful requests. @@ -65,11 +77,11 @@ end # Sets a base_uri and default_params for requests. # @raise [Error::MissingCredentials] if endpoint not set. def request_defaults(sudo = nil) - raise Error::MissingCredentials, 'Please set an endpoint to API' unless @endpoint + raise Error::MissingCredentials, 'Please set an endpoint to API' unless endpoint self.class.default_params sudo: sudo self.class.default_params.delete(:sudo) if sudo.nil? end @@ -77,15 +89,15 @@ # Returns an Authorization header hash # # @raise [Error::MissingCredentials] if private_token and auth_token are not set. def authorization_header - raise Error::MissingCredentials, 'Please provide a private_token or auth_token for user' unless @private_token + raise Error::MissingCredentials, 'Please provide a private_token or auth_token for user' unless private_token - if @private_token.size < 21 - { 'PRIVATE-TOKEN' => @private_token } + if private_token.size < 21 + { 'PRIVATE-TOKEN' => private_token } else - { 'Authorization' => "Bearer #{@private_token}" } + { 'Authorization' => "Bearer #{private_token}" } end end # Set HTTParty configuration # @see https://github.com/jnunemaker/httparty