lib/ruby-box/session.rb in ruby-box-1.3.1 vs lib/ruby-box/session.rb in ruby-box-1.4.0
- old
+ new
@@ -11,10 +11,11 @@
def initialize(opts={})
if opts[:client_id]
@oauth2_client = OAuth2::Client.new(opts[:client_id], opts[:client_secret], OAUTH2_URLS.dup)
@access_token = OAuth2::AccessToken.new(@oauth2_client, opts[:access_token]) if opts[:access_token]
+ @refresh_token = opts[:refresh_token]
else # Support legacy API for historical reasons.
@api_key = opts[:api_key]
@auth_token = opts[:auth_token]
end
end
@@ -47,11 +48,11 @@
uri = URI.parse(url)
request = Net::HTTP::Delete.new( uri.request_uri )
resp = request( uri, request, raw )
end
- def request(uri, request, raw=false)
+ def request(uri, request, raw=false, retries=0)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.ssl_version = :SSLv3
@@ -64,10 +65,17 @@
response = http.request(request)
if response.is_a? Net::HTTPNotFound
raise RubyBox::ObjectNotFound
end
+
+ # Got unauthorized (401) status, try to refresh the token
+ if response.code.to_i == 401 and @refresh_token and retries == 0
+ refresh_token(@refresh_token)
+ request(uri, request, raw, retries + 1)
+ end
+
handle_errors( response.code.to_i, response.body, raw )
end
def do_stream(url, opts)
params = {
@@ -89,13 +97,18 @@
parsed_body = JSON.parse(body)
rescue
msg = body.nil? || body.empty? ? "no data returned" : body
parsed_body = { "message" => msg }
end
+
+ # status is used to determine whether
+ # we need to refresh the access token.
+ parsed_body["status"] = status
+
case status / 100
when 4
raise(RubyBox::ItemNameInUse.new(parsed_body), parsed_body["message"]) if parsed_body["code"] == "item_name_in_use"
- raise(RubyBox::AuthError.new(parsed_body), parsed_body["message"]) if parsed_body["code"] == "unauthorized" || status == 401
+ raise(RubyBox::AuthError.new(parsed_body), parsed_body["message"]) if parsed_body["code"] == "unauthorized" || status == 401
raise(RubyBox::RequestError.new(parsed_body), parsed_body["message"])
when 5
raise RubyBox::ServerError, parsed_body["message"]
end
raw ? body : parsed_body