Skip to content

Commit c18d45b

Browse files
author
Kyle Rames
authored
Merge pull request #15 from codeship/access-token2
Retry access token refresh errors
2 parents cf2e572 + 4b6d77e commit c18d45b

File tree

6 files changed

+53
-18
lines changed

6 files changed

+53
-18
lines changed

.ruby-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.3.0
1+
2.4.1

lib/bitbucket_rest_api/error.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def initialize(message)
3333
bad_events
3434
no_events
3535
blank_value
36+
refresh_token
3637
].each do |error|
3738
require "bitbucket_rest_api/error/#{error}"
3839
end
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# encoding: utf-8
2+
3+
module BitBucket #:nodoc
4+
# Raised when BitBucket receives a RefreshToken error
5+
module Error
6+
class RefreshToken < BitBucketError
7+
def initialize(env)
8+
super(env)
9+
end
10+
end
11+
end # Error
12+
end # BitBucket

lib/bitbucket_rest_api/repos/webhooks.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def get(user_name_or_project_key, repo_name, hook_uuid)
6262
_validate_user_repo_params(user, repo) unless user? && repo?
6363

6464
get_request(
65-
"/2.0/repositories/#{user_name}/#{repo_name}/hooks/#{hook_uuid}"
65+
"/2.0/repositories/#{user_name_or_project_key}/#{repo_name}/hooks/#{hook_uuid}"
6666
)
6767
end
6868

lib/bitbucket_rest_api/request.rb

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@ def delete_request(path, params={}, options={})
2828
request(:delete, path, params, options)
2929
end
3030

31+
def retry_token_refresh_errors
32+
count = 0
33+
begin
34+
yield
35+
rescue BitBucket::Error::RefreshToken
36+
count += 1
37+
if count <= 3
38+
sleep 0.3 * count
39+
retry
40+
end
41+
raise
42+
end
43+
end
44+
3145
def request(method, path, params, options={})
3246
if !METHODS.include?(method)
3347
raise ArgumentError, "unkown http method: #{method}"
@@ -36,25 +50,28 @@ def request(method, path, params, options={})
3650

3751
puts "EXECUTED: #{method} - #{path} with #{params} and #{options}" if ENV['DEBUG']
3852

39-
conn = connection(options)
40-
path_prefix = (path.include?('/ssh') && BitBucket.options[:bitbucket_server]) ? '/rest/keys' : conn.path_prefix
41-
path = (path_prefix + path).gsub(/\/\//,'/') if conn.path_prefix != '/'
42-
43-
response = conn.send(method) do |request|
44-
request['Authorization'] = "Bearer #{new_access_token}" unless new_access_token.nil?
45-
case method.to_sym
46-
when *(METHODS - METHODS_WITH_BODIES)
47-
request.body = params.delete('data') if params.has_key?('data')
48-
request.url(path, params)
49-
when *METHODS_WITH_BODIES
50-
request.path = path
51-
unless params.empty?
52-
# data = extract_data_from_params(params)
53-
# request.body = MultiJson.dump(data)
54-
request.body = MultiJson.dump(params)
53+
response = retry_token_refresh_errors do
54+
conn = connection(options)
55+
path_prefix = (path.include?('/ssh') && BitBucket.options[:bitbucket_server]) ? '/rest/keys' : conn.path_prefix
56+
path = (path_prefix + path).gsub(/\/\//,'/') if conn.path_prefix != '/'
57+
58+
response = conn.send(method) do |request|
59+
request['Authorization'] = "Bearer #{new_access_token}" unless new_access_token.nil?
60+
case method.to_sym
61+
when *(METHODS - METHODS_WITH_BODIES)
62+
request.body = params.delete('data') if params.has_key?('data')
63+
request.url(path, params)
64+
when *METHODS_WITH_BODIES
65+
request.path = path
66+
unless params.empty?
67+
# data = extract_data_from_params(params)
68+
# request.body = MultiJson.dump(data)
69+
request.body = MultiJson.dump(params)
70+
end
5571
end
5672
end
5773
end
74+
5875
response.body
5976
end
6077

lib/bitbucket_rest_api/response/raise_error.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
require 'faraday'
44
require 'bitbucket_rest_api/error'
55

6+
REFRESH_TOKEN = %r{Access token expired. Use your refresh token to obtain a new access token.}
7+
68
module BitBucket
79
class Response::RaiseError < Faraday::Response::Middleware
810

@@ -11,6 +13,9 @@ def on_complete(env)
1113
when 400
1214
raise BitBucket::Error::BadRequest.new(env)
1315
when 401
16+
if env[:body] =~ REFRESH_TOKEN
17+
raise BitBucket::Error::RefreshToken.new(env)
18+
end
1419
raise BitBucket::Error::Unauthorized.new(env)
1520
when 403
1621
raise BitBucket::Error::Forbidden.new(env)

0 commit comments

Comments
 (0)