Class: RubyBox::Session

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby-box/session.rb

Constant Summary collapse

OAUTH2_URLS =
{
  :site => 'https://www.box.com',
  :authorize_url => "/api/oauth2/authorize",
  :token_url => "/api/oauth2/token"
}

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ Session

Returns a new instance of Session.



12
13
14
15
16
17
18
19
20
21
# File 'lib/ruby-box/session.rb', line 12

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

Instance Method Details

#authorize_url(redirect_uri) ⇒ Object



23
24
25
26
# File 'lib/ruby-box/session.rb', line 23

def authorize_url(redirect_uri)
  @redirect_uri = redirect_uri
  @oauth2_client.auth_code.authorize_url(:redirect_uri => redirect_uri)
end

#build_auth_headerObject



37
38
39
# File 'lib/ruby-box/session.rb', line 37

def build_auth_header
  "BoxAuth api_key=#{@api_key}&auth_token=#{@auth_token}"
end

#delete(url, raw = false) ⇒ Object



47
48
49
50
51
# File 'lib/ruby-box/session.rb', line 47

def delete(url, raw=false)
  uri = URI.parse(url)
  request = Net::HTTP::Delete.new( uri.request_uri )
  resp = request( uri, request, raw )
end

#do_stream(url, opts) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/ruby-box/session.rb', line 80

def do_stream(url, opts)
  params = {
    :content_length_proc => opts[:content_length_proc],
    :progress_proc => opts[:progress_proc]        
  }

  if @access_token
    params['Authorization'] = "Bearer #{@access_token.token}"
  else
    params['Authorization'] = build_auth_header
  end

  open(url, params)
end

#get(url, raw = false) ⇒ Object



41
42
43
44
45
# File 'lib/ruby-box/session.rb', line 41

def get(url, raw=false)
  uri = URI.parse(url)
  request = Net::HTTP::Get.new( uri.request_uri )
  resp = request( uri, request, raw )
end

#get_access_token(code) ⇒ Object



28
29
30
# File 'lib/ruby-box/session.rb', line 28

def get_access_token(code)
  @access_token = @oauth2_client.auth_code.get_token(code)
end

#handle_errors(status, body, raw) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/ruby-box/session.rb', line 95

def handle_errors( status, body, raw )
  begin
    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::RequestError.new(parsed_body), parsed_body["message"])
  when 5
    raise RubyBox::ServerError, parsed_body["message"]
  end
  raw ? body : parsed_body
end

#refresh_token(refresh_token) ⇒ Object



32
33
34
35
# File 'lib/ruby-box/session.rb', line 32

def refresh_token(refresh_token)
  refresh_access_token_obj = OAuth2::AccessToken.new(@oauth2_client, @access_token.token, {'refresh_token' => refresh_token})
  @access_token = refresh_access_token_obj.refresh!
end

#request(uri, request, raw = false, retries = 0) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/ruby-box/session.rb', line 53

def request(uri, request, raw=false, retries=0)

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.ssl_version = :SSLv3
  
  if @access_token
    request.add_field('Authorization', "Bearer #{@access_token.token}")
  else
    request.add_field('Authorization', build_auth_header)
  end

  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