dbox 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +83 -0
- data/README.md +31 -7
- data/TODO.txt +1 -1
- data/VERSION +1 -1
- data/bin/dbox +2 -1
- data/dbox.gemspec +13 -11
- data/lib/dbox.rb +11 -2
- data/lib/dbox/api.rb +130 -66
- data/lib/dbox/cacert.pem +3376 -0
- data/lib/dbox/database.rb +106 -8
- data/lib/dbox/syncer.rb +103 -86
- data/lib/dbox/utils.rb +82 -0
- data/spec/dbox_spec.rb +201 -0
- data/spec/spec_helper.rb +2 -2
- data/vendor/dropbox-ruby-sdk/CHANGELOG +29 -0
- data/vendor/{dropbox-client-ruby → dropbox-ruby-sdk}/LICENSE +1 -1
- data/vendor/dropbox-ruby-sdk/README +7 -0
- data/vendor/dropbox-ruby-sdk/cli_example.rb +197 -0
- data/vendor/dropbox-ruby-sdk/dropbox_controller.rb +57 -0
- data/vendor/dropbox-ruby-sdk/gemspec.rb +25 -0
- data/vendor/dropbox-ruby-sdk/lib/dropbox_sdk.rb +690 -0
- data/vendor/dropbox-ruby-sdk/web_file_browser.rb +184 -0
- metadata +16 -14
- data/vendor/dropbox-client-ruby/README +0 -17
- data/vendor/dropbox-client-ruby/Rakefile +0 -41
- data/vendor/dropbox-client-ruby/config/testing.json.example +0 -16
- data/vendor/dropbox-client-ruby/lib/dropbox.rb +0 -259
- data/vendor/dropbox-client-ruby/manifest +0 -9
- data/vendor/dropbox-client-ruby/test/authenticator_test.rb +0 -53
- data/vendor/dropbox-client-ruby/test/client_test.rb +0 -100
- data/vendor/dropbox-client-ruby/test/util.rb +0 -21
@@ -0,0 +1,184 @@
|
|
1
|
+
# -------------------------------------------------------------------
|
2
|
+
# An example webapp that lets you browse and upload files to Dropbox.
|
3
|
+
# Demonstrates:
|
4
|
+
# - The webapp OAuth process.
|
5
|
+
# - The metadata() and put_file() calls.
|
6
|
+
#
|
7
|
+
# To run:
|
8
|
+
# 1. Install Sinatra $ gem install sinatra
|
9
|
+
# 2. Launch server $ ruby web_file_browser.rb
|
10
|
+
# 3. Browse to http://localhost:4567/
|
11
|
+
# -------------------------------------------------------------------
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'sinatra'
|
15
|
+
require 'pp'
|
16
|
+
require './lib/dropbox_sdk'
|
17
|
+
|
18
|
+
# Get your app's key and secret from https://www.dropbox.com/developers/
|
19
|
+
APP_KEY = ''
|
20
|
+
APP_SECRET = ''
|
21
|
+
ACCESS_TYPE = :app_folder #The two valid values here are :app_folder and :dropbox
|
22
|
+
#The default is :app_folder, but your application might be
|
23
|
+
#set to have full :dropbox access. Check your app at
|
24
|
+
#https://www.dropbox.com/developers/apps
|
25
|
+
|
26
|
+
# -------------------------------------------------------------------
|
27
|
+
# OAuth stuff
|
28
|
+
|
29
|
+
get '/oauth-start' do
|
30
|
+
# OAuth Step 1: Get a request token from Dropbox.
|
31
|
+
db_session = DropboxSession.new(APP_KEY, APP_SECRET)
|
32
|
+
begin
|
33
|
+
db_session.get_request_token
|
34
|
+
rescue DropboxError => e
|
35
|
+
return html_page "Exception in OAuth step 1", "<p>#{h e}</p>"
|
36
|
+
end
|
37
|
+
|
38
|
+
session[:request_db_session] = db_session.serialize
|
39
|
+
|
40
|
+
# OAuth Step 2: Send the user to the Dropbox website so they can authorize
|
41
|
+
# our app. After the user authorizes our app, Dropbox will redirect them
|
42
|
+
# to our '/oauth-callback' endpoint.
|
43
|
+
auth_url = db_session.get_authorize_url url('/oauth-callback')
|
44
|
+
redirect auth_url
|
45
|
+
end
|
46
|
+
|
47
|
+
get '/oauth-callback' do
|
48
|
+
# Finish OAuth Step 2
|
49
|
+
ser = session[:request_db_session]
|
50
|
+
unless ser
|
51
|
+
return html_page "Error in OAuth step 2", "<p>Couldn't find OAuth state in session.</p>"
|
52
|
+
end
|
53
|
+
db_session = DropboxSession.deserialize(ser)
|
54
|
+
|
55
|
+
# OAuth Step 3: Get an access token from Dropbox.
|
56
|
+
begin
|
57
|
+
db_session.get_access_token
|
58
|
+
rescue DropboxError => e
|
59
|
+
return html_page "Exception in OAuth step 3", "<p>#{h e}</p>"
|
60
|
+
end
|
61
|
+
session.delete(:request_db_session)
|
62
|
+
session[:authorized_db_session] = db_session.serialize
|
63
|
+
redirect url('/')
|
64
|
+
# In this simple example, we store the authorized DropboxSession in the web
|
65
|
+
# session hash. A "real" webapp might store it somewhere more persistent.
|
66
|
+
end
|
67
|
+
|
68
|
+
# If we already have an authorized DropboxSession, returns a DropboxClient.
|
69
|
+
def get_db_client
|
70
|
+
if session[:authorized_db_session]
|
71
|
+
db_session = DropboxSession.deserialize(session[:authorized_db_session])
|
72
|
+
begin
|
73
|
+
return DropboxClient.new(db_session, ACCESS_TYPE)
|
74
|
+
rescue DropboxAuthError => e
|
75
|
+
# The stored session didn't work. Fall through and start OAuth.
|
76
|
+
session[:authorized_db_session].delete
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# -------------------------------------------------------------------
|
82
|
+
# File/folder display stuff
|
83
|
+
|
84
|
+
get '/' do
|
85
|
+
# Get the DropboxClient object. Redirect to OAuth flow if necessary.
|
86
|
+
db_client = get_db_client
|
87
|
+
unless db_client
|
88
|
+
redirect url("/oauth-start")
|
89
|
+
end
|
90
|
+
|
91
|
+
# Call DropboxClient.metadata
|
92
|
+
path = params[:path] || '/'
|
93
|
+
begin
|
94
|
+
entry = db_client.metadata(path)
|
95
|
+
rescue DropboxAuthError => e
|
96
|
+
session.delete(:authorized_db_session) # An auth error means the db_session is probably bad
|
97
|
+
return html_page "Dropbox auth error", "<p>#{h e}</p>"
|
98
|
+
rescue DropboxError => e
|
99
|
+
if e.http_response.code == '404'
|
100
|
+
return html_page "Path not found: #{h path}", ""
|
101
|
+
else
|
102
|
+
return html_page "Dropbox API error", "<pre>#{h e.http_response}</pre>"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
if entry['is_dir']
|
107
|
+
render_folder(db_client, entry)
|
108
|
+
else
|
109
|
+
render_file(db_client, entry)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def render_folder(db_client, entry)
|
114
|
+
# Provide an upload form (so the user can add files to this folder)
|
115
|
+
out = "<form action='/upload' method='post' enctype='multipart/form-data'>"
|
116
|
+
out += "<label for='file'>Upload file:</label> <input name='file' type='file'/>"
|
117
|
+
out += "<input type='submit' value='Upload'/>"
|
118
|
+
out += "<input name='folder' type='hidden' value='#{h entry['path']}'/>"
|
119
|
+
out += "</form>" # TODO: Add a token to counter CSRF attacks.
|
120
|
+
# List of folder contents
|
121
|
+
entry['contents'].each do |child|
|
122
|
+
cp = child['path'] # child path
|
123
|
+
cn = File.basename(cp) # child name
|
124
|
+
if (child['is_dir']) then cn += '/' end
|
125
|
+
out += "<div><a style='text-decoration: none' href='/?path=#{h cp}'>#{h cn}</a></div>"
|
126
|
+
end
|
127
|
+
|
128
|
+
html_page "Folder: #{entry['path']}", out
|
129
|
+
end
|
130
|
+
|
131
|
+
def render_file(db_client, entry)
|
132
|
+
# Just dump out metadata hash
|
133
|
+
html_page "File: #{entry['path']}", "<pre>#{h entry.pretty_inspect}</pre>"
|
134
|
+
end
|
135
|
+
|
136
|
+
# -------------------------------------------------------------------
|
137
|
+
# File upload handler
|
138
|
+
|
139
|
+
post '/upload' do
|
140
|
+
# Check POST parameter.
|
141
|
+
file = params[:file]
|
142
|
+
unless file && (temp_file = file[:tempfile]) && (name = file[:filename])
|
143
|
+
return html_page "Upload error", "<p>No file selected.</p>"
|
144
|
+
end
|
145
|
+
|
146
|
+
# Get the DropboxClient object.
|
147
|
+
db_client = get_db_client
|
148
|
+
unless db_client
|
149
|
+
return html_page "Upload error", "<p>Not linked with a Dropbox account.</p>"
|
150
|
+
end
|
151
|
+
|
152
|
+
# Call DropboxClient.put_file
|
153
|
+
begin
|
154
|
+
entry = db_client.put_file("#{params[:folder]}/#{name}", temp_file.read)
|
155
|
+
rescue DropboxAuthError => e
|
156
|
+
session.delete(:authorized_db_session) # An auth error means the db_session is probably bad
|
157
|
+
return html_page "Dropbox auth error", "<p>#{h e}</p>"
|
158
|
+
rescue DropboxError => e
|
159
|
+
return html_page "Dropbox API error", "<p>#{h e}</p>"
|
160
|
+
end
|
161
|
+
|
162
|
+
html_page "Upload complete", "<pre>#{h entry.pretty_inspect}</pre>"
|
163
|
+
end
|
164
|
+
|
165
|
+
# -------------------------------------------------------------------
|
166
|
+
|
167
|
+
def html_page(title, body)
|
168
|
+
"<html>" +
|
169
|
+
"<head><title>#{h title}</title></head>" +
|
170
|
+
"<body><h1>#{h title}</h1>#{body}</body>" +
|
171
|
+
"</html>"
|
172
|
+
end
|
173
|
+
|
174
|
+
enable :sessions
|
175
|
+
|
176
|
+
helpers do
|
177
|
+
include Rack::Utils
|
178
|
+
alias_method :h, :escape_html
|
179
|
+
end
|
180
|
+
|
181
|
+
if APP_KEY == '' or APP_SECRET == ''
|
182
|
+
puts "You must set APP_KEY and APP_SECRET at the top of \"#{__FILE__}\"!"
|
183
|
+
exit 1
|
184
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dbox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 7
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 6
|
9
|
+
- 0
|
10
|
+
version: 0.6.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ken Pratt
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-11-
|
18
|
+
date: 2011-11-24 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: multipart-post
|
@@ -108,6 +108,7 @@ extra_rdoc_files:
|
|
108
108
|
- README.md
|
109
109
|
files:
|
110
110
|
- .document
|
111
|
+
- History.txt
|
111
112
|
- LICENSE.txt
|
112
113
|
- README.md
|
113
114
|
- Rakefile
|
@@ -117,23 +118,24 @@ files:
|
|
117
118
|
- dbox.gemspec
|
118
119
|
- lib/dbox.rb
|
119
120
|
- lib/dbox/api.rb
|
121
|
+
- lib/dbox/cacert.pem
|
120
122
|
- lib/dbox/database.rb
|
121
123
|
- lib/dbox/db.rb
|
122
124
|
- lib/dbox/loggable.rb
|
123
125
|
- lib/dbox/parallel_tasks.rb
|
124
126
|
- lib/dbox/syncer.rb
|
127
|
+
- lib/dbox/utils.rb
|
125
128
|
- sample_polling_script.rb
|
126
129
|
- spec/dbox_spec.rb
|
127
130
|
- spec/spec_helper.rb
|
128
|
-
- vendor/dropbox-
|
129
|
-
- vendor/dropbox-
|
130
|
-
- vendor/dropbox-
|
131
|
-
- vendor/dropbox-
|
132
|
-
- vendor/dropbox-
|
133
|
-
- vendor/dropbox-
|
134
|
-
- vendor/dropbox-
|
135
|
-
- vendor/dropbox-
|
136
|
-
- vendor/dropbox-client-ruby/test/util.rb
|
131
|
+
- vendor/dropbox-ruby-sdk/CHANGELOG
|
132
|
+
- vendor/dropbox-ruby-sdk/LICENSE
|
133
|
+
- vendor/dropbox-ruby-sdk/README
|
134
|
+
- vendor/dropbox-ruby-sdk/cli_example.rb
|
135
|
+
- vendor/dropbox-ruby-sdk/dropbox_controller.rb
|
136
|
+
- vendor/dropbox-ruby-sdk/gemspec.rb
|
137
|
+
- vendor/dropbox-ruby-sdk/lib/dropbox_sdk.rb
|
138
|
+
- vendor/dropbox-ruby-sdk/web_file_browser.rb
|
137
139
|
homepage: http://github.com/kenpratt/dbox
|
138
140
|
licenses:
|
139
141
|
- MIT
|
@@ -1,17 +0,0 @@
|
|
1
|
-
Forked from Ruby client at https://www.dropbox.com/developers/releases
|
2
|
-
|
3
|
-
Getting started with the Dropbox ruby library:
|
4
|
-
1. Make sure you have rake and rubygems installed on your system.
|
5
|
-
1b. Some of the gems below may need to be compiled locally, so make sure you
|
6
|
-
have any necessary source code around as well.
|
7
|
-
e.g. 'apt-get install ruby1.x-dev libxml2-dev libxslt1-dev' on ubuntu
|
8
|
-
2. Install oauth from rubygems
|
9
|
-
3. Install multipart-post from rubygems
|
10
|
-
4. Install json from rubygems
|
11
|
-
5. Install mechanize from rubygems
|
12
|
-
6. Install shoulda from rubygems
|
13
|
-
7. Copy config/testing.json.example to config/testing.json
|
14
|
-
8. In config/testing.json enter your application's consumer key, secret key,
|
15
|
-
and your test user email and password.
|
16
|
-
9. Run 'rake test_units' to make sure all the tests pass.
|
17
|
-
10. Start developing your Dropbox API application!
|
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/testtask'
|
3
|
-
require 'rake/gempackagetask'
|
4
|
-
require 'rubygems'
|
5
|
-
|
6
|
-
manifest = File.readlines('manifest').map! { |x| x.chomp! }
|
7
|
-
|
8
|
-
spec = Gem::Specification.new do |s|
|
9
|
-
s.name = %q{dropbox}
|
10
|
-
s.version = '1.0'
|
11
|
-
|
12
|
-
s.authors = ["Dropbox, Inc."]
|
13
|
-
s.date = Time.now.utc.strftime('%Y-%m-%d')
|
14
|
-
s.description = "Dropbox REST API Client Library"
|
15
|
-
s.email = %q{support@dropbox.com}
|
16
|
-
s.executables = %w()
|
17
|
-
s.extensions = %w()
|
18
|
-
|
19
|
-
s.files = manifest
|
20
|
-
s.homepage = %q{http://developers.dropbox.com/}
|
21
|
-
|
22
|
-
summary = %q{Dropbox REST API Client Library}
|
23
|
-
s.require_paths = %w(lib)
|
24
|
-
s.summary = summary
|
25
|
-
end
|
26
|
-
|
27
|
-
task :default => [:test_units]
|
28
|
-
|
29
|
-
desc "Run basic tests"
|
30
|
-
Rake::TestTask.new("test_units") { |t|
|
31
|
-
t.pattern = 'test/*_test.rb'
|
32
|
-
t.verbose = true
|
33
|
-
t.warning = true
|
34
|
-
}
|
35
|
-
|
36
|
-
Rake::GemPackageTask.new(spec) do |pkg|
|
37
|
-
pkg.need_zip = true
|
38
|
-
pkg.need_tar = true
|
39
|
-
end
|
40
|
-
|
41
|
-
|
@@ -1,16 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"server": "api.dropbox.com",
|
3
|
-
"content_server": "api-content.dropbox.com",
|
4
|
-
"port": 80,
|
5
|
-
"request_token_url": "http://api.dropbox.com/0/oauth/request_token",
|
6
|
-
"access_token_url": "http://api.dropbox.com/0/oauth/access_token",
|
7
|
-
"authorization_url": "http://www.dropbox.com/0/oauth/authorize",
|
8
|
-
"consumer_key": "YOUR CONSUMER KEY",
|
9
|
-
"consumer_secret": "YOUR CONSUMER SECRET",
|
10
|
-
"verifier": "",
|
11
|
-
"testing_user": "USER TO TEST WITH",
|
12
|
-
"testing_password": "PASSWORD",
|
13
|
-
"root": "dropbox"
|
14
|
-
}
|
15
|
-
|
16
|
-
|
@@ -1,259 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'oauth'
|
3
|
-
require 'json'
|
4
|
-
require 'uri'
|
5
|
-
require 'net/http/post/multipart'
|
6
|
-
|
7
|
-
class Authenticator
|
8
|
-
|
9
|
-
def initialize(config, key=nil, secret=nil, is_request=false, server=nil)
|
10
|
-
@consumer_key = config['consumer_key']
|
11
|
-
@consumer_secret = config['consumer_secret']
|
12
|
-
@config = config
|
13
|
-
@oauth_conf = {
|
14
|
-
:site => "http://" + (server || config["server"]),
|
15
|
-
:scheme => :header,
|
16
|
-
:http_method => :post,
|
17
|
-
:request_token_url => config["request_token_url"],
|
18
|
-
:access_token_url => config["access_token_url"],
|
19
|
-
:authorize_url => config["authorization_url"],
|
20
|
-
}
|
21
|
-
|
22
|
-
@consumer = OAuth::Consumer.new @consumer_key, @consumer_secret, @oauth_conf
|
23
|
-
|
24
|
-
@access_token = nil
|
25
|
-
@request_token = nil
|
26
|
-
|
27
|
-
if key and secret
|
28
|
-
if is_request then
|
29
|
-
@request_token = OAuth::RequestToken.new(@consumer, key, secret)
|
30
|
-
else
|
31
|
-
@access_token = OAuth::AccessToken.new(@consumer, key, secret)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
attr_reader :config
|
37
|
-
|
38
|
-
def Authenticator.load_config(path)
|
39
|
-
open(path) do |f|
|
40
|
-
return JSON.parse(f.read())
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def get_request_token(*args)
|
45
|
-
@request_token = @consumer.get_request_token(*args)
|
46
|
-
return @request_token.authorize_url
|
47
|
-
end
|
48
|
-
|
49
|
-
def get_access_token
|
50
|
-
if @access_token == nil
|
51
|
-
@access_token = @request_token.get_access_token
|
52
|
-
end
|
53
|
-
|
54
|
-
return @access_token
|
55
|
-
end
|
56
|
-
|
57
|
-
def authorized?
|
58
|
-
!!@access_token
|
59
|
-
end
|
60
|
-
|
61
|
-
def token
|
62
|
-
return (@access_token || @request_token).token
|
63
|
-
end
|
64
|
-
|
65
|
-
def secret
|
66
|
-
return (@access_token || @request_token).secret
|
67
|
-
end
|
68
|
-
|
69
|
-
def sign(request, request_options = {})
|
70
|
-
return @consumer.sign!(request, @access_token || @request_token, request_options)
|
71
|
-
end
|
72
|
-
|
73
|
-
def clone(host)
|
74
|
-
return Authenticator.new(@config, token(), secret(), !authorized?, host)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# maybe subclass or monkey patch trusted into the oauth stuff
|
79
|
-
|
80
|
-
|
81
|
-
API_VERSION = 0
|
82
|
-
|
83
|
-
|
84
|
-
class DropboxError < RuntimeError
|
85
|
-
end
|
86
|
-
|
87
|
-
class DropboxClient
|
88
|
-
attr_reader :token
|
89
|
-
|
90
|
-
def initialize(api_host, content_host, port, auth)
|
91
|
-
@api_host = api_host
|
92
|
-
@content_host = content_host
|
93
|
-
@port = port.to_i
|
94
|
-
@auth = auth
|
95
|
-
@token = auth.get_access_token
|
96
|
-
end
|
97
|
-
|
98
|
-
def initialize_copy(other)
|
99
|
-
@token = other.token.clone()
|
100
|
-
@token.consumer = @token.consumer.clone()
|
101
|
-
@token.consumer.http = nil
|
102
|
-
end
|
103
|
-
|
104
|
-
def parse_response(response, callback=nil)
|
105
|
-
if response.kind_of?(Net::HTTPServerError)
|
106
|
-
raise DropboxError.new("Invalid response #{response}\n#{response.body}")
|
107
|
-
elsif not response.kind_of?(Net::HTTPSuccess)
|
108
|
-
return response
|
109
|
-
end
|
110
|
-
|
111
|
-
if callback
|
112
|
-
return response.body
|
113
|
-
else
|
114
|
-
begin
|
115
|
-
return JSON.parse(response.body)
|
116
|
-
rescue JSON::ParserError
|
117
|
-
return response.body
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
|
123
|
-
def account_info(status_in_response=false, callback=nil)
|
124
|
-
response = @token.get build_url(@api_host, @port, "/account/info")
|
125
|
-
return parse_response(response, callback)
|
126
|
-
end
|
127
|
-
|
128
|
-
def put_file(root, to_path, name, file_obj)
|
129
|
-
path = "/files/#{root}#{to_path}"
|
130
|
-
oauth_params = {"file" => name}
|
131
|
-
auth = @auth.clone(@content_host)
|
132
|
-
|
133
|
-
url = URI.parse(build_url(@content_host, @port, path))
|
134
|
-
|
135
|
-
oauth_fake_req = Net::HTTP::Post.new(url.path)
|
136
|
-
oauth_fake_req.set_form_data({ "file" => name })
|
137
|
-
auth.sign(oauth_fake_req)
|
138
|
-
|
139
|
-
oauth_sig = oauth_fake_req.to_hash['authorization']
|
140
|
-
|
141
|
-
req = Net::HTTP::Post::Multipart.new(url.path, {
|
142
|
-
"file" => UploadIO.new(file_obj, "application/octet-stream", name),
|
143
|
-
})
|
144
|
-
req['authorization'] = oauth_sig.join(", ")
|
145
|
-
|
146
|
-
res = Net::HTTP.start(url.host, url.port) do |http|
|
147
|
-
return parse_response(http.request(req))
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
def get_file(root, from_path, destination_io=nil)
|
152
|
-
path = "/files/#{root}#{from_path}"
|
153
|
-
|
154
|
-
if destination_io
|
155
|
-
url = URI.parse(build_url(@content_host, @port, path))
|
156
|
-
|
157
|
-
# if a destination is given, stream the response into it
|
158
|
-
Net::HTTP.start(url.host, url.port) do |http|
|
159
|
-
# build the request
|
160
|
-
req = Net::HTTP::Get.new(url.path, {})
|
161
|
-
auth = @auth.clone(@content_host)
|
162
|
-
auth.sign(req)
|
163
|
-
|
164
|
-
# make the request
|
165
|
-
http.request(req) do |response|
|
166
|
-
if response.kind_of?(Net::HTTPServerError)
|
167
|
-
raise DropboxError.new("Invalid response #{response}\n#{response.body}")
|
168
|
-
elsif not response.kind_of?(Net::HTTPSuccess)
|
169
|
-
return response
|
170
|
-
else
|
171
|
-
# stream to given io
|
172
|
-
response.read_body {|segment| destination_io << segment }
|
173
|
-
return true
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end
|
177
|
-
else
|
178
|
-
response = @token.get(build_url(@content_host, @port, path))
|
179
|
-
return parse_response(response, true)
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
def file_copy(root, from_path, to_path, callback=nil)
|
184
|
-
params = {
|
185
|
-
"root" => root,
|
186
|
-
"from_path" => from_path,
|
187
|
-
"to_path" => to_path,
|
188
|
-
"callback" => callback
|
189
|
-
}
|
190
|
-
response = @token.post(build_url(@api_host, @port, "/fileops/copy"), params)
|
191
|
-
return parse_response(response, callback)
|
192
|
-
end
|
193
|
-
|
194
|
-
def file_create_folder(root, path, callback=nil)
|
195
|
-
params = {
|
196
|
-
"root" => root,
|
197
|
-
"path" => path,
|
198
|
-
"callback" => callback
|
199
|
-
}
|
200
|
-
response = @token.post(build_url(@api_host, @port, "/fileops/create_folder"), params)
|
201
|
-
|
202
|
-
return parse_response(response, callback)
|
203
|
-
end
|
204
|
-
|
205
|
-
def file_delete(root, path, callback=nil)
|
206
|
-
params = {
|
207
|
-
"root" => root,
|
208
|
-
"path" => path,
|
209
|
-
"callback" => callback
|
210
|
-
}
|
211
|
-
response = @token.post(build_url(@api_host, @port, "/fileops/delete"), params)
|
212
|
-
return parse_response(response, callback)
|
213
|
-
end
|
214
|
-
|
215
|
-
def file_move(root, from_path, to_path, callback=nil)
|
216
|
-
params = {
|
217
|
-
"root" => root,
|
218
|
-
"from_path" => from_path,
|
219
|
-
"to_path" => to_path,
|
220
|
-
"callback" => callback
|
221
|
-
}
|
222
|
-
response = @token.post(build_url(@api_host, @port, "/fileops/move"), params)
|
223
|
-
return parse_response(response, callback)
|
224
|
-
end
|
225
|
-
|
226
|
-
def metadata(root, path, file_limit=10000, hash=nil, list=true, status_in_response=false, callback=nil)
|
227
|
-
params = {
|
228
|
-
"file_limit" => file_limit.to_s,
|
229
|
-
"list" => list ? "true" : "false",
|
230
|
-
"status_in_response" => status_in_response ? "true" : "false"
|
231
|
-
}
|
232
|
-
params["hash"] = hash if hash
|
233
|
-
params["callback"] = callback if callback
|
234
|
-
|
235
|
-
response = @token.get build_url(@api_host, @port, "/metadata/#{root}#{path}", params=params)
|
236
|
-
return parse_response(response, callback)
|
237
|
-
end
|
238
|
-
|
239
|
-
def links(root, path)
|
240
|
-
full_path = "/links/#{root}#{path}"
|
241
|
-
return build_url(@api_host, @port, full_path)
|
242
|
-
end
|
243
|
-
|
244
|
-
def build_url(host, port, url, params=nil)
|
245
|
-
port = port == 80 ? nil : port
|
246
|
-
versioned_url = "/#{API_VERSION}#{url}"
|
247
|
-
|
248
|
-
target = URI::Generic.new("http", nil, host, port, nil, versioned_url, nil, nil, nil)
|
249
|
-
|
250
|
-
if params
|
251
|
-
target.query = params.collect {|k,v| URI.escape(k) + "=" + URI.escape(v) }.join("&")
|
252
|
-
end
|
253
|
-
|
254
|
-
return target.to_s
|
255
|
-
end
|
256
|
-
|
257
|
-
|
258
|
-
end
|
259
|
-
|