radosgw-s3 0.5 → 0.6
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.
- checksums.yaml +4 -4
- data/lib/s3/connection.rb +31 -25
- data/lib/s3/service.rb +20 -15
- data/lib/s3/version.rb +1 -1
- data/radosgw-s3.gemspec +6 -7
- metadata +27 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b670b4ebdb3d82028d8123baabdb8b73009c758c
|
4
|
+
data.tar.gz: e55274728dd5ba6e66174ddd31349e1268210768
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40dde8be0059906467dfad9efeaa69aa5db302c3718c6fc3108f9a282b0d1d12b8d2cbc683da135ff1cdf6103771c747727e8f88dd74d0eb8d0dd2ceeebc5e79
|
7
|
+
data.tar.gz: 0534107067e63a729561ad184caf01c9be301c0c29aacf60de928433993869aa58994384380aa774bae8abfb1d104b7ad1a40900ffb58a68382b22a7b4f597ae
|
data/lib/s3/connection.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
module S3
|
2
|
-
|
3
2
|
# Class responsible for handling connections to amazon hosts
|
4
3
|
class Connection
|
5
4
|
include Parser
|
6
5
|
|
7
6
|
attr_accessor :access_key_id, :secret_access_key, :use_ssl, :timeout, :debug, :proxy, :host
|
8
|
-
|
7
|
+
alias_method :use_ssl?, :use_ssl
|
9
8
|
|
10
9
|
# Creates new connection object.
|
11
10
|
#
|
@@ -30,7 +29,7 @@ module S3
|
|
30
29
|
@debug = options.fetch(:debug, false)
|
31
30
|
@timeout = options.fetch(:timeout, 60)
|
32
31
|
@proxy = options.fetch(:proxy, nil)
|
33
|
-
@chunk_size = options.fetch(:chunk_size,
|
32
|
+
@chunk_size = options.fetch(:chunk_size, 1_048_576)
|
34
33
|
end
|
35
34
|
|
36
35
|
# Makes request with given HTTP method, sets missing parameters,
|
@@ -60,6 +59,7 @@ module S3
|
|
60
59
|
body = options.fetch(:body, nil)
|
61
60
|
params = options.fetch(:params, {})
|
62
61
|
headers = options.fetch(:headers, {})
|
62
|
+
use_authsign = options.fetch(:use_authsign)
|
63
63
|
|
64
64
|
# Must be done before adding params
|
65
65
|
# Encodes all characters except forward-slash (/) and explicitly legal URL characters
|
@@ -70,7 +70,7 @@ module S3
|
|
70
70
|
path << "?#{params}"
|
71
71
|
end
|
72
72
|
|
73
|
-
request = Request.new(@chunk_size, method.to_s.upcase, !!body, method.to_s.upcase !=
|
73
|
+
request = Request.new(@chunk_size, method.to_s.upcase, !!body, method.to_s.upcase != 'HEAD', path)
|
74
74
|
|
75
75
|
headers = self.class.parse_headers(headers)
|
76
76
|
headers.each do |key, value|
|
@@ -86,7 +86,11 @@ module S3
|
|
86
86
|
request.content_length = body.respond_to?(:lstat) ? body.stat.size : body.size
|
87
87
|
end
|
88
88
|
|
89
|
-
|
89
|
+
if use_authsign
|
90
|
+
send_authsign(host, request)
|
91
|
+
else
|
92
|
+
send_request(host, request)
|
93
|
+
end
|
90
94
|
end
|
91
95
|
|
92
96
|
# Helper function to parser parameters and create single string of
|
@@ -104,7 +108,7 @@ module S3
|
|
104
108
|
result = []
|
105
109
|
params.each do |key, value|
|
106
110
|
if interesting_keys.include?(key)
|
107
|
-
parsed_key = key.to_s.
|
111
|
+
parsed_key = key.to_s.tr('_', '-')
|
108
112
|
case value
|
109
113
|
when nil
|
110
114
|
result << parsed_key
|
@@ -113,7 +117,7 @@ module S3
|
|
113
117
|
end
|
114
118
|
end
|
115
119
|
end
|
116
|
-
result.join(
|
120
|
+
result.join('&')
|
117
121
|
end
|
118
122
|
|
119
123
|
# Helper function to change headers from symbols, to in correct
|
@@ -142,7 +146,7 @@ module S3
|
|
142
146
|
if headers
|
143
147
|
headers.each do |key, value|
|
144
148
|
if interesting_keys.include?(key)
|
145
|
-
parsed_key = key.to_s.
|
149
|
+
parsed_key = key.to_s.tr('_', '-')
|
146
150
|
parsed_value = value
|
147
151
|
case value
|
148
152
|
when Range
|
@@ -178,19 +182,7 @@ module S3
|
|
178
182
|
response = http(host).start do |http|
|
179
183
|
host = http.address
|
180
184
|
|
181
|
-
request
|
182
|
-
|
183
|
-
if request.body
|
184
|
-
request["Content-Type"] ||= "application/octet-stream"
|
185
|
-
request["Content-MD5"] = Base64.encode64(Digest::MD5.digest(request.body)).chomp unless request.body.empty?
|
186
|
-
end
|
187
|
-
|
188
|
-
unless skip_authorization
|
189
|
-
request["Authorization"] = Signature.generate(:host => host,
|
190
|
-
:request => request,
|
191
|
-
:access_key_id => access_key_id,
|
192
|
-
:secret_access_key => secret_access_key)
|
193
|
-
end
|
185
|
+
request = send_authsign(request)
|
194
186
|
|
195
187
|
http.request(request)
|
196
188
|
end
|
@@ -198,26 +190,40 @@ module S3
|
|
198
190
|
if response.code.to_i == 307
|
199
191
|
if response.body
|
200
192
|
doc = Document.new response.body
|
201
|
-
send_request(doc.elements[
|
193
|
+
send_request(doc.elements['Error'].elements['Endpoint'].text, request, true)
|
202
194
|
end
|
203
195
|
else
|
204
196
|
handle_response(response)
|
205
197
|
end
|
206
198
|
end
|
207
199
|
|
200
|
+
def send_authsign(host, request, skip_authorization = false)
|
201
|
+
request['Date'] ||= Time.now.httpdate
|
202
|
+
if request.body
|
203
|
+
request['Content-Type'] ||= 'application/octet-stream'
|
204
|
+
request['Content-MD5'] = Base64.encode64(Digest::MD5.digest(request.body)).chomp unless request.body.empty?
|
205
|
+
end
|
206
|
+
unless skip_authorization
|
207
|
+
request['Authorization'] = Signature.generate(host: host, request: request,
|
208
|
+
access_key_id: access_key_id,
|
209
|
+
secret_access_key: secret_access_key)
|
210
|
+
end
|
211
|
+
request
|
212
|
+
end
|
213
|
+
|
208
214
|
def handle_response(response)
|
209
215
|
case response.code.to_i
|
210
216
|
when 200...300
|
211
217
|
response
|
212
218
|
when 300...600
|
213
219
|
if response.body.nil? || response.body.empty?
|
214
|
-
|
220
|
+
fail Error::ResponseError.new(nil, response)
|
215
221
|
else
|
216
222
|
code, message = parse_error(response.body)
|
217
|
-
|
223
|
+
fail Error::ResponseError.exception(code).new(message, response)
|
218
224
|
end
|
219
225
|
else
|
220
|
-
|
226
|
+
fail(ConnectionError.new(response, "Unknown response code: #{response.code}"))
|
221
227
|
end
|
222
228
|
response
|
223
229
|
end
|
data/lib/s3/service.rb
CHANGED
@@ -8,7 +8,7 @@ module S3
|
|
8
8
|
# Compares service to other, by <tt>access_key_id</tt> and
|
9
9
|
# <tt>secret_access_key</tt>
|
10
10
|
def ==(other)
|
11
|
-
|
11
|
+
access_key_id == other.access_key_id && secret_access_key == other.secret_access_key
|
12
12
|
end
|
13
13
|
|
14
14
|
# Creates new service.
|
@@ -28,8 +28,8 @@ module S3
|
|
28
28
|
# The keys for these required options might exist in the options hash, but
|
29
29
|
# they might be set to something like `nil`. If this is the case, we want
|
30
30
|
# to fail early.
|
31
|
-
|
32
|
-
|
31
|
+
fail ArgumentError, 'Missing :access_key_id.' unless options[:access_key_id]
|
32
|
+
fail ArgumentError, 'Missing :secret_access_key.' unless options[:secret_access_key]
|
33
33
|
|
34
34
|
@access_key_id = options.fetch(:access_key_id)
|
35
35
|
@secret_access_key = options.fetch(:secret_access_key)
|
@@ -39,14 +39,14 @@ module S3
|
|
39
39
|
@timeout = options.fetch(:timeout, 60)
|
40
40
|
@debug = options.fetch(:debug, false)
|
41
41
|
|
42
|
-
|
42
|
+
fail ArgumentError, 'Missing proxy settings. Must specify at least :host.' if options[:proxy] && !options[:proxy][:host]
|
43
43
|
@proxy = options.fetch(:proxy, nil)
|
44
44
|
end
|
45
45
|
|
46
46
|
# Returns all buckets in the service and caches the result (see
|
47
47
|
# +reload+)
|
48
48
|
def buckets
|
49
|
-
Proxy.new(
|
49
|
+
Proxy.new(-> { list_all_my_buckets }, owner: self, extend: BucketsExtension)
|
50
50
|
end
|
51
51
|
|
52
52
|
# Returns the bucket with the given name. Does not check whether the
|
@@ -56,10 +56,15 @@ module S3
|
|
56
56
|
Bucket.send(:new, self, name)
|
57
57
|
end
|
58
58
|
|
59
|
+
# Returns the signature for POST operations done externally via javascript
|
60
|
+
def auth_sign
|
61
|
+
service_request(:post, use_authsign: true)
|
62
|
+
end
|
63
|
+
|
59
64
|
# Returns "http://" or "https://", depends on <tt>:use_ssl</tt>
|
60
65
|
# value from initializer
|
61
66
|
def protocol
|
62
|
-
use_ssl ?
|
67
|
+
use_ssl ? 'https://' : 'http://'
|
63
68
|
end
|
64
69
|
|
65
70
|
# Returns 443 or 80, depends on <tt>:use_ssl</tt> value from
|
@@ -69,7 +74,7 @@ module S3
|
|
69
74
|
end
|
70
75
|
|
71
76
|
def inspect #:nodoc:
|
72
|
-
"#<#{self.class}
|
77
|
+
"#<#{self.class}:#{@access_key_id}>"
|
73
78
|
end
|
74
79
|
|
75
80
|
private
|
@@ -81,18 +86,18 @@ module S3
|
|
81
86
|
end
|
82
87
|
|
83
88
|
def service_request(method, options = {})
|
84
|
-
connection.request(method, options.merge(:
|
89
|
+
connection.request(method, options.merge(path: "/#{options[:path]}"))
|
85
90
|
end
|
86
91
|
|
87
92
|
def connection
|
88
93
|
return @connection if defined?(@connection)
|
89
|
-
@connection = Connection.new(:
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
94
|
+
@connection = Connection.new(access_key_id: @access_key_id,
|
95
|
+
secret_access_key: @secret_access_key,
|
96
|
+
host: @host,
|
97
|
+
use_ssl: @use_ssl,
|
98
|
+
timeout: @timeout,
|
99
|
+
debug: @debug,
|
100
|
+
proxy: @proxy)
|
96
101
|
end
|
97
102
|
end
|
98
103
|
end
|
data/lib/s3/version.rb
CHANGED
data/radosgw-s3.gemspec
CHANGED
@@ -20,15 +20,14 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.rubyforge_project = "s3"
|
21
21
|
|
22
22
|
s.add_dependency "proxies", "~> 0.2.0"
|
23
|
-
s.add_dependency "net-ssh"
|
24
|
-
s.add_development_dependency "rake"
|
25
|
-
s.add_development_dependency "json"
|
26
|
-
s.add_development_dependency "test-unit"
|
27
|
-
s.add_development_dependency "mocha"
|
28
|
-
s.add_development_dependency "bundler"
|
23
|
+
s.add_dependency "net-ssh", "~> 3.0"
|
24
|
+
s.add_development_dependency "rake", "~> 10.4"
|
25
|
+
s.add_development_dependency "json", "~> 1.8"
|
26
|
+
s.add_development_dependency "test-unit", "~> 3.1"
|
27
|
+
s.add_development_dependency "mocha", "~> 1.1"
|
28
|
+
s.add_development_dependency "bundler", "~> 1.10"
|
29
29
|
|
30
30
|
s.files = `git ls-files`.split("\n")
|
31
31
|
s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
|
32
32
|
s.require_path = "lib"
|
33
33
|
end
|
34
|
-
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: radosgw-s3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.6'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Alrin, Kishorekumar Neelamegam, Rajthilak, Kuba Kuźma
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: proxies
|
@@ -28,86 +28,86 @@ dependencies:
|
|
28
28
|
name: net-ssh
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
33
|
+
version: '3.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
40
|
+
version: '3.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '10.4'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '10.4'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: json
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '1.8'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '1.8'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: test-unit
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '3.1'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '3.1'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: mocha
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '1.1'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '1.1'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: bundler
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
103
|
+
version: '1.10'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
110
|
+
version: '1.10'
|
111
111
|
description: 'radosgw-s3 library provides access to your ceph-radosgw. It supports
|
112
112
|
both: radosgw user creation and bucket operation using REST API.'
|
113
113
|
email:
|
@@ -164,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
164
|
version: 1.3.6
|
165
165
|
requirements: []
|
166
166
|
rubyforge_project: s3
|
167
|
-
rubygems_version: 2.4.
|
167
|
+
rubygems_version: 2.4.8
|
168
168
|
signing_key:
|
169
169
|
specification_version: 4
|
170
170
|
summary: Library for accessing ceph objects and buckets
|