qingstor-sdk 1.9.2 → 1.9.3
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/README.md +13 -2
- data/lib/qingstor/sdk/general/config.rb +17 -0
- data/lib/qingstor/sdk/general/default/config.yaml +8 -5
- data/lib/qingstor/sdk/general/error.rb +11 -1
- data/lib/qingstor/sdk/request/preprocessor.rb +17 -3
- data/lib/qingstor/sdk/request/request.rb +5 -2
- data/lib/qingstor/sdk/request/signer.rb +2 -7
- data/lib/qingstor/sdk/service/bucket.rb +52 -4
- data/lib/qingstor/sdk/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 077caf573d40509928daa24c05cfc408e48507d3
|
|
4
|
+
data.tar.gz: fd249954ffe298be5d12febad583f88f2124d13b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 96ca254d7e4090112d58ff1da2cf7917dad9148a188b0cf38aa3f7f961ec482c2ec9643e8456e8a13fb4cd910c6e91d3ca3e89e17eeaa4721f402fd48978beb9
|
|
7
|
+
data.tar.gz: 58002a2563f7f51147386998c8fe4ec9a910068f3e5840ff6e41a37163a1737edcdba68ae598e3ee697b12fc09027f551de4627277893a6663af55386d951442
|
data/README.md
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
# QingStor::SDK
|
|
2
2
|
|
|
3
|
-
<span style="display: inline-block">
|
|
4
3
|
[](https://travis-ci.org/yunify/qingstor-sdk-ruby)
|
|
5
4
|
[](http://badge.fury.io/rb/qingstor-sdk)
|
|
6
5
|
[](https://docs.qingcloud.com/qingstor/)
|
|
7
6
|
[](https://github.com/yunify/qingstor-sdk-ruby/blob/master/LICENSE)
|
|
8
|
-
</span>
|
|
9
7
|
|
|
10
8
|
The official QingStor SDK for Ruby programming language.
|
|
11
9
|
|
|
@@ -165,6 +163,18 @@ log_level: 'warn'
|
|
|
165
163
|
## Change Log
|
|
166
164
|
All notable changes to QingStor SDK for Ruby will be documented here.
|
|
167
165
|
|
|
166
|
+
### [v1.9.3] - 2017-03-15
|
|
167
|
+
|
|
168
|
+
#### Added
|
|
169
|
+
|
|
170
|
+
- Allow user to append additional info to User-Agent.
|
|
171
|
+
- Add request parameters for GET Object.
|
|
172
|
+
- Add IP address conditions for bucket policy.
|
|
173
|
+
|
|
174
|
+
### Fixed
|
|
175
|
+
|
|
176
|
+
- Resource is not mandatory in bucket policy statement.
|
|
177
|
+
|
|
168
178
|
### [v1.9.2] - 2017-01-23
|
|
169
179
|
|
|
170
180
|
#### Fixed
|
|
@@ -203,5 +213,6 @@ All notable changes to QingStor SDK for Ruby will be documented here.
|
|
|
203
213
|
The Apache License (Version 2.0, January 2004).
|
|
204
214
|
|
|
205
215
|
[master]: https://github.com/yunify/qingstor-sdk-ruby/tree/master
|
|
216
|
+
[v1.9.3]: https://github.com/yunify/qingstor-sdk-ruby/compare/v1.9.2...v1.9.3
|
|
206
217
|
[v1.9.2]: https://github.com/yunify/qingstor-sdk-ruby/compare/v1.9.1...v1.9.2
|
|
207
218
|
[v1.9.1]: https://github.com/yunify/qingstor-sdk-ruby/compare/v1.9.0...v1.9.1
|
|
@@ -46,6 +46,23 @@ module QingStor
|
|
|
46
46
|
self
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
+
def check
|
|
50
|
+
[:access_key_id, :secret_access_key, :host, :port, :protocol].each do |x|
|
|
51
|
+
if !self[x] || self[x].to_s.empty?
|
|
52
|
+
raise ConfigurationError, "#{x.to_sym} not specified"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
if self[:additional_user_agent] && !self[:additional_user_agent].empty?
|
|
56
|
+
self[:additional_user_agent].each_byte do |x|
|
|
57
|
+
# Allow space(32) to ~(126) in ASCII Table, exclude "(34).
|
|
58
|
+
if x < 32 || x > 126 || x == 32 || x == 34
|
|
59
|
+
raise ConfigurationError, 'additional User-Agent contains characters that not allowed'
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
self
|
|
64
|
+
end
|
|
65
|
+
|
|
49
66
|
def load_default_config
|
|
50
67
|
load_config_from_file Contract::DEFAULT_CONFIG_FILEPATH
|
|
51
68
|
end
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
# QingStor services configuration
|
|
2
2
|
|
|
3
|
-
#access_key_id:
|
|
4
|
-
#secret_access_key:
|
|
3
|
+
#access_key_id: ACCESS_KEY_ID
|
|
4
|
+
#secret_access_key: SECRET_ACCESS_KEY
|
|
5
5
|
|
|
6
|
-
host:
|
|
6
|
+
host: qingstor.com
|
|
7
7
|
port: 443
|
|
8
|
-
protocol:
|
|
8
|
+
protocol: https
|
|
9
9
|
connection_retries: 3
|
|
10
10
|
|
|
11
|
+
# Additional User-Agent
|
|
12
|
+
additional_user_agent: ""
|
|
13
|
+
|
|
11
14
|
# Valid log levels are "debug", "info", "warn", "error", and "fatal".
|
|
12
|
-
log_level:
|
|
15
|
+
log_level: warn
|
|
@@ -14,11 +14,21 @@
|
|
|
14
14
|
# | limitations under the License.
|
|
15
15
|
# +-------------------------------------------------------------------------
|
|
16
16
|
|
|
17
|
-
module
|
|
17
|
+
module QingStor
|
|
18
18
|
module SDK
|
|
19
19
|
class SDKError < StandardError
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
class ConfigurationError < SDKError
|
|
23
|
+
def initialize(error_message)
|
|
24
|
+
@error_message = error_message
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def message
|
|
28
|
+
"configuration is not valid, #{@error_message}"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
22
32
|
class NetworkError < SDKError
|
|
23
33
|
end
|
|
24
34
|
|
|
@@ -51,7 +51,7 @@ module QingStor
|
|
|
51
51
|
def self.request_uri(input)
|
|
52
52
|
unless input[:properties].nil?
|
|
53
53
|
input[:properties].each do |k, v|
|
|
54
|
-
input[:request_uri].gsub! "<#{k}>", v.to_s
|
|
54
|
+
input[:request_uri].gsub! "<#{k}>", (escape v.to_s)
|
|
55
55
|
end
|
|
56
56
|
end
|
|
57
57
|
input[:request_uri]
|
|
@@ -92,6 +92,9 @@ module QingStor
|
|
|
92
92
|
end
|
|
93
93
|
unless input[:request_headers][:'User-Agent']
|
|
94
94
|
ua = "qingstor-sdk-ruby/#{QingStor::SDK::VERSION} (Ruby v#{RUBY_VERSION}; #{RUBY_PLATFORM})"
|
|
95
|
+
if input[:config][:additional_user_agent] && !input[:config][:additional_user_agent].empty?
|
|
96
|
+
ua = "#{ua} #{input[:config][:additional_user_agent]}"
|
|
97
|
+
end
|
|
95
98
|
input[:request_headers][:'User-Agent'] = ua
|
|
96
99
|
end
|
|
97
100
|
|
|
@@ -99,14 +102,17 @@ module QingStor
|
|
|
99
102
|
input[:request_headers][:'Content-MD5'] = Base64.encode64(Digest::MD5.digest(input[:request_body])).strip
|
|
100
103
|
end
|
|
101
104
|
|
|
105
|
+
input[:request_headers].map do |k, v|
|
|
106
|
+
input[:request_headers][k] = escape v.to_s unless v.to_s.ascii_only?
|
|
107
|
+
end
|
|
108
|
+
|
|
102
109
|
input[:request_headers]
|
|
103
110
|
end
|
|
104
111
|
|
|
105
112
|
def self.request_params(input)
|
|
106
113
|
unless input[:request_params].nil?
|
|
107
114
|
input[:request_params].map do |k, v|
|
|
108
|
-
input[:request_params][k] =
|
|
109
|
-
input[:request_params][k].gsub! '+', '%20'
|
|
115
|
+
input[:request_params][k] = escape v.to_s
|
|
110
116
|
end
|
|
111
117
|
end
|
|
112
118
|
input[:request_params]
|
|
@@ -125,6 +131,14 @@ module QingStor
|
|
|
125
131
|
end
|
|
126
132
|
object
|
|
127
133
|
end
|
|
134
|
+
|
|
135
|
+
def self.escape(origin)
|
|
136
|
+
origin = CGI.escape origin
|
|
137
|
+
origin.gsub! '%2F', '/'
|
|
138
|
+
origin.gsub! '%3D', '='
|
|
139
|
+
origin.gsub! '+', '%20'
|
|
140
|
+
origin
|
|
141
|
+
end
|
|
128
142
|
end
|
|
129
143
|
end
|
|
130
144
|
end
|
|
@@ -63,10 +63,13 @@ module QingStor
|
|
|
63
63
|
|
|
64
64
|
def build
|
|
65
65
|
params = input[:request_params].map { |k, v| "#{k}=#{v}" }
|
|
66
|
-
query_string =
|
|
66
|
+
query_string = params.join '&'
|
|
67
|
+
if query_string && !query_string.empty?
|
|
68
|
+
query_string = "#{input[:request_uri].include?('?') ? '&' : '?'}#{query_string}"
|
|
69
|
+
end
|
|
67
70
|
self.request_url = URI "#{input[:request_endpoint]}#{input[:request_uri]}#{query_string}"
|
|
68
71
|
|
|
69
|
-
request = new_http_request input[:request_method], request_url.
|
|
72
|
+
request = new_http_request input[:request_method], request_url.to_s
|
|
70
73
|
request.body = input[:request_body]
|
|
71
74
|
input[:request_headers].each { |k, v| request[k.to_s] = v }
|
|
72
75
|
|
|
@@ -87,19 +87,14 @@ module QingStor
|
|
|
87
87
|
end
|
|
88
88
|
|
|
89
89
|
def self.canonicalized_resource(input)
|
|
90
|
-
path = CGI.escape input[:request_uri]
|
|
91
|
-
path.gsub! '%3F', '?'
|
|
92
|
-
path.gsub! '%2F', '/'
|
|
93
|
-
path.gsub! '+', '%20'
|
|
94
|
-
|
|
95
90
|
params = input[:request_params].keys.sort.map { |k|
|
|
96
91
|
if sub_resource? k.to_s
|
|
97
92
|
v = input[:request_params][k].to_s.strip
|
|
98
93
|
!v.nil? && v != '' ? "#{k}=#{CGI.unescape v}" : k
|
|
99
94
|
end
|
|
100
95
|
}.compact.join '&'
|
|
101
|
-
params =
|
|
102
|
-
"#{
|
|
96
|
+
params = input[:request_uri].include?('?') ? "&#{params}" : "?#{params}" if params != ''
|
|
97
|
+
"#{input[:request_uri]}#{params}"
|
|
103
98
|
end
|
|
104
99
|
|
|
105
100
|
def self.sub_resource?(key)
|
|
@@ -522,6 +522,58 @@ module QingStor
|
|
|
522
522
|
|
|
523
523
|
public
|
|
524
524
|
|
|
525
|
+
# list_multipart_uploads: List multipart uploads in the bucket.
|
|
526
|
+
# Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/list_multipart_uploads.html
|
|
527
|
+
#
|
|
528
|
+
# == Options
|
|
529
|
+
#
|
|
530
|
+
# * +:delimiter+ - Put all keys that share a common prefix into a list
|
|
531
|
+
# * +:limit+ - Results count limit
|
|
532
|
+
# * +:marker+ - Limit results to keys that start at this marker
|
|
533
|
+
# * +:prefix+ - Limits results to keys that begin with the prefix
|
|
534
|
+
#
|
|
535
|
+
def list_multipart_uploads(options = {})
|
|
536
|
+
options.deep_stringify_keys!
|
|
537
|
+
request = list_multipart_uploads_request options
|
|
538
|
+
request.send
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
def list_multipart_uploads_request(options = {})
|
|
542
|
+
options.deep_stringify_keys!
|
|
543
|
+
input = {
|
|
544
|
+
config: config,
|
|
545
|
+
properties: properties,
|
|
546
|
+
api_name: 'List Multipart Uploads',
|
|
547
|
+
request_method: 'GET',
|
|
548
|
+
request_uri: '/<bucket-name>?uploads',
|
|
549
|
+
request_params: {
|
|
550
|
+
'delimiter' => options['delimiter'],
|
|
551
|
+
'limit' => options['limit'],
|
|
552
|
+
'marker' => options['marker'],
|
|
553
|
+
'prefix' => options['prefix'],
|
|
554
|
+
},
|
|
555
|
+
request_headers: {
|
|
556
|
+
},
|
|
557
|
+
request_elements: {
|
|
558
|
+
},
|
|
559
|
+
request_body: nil,
|
|
560
|
+
status_code: [
|
|
561
|
+
200, # OK
|
|
562
|
+
],
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
list_multipart_uploads_input_validate input
|
|
566
|
+
Request.new input
|
|
567
|
+
end
|
|
568
|
+
|
|
569
|
+
private
|
|
570
|
+
|
|
571
|
+
def list_multipart_uploads_input_validate(input)
|
|
572
|
+
input.deep_stringify_keys!
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
public
|
|
576
|
+
|
|
525
577
|
# list_objects: Retrieve the object list in a bucket.
|
|
526
578
|
# Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/get.html
|
|
527
579
|
#
|
|
@@ -909,10 +961,6 @@ module QingStor
|
|
|
909
961
|
raise ParameterRequiredError.new('id', 'statement')
|
|
910
962
|
end
|
|
911
963
|
|
|
912
|
-
unless !x['resource'].nil? && !x['resource'].to_s.empty?
|
|
913
|
-
raise ParameterRequiredError.new('resource', 'statement')
|
|
914
|
-
end
|
|
915
|
-
|
|
916
964
|
unless !x['user'].nil? && !x['user'].to_s.empty?
|
|
917
965
|
raise ParameterRequiredError.new('user', 'statement')
|
|
918
966
|
end
|
data/lib/qingstor/sdk/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: qingstor-sdk
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.9.
|
|
4
|
+
version: 1.9.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Yunify SDK Group
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-
|
|
11
|
+
date: 2017-03-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|