aws 2.4.5 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +9 -75
- data/lib/acf/acf_interface.rb +6 -4
- data/lib/aws.rb +2 -1
- data/lib/awsbase/awsbase.rb +98 -65
- data/lib/awsbase/errors.rb +9 -5
- data/lib/awsbase/parsers.rb +226 -226
- data/lib/awsbase/utils.rb +255 -207
- data/lib/ec2/ec2.rb +243 -105
- data/lib/ec2/mon_interface.rb +2 -1
- data/lib/iam/iam.rb +31 -25
- data/lib/right_aws.rb +1 -1
- data/lib/s3/bucket.rb +7 -8
- data/lib/s3/grantee.rb +238 -238
- data/lib/s3/key.rb +281 -281
- data/lib/s3/s3.rb +2 -1
- data/lib/s3/s3_interface.rb +45 -35
- data/lib/sdb/active_sdb.rb +19 -22
- data/lib/sdb/sdb_interface.rb +4 -5
- data/lib/ses/ses.rb +123 -0
- data/lib/sqs/sqs.rb +5 -0
- data/lib/sqs/sqs_interface.rb +3 -3
- metadata +53 -104
- data/lib/awsbase/support.rb +0 -142
- data/test/acf/test_acf.rb +0 -148
- data/test/acf/test_helper.rb +0 -2
- data/test/ec2/test_ec2.rb +0 -205
- data/test/ec2/test_helper.rb +0 -2
- data/test/ec2/test_mon.rb +0 -17
- data/test/elb/test_elb.rb +0 -51
- data/test/http_connection.rb +0 -87
- data/test/iam/test_iam.rb +0 -36
- data/test/rds/test_rds.rb +0 -181
- data/test/s3/s3_test_base.rb +0 -23
- data/test/s3/test_helper.rb +0 -3
- data/test/s3/test_s3.rb +0 -162
- data/test/s3/test_s3_class.rb +0 -179
- data/test/s3/test_s3_rights.rb +0 -139
- data/test/s3/test_s3_stubbed.rb +0 -97
- data/test/sdb/test_active_sdb.rb +0 -338
- data/test/sdb/test_helper.rb +0 -3
- data/test/sdb/test_sdb.rb +0 -220
- data/test/sqs/test_helper.rb +0 -2
- data/test/sqs/test_sqs.rb +0 -232
- data/test/test_credentials.rb +0 -54
- data/test/ts_right_aws.rb +0 -13
data/lib/s3/s3.rb
CHANGED
@@ -80,6 +80,7 @@ module Aws
|
|
80
80
|
# {:server => 's3.amazonaws.com' # Amazon service host: 's3.amazonaws.com'(default)
|
81
81
|
# :port => 443 # Amazon service port: 80 or 443(default)
|
82
82
|
# :protocol => 'https' # Amazon service protocol: 'http' or 'https'(default)
|
83
|
+
# :virtual_hosting => false # Force using bucket virtual hosting: https://s3.amazonaws.com/my-bucket vs. https://my-bucket.s3.amazonaws.com
|
83
84
|
# :connection_mode => :default # options are
|
84
85
|
# :default (will use best known safe (as in won't need explicit close) option, may change in the future)
|
85
86
|
# :per_request (opens and closes a connection on every request)
|
@@ -306,7 +307,7 @@ module Aws
|
|
306
307
|
@bucket = bucket
|
307
308
|
@name = name.to_s
|
308
309
|
@meta_headers = meta_headers
|
309
|
-
raise 'Key name can not be empty.' if
|
310
|
+
raise 'Key name can not be empty.' if Aws::Utils.blank?(@name)
|
310
311
|
end
|
311
312
|
|
312
313
|
# Generate link to PUT key data.
|
data/lib/s3/s3_interface.rb
CHANGED
@@ -50,10 +50,6 @@ module Aws
|
|
50
50
|
@@bench
|
51
51
|
end
|
52
52
|
|
53
|
-
def self.bench
|
54
|
-
@@bench
|
55
|
-
end
|
56
|
-
|
57
53
|
def self.bench_xml
|
58
54
|
@@bench.xml
|
59
55
|
end
|
@@ -135,13 +131,18 @@ module Aws
|
|
135
131
|
server = @params[:server]
|
136
132
|
service = @params[:service].to_s
|
137
133
|
service.chop! if service[%r{/$}] # remove trailing '/' from service
|
138
|
-
# extract bucket name and check it's dns
|
134
|
+
# extract bucket name and check it's dns compatibility
|
139
135
|
headers[:url].to_s[%r{^([a-z0-9._-]*)(/[^?]*)?(\?.+)?}i]
|
140
136
|
bucket_name, key_path, params_list = $1, $2, $3
|
141
137
|
# select request model
|
142
|
-
|
143
|
-
|
144
|
-
|
138
|
+
if is_dns_bucket?(bucket_name) and !@params[:virtual_hosting]
|
139
|
+
# fix a path
|
140
|
+
server = "#{bucket_name}.#{server}"
|
141
|
+
key_path ||= '/'
|
142
|
+
path = "#{service}#{key_path}#{params_list}"
|
143
|
+
else
|
144
|
+
path = "#{service}/#{bucket_name}#{key_path}#{params_list}"
|
145
|
+
end
|
145
146
|
path_to_sign = "#{service}/#{bucket_name}#{key_path}#{params_list}"
|
146
147
|
[server, path, path_to_sign]
|
147
148
|
end
|
@@ -158,13 +159,13 @@ module Aws
|
|
158
159
|
headers['content-type'] ||= ''
|
159
160
|
headers['date'] = Time.now.httpdate
|
160
161
|
# create request
|
161
|
-
request =
|
162
|
+
request = Net::HTTP.const_get(method.capitalize).new(path)
|
162
163
|
request.body = data if data
|
163
164
|
# set request headers and meta headers
|
164
165
|
headers.each { |key, value| request[key.to_s] = value }
|
165
166
|
#generate auth strings
|
166
167
|
auth_string = canonical_string(request.method, path_to_sign, request.to_hash)
|
167
|
-
signature =
|
168
|
+
signature = Utils::sign(@aws_secret_access_key, auth_string)
|
168
169
|
# set other headers
|
169
170
|
request['Authorization'] = "AWS #{@aws_access_key_id}:#{signature}"
|
170
171
|
# prepare output hash
|
@@ -206,7 +207,7 @@ module Aws
|
|
206
207
|
#
|
207
208
|
def create_bucket(bucket, headers={})
|
208
209
|
data = nil
|
209
|
-
unless headers[:location]
|
210
|
+
unless Aws::Utils.blank?(headers[:location])
|
210
211
|
# data = "<CreateBucketConfiguration><LocationConstraint>#{headers[:location].to_s.upcase}</LocationConstraint></CreateBucketConfiguration>"
|
211
212
|
location = headers[:location].to_s
|
212
213
|
location.upcase! if location == 'eu'
|
@@ -242,8 +243,8 @@ module Aws
|
|
242
243
|
#
|
243
244
|
#
|
244
245
|
def get_logging_parse(params)
|
245
|
-
|
246
|
-
|
246
|
+
Utils.mandatory_arguments([:bucket], params)
|
247
|
+
Utils.allow_only([:bucket, :headers], params)
|
247
248
|
params[:headers] = {} unless params[:headers]
|
248
249
|
req_hash = generate_rest_request('GET', params[:headers].merge(:url=>"#{params[:bucket]}?logging"))
|
249
250
|
request_info(req_hash, S3LoggingParser.new)
|
@@ -256,8 +257,8 @@ module Aws
|
|
256
257
|
# :bucket
|
257
258
|
# :xmldoc
|
258
259
|
def put_logging(params)
|
259
|
-
|
260
|
-
|
260
|
+
Utils.mandatory_arguments([:bucket, :xmldoc], params)
|
261
|
+
Utils.allow_only([:bucket, :xmldoc, :headers], params)
|
261
262
|
params[:headers] = {} unless params[:headers]
|
262
263
|
req_hash = generate_rest_request('PUT', params[:headers].merge(:url=>"#{params[:bucket]}?logging", :data => params[:xmldoc]))
|
263
264
|
request_info(req_hash, S3TrueParser.new)
|
@@ -295,7 +296,10 @@ module Aws
|
|
295
296
|
# 'max-keys' => "5"}, ..., {...}]
|
296
297
|
#
|
297
298
|
def list_bucket(bucket, options={}, headers={})
|
298
|
-
|
299
|
+
unless options.nil? || options.empty?
|
300
|
+
bucket << '?'
|
301
|
+
bucket << options.map { |k, v| "#{k.to_s}=#{CGI::escape v.to_s}" }.join('&')
|
302
|
+
end
|
299
303
|
req_hash = generate_rest_request('GET', headers.merge(:url=>bucket))
|
300
304
|
request_info(req_hash, S3ListBucketParser.new(:logger => @logger))
|
301
305
|
rescue
|
@@ -330,10 +334,13 @@ module Aws
|
|
330
334
|
# ]
|
331
335
|
# }
|
332
336
|
def incrementally_list_bucket(bucket, options={}, headers={}, &block)
|
333
|
-
internal_options = options.
|
337
|
+
internal_options = Hash[ options.map {|k,v| [k.to_sym, v] } ]
|
334
338
|
begin
|
335
339
|
internal_bucket = bucket.dup
|
336
|
-
|
340
|
+
unless internal_options.nil? || internal_options.empty?
|
341
|
+
internal_bucket << '?'
|
342
|
+
internal_bucket << internal_options.map { |k, v| "#{k.to_s}=#{CGI::escape v.to_s}" }.join('&')
|
343
|
+
end
|
337
344
|
req_hash = generate_rest_request('GET', headers.merge(:url=>internal_bucket))
|
338
345
|
response = request_info(req_hash, S3ImprovedListBucketParser.new(:logger => @logger))
|
339
346
|
there_are_more_keys = response[:is_truncated]
|
@@ -462,8 +469,8 @@ module Aws
|
|
462
469
|
# "content-length"=>"0"}
|
463
470
|
|
464
471
|
def store_object(params)
|
465
|
-
|
466
|
-
|
472
|
+
Utils.allow_only([:bucket, :key, :data, :headers, :md5], params)
|
473
|
+
Utils.mandatory_arguments([:bucket, :key, :data], params)
|
467
474
|
params[:headers] = {} unless params[:headers]
|
468
475
|
|
469
476
|
params[:data].binmode if (params[:data].respond_to?(:binmode)) # On Windows, if someone opens a file in text mode, we must reset it to binary mode for streaming to work properly
|
@@ -506,7 +513,7 @@ module Aws
|
|
506
513
|
# "server"=>"AmazonS3",
|
507
514
|
# "content-length"=>"0"}
|
508
515
|
def store_object_and_verify(params)
|
509
|
-
|
516
|
+
Utils.mandatory_arguments([:md5], params)
|
510
517
|
r = store_object(params)
|
511
518
|
r[:verified_md5] ? (return r) : (raise AwsError.new("Uploaded object failed MD5 checksum verification: #{r.inspect}"))
|
512
519
|
end
|
@@ -587,8 +594,8 @@ module Aws
|
|
587
594
|
# the response can be 'streamed'. The hash containing header fields is
|
588
595
|
# still returned.
|
589
596
|
def retrieve_object(params, &block)
|
590
|
-
|
591
|
-
|
597
|
+
Utils.mandatory_arguments([:bucket, :key], params)
|
598
|
+
Utils.allow_only([:bucket, :key, :headers, :md5], params)
|
592
599
|
params[:headers] = {} unless params[:headers]
|
593
600
|
req_hash = generate_rest_request('GET', params[:headers].merge(:url=>"#{params[:bucket]}/#{CGI::escape params[:key]}"))
|
594
601
|
resp = request_info(req_hash, S3HttpResponseBodyParser.new, &block)
|
@@ -605,7 +612,7 @@ module Aws
|
|
605
612
|
# If the check passes, returns the response metadata with the "verified_md5" field set true. Raises an exception if the checksums conflict.
|
606
613
|
# This call is implemented as a wrapper around retrieve_object and the user may gain different semantics by creating a custom wrapper.
|
607
614
|
def retrieve_object_and_verify(params, &block)
|
608
|
-
|
615
|
+
Utils.mandatory_arguments([:md5], params)
|
609
616
|
resp = retrieve_object(params, &block)
|
610
617
|
return resp if resp[:verified_md5]
|
611
618
|
raise AwsError.new("Retrieved object failed MD5 checksum verification: #{resp.inspect}")
|
@@ -707,7 +714,7 @@ module Aws
|
|
707
714
|
# <Permission>FULL_CONTROL</Permission></Grant></AccessControlList></AccessControlPolicy>" }
|
708
715
|
#
|
709
716
|
def get_acl(bucket, key='', headers={})
|
710
|
-
key =
|
717
|
+
key = Aws::Utils.blank?(key) ? '' : "/#{CGI::escape key}"
|
711
718
|
req_hash = generate_rest_request('GET', headers.merge(:url=>"#{bucket}#{key}?acl"))
|
712
719
|
request_info(req_hash, S3HttpResponseBodyParser.new)
|
713
720
|
rescue
|
@@ -737,7 +744,7 @@ module Aws
|
|
737
744
|
# :display_name=>"root"}}
|
738
745
|
#
|
739
746
|
def get_acl_parse(bucket, key='', headers={})
|
740
|
-
key =
|
747
|
+
key = Aws::Utils.blank?(key) ? '' : "/#{CGI::escape key}"
|
741
748
|
req_hash = generate_rest_request('GET', headers.merge(:url=>"#{bucket}#{key}?acl"))
|
742
749
|
acl = request_info(req_hash, S3AclParser.new(:logger => @logger))
|
743
750
|
result = {}
|
@@ -761,7 +768,7 @@ module Aws
|
|
761
768
|
|
762
769
|
# Sets the ACL on a bucket or object.
|
763
770
|
def put_acl(bucket, key, acl_xml_doc, headers={})
|
764
|
-
key =
|
771
|
+
key = Aws::Utils.blank?(key) ? '' : "/#{CGI::escape key}"
|
765
772
|
req_hash = generate_rest_request('PUT', headers.merge(:url=>"#{bucket}#{key}?acl", :data=>acl_xml_doc))
|
766
773
|
request_info(req_hash, S3HttpResponseBodyParser.new)
|
767
774
|
rescue
|
@@ -790,7 +797,7 @@ module Aws
|
|
790
797
|
end
|
791
798
|
|
792
799
|
def put_bucket_policy(bucket, policy)
|
793
|
-
key =
|
800
|
+
key = Aws::Utils.blank?(key) ? '' : "/#{CGI::escape key}"
|
794
801
|
req_hash = generate_rest_request('PUT', {:url=>"#{bucket}?policy", :data=>policy})
|
795
802
|
request_info(req_hash, S3HttpResponseBodyParser.new)
|
796
803
|
rescue
|
@@ -910,7 +917,10 @@ module Aws
|
|
910
917
|
# s3.list_bucket_link('my_awesome_bucket') #=> url string
|
911
918
|
#
|
912
919
|
def list_bucket_link(bucket, options=nil, expires=nil, headers={})
|
913
|
-
|
920
|
+
unless options.nil? || options.empty?
|
921
|
+
bucket << '?'
|
922
|
+
bucket << options.map { |k, v| "#{k.to_s}=#{CGI::escape v.to_s}" }.join('&')
|
923
|
+
end
|
914
924
|
generate_link('GET', headers.merge(:url=>bucket), expires)
|
915
925
|
rescue
|
916
926
|
on_exception
|
@@ -921,7 +931,7 @@ module Aws
|
|
921
931
|
# s3.put_link('my_awesome_bucket',key, object) #=> url string
|
922
932
|
#
|
923
933
|
def put_link(bucket, key, data=nil, expires=nil, headers={})
|
924
|
-
generate_link('PUT', headers.merge(:url=>"#{bucket}/#{
|
934
|
+
generate_link('PUT', headers.merge(:url=>"#{bucket}/#{Utils::URLencode key}", :data=>data), expires)
|
925
935
|
rescue
|
926
936
|
on_exception
|
927
937
|
end
|
@@ -939,7 +949,7 @@ module Aws
|
|
939
949
|
#
|
940
950
|
# see http://docs.amazonwebservices.com/AmazonS3/2006-03-01/VirtualHosting.html
|
941
951
|
def get_link(bucket, key, expires=nil, headers={})
|
942
|
-
generate_link('GET', headers.merge(:url=>"#{bucket}/#{
|
952
|
+
generate_link('GET', headers.merge(:url=>"#{bucket}/#{Utils::URLencode key.to_s}"), expires)
|
943
953
|
rescue
|
944
954
|
on_exception
|
945
955
|
end
|
@@ -949,7 +959,7 @@ module Aws
|
|
949
959
|
# s3.head_link('my_awesome_bucket',key) #=> url string
|
950
960
|
#
|
951
961
|
def head_link(bucket, key, expires=nil, headers={})
|
952
|
-
generate_link('HEAD', headers.merge(:url=>"#{bucket}/#{
|
962
|
+
generate_link('HEAD', headers.merge(:url=>"#{bucket}/#{Utils::URLencode key}"), expires)
|
953
963
|
rescue
|
954
964
|
on_exception
|
955
965
|
end
|
@@ -959,7 +969,7 @@ module Aws
|
|
959
969
|
# s3.delete_link('my_awesome_bucket',key) #=> url string
|
960
970
|
#
|
961
971
|
def delete_link(bucket, key, expires=nil, headers={})
|
962
|
-
generate_link('DELETE', headers.merge(:url=>"#{bucket}/#{
|
972
|
+
generate_link('DELETE', headers.merge(:url=>"#{bucket}/#{Utils::URLencode key}"), expires)
|
963
973
|
rescue
|
964
974
|
on_exception
|
965
975
|
end
|
@@ -970,7 +980,7 @@ module Aws
|
|
970
980
|
# s3.get_acl_link('my_awesome_bucket',key) #=> url string
|
971
981
|
#
|
972
982
|
def get_acl_link(bucket, key='', headers={})
|
973
|
-
return generate_link('GET', headers.merge(:url=>"#{bucket}/#{
|
983
|
+
return generate_link('GET', headers.merge(:url=>"#{bucket}/#{Utils::URLencode key}?acl"))
|
974
984
|
rescue
|
975
985
|
on_exception
|
976
986
|
end
|
@@ -980,7 +990,7 @@ module Aws
|
|
980
990
|
# s3.put_acl_link('my_awesome_bucket',key) #=> url string
|
981
991
|
#
|
982
992
|
def put_acl_link(bucket, key='', headers={})
|
983
|
-
return generate_link('PUT', headers.merge(:url=>"#{bucket}/#{
|
993
|
+
return generate_link('PUT', headers.merge(:url=>"#{bucket}/#{Utils::URLencode key}?acl"))
|
984
994
|
rescue
|
985
995
|
on_exception
|
986
996
|
end
|
data/lib/sdb/active_sdb.rb
CHANGED
@@ -1,7 +1,4 @@
|
|
1
|
-
|
2
|
-
# http://github.com/appoxy/simple_record
|
3
|
-
|
4
|
-
|
1
|
+
puts 'WARNING: ActiveSdb is deprecated, please use SimpleRecord at https://github.com/appoxy/simple_record/ instead.'
|
5
2
|
|
6
3
|
# Copyright (c) 2008 RightScale Inc
|
7
4
|
#
|
@@ -32,8 +29,6 @@ rescue LoadError => e
|
|
32
29
|
exit
|
33
30
|
end
|
34
31
|
|
35
|
-
puts 'WARNING: ActiveSdb is deprecated, please use SimpleRecord at https://github.com/appoxy/simple_record/ instead.'
|
36
|
-
|
37
32
|
module Aws
|
38
33
|
|
39
34
|
# = Aws::ActiveSdb -- RightScale SDB interface (alpha release)
|
@@ -375,7 +370,7 @@ module Aws
|
|
375
370
|
# user defined :conditions to string (if it was defined)
|
376
371
|
options[:conditions] = build_conditions(options[:conditions])
|
377
372
|
# join ids condition and user defined conditions
|
378
|
-
options[:conditions] = options[:conditions]
|
373
|
+
options[:conditions] = Aws::Utils.blank?(options[:conditions]) ? ids_cond : "(#{options[:conditions]}) AND #{ids_cond}"
|
379
374
|
#puts 'options=' + options.inspect
|
380
375
|
result = sql_select(options)
|
381
376
|
#puts 'select_from_ids result=' + result.inspect
|
@@ -482,7 +477,7 @@ module Aws
|
|
482
477
|
query_expression = query_expression.to_s
|
483
478
|
# quote from Amazon:
|
484
479
|
# The sort attribute must be present in at least one of the predicates of the query expression.
|
485
|
-
if
|
480
|
+
if Aws::Utils.blank?(query_expression)
|
486
481
|
query_expression = sort_query_expression
|
487
482
|
elsif !query_attributes(query_expression).include?(sort_by)
|
488
483
|
query_expression += " intersection #{sort_query_expression}"
|
@@ -536,7 +531,7 @@ module Aws
|
|
536
531
|
# user defined :conditions to string (if it was defined)
|
537
532
|
options[:conditions] = build_conditions(options[:conditions])
|
538
533
|
# join ids condition and user defined conditions
|
539
|
-
options[:conditions] = options[:conditions]
|
534
|
+
options[:conditions] = Aws::Utils.blank?(options[:conditions]) ? ids_cond : "#{options[:conditions]} intersection #{ids_cond}"
|
540
535
|
result = find_every(options)
|
541
536
|
# if one record was requested then return it
|
542
537
|
unless bunch_of_records_requested
|
@@ -598,9 +593,9 @@ module Aws
|
|
598
593
|
order = options[:order] ? " ORDER BY #{options[:order]}" : ''
|
599
594
|
limit = options[:limit] ? " LIMIT #{options[:limit]}" : ''
|
600
595
|
# mix sort by argument (it must present in response)
|
601
|
-
unless
|
596
|
+
unless Aws::Utils.blank?(order)
|
602
597
|
sort_by, sort_order = sort_options(options[:order])
|
603
|
-
conditions << (
|
598
|
+
conditions << (Aws::Utils.blank?(conditions) ? " WHERE " : " AND ") << "(#{sort_by} IS NOT NULL)"
|
604
599
|
end
|
605
600
|
"SELECT #{select} FROM `#{from}`#{conditions}#{order}#{limit}"
|
606
601
|
end
|
@@ -688,7 +683,9 @@ module Aws
|
|
688
683
|
def attributes=(attrs)
|
689
684
|
old_id = @attributes['id']
|
690
685
|
@attributes = uniq_values(attrs)
|
691
|
-
|
686
|
+
if Aws::Utils.blank?(@attributes['id']) && !Aws::Utils.blank?(old_id)
|
687
|
+
@attributes['id'] = old_id
|
688
|
+
end
|
692
689
|
self.attributes
|
693
690
|
end
|
694
691
|
|
@@ -731,7 +728,7 @@ module Aws
|
|
731
728
|
old_id = id
|
732
729
|
attrs = connection.get_attributes(domain, id)[:attributes]
|
733
730
|
@attributes = {}
|
734
|
-
unless attrs.
|
731
|
+
unless attrs.nil? || attrs.empty?
|
735
732
|
attrs.each { |attribute, values| @attributes[attribute] = values }
|
736
733
|
@attributes['id'] = old_id
|
737
734
|
end
|
@@ -757,7 +754,7 @@ module Aws
|
|
757
754
|
attrs_list.flatten.uniq.each do |attribute|
|
758
755
|
attribute = attribute.to_s
|
759
756
|
values = connection.get_attributes(domain, id, attribute)[:attributes][attribute]
|
760
|
-
unless
|
757
|
+
unless Aws::Utils.blank?(values)
|
761
758
|
@attributes[attribute] = result[attribute] = values
|
762
759
|
else
|
763
760
|
@attributes.delete(attribute)
|
@@ -787,7 +784,7 @@ module Aws
|
|
787
784
|
prepare_for_update
|
788
785
|
attrs = @attributes.dup
|
789
786
|
attrs.delete('id')
|
790
|
-
connection.put_attributes(domain, id, attrs) unless
|
787
|
+
connection.put_attributes(domain, id, attrs) unless Aws::Utils.blank?(attrs)
|
791
788
|
connection.put_attributes(domain, id, { 'id' => id }, :replace)
|
792
789
|
mark_as_old
|
793
790
|
@attributes
|
@@ -803,10 +800,10 @@ module Aws
|
|
803
800
|
prepare_for_update
|
804
801
|
# if 'id' is present in attrs hash:
|
805
802
|
# replace internal 'id' attribute and remove it from the attributes to be sent
|
806
|
-
@attributes['id'] = attrs['id'] unless attrs['id']
|
803
|
+
@attributes['id'] = attrs['id'] unless Aws::Utils.blank?(attrs['id'])
|
807
804
|
attrs.delete('id')
|
808
805
|
# add new values to all attributes from list
|
809
|
-
connection.put_attributes(domain, id, attrs) unless
|
806
|
+
connection.put_attributes(domain, id, attrs) unless Aws::Utils.blank?(attrs)
|
810
807
|
connection.put_attributes(domain, id, { 'id' => id }, :replace)
|
811
808
|
attrs.each do |attribute, values|
|
812
809
|
@attributes[attribute] ||= []
|
@@ -875,7 +872,7 @@ module Aws
|
|
875
872
|
prepare_for_update
|
876
873
|
attrs = uniq_values(attrs)
|
877
874
|
# if 'id' is present in attrs hash then replace internal 'id' attribute
|
878
|
-
unless attrs['id']
|
875
|
+
unless Aws::Utils.blank?(attrs['id'])
|
879
876
|
@attributes['id'] = attrs['id']
|
880
877
|
else
|
881
878
|
attrs['id'] = id
|
@@ -899,7 +896,7 @@ module Aws
|
|
899
896
|
raise_on_id_absence
|
900
897
|
attrs = uniq_values(attrs)
|
901
898
|
attrs.delete('id')
|
902
|
-
unless attrs.
|
899
|
+
unless attrs.nil? || attrs.empty?
|
903
900
|
connection.delete_attributes(domain, id, attrs)
|
904
901
|
attrs.each do |attribute, values|
|
905
902
|
# remove the values from the attribute
|
@@ -928,7 +925,7 @@ module Aws
|
|
928
925
|
raise_on_id_absence
|
929
926
|
attrs_list = attrs_list.flatten.map{ |attribute| attribute.to_s }
|
930
927
|
attrs_list.delete('id')
|
931
|
-
unless attrs_list.
|
928
|
+
unless attrs_list.empty?
|
932
929
|
connection.delete_attributes(domain, id, attrs_list)
|
933
930
|
attrs_list.each { |attribute| @attributes.delete(attribute) }
|
934
931
|
end
|
@@ -970,7 +967,7 @@ module Aws
|
|
970
967
|
end
|
971
968
|
|
972
969
|
def prepare_for_update
|
973
|
-
@attributes['id'] = self.class.generate_id if @attributes['id']
|
970
|
+
@attributes['id'] = self.class.generate_id if Aws::Utils.blank?(@attributes['id'])
|
974
971
|
end
|
975
972
|
|
976
973
|
def uniq_values(attributes=nil) # :nodoc:
|
@@ -979,7 +976,7 @@ module Aws
|
|
979
976
|
attribute = attribute.to_s
|
980
977
|
newval = attribute == 'id' ? values.to_s : values.is_a?(Array) ? values.uniq : [values]
|
981
978
|
attrs[attribute] = newval
|
982
|
-
if
|
979
|
+
if Aws::Utils.blank?(newval)
|
983
980
|
# puts "VALUE IS BLANK " + attribute.to_s + " val=" + values.inspect
|
984
981
|
attrs.delete(attribute)
|
985
982
|
end
|
data/lib/sdb/sdb_interface.rb
CHANGED
@@ -21,8 +21,6 @@
|
|
21
21
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
22
|
#
|
23
23
|
|
24
|
-
require "aws"
|
25
|
-
|
26
24
|
module Aws
|
27
25
|
|
28
26
|
class SdbInterface < AwsBase
|
@@ -143,7 +141,8 @@ module Aws
|
|
143
141
|
# see: http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API.html
|
144
142
|
#
|
145
143
|
def escape(value)
|
146
|
-
|
144
|
+
# %Q{'#{value.to_s.gsub(/(['\\])/) { "\\#{$1}" }}'} if value
|
145
|
+
%{'#{value.to_s.gsub(/(['\\])/){"#{$1}#{$1}"}}'} if value
|
147
146
|
end
|
148
147
|
|
149
148
|
# Convert a Ruby language value to a SDB value by replacing Ruby nil with the user's chosen string representation of nil.
|
@@ -177,7 +176,7 @@ module Aws
|
|
177
176
|
# (similar to ActiveRecord::Base#find using :conditions => ['query', param1, .., paramN])
|
178
177
|
#
|
179
178
|
def query_expression_from_array(params) #:nodoc:
|
180
|
-
return '' if
|
179
|
+
return '' if Aws::Utils.blank?(params)
|
181
180
|
query = params[0].to_s
|
182
181
|
i = 1
|
183
182
|
query.gsub(/(\\)?(\?)/) do
|
@@ -192,7 +191,7 @@ module Aws
|
|
192
191
|
end
|
193
192
|
|
194
193
|
def query_expression_from_hash(hash)
|
195
|
-
return '' if
|
194
|
+
return '' if Aws::Utils.blank?(hash)
|
196
195
|
expression = []
|
197
196
|
hash.each do |key, value|
|
198
197
|
expression << "#{key}=#{escape(value)}"
|
data/lib/ses/ses.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
require_relative "../awsbase/awsbase"
|
2
|
+
module Aws
|
3
|
+
|
4
|
+
require 'xmlsimple'
|
5
|
+
|
6
|
+
class Ses < AwsBase
|
7
|
+
|
8
|
+
include AwsBaseInterface
|
9
|
+
|
10
|
+
API_VERSION = "2010-12-01"
|
11
|
+
DEFAULT_HOST = "email.us-east-1.amazonaws.com"
|
12
|
+
DEFAULT_PATH = '/'
|
13
|
+
DEFAULT_PROTOCOL = 'https'
|
14
|
+
DEFAULT_PORT = 443
|
15
|
+
|
16
|
+
def self.connection_name
|
17
|
+
:ses_connection
|
18
|
+
end
|
19
|
+
|
20
|
+
@@bench = AwsBenchmarkingBlock.new
|
21
|
+
|
22
|
+
def self.bench
|
23
|
+
@@bench
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.bench_xml
|
27
|
+
@@bench.xml
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.bench_ec2
|
31
|
+
@@bench.service
|
32
|
+
end
|
33
|
+
|
34
|
+
# Current API version (sometimes we have to check it outside the GEM).
|
35
|
+
@@api = ENV['SES_API_VERSION'] || API_VERSION
|
36
|
+
|
37
|
+
def self.api
|
38
|
+
@@api
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
|
43
|
+
init({:name => 'SES',
|
44
|
+
:default_host => ENV['SES_URL'] ? URI.parse(ENV['SES_URL']).host : DEFAULT_HOST,
|
45
|
+
:default_port => ENV['SES_URL'] ? URI.parse(ENV['SES_URL']).port : DEFAULT_PORT,
|
46
|
+
:default_service => ENV['SES_URL'] ? URI.parse(ENV['SES_URL']).path : DEFAULT_PATH,
|
47
|
+
:default_protocol => ENV['SES_URL'] ? URI.parse(ENV['SES_URL']).scheme : DEFAULT_PROTOCOL,
|
48
|
+
:api_version => API_VERSION,
|
49
|
+
:signature_version=>'3'},
|
50
|
+
aws_access_key_id || ENV['AWS_ACCESS_KEY_ID'],
|
51
|
+
aws_secret_access_key|| ENV['AWS_SECRET_ACCESS_KEY'],
|
52
|
+
params)
|
53
|
+
end
|
54
|
+
|
55
|
+
def do_request(action, params, options={})
|
56
|
+
link = generate_request(action, params)
|
57
|
+
puts "request=" + link[:request].inspect
|
58
|
+
resp = request_info_xml_simple3(self, link,
|
59
|
+
:group_tags =>{"LoadBalancersDescriptions"=>"LoadBalancersDescription",
|
60
|
+
"DBParameterGroups" =>"DBParameterGroup",
|
61
|
+
"DBSecurityGroups" =>"DBSecurityGroup",
|
62
|
+
"EC2SecurityGroups" =>"EC2SecurityGroup",
|
63
|
+
"IPRanges" =>"IPRange"},
|
64
|
+
:force_array =>["DBInstances",
|
65
|
+
"DBParameterGroups",
|
66
|
+
"DBSecurityGroups",
|
67
|
+
"EC2SecurityGroups",
|
68
|
+
"IPRanges"],
|
69
|
+
:pull_out_array =>options[:pull_out_array],
|
70
|
+
:pull_out_single=>options[:pull_out_single],
|
71
|
+
:wrapper =>options[:wrapper])
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
#-----------------------------------------------------------------
|
76
|
+
# REQUESTS
|
77
|
+
#-----------------------------------------------------------------
|
78
|
+
|
79
|
+
|
80
|
+
# options:
|
81
|
+
# :marker => value received from previous response if IsTruncated = true
|
82
|
+
# :max_items => number of items you want returned
|
83
|
+
# :path_previx => for filtering results, default is /
|
84
|
+
def get_send_quota(options={})
|
85
|
+
@logger.info("get_send_quota")
|
86
|
+
|
87
|
+
resp = do_request("GetSendQuota", options)
|
88
|
+
|
89
|
+
|
90
|
+
rescue Exception
|
91
|
+
on_exception
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
# name: name of certificate
|
96
|
+
# public_key: public key certificate in PEM-encoded format
|
97
|
+
# private_key: private key in PEM-encoded format
|
98
|
+
# options:
|
99
|
+
# :path => specify a path you want it stored in
|
100
|
+
# :certificate_chain => contents of certificate chain
|
101
|
+
def upload_server_certificate(name, public_key, private_key, options={})
|
102
|
+
params = {}
|
103
|
+
params['ServerCertificateName'] = name
|
104
|
+
params['PrivateKey'] = private_key
|
105
|
+
params['CertificateBody'] = public_key
|
106
|
+
|
107
|
+
params['CertificateChain'] = options[:certificate_chain] if options[:certificate_chain]
|
108
|
+
params['Path'] = options[:path] if options[:path]
|
109
|
+
|
110
|
+
p params
|
111
|
+
|
112
|
+
resp = do_request("UploadServerCertificate", params, :pull_out_array=>[:list_server_certificates_result, :server_certificate_metadata_list])
|
113
|
+
|
114
|
+
|
115
|
+
rescue Exception
|
116
|
+
on_exception
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
end
|