aws 2.3.34 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/acf/{right_acf_interface.rb → acf_interface.rb} +87 -57
- data/lib/aws.rb +9 -9
- data/lib/awsbase/aws_response_array.rb +21 -21
- data/lib/awsbase/awsbase.rb +579 -0
- data/lib/awsbase/benchmark_fix.rb +2 -2
- data/lib/awsbase/errors.rb +288 -0
- data/lib/awsbase/parsers.rb +227 -0
- data/lib/awsbase/support.rb +114 -114
- data/lib/awsbase/utils.rb +207 -0
- data/lib/ec2/ec2.rb +2070 -0
- data/lib/ec2/mon_interface.rb +243 -0
- data/lib/elb/elb_interface.rb +278 -276
- data/lib/iam/iam.rb +111 -109
- data/lib/rds/rds.rb +3 -1
- data/lib/right_aws.rb +9 -9
- data/lib/s3/bucket.rb +265 -0
- data/lib/s3/grantee.rb +238 -0
- data/lib/s3/key.rb +281 -0
- data/lib/s3/s3.rb +346 -0
- data/lib/s3/s3_interface.rb +1275 -0
- data/lib/sdb/active_sdb.rb +2 -0
- data/lib/sdb/sdb_interface.rb +886 -0
- data/lib/sqs/{right_sqs.rb → sqs.rb} +10 -0
- data/lib/sqs/sqs_interface.rb +483 -0
- data/test/s3/s3_test_base.rb +23 -0
- data/test/s3/test_s3.rb +156 -419
- data/test/s3/test_s3_class.rb +179 -0
- data/test/s3/test_s3_rights.rb +139 -0
- data/test/sqs/test_sqs.rb +19 -0
- metadata +27 -15
- data/lib/awsbase/right_awsbase.rb +0 -1254
- data/lib/ec2/right_ec2.rb +0 -1884
- data/lib/ec2/right_mon_interface.rb +0 -232
- data/lib/s3/right_s3.rb +0 -1115
- data/lib/s3/right_s3_interface.rb +0 -1253
- data/lib/sdb/right_sdb_interface.rb +0 -881
- data/lib/sqs/right_sqs_interface.rb +0 -443
data/lib/awsbase/support.rb
CHANGED
@@ -2,141 +2,141 @@
|
|
2
2
|
# want a dependency on it, so if it's not present, define the few
|
3
3
|
# extensions that we want to use...
|
4
4
|
unless defined? ActiveSupport
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
5
|
+
# These are ActiveSupport-;like extensions to do a few handy things in the gems
|
6
|
+
# Derived from ActiveSupport, so the AS copyright notice applies:
|
7
|
+
#
|
8
|
+
#
|
9
|
+
#
|
10
|
+
# Copyright (c) 2005 David Heinemeier Hansson
|
11
|
+
#
|
12
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
13
|
+
# a copy of this software and associated documentation files (the
|
14
|
+
# "Software"), to deal in the Software without restriction, including
|
15
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
16
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
17
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
18
|
+
# the following conditions:
|
19
|
+
#
|
20
|
+
# The above copyright notice and this permission notice shall be
|
21
|
+
# included in all copies or substantial portions of the Software.
|
22
|
+
#
|
23
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
24
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
25
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
26
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
27
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
28
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
29
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
30
|
+
#++
|
31
|
+
#
|
32
|
+
#
|
33
|
+
class String #:nodoc:
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
35
|
+
# Constantize tries to find a declared constant with the name specified
|
36
|
+
# in the string. It raises a NameError when the name is not in CamelCase
|
37
|
+
# or is not initialized.
|
38
|
+
#
|
39
|
+
# Examples
|
40
|
+
# "Module".constantize #=> Module
|
41
|
+
# "Class".constantize #=> Class
|
42
|
+
def constantize()
|
43
|
+
camel_cased_word = self
|
44
|
+
names = camel_cased_word.split('::')
|
45
|
+
names.shift if names.empty? || names.first.empty?
|
46
46
|
|
47
|
-
|
48
|
-
|
47
|
+
constant = Object
|
48
|
+
names.each do |name|
|
49
49
|
# constant = constant.const_get(name, false) || constant.const_missing(name)
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
57
|
-
end
|
58
|
-
constant
|
50
|
+
if Module.method(:const_get).arity == 1
|
51
|
+
# ruby 1.8
|
52
|
+
constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
|
53
|
+
else
|
54
|
+
# ruby 1.9
|
55
|
+
constant = constant.const_get(name, false) || constant.const_missing(name)
|
59
56
|
end
|
60
|
-
|
57
|
+
end
|
58
|
+
constant
|
61
59
|
end
|
62
60
|
|
61
|
+
end
|
63
62
|
|
64
|
-
class Object #:nodoc:
|
65
|
-
# "", " ", nil, [], and {} are blank
|
66
|
-
def blank?
|
67
|
-
if respond_to?(:empty?) && respond_to?(:strip)
|
68
|
-
empty? or strip.empty?
|
69
|
-
elsif respond_to?(:empty?)
|
70
|
-
empty?
|
71
|
-
else
|
72
|
-
!self
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
63
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
64
|
+
class Object #:nodoc:
|
65
|
+
# "", " ", nil, [], and {} are blank
|
66
|
+
def blank?
|
67
|
+
if respond_to?(:empty?) && respond_to?(:strip)
|
68
|
+
empty? or strip.empty?
|
69
|
+
elsif respond_to?(:empty?)
|
70
|
+
empty?
|
71
|
+
else
|
72
|
+
!self
|
73
|
+
end
|
81
74
|
end
|
75
|
+
end
|
82
76
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
end
|
77
|
+
class NilClass #:nodoc:
|
78
|
+
def blank?
|
79
|
+
true
|
87
80
|
end
|
81
|
+
end
|
88
82
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
end
|
83
|
+
class FalseClass #:nodoc:
|
84
|
+
def blank?
|
85
|
+
true
|
93
86
|
end
|
87
|
+
end
|
94
88
|
|
95
|
-
|
96
|
-
|
89
|
+
class TrueClass #:nodoc:
|
90
|
+
def blank?
|
91
|
+
false
|
97
92
|
end
|
93
|
+
end
|
98
94
|
|
99
|
-
|
100
|
-
|
95
|
+
class Array #:nodoc:
|
96
|
+
alias_method :blank?, :empty?
|
97
|
+
end
|
101
98
|
|
102
|
-
|
103
|
-
|
104
|
-
inject({}) do |options, (key, value)|
|
105
|
-
options[key.to_sym] = value
|
106
|
-
options
|
107
|
-
end
|
108
|
-
end
|
99
|
+
class Hash #:nodoc:
|
100
|
+
alias_method :blank?, :empty?
|
109
101
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
#
|
117
|
-
# search(options.slice(:mass, :velocity, :time))
|
118
|
-
#
|
119
|
-
# If you have an array of keys you want to limit to, you should splat them:
|
120
|
-
#
|
121
|
-
# valid_keys = [:mass, :velocity, :time]
|
122
|
-
# search(options.slice(*valid_keys))
|
123
|
-
def slice(*keys)
|
124
|
-
keys = keys.map! { |key| convert_key(key) } if respond_to?(:convert_key)
|
125
|
-
hash = self.class.new
|
126
|
-
keys.each { |k| hash[k] = self[k] if has_key?(k) }
|
127
|
-
hash
|
128
|
-
end
|
102
|
+
# Return a new hash with all keys converted to symbols.
|
103
|
+
def symbolize_keys
|
104
|
+
inject({}) do |options, (key, value)|
|
105
|
+
options[key.to_sym] = value
|
106
|
+
options
|
107
|
+
end
|
129
108
|
end
|
130
109
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
110
|
+
# Slice a hash to include only the given keys. This is useful for
|
111
|
+
# limiting an options hash to valid keys before passing to a method:
|
112
|
+
#
|
113
|
+
# def search(criteria = {})
|
114
|
+
# assert_valid_keys(:mass, :velocity, :time)
|
115
|
+
# end
|
116
|
+
#
|
117
|
+
# search(options.slice(:mass, :velocity, :time))
|
118
|
+
#
|
119
|
+
# If you have an array of keys you want to limit to, you should splat them:
|
120
|
+
#
|
121
|
+
# valid_keys = [:mass, :velocity, :time]
|
122
|
+
# search(options.slice(*valid_keys))
|
123
|
+
def slice(*keys)
|
124
|
+
keys = keys.map! { |key| convert_key(key) } if respond_to?(:convert_key)
|
125
|
+
hash = self.class.new
|
126
|
+
keys.each { |k| hash[k] = self[k] if has_key?(k) }
|
127
|
+
hash
|
135
128
|
end
|
129
|
+
end
|
136
130
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
131
|
+
class String #:nodoc:
|
132
|
+
def blank?
|
133
|
+
empty? || strip.empty?
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
class Numeric #:nodoc:
|
138
|
+
def blank?
|
139
|
+
false
|
141
140
|
end
|
141
|
+
end
|
142
142
|
end
|
@@ -0,0 +1,207 @@
|
|
1
|
+
module Aws
|
2
|
+
|
3
|
+
class AwsUtils #:nodoc:
|
4
|
+
@@digest1 = OpenSSL::Digest::Digest.new("sha1")
|
5
|
+
@@digest256 = nil
|
6
|
+
if OpenSSL::OPENSSL_VERSION_NUMBER > 0x00908000
|
7
|
+
@@digest256 = OpenSSL::Digest::Digest.new("sha256") rescue nil # Some installation may not support sha256
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.sign(aws_secret_access_key, auth_string)
|
11
|
+
Base64.encode64(OpenSSL::HMAC.digest(@@digest1, aws_secret_access_key, auth_string)).strip
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
# Set a timestamp and a signature version
|
16
|
+
def self.fix_service_params(service_hash, signature)
|
17
|
+
service_hash["Timestamp"] ||= Time.now.utc.strftime("%Y-%m-%dT%H:%M:%S.000Z") unless service_hash["Expires"]
|
18
|
+
service_hash["SignatureVersion"] = signature
|
19
|
+
service_hash
|
20
|
+
end
|
21
|
+
|
22
|
+
# Signature Version 0
|
23
|
+
# A deprecated guy (should work till septemper 2009)
|
24
|
+
def self.sign_request_v0(aws_secret_access_key, service_hash)
|
25
|
+
fix_service_params(service_hash, '0')
|
26
|
+
string_to_sign = "#{service_hash['Action']}#{service_hash['Timestamp'] || service_hash['Expires']}"
|
27
|
+
service_hash['Signature'] = AwsUtils::sign(aws_secret_access_key, string_to_sign)
|
28
|
+
service_hash.to_a.collect { |key, val| "#{amz_escape(key)}=#{amz_escape(val.to_s)}" }.join("&")
|
29
|
+
end
|
30
|
+
|
31
|
+
# Signature Version 1
|
32
|
+
# Another deprecated guy (should work till septemper 2009)
|
33
|
+
def self.sign_request_v1(aws_secret_access_key, service_hash)
|
34
|
+
fix_service_params(service_hash, '1')
|
35
|
+
string_to_sign = service_hash.sort { |a, b| (a[0].to_s.downcase)<=>(b[0].to_s.downcase) }.to_s
|
36
|
+
service_hash['Signature'] = AwsUtils::sign(aws_secret_access_key, string_to_sign)
|
37
|
+
service_hash.to_a.collect { |key, val| "#{amz_escape(key)}=#{amz_escape(val.to_s)}" }.join("&")
|
38
|
+
end
|
39
|
+
|
40
|
+
# Signature Version 2
|
41
|
+
# EC2, SQS and SDB requests must be signed by this guy.
|
42
|
+
# See: http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/index.html?REST_RESTAuth.html
|
43
|
+
# http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1928
|
44
|
+
def self.sign_request_v2(aws_secret_access_key, service_hash, http_verb, host, uri)
|
45
|
+
fix_service_params(service_hash, '2')
|
46
|
+
# select a signing method (make an old openssl working with sha1)
|
47
|
+
# make 'HmacSHA256' to be a default one
|
48
|
+
service_hash['SignatureMethod'] = 'HmacSHA256' unless ['HmacSHA256', 'HmacSHA1'].include?(service_hash['SignatureMethod'])
|
49
|
+
service_hash['SignatureMethod'] = 'HmacSHA1' unless @@digest256
|
50
|
+
# select a digest
|
51
|
+
digest = (service_hash['SignatureMethod'] == 'HmacSHA256' ? @@digest256 : @@digest1)
|
52
|
+
# form string to sign
|
53
|
+
canonical_string = service_hash.keys.sort.map do |key|
|
54
|
+
"#{amz_escape(key)}=#{amz_escape(service_hash[key])}"
|
55
|
+
end.join('&')
|
56
|
+
string_to_sign = "#{http_verb.to_s.upcase}\n#{host.downcase}\n#{uri}\n#{canonical_string}"
|
57
|
+
# sign the string
|
58
|
+
signature = escape_sig(Base64.encode64(OpenSSL::HMAC.digest(digest, aws_secret_access_key, string_to_sign)).strip)
|
59
|
+
ret = "#{canonical_string}&Signature=#{signature}"
|
60
|
+
# puts 'full=' + ret.inspect
|
61
|
+
ret
|
62
|
+
end
|
63
|
+
|
64
|
+
HEX = [
|
65
|
+
"%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
|
66
|
+
"%08", "%09", "%0A", "%0B", "%0C", "%0D", "%0E", "%0F",
|
67
|
+
"%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
|
68
|
+
"%18", "%19", "%1A", "%1B", "%1C", "%1D", "%1E", "%1F",
|
69
|
+
"%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27",
|
70
|
+
"%28", "%29", "%2A", "%2B", "%2C", "%2D", "%2E", "%2F",
|
71
|
+
"%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37",
|
72
|
+
"%38", "%39", "%3A", "%3B", "%3C", "%3D", "%3E", "%3F",
|
73
|
+
"%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47",
|
74
|
+
"%48", "%49", "%4A", "%4B", "%4C", "%4D", "%4E", "%4F",
|
75
|
+
"%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57",
|
76
|
+
"%58", "%59", "%5A", "%5B", "%5C", "%5D", "%5E", "%5F",
|
77
|
+
"%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67",
|
78
|
+
"%68", "%69", "%6A", "%6B", "%6C", "%6D", "%6E", "%6F",
|
79
|
+
"%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77",
|
80
|
+
"%78", "%79", "%7A", "%7B", "%7C", "%7D", "%7E", "%7F",
|
81
|
+
"%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87",
|
82
|
+
"%88", "%89", "%8A", "%8B", "%8C", "%8D", "%8E", "%8F",
|
83
|
+
"%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97",
|
84
|
+
"%98", "%99", "%9A", "%9B", "%9C", "%9D", "%9E", "%9F",
|
85
|
+
"%A0", "%A1", "%A2", "%A3", "%A4", "%A5", "%A6", "%A7",
|
86
|
+
"%A8", "%A9", "%AA", "%AB", "%AC", "%AD", "%AE", "%AF",
|
87
|
+
"%B0", "%B1", "%B2", "%B3", "%B4", "%B5", "%B6", "%B7",
|
88
|
+
"%B8", "%B9", "%BA", "%BB", "%BC", "%BD", "%BE", "%BF",
|
89
|
+
"%C0", "%C1", "%C2", "%C3", "%C4", "%C5", "%C6", "%C7",
|
90
|
+
"%C8", "%C9", "%CA", "%CB", "%CC", "%CD", "%CE", "%CF",
|
91
|
+
"%D0", "%D1", "%D2", "%D3", "%D4", "%D5", "%D6", "%D7",
|
92
|
+
"%D8", "%D9", "%DA", "%DB", "%DC", "%DD", "%DE", "%DF",
|
93
|
+
"%E0", "%E1", "%E2", "%E3", "%E4", "%E5", "%E6", "%E7",
|
94
|
+
"%E8", "%E9", "%EA", "%EB", "%EC", "%ED", "%EE", "%EF",
|
95
|
+
"%F0", "%F1", "%F2", "%F3", "%F4", "%F5", "%F6", "%F7",
|
96
|
+
"%F8", "%F9", "%FA", "%FB", "%FC", "%FD", "%FE", "%FF"
|
97
|
+
]
|
98
|
+
TO_REMEMBER = 'AZaz09 -_.!~*\'()'
|
99
|
+
ASCII = {} # {'A'=>65, 'Z'=>90, 'a'=>97, 'z'=>122, '0'=>48, '9'=>57, ' '=>32, '-'=>45, '_'=>95, '.'=>}
|
100
|
+
TO_REMEMBER.each_char do |c| #unpack("c*").each do |c|
|
101
|
+
ASCII[c] = c.unpack("c")[0]
|
102
|
+
end
|
103
|
+
# puts 'ascii=' + ASCII.inspect
|
104
|
+
|
105
|
+
# Escape a string accordingly Amazon rulles
|
106
|
+
# http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/index.html?REST_RESTAuth.html
|
107
|
+
def self.amz_escape(param)
|
108
|
+
|
109
|
+
param = param.to_s
|
110
|
+
# param = param.force_encoding("UTF-8")
|
111
|
+
|
112
|
+
e = "x" # escape2(param.to_s)
|
113
|
+
# puts 'ESCAPED=' + e.inspect
|
114
|
+
|
115
|
+
|
116
|
+
#return CGI.escape(param.to_s).gsub("%7E", "~").gsub("+", "%20") # from: http://umlaut.rubyforge.org/svn/trunk/lib/aws_product_sign.rb
|
117
|
+
|
118
|
+
#param.to_s.gsub(/([^a-zA-Z0-9._~-]+)/n) do
|
119
|
+
# '%' + $1.unpack('H2' * $1.size).join('%').upcase
|
120
|
+
#end
|
121
|
+
|
122
|
+
# puts 'e in=' + e.inspect
|
123
|
+
# converter = Iconv.new('ASCII', 'UTF-8')
|
124
|
+
# e = converter.iconv(e) #.unpack('U*').select{ |cp| cp < 127 }.pack('U*')
|
125
|
+
# puts 'e out=' + e.inspect
|
126
|
+
|
127
|
+
e2 = CGI.escape(param)
|
128
|
+
e2 = e2.gsub("%7E", "~")
|
129
|
+
e2 = e2.gsub("+", "%20")
|
130
|
+
e2 = e2.gsub("*", "%2A")
|
131
|
+
|
132
|
+
# puts 'E2=' + e2.inspect
|
133
|
+
# puts e == e2.to_s
|
134
|
+
|
135
|
+
e2
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
def self.escape2(s)
|
140
|
+
# home grown
|
141
|
+
ret = ""
|
142
|
+
s.unpack("U*") do |ch|
|
143
|
+
# puts 'ch=' + ch.inspect
|
144
|
+
if ASCII['A'] <= ch && ch <= ASCII['Z'] # A to Z
|
145
|
+
ret << ch
|
146
|
+
elsif ASCII['a'] <= ch && ch <= ASCII['z'] # a to z
|
147
|
+
ret << ch
|
148
|
+
elsif ASCII['0'] <= ch && ch <= ASCII['9'] # 0 to 9
|
149
|
+
ret << ch
|
150
|
+
elsif ch == ASCII[' '] # space
|
151
|
+
ret << "%20" # "+"
|
152
|
+
elsif ch == ASCII['-'] || ch == ASCII['_'] || ch == ASCII['.'] || ch == ASCII['~']
|
153
|
+
ret << ch
|
154
|
+
elsif ch <= 0x007f # other ascii
|
155
|
+
ret << HEX[ch]
|
156
|
+
elsif ch <= 0x07FF # non-ascii
|
157
|
+
ret << HEX[0xc0 | (ch >> 6)]
|
158
|
+
ret << HEX[0x80 | (ch & 0x3F)]
|
159
|
+
else
|
160
|
+
ret << HEX[0xe0 | (ch >> 12)]
|
161
|
+
ret << HEX[0x80 | ((ch >> 6) & 0x3F)]
|
162
|
+
ret << HEX[0x80 | (ch & 0x3F)]
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
ret
|
167
|
+
|
168
|
+
end
|
169
|
+
|
170
|
+
def self.escape_sig(raw)
|
171
|
+
e = CGI.escape(raw)
|
172
|
+
end
|
173
|
+
|
174
|
+
# From Amazon's SQS Dev Guide, a brief description of how to escape:
|
175
|
+
# "URL encode the computed signature and other query parameters as specified in
|
176
|
+
# RFC1738, section 2.2. In addition, because the + character is interpreted as a blank space
|
177
|
+
# by Sun Java classes that perform URL decoding, make sure to encode the + character
|
178
|
+
# although it is not required by RFC1738."
|
179
|
+
# Avoid using CGI::escape to escape URIs.
|
180
|
+
# CGI::escape will escape characters in the protocol, host, and port
|
181
|
+
# sections of the URI. Only target chars in the query
|
182
|
+
# string should be escaped.
|
183
|
+
def self.URLencode(raw)
|
184
|
+
e = URI.escape(raw)
|
185
|
+
e.gsub(/\+/, "%2b")
|
186
|
+
end
|
187
|
+
|
188
|
+
|
189
|
+
def self.allow_only(allowed_keys, params)
|
190
|
+
bogus_args = []
|
191
|
+
params.keys.each { |p| bogus_args.push(p) unless allowed_keys.include?(p) }
|
192
|
+
raise AwsError.new("The following arguments were given but are not legal for the function call #{caller_method}: #{bogus_args.inspect}") if bogus_args.length > 0
|
193
|
+
end
|
194
|
+
|
195
|
+
def self.mandatory_arguments(required_args, params)
|
196
|
+
rargs = required_args.dup
|
197
|
+
params.keys.each { |p| rargs.delete(p) }
|
198
|
+
raise AwsError.new("The following mandatory arguments were not provided to #{caller_method}: #{rargs.inspect}") if rargs.length > 0
|
199
|
+
end
|
200
|
+
|
201
|
+
def self.caller_method
|
202
|
+
caller[1]=~/`(.*?)'/
|
203
|
+
$1
|
204
|
+
end
|
205
|
+
|
206
|
+
end
|
207
|
+
end
|