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