aws 2.3.26 → 2.3.27

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.
@@ -31,7 +31,7 @@ module Aws
31
31
  require 'active_support/core_ext'
32
32
 
33
33
  class AwsUtils #:nodoc:
34
- @@digest1 = OpenSSL::Digest::Digest.new("sha1")
34
+ @@digest1 = OpenSSL::Digest::Digest.new("sha1")
35
35
  @@digest256 = nil
36
36
  if OpenSSL::OPENSSL_VERSION_NUMBER > 0x00908000
37
37
  @@digest256 = OpenSSL::Digest::Digest.new("sha256") rescue nil # Some installation may not support sha256
@@ -53,18 +53,18 @@ module Aws
53
53
  # A deprecated guy (should work till septemper 2009)
54
54
  def self.sign_request_v0(aws_secret_access_key, service_hash)
55
55
  fix_service_params(service_hash, '0')
56
- string_to_sign = "#{service_hash['Action']}#{service_hash['Timestamp'] || service_hash['Expires']}"
56
+ string_to_sign = "#{service_hash['Action']}#{service_hash['Timestamp'] || service_hash['Expires']}"
57
57
  service_hash['Signature'] = AwsUtils::sign(aws_secret_access_key, string_to_sign)
58
- service_hash.to_a.collect{|key, val| "#{amz_escape(key)}=#{amz_escape(val.to_s)}" }.join("&")
58
+ service_hash.to_a.collect { |key, val| "#{amz_escape(key)}=#{amz_escape(val.to_s)}" }.join("&")
59
59
  end
60
60
 
61
61
  # Signature Version 1
62
62
  # Another deprecated guy (should work till septemper 2009)
63
63
  def self.sign_request_v1(aws_secret_access_key, service_hash)
64
64
  fix_service_params(service_hash, '1')
65
- string_to_sign = service_hash.sort{|a, b| (a[0].to_s.downcase)<=>(b[0].to_s.downcase)}.to_s
65
+ string_to_sign = service_hash.sort { |a, b| (a[0].to_s.downcase)<=>(b[0].to_s.downcase) }.to_s
66
66
  service_hash['Signature'] = AwsUtils::sign(aws_secret_access_key, string_to_sign)
67
- service_hash.to_a.collect{|key, val| "#{amz_escape(key)}=#{amz_escape(val.to_s)}" }.join("&")
67
+ service_hash.to_a.collect { |key, val| "#{amz_escape(key)}=#{amz_escape(val.to_s)}" }.join("&")
68
68
  end
69
69
 
70
70
  # Signature Version 2
@@ -78,20 +78,20 @@ module Aws
78
78
  service_hash['SignatureMethod'] = 'HmacSHA256' unless ['HmacSHA256', 'HmacSHA1'].include?(service_hash['SignatureMethod'])
79
79
  service_hash['SignatureMethod'] = 'HmacSHA1' unless @@digest256
80
80
  # select a digest
81
- digest = (service_hash['SignatureMethod'] == 'HmacSHA256' ? @@digest256 : @@digest1)
81
+ digest = (service_hash['SignatureMethod'] == 'HmacSHA256' ? @@digest256 : @@digest1)
82
82
  # form string to sign
83
83
  canonical_string = service_hash.keys.sort.map do |key|
84
84
  "#{amz_escape(key)}=#{amz_escape(service_hash[key])}"
85
85
  end.join('&')
86
- string_to_sign = "#{http_verb.to_s.upcase}\n#{host.downcase}\n#{uri}\n#{canonical_string}"
86
+ string_to_sign = "#{http_verb.to_s.upcase}\n#{host.downcase}\n#{uri}\n#{canonical_string}"
87
87
  # sign the string
88
- signature = escape_sig(Base64.encode64(OpenSSL::HMAC.digest(digest, aws_secret_access_key, string_to_sign)).strip)
89
- ret = "#{canonical_string}&Signature=#{signature}"
88
+ signature = escape_sig(Base64.encode64(OpenSSL::HMAC.digest(digest, aws_secret_access_key, string_to_sign)).strip)
89
+ ret = "#{canonical_string}&Signature=#{signature}"
90
90
  # puts 'full=' + ret.inspect
91
91
  ret
92
92
  end
93
93
 
94
- HEX = [
94
+ HEX = [
95
95
  "%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
96
96
  "%08", "%09", "%0A", "%0B", "%0C", "%0D", "%0E", "%0F",
97
97
  "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
@@ -126,7 +126,7 @@ module Aws
126
126
  "%F8", "%F9", "%FA", "%FB", "%FC", "%FD", "%FE", "%FF"
127
127
  ]
128
128
  TO_REMEMBER = 'AZaz09 -_.!~*\'()'
129
- ASCII = {} # {'A'=>65, 'Z'=>90, 'a'=>97, 'z'=>122, '0'=>48, '9'=>57, ' '=>32, '-'=>45, '_'=>95, '.'=>}
129
+ ASCII = {} # {'A'=>65, 'Z'=>90, 'a'=>97, 'z'=>122, '0'=>48, '9'=>57, ' '=>32, '-'=>45, '_'=>95, '.'=>}
130
130
  TO_REMEMBER.each_char do |c| #unpack("c*").each do |c|
131
131
  ASCII[c] = c.unpack("c")[0]
132
132
  end
@@ -139,7 +139,7 @@ module Aws
139
139
  param = param.to_s
140
140
  # param = param.force_encoding("UTF-8")
141
141
 
142
- e = "x" # escape2(param.to_s)
142
+ e = "x" # escape2(param.to_s)
143
143
  # puts 'ESCAPED=' + e.inspect
144
144
 
145
145
 
@@ -154,10 +154,10 @@ module Aws
154
154
  # e = converter.iconv(e) #.unpack('U*').select{ |cp| cp < 127 }.pack('U*')
155
155
  # puts 'e out=' + e.inspect
156
156
 
157
- e2 = CGI.escape(param)
158
- e2 = e2.gsub("%7E", "~")
159
- e2 = e2.gsub("+", "%20")
160
- e2 = e2.gsub("*", "%2A")
157
+ e2 = CGI.escape(param)
158
+ e2 = e2.gsub("%7E", "~")
159
+ e2 = e2.gsub("+", "%20")
160
+ e2 = e2.gsub("*", "%2A")
161
161
 
162
162
  # puts 'E2=' + e2.inspect
163
163
  # puts e == e2.to_s
@@ -218,13 +218,13 @@ module Aws
218
218
 
219
219
  def self.allow_only(allowed_keys, params)
220
220
  bogus_args = []
221
- params.keys.each {|p| bogus_args.push(p) unless allowed_keys.include?(p) }
221
+ params.keys.each { |p| bogus_args.push(p) unless allowed_keys.include?(p) }
222
222
  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
223
223
  end
224
224
 
225
225
  def self.mandatory_arguments(required_args, params)
226
226
  rargs = required_args.dup
227
- params.keys.each {|p| rargs.delete(p)}
227
+ params.keys.each { |p| rargs.delete(p) }
228
228
  raise AwsError.new("The following mandatory arguments were not provided to #{caller_method}: #{rargs.inspect}") if rargs.length > 0
229
229
  end
230
230
 
@@ -242,7 +242,7 @@ module Aws
242
242
  # Benchmark::Tms instance for service (Ec2, S3, or SQS) access benchmarking.
243
243
  @service = Benchmark::Tms.new()
244
244
  # Benchmark::Tms instance for XML parsing benchmarking.
245
- @xml = Benchmark::Tms.new()
245
+ @xml = Benchmark::Tms.new()
246
246
  end
247
247
  end
248
248
 
@@ -255,15 +255,15 @@ module Aws
255
255
 
256
256
  # Text, if found in an error message returned by AWS, indicates that this may be a transient
257
257
  # error. Transient errors are automatically retried with exponential back-off.
258
- AMAZON_PROBLEMS = [ 'internal service error',
259
- 'is currently unavailable',
260
- 'no response from',
261
- 'Please try again',
262
- 'InternalError',
263
- 'ServiceUnavailable', #from SQS docs
264
- 'Unavailable',
265
- 'This application is not currently available',
266
- 'InsufficientInstanceCapacity'
258
+ AMAZON_PROBLEMS = ['internal service error',
259
+ 'is currently unavailable',
260
+ 'no response from',
261
+ 'Please try again',
262
+ 'InternalError',
263
+ 'ServiceUnavailable', #from SQS docs
264
+ 'Unavailable',
265
+ 'This application is not currently available',
266
+ 'InsufficientInstanceCapacity'
267
267
  ]
268
268
  @@amazon_problems = AMAZON_PROBLEMS
269
269
  # Returns a list of Amazon service responses which are known to be transient problems.
@@ -284,7 +284,7 @@ module Aws
284
284
  module AwsBaseInterface
285
285
  DEFAULT_SIGNATURE_VERSION = '2'
286
286
 
287
- @@caching = false
287
+ @@caching = false
288
288
 
289
289
  def self.caching
290
290
  @@caching
@@ -319,21 +319,21 @@ module Aws
319
319
  @params = params
320
320
  raise AwsError.new("AWS access keys are required to operate on #{service_info[:name]}") \
321
321
  if aws_access_key_id.blank? || aws_secret_access_key.blank?
322
- @aws_access_key_id = aws_access_key_id
322
+ @aws_access_key_id = aws_access_key_id
323
323
  @aws_secret_access_key = aws_secret_access_key
324
324
  # if the endpoint was explicitly defined - then use it
325
325
  if @params[:endpoint_url]
326
- @params[:server] = URI.parse(@params[:endpoint_url]).host
327
- @params[:port] = URI.parse(@params[:endpoint_url]).port
328
- @params[:service] = URI.parse(@params[:endpoint_url]).path
326
+ @params[:server] = URI.parse(@params[:endpoint_url]).host
327
+ @params[:port] = URI.parse(@params[:endpoint_url]).port
328
+ @params[:service] = URI.parse(@params[:endpoint_url]).path
329
329
  @params[:protocol] = URI.parse(@params[:endpoint_url]).scheme
330
- @params[:region] = nil
330
+ @params[:region] = nil
331
331
  else
332
332
  @params[:server] ||= service_info[:default_host]
333
333
  @params[:server] = "#{@params[:region]}.#{@params[:server]}" if @params[:region]
334
- @params[:port] ||= service_info[:default_port]
335
- @params[:service] ||= service_info[:default_service]
336
- @params[:protocol] ||= service_info[:default_protocol]
334
+ @params[:port] ||= service_info[:default_port]
335
+ @params[:service] ||= service_info[:default_service]
336
+ @params[:protocol] ||= service_info[:default_protocol]
337
337
  @params[:api_version] ||= service_info[:api_version]
338
338
  end
339
339
  if !@params[:multi_thread].nil? && @params[:connection_mode].nil? # user defined this
@@ -347,12 +347,12 @@ module Aws
347
347
  @logger = ::Rails.logger if !@logger && defined?(::Rails.logger)
348
348
  @logger = Logger.new(STDOUT) if !@logger
349
349
  @logger.info "New #{self.class.name} using #{@params[:connection_mode].to_s}-connection mode"
350
- @error_handler = nil
351
- @cache = {}
350
+ @error_handler = nil
351
+ @cache = {}
352
352
  @signature_version = (params[:signature_version] || DEFAULT_SIGNATURE_VERSION).to_s
353
353
  end
354
354
 
355
- def signed_service_params(aws_secret_access_key, service_hash, http_verb=nil, host=nil, service=nil )
355
+ def signed_service_params(aws_secret_access_key, service_hash, http_verb=nil, host=nil, service=nil)
356
356
  case signature_version.to_s
357
357
  when '0' then
358
358
  AwsUtils::sign_request_v0(aws_secret_access_key, service_hash)
@@ -371,18 +371,18 @@ module Aws
371
371
  end
372
372
 
373
373
  # FROM SDB
374
- def generate_request2(aws_access_key, aws_secret_key, action, api_version, lib_params, user_params={}) #:nodoc:
374
+ def generate_request2(aws_access_key, aws_secret_key, action, api_version, lib_params, user_params={}, options={}) #:nodoc:
375
375
  # remove empty params from request
376
- user_params.delete_if {|key, value| value.nil? }
376
+ user_params.delete_if { |key, value| value.nil? }
377
377
  # user_params.each_pair do |k,v|
378
378
  # user_params[k] = v.force_encoding("UTF-8")
379
379
  # end
380
380
  #params_string = params.to_a.collect{|key,val| key + "=#{CGI::escape(val.to_s)}" }.join("&")
381
381
  # prepare service data
382
- service = lib_params[:service]
382
+ service = lib_params[:service]
383
383
  # puts 'service=' + service.to_s
384
384
  service_hash = {"Action" => action,
385
- "AWSAccessKeyId" => aws_access_key }
385
+ "AWSAccessKeyId" => aws_access_key}
386
386
  service_hash.update("Version" => api_version) if api_version
387
387
  service_hash.update(user_params)
388
388
  service_params = signed_service_params(aws_secret_key, service_hash, :get, lib_params[:server], lib_params[:service])
@@ -394,8 +394,8 @@ module Aws
394
394
  # resign the request because HTTP verb is included into signature
395
395
  service_params = signed_service_params(aws_secret_key, service_hash, :post, lib_params[:server], service)
396
396
  end
397
- request = Net::HTTP::Post.new(service)
398
- request.body = service_params
397
+ request = Net::HTTP::Post.new(service)
398
+ request.body = service_params
399
399
  request['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'
400
400
  else
401
401
  request = Net::HTTP::Get.new("#{service}?#{service_params}")
@@ -405,10 +405,10 @@ module Aws
405
405
  #puts "#{@params[:service]}?#{service_params}\n\n"
406
406
 
407
407
  # prepare output hash
408
- { :request => request,
409
- :server => lib_params[:server],
410
- :port => lib_params[:port],
411
- :protocol => lib_params[:protocol] }
408
+ {:request => request,
409
+ :server => lib_params[:server],
410
+ :port => lib_params[:port],
411
+ :protocol => lib_params[:protocol]}
412
412
  end
413
413
 
414
414
  def get_conn(connection_name, lib_params, logger)
@@ -422,9 +422,9 @@ module Aws
422
422
  http_conn = Rightscale::HttpConnection.new(:exception => AwsError, :logger => logger)
423
423
 
424
424
  elsif conn_mode == :per_thread || conn_mode == :single
425
- thread = conn_mode == :per_thread ? Thread.current : Thread.main
425
+ thread = conn_mode == :per_thread ? Thread.current : Thread.main
426
426
  thread[connection_name] ||= Rightscale::HttpConnection.new(:exception => AwsError, :logger => logger)
427
- http_conn = thread[connection_name]
427
+ http_conn = thread[connection_name]
428
428
  # ret = request_info_impl(http_conn, bench, request, parser, &block)
429
429
  end
430
430
  return http_conn
@@ -450,16 +450,17 @@ module Aws
450
450
 
451
451
  # Sends request to Amazon and parses the response
452
452
  # Raises AwsError if any banana happened
453
- def request_info2(request, parser, lib_params, connection_name, logger, bench, &block) #:nodoc:
454
- ret = nil
453
+ def request_info2(request, parser, lib_params, connection_name, logger, bench, options={}, &block) #:nodoc:
454
+ ret = nil
455
+ # puts 'OPTIONS=' + options.inspect
455
456
  http_conn = get_conn(connection_name, lib_params, logger)
456
457
  begin
457
458
  retry_count = 1
458
- count = 0
459
+ count = 0
459
460
  while count <= retry_count
460
461
  puts 'RETRYING QUERY due to QueryTimeout...' if count > 0
461
462
  begin
462
- ret = request_info_impl(http_conn, bench, request, parser, &block)
463
+ ret = request_info_impl(http_conn, bench, request, parser, options, &block)
463
464
  break
464
465
  rescue Aws::AwsError => ex
465
466
  if !ex.include?(/QueryTimeout/) || count == retry_count
@@ -484,19 +485,19 @@ module Aws
484
485
 
485
486
  @connection = get_conn(connection_name, lib_params, logger)
486
487
  begin
487
- @last_request = request[:request]
488
+ @last_request = request[:request]
488
489
  @last_response = nil
489
490
 
490
- response = @connection.request(request)
491
+ response = @connection.request(request)
491
492
  # puts "response=" + response.body
492
493
  # benchblock.service.add!{ response = @connection.request(request) }
493
494
  # check response for errors...
494
495
  @last_response = response
495
496
  if response.is_a?(Net::HTTPSuccess)
496
- @error_handler = nil
497
+ @error_handler = nil
497
498
  # benchblock.xml.add! { parser.parse(response) }
498
499
  # return parser.result
499
- force_array = params[:force_array] || false
500
+ force_array = params[:force_array] || false
500
501
  # Force_array and group_tags don't work nice together so going to force array manually
501
502
  xml_simple_options = {"KeyToSymbol"=>false, 'ForceArray' => false}
502
503
  xml_simple_options["GroupTags"] = params[:group_tags] if params[:group_tags]
@@ -517,7 +518,7 @@ module Aws
517
518
  parsed = symbolize(parsed, force_array)
518
519
  # puts 'parsed=' + parsed.inspect
519
520
  if params[:pull_out_array]
520
- ret = Aws::AwsResponseArray.new(parsed[:response_metadata])
521
+ ret = Aws::AwsResponseArray.new(parsed[:response_metadata])
521
522
  level_hash = parsed
522
523
  params[:pull_out_array].each do |x|
523
524
  level_hash = level_hash[x]
@@ -532,7 +533,7 @@ module Aws
532
533
  end
533
534
  elsif params[:pull_out_single]
534
535
  # returns a single object
535
- ret = AwsResponseObjectHash.new(parsed[:response_metadata])
536
+ ret = AwsResponseObjectHash.new(parsed[:response_metadata])
536
537
  level_hash = parsed
537
538
  params[:pull_out_single].each do |x|
538
539
  level_hash = level_hash[x]
@@ -589,17 +590,17 @@ module Aws
589
590
  def cache_hits?(function, response, do_raise=:raise)
590
591
  result = false
591
592
  if caching?
592
- function = function.to_sym
593
+ function = function.to_sym
593
594
  # get rid of requestId (this bad boy was added for API 2008-08-08+ and it is uniq for every response)
594
- response = response.sub(%r{<requestId>.+?</requestId>}, '')
595
+ response = response.sub(%r{<requestId>.+?</requestId>}, '')
595
596
  response_md5 =Digest::MD5.hexdigest(response).to_s
596
597
  # check for changes
597
598
  unless @cache[function] && @cache[function][:response_md5] == response_md5
598
599
  # well, the response is new, reset cache data
599
600
  update_cache(function, {:response_md5 => response_md5,
600
- :timestamp => Time.now,
601
- :hits => 0,
602
- :parsed => nil})
601
+ :timestamp => Time.now,
602
+ :hits => 0,
603
+ :parsed => nil})
603
604
  else
604
605
  # aha, cache hits, update the data and throw an exception if needed
605
606
  @cache[function][:hits] += 1
@@ -630,13 +631,15 @@ module Aws
630
631
  end
631
632
 
632
633
 
633
- def request_info_impl(connection, benchblock, request, parser, &block) #:nodoc:
634
- @connection = connection
635
- @last_request = request[:request]
634
+ def request_info_impl(connection, benchblock, request, parser, options={}, &block) #:nodoc:
635
+ @connection = connection
636
+ @last_request = request[:request]
636
637
  @last_response = nil
637
- response=nil
638
+ response =nil
638
639
  blockexception = nil
639
640
 
641
+ # puts 'OPTIONS2=' + options.inspect
642
+
640
643
  if (block != nil)
641
644
  # TRB 9/17/07 Careful - because we are passing in blocks, we get a situation where
642
645
  # an exception may get thrown in the block body (which is high-level
@@ -655,7 +658,7 @@ module Aws
655
658
  response.read_body(&block)
656
659
  else
657
660
  @error_handler = AWSErrorHandler.new(self, parser, :errors_list => self.class.amazon_problems) unless @error_handler
658
- check_result = @error_handler.check(request)
661
+ check_result = @error_handler.check(request, options)
659
662
  if check_result
660
663
  @error_handler = nil
661
664
  return check_result
@@ -679,7 +682,7 @@ module Aws
679
682
  return parser.result
680
683
  end
681
684
  else
682
- benchblock.service.add!{ response = @connection.request(request) }
685
+ benchblock.service.add! { response = @connection.request(request) }
683
686
  # check response for errors...
684
687
  @last_response = response
685
688
  if response.is_a?(Net::HTTPSuccess)
@@ -688,7 +691,7 @@ module Aws
688
691
  return parser.result
689
692
  else
690
693
  @error_handler = AWSErrorHandler.new(self, parser, :errors_list => self.class.amazon_problems) unless @error_handler
691
- check_result = @error_handler.check(request)
694
+ check_result = @error_handler.check(request, options)
692
695
  if check_result
693
696
  @error_handler = nil
694
697
  return check_result
@@ -711,7 +714,7 @@ module Aws
711
714
  response, params = request_info(link, RightDummyParser.new)
712
715
  cache_hits?(method.to_sym, response.body) if use_cache
713
716
  parser = parser_class.new(:logger => @logger)
714
- benchblock.xml.add!{ parser.parse(response, params) }
717
+ benchblock.xml.add! { parser.parse(response, params) }
715
718
  result = block_given? ? yield(parser) : parser.result
716
719
  # update parsed data
717
720
  update_cache(method.to_sym, :parsed => result) if use_cache
@@ -725,7 +728,7 @@ module Aws
725
728
 
726
729
  def hash_params(prefix, list) #:nodoc:
727
730
  groups = {}
728
- list.each_index{|i| groups.update("#{prefix}.#{i+1}"=>list[i])} if list
731
+ list.each_index { |i| groups.update("#{prefix}.#{i+1}"=>list[i]) } if list
729
732
  return groups
730
733
  end
731
734
 
@@ -754,12 +757,12 @@ module Aws
754
757
  attr_reader :response
755
758
 
756
759
  def initialize(errors=nil, http_code=nil, request_id=nil, request_data=nil, response=nil)
757
- @errors = errors
758
- @request_id = request_id
759
- @http_code = http_code
760
+ @errors = errors
761
+ @request_id = request_id
762
+ @http_code = http_code
760
763
  @request_data = request_data
761
- @response = response
762
- msg = @errors.is_a?(Array) ? @errors.map{|code, msg| "#{code}: #{msg}"}.join("; ") : @errors.to_s
764
+ @response = response
765
+ msg = @errors.is_a?(Array) ? @errors.map { |code, msg| "#{code}: #{msg}" }.join("; ") : @errors.to_s
763
766
  msg += "\nREQUEST=#{@request_data} " unless @request_data.nil?
764
767
  msg += "\nREQUEST ID=#{@request_id} " unless @request_id.nil?
765
768
  super(msg)
@@ -769,7 +772,7 @@ module Aws
769
772
  # Used to determine whether to retry request.
770
773
  def include?(pattern)
771
774
  if @errors.is_a?(Array)
772
- @errors.each{ |code, msg| return true if code =~ pattern }
775
+ @errors.each { |code, msg| return true if code =~ pattern }
773
776
  else
774
777
  return true if @errors_str =~ pattern
775
778
  end
@@ -789,8 +792,8 @@ module Aws
789
792
  puts error_text if options[:puts]
790
793
  # Log the error
791
794
  if options[:log]
792
- request = aws.last_request ? aws.last_request.path : '-none-'
793
- response = aws.last_response ? "#{aws.last_response.code} -- #{aws.last_response.message} -- #{aws.last_response.body}" : '-none-'
795
+ request = aws.last_request ? aws.last_request.path : '-none-'
796
+ response = aws.last_response ? "#{aws.last_response.code} -- #{aws.last_response.message} -- #{aws.last_response.body}" : '-none-'
794
797
  @response = response
795
798
  aws.logger.error error_text
796
799
  aws.logger.error "Request was: #{request}"
@@ -826,14 +829,14 @@ module Aws
826
829
 
827
830
  def initialize(http_code=nil, request_id=nil, request_data=nil, response=nil)
828
831
 
829
- @request_id = request_id
830
- @http_code = http_code
832
+ @request_id = request_id
833
+ @http_code = http_code
831
834
  @request_data = request_data
832
- @response = response
835
+ @response = response
833
836
  # puts '@response=' + @response.inspect
834
837
 
835
838
  if @response
836
- ref = XmlSimple.xml_in(@response, { "ForceArray"=>false })
839
+ ref = XmlSimple.xml_in(@response, {"ForceArray"=>false})
837
840
  # puts "refxml=" + ref.inspect
838
841
  msg = "#{ref['Error']['Code']}: #{ref['Error']['Message']}"
839
842
  else
@@ -851,7 +854,7 @@ module Aws
851
854
  # 0-100 (%)
852
855
  DEFAULT_CLOSE_ON_4XX_PROBABILITY = 10
853
856
 
854
- @@reiteration_start_delay = 0.2
857
+ @@reiteration_start_delay = 0.2
855
858
 
856
859
  def self.reiteration_start_delay
857
860
  @@reiteration_start_delay
@@ -897,26 +900,26 @@ module Aws
897
900
  # :close_on_error = true | false
898
901
  # :close_on_4xx_probability = 1-100
899
902
  def initialize(aws, parser, params={}) #:nodoc:
900
- @aws = aws # Link to RightEc2 | RightSqs | RightS3 instance
901
- @parser = parser # parser to parse Amazon response
902
- @started_at = Time.now
903
- @stop_at = @started_at + (params[:reiteration_time] || @@reiteration_time)
904
- @errors_list = params[:errors_list] || []
905
- @reiteration_delay = @@reiteration_start_delay
906
- @retries = 0
903
+ @aws = aws # Link to RightEc2 | RightSqs | RightS3 instance
904
+ @parser = parser # parser to parse Amazon response
905
+ @started_at = Time.now
906
+ @stop_at = @started_at + (params[:reiteration_time] || @@reiteration_time)
907
+ @errors_list = params[:errors_list] || []
908
+ @reiteration_delay = @@reiteration_start_delay
909
+ @retries = 0
907
910
  # close current HTTP(S) connection on 5xx, errors from list and 4xx errors
908
- @close_on_error = params[:close_on_error].nil? ? @@close_on_error : params[:close_on_error]
911
+ @close_on_error = params[:close_on_error].nil? ? @@close_on_error : params[:close_on_error]
909
912
  @close_on_4xx_probability = params[:close_on_4xx_probability] || @@close_on_4xx_probability
910
913
  end
911
914
 
912
915
  # Returns false if
913
- def check(request) #:nodoc:
914
- result = false
915
- error_found = false
916
- redirect_detected= false
917
- error_match = nil
918
- last_errors_text = ''
919
- response = @aws.last_response
916
+ def check(request, options={}) #:nodoc:
917
+ result = false
918
+ error_found = false
919
+ redirect_detected = false
920
+ error_match = nil
921
+ last_errors_text = ''
922
+ response = @aws.last_response
920
923
  # log error
921
924
  request_text_data = "#{request[:server]}:#{request[:port]}#{request[:request].path}"
922
925
  # is this a redirect?
@@ -933,9 +936,9 @@ module Aws
933
936
  @aws.class.bench_xml.add! do
934
937
  error_parser = RightErrorResponseParser.new
935
938
  error_parser.parse(response)
936
- @aws.last_errors = error_parser.errors
939
+ @aws.last_errors = error_parser.errors
937
940
  @aws.last_request_id = error_parser.requestID
938
- last_errors_text = @aws.last_errors.flatten.join("\n")
941
+ last_errors_text = @aws.last_errors.flatten.join("\n")
939
942
  # on redirect :
940
943
  if redirect_detected
941
944
  location = response['location']
@@ -943,15 +946,15 @@ module Aws
943
946
  @aws.logger.info("##### #{@aws.class.name} redirect requested: #{response.code} #{response.message} #####")
944
947
  @aws.logger.info("##### New location: #{location} #####")
945
948
  # ... fix the connection data
946
- request[:server] = URI.parse(location).host
949
+ request[:server] = URI.parse(location).host
947
950
  request[:protocol] = URI.parse(location).scheme
948
- request[:port] = URI.parse(location).port
951
+ request[:port] = URI.parse(location).port
949
952
  end
950
953
  end
951
954
  else # ... it is not a xml document(probably just a html page?)
952
- @aws.last_errors = [[response.code, "#{response.message} (#{request_text_data})"]]
955
+ @aws.last_errors = [[response.code, "#{response.message} (#{request_text_data})"]]
953
956
  @aws.last_request_id = '-undefined-'
954
- last_errors_text = response.message
957
+ last_errors_text = response.message
955
958
  end
956
959
  # now - check the error
957
960
  unless redirect_detected
@@ -972,30 +975,34 @@ module Aws
972
975
  if !redirect_detected && @close_on_error
973
976
  @aws.connection.finish "#{self.class.name}: error match to pattern '#{error_match}'"
974
977
  end
975
-
976
- if (Time.now < @stop_at)
977
- @retries += 1
978
- unless redirect_detected
979
- @aws.logger.warn("##### Retry ##{@retries} is being performed. Sleeping for #{@reiteration_delay} sec. Whole time: #{Time.now-@started_at} sec ####")
980
- sleep @reiteration_delay
981
- @reiteration_delay *= 2
982
-
983
- # Always make sure that the fp is set to point to the beginning(?)
984
- # of the File/IO. TODO: it assumes that offset is 0, which is bad.
985
- if (request[:request].body_stream && request[:request].body_stream.respond_to?(:pos))
986
- begin
987
- request[:request].body_stream.pos = 0
988
- rescue Exception => e
989
- @logger.warn("Retry may fail due to unable to reset the file pointer" +
990
- " -- #{self.class.name} : #{e.inspect}")
978
+ # puts 'OPTIONS3=' + options.inspect
979
+ if options[:retries].nil? || @retries < options[:retries]
980
+ if (Time.now < @stop_at)
981
+ @retries += 1
982
+ unless redirect_detected
983
+ @aws.logger.warn("##### Retry ##{@retries} is being performed. Sleeping for #{@reiteration_delay} sec. Whole time: #{Time.now-@started_at} sec ####")
984
+ sleep @reiteration_delay
985
+ @reiteration_delay *= 2
986
+
987
+ # Always make sure that the fp is set to point to the beginning(?)
988
+ # of the File/IO. TODO: it assumes that offset is 0, which is bad.
989
+ if (request[:request].body_stream && request[:request].body_stream.respond_to?(:pos))
990
+ begin
991
+ request[:request].body_stream.pos = 0
992
+ rescue Exception => e
993
+ @logger.warn("Retry may fail due to unable to reset the file pointer" +
994
+ " -- #{self.class.name} : #{e.inspect}")
995
+ end
991
996
  end
997
+ else
998
+ @aws.logger.info("##### Retry ##{@retries} is being performed due to a redirect. ####")
992
999
  end
1000
+ result = @aws.request_info(request, @parser, options)
993
1001
  else
994
- @aws.logger.info("##### Retry ##{@retries} is being performed due to a redirect. ####")
1002
+ @aws.logger.warn("##### Ooops, time is over... ####")
995
1003
  end
996
- result = @aws.request_info(request, @parser)
997
1004
  else
998
- @aws.logger.warn("##### Ooops, time is over... ####")
1005
+ @aws.logger.info("##### Stopped retrying because retries=#{@retries} and max=#{options[:retries]} ####")
999
1006
  end
1000
1007
  # aha, this is unhandled error:
1001
1008
  elsif @close_on_error
@@ -1005,7 +1012,7 @@ module Aws
1005
1012
  # Is this a 4xx error ?
1006
1013
  elsif @aws.last_response.code.to_s[/^4\d\d$/] && @close_on_4xx_probability > rand(100)
1007
1014
  @aws.connection.finish "#{self.class.name}: code: #{@aws.last_response.code}: '#{@aws.last_response.message}', " +
1008
- "probability: #{@close_on_4xx_probability}%"
1015
+ "probability: #{@close_on_4xx_probability}%"
1009
1016
  end
1010
1017
  end
1011
1018
  result
@@ -1058,11 +1065,11 @@ module Aws
1058
1065
 
1059
1066
  class AwsParser #:nodoc:
1060
1067
  # default parsing library
1061
- DEFAULT_XML_LIBRARY = 'rexml'
1068
+ DEFAULT_XML_LIBRARY = 'rexml'
1062
1069
  # a list of supported parsers
1063
1070
  @@supported_xml_libs = [DEFAULT_XML_LIBRARY, 'libxml']
1064
1071
 
1065
- @@xml_lib = DEFAULT_XML_LIBRARY # xml library name: 'rexml' | 'libxml'
1072
+ @@xml_lib = DEFAULT_XML_LIBRARY # xml library name: 'rexml' | 'libxml'
1066
1073
  def self.xml_lib
1067
1074
  @@xml_lib
1068
1075
  end
@@ -1077,10 +1084,10 @@ module Aws
1077
1084
 
1078
1085
  def initialize(params={})
1079
1086
  @xmlpath = ''
1080
- @result = false
1081
- @text = ''
1087
+ @result = false
1088
+ @text = ''
1082
1089
  @xml_lib = params[:xml_lib] || @@xml_lib
1083
- @logger = params[:logger]
1090
+ @logger = params[:logger]
1084
1091
  reset
1085
1092
  end
1086
1093
 
@@ -1141,9 +1148,9 @@ module Aws
1141
1148
  if XML::Parser::VERSION >= '0.5.1.0'
1142
1149
  xml.callbacks = RightSaxParserCallback.new(self)
1143
1150
  else
1144
- xml.on_start_element{|name, attr_hash| self.tag_start(name, attr_hash)}
1145
- xml.on_characters{ |text| self.text(text)}
1146
- xml.on_end_element{ |name| self.tag_end(name)}
1151
+ xml.on_start_element { |name, attr_hash| self.tag_start(name, attr_hash) }
1152
+ xml.on_characters { |text| self.text(text) }
1153
+ xml.on_end_element { |name| self.tag_end(name) }
1147
1154
  end
1148
1155
  xml.parse
1149
1156
  else
@@ -1210,7 +1217,7 @@ module Aws
1210
1217
  # when 'HostId' ; @host_id = @text
1211
1218
  # when 'Bucket' ; @bucket = @text
1212
1219
  when 'Error';
1213
- @errors << [ @code, @message ]
1220
+ @errors << [@code, @message]
1214
1221
  end
1215
1222
  end
1216
1223
 
@@ -29,17 +29,17 @@ module Aws
29
29
 
30
30
  include AwsBaseInterface
31
31
 
32
- DEFAULT_HOST = 's3.amazonaws.com'
33
- DEFAULT_PORT = 443
34
- DEFAULT_PROTOCOL = 'https'
35
- DEFAULT_SERVICE = '/'
36
- REQUEST_TTL = 30
37
- DEFAULT_EXPIRES_AFTER = 1 * 24 * 60 * 60 # One day's worth of seconds
38
- ONE_YEAR_IN_SECONDS = 365 * 24 * 60 * 60
39
- AMAZON_HEADER_PREFIX = 'x-amz-'
40
- AMAZON_METADATA_PREFIX = 'x-amz-meta-'
41
-
42
- @@bench = AwsBenchmarkingBlock.new
32
+ DEFAULT_HOST = 's3.amazonaws.com'
33
+ DEFAULT_PORT = 443
34
+ DEFAULT_PROTOCOL = 'https'
35
+ DEFAULT_SERVICE = '/'
36
+ REQUEST_TTL = 30
37
+ DEFAULT_EXPIRES_AFTER = 1 * 24 * 60 * 60 # One day's worth of seconds
38
+ ONE_YEAR_IN_SECONDS = 365 * 24 * 60 * 60
39
+ AMAZON_HEADER_PREFIX = 'x-amz-'
40
+ AMAZON_METADATA_PREFIX = 'x-amz-meta-'
41
+
42
+ @@bench = AwsBenchmarkingBlock.new
43
43
 
44
44
  def self.bench_xml
45
45
  @@bench.xml
@@ -87,17 +87,17 @@ module Aws
87
87
  #-----------------------------------------------------------------
88
88
  # Produces canonical string for signing.
89
89
  def canonical_string(method, path, headers={}, expires=nil) # :nodoc:
90
- s3_headers = {}
90
+ s3_headers = {}
91
91
  headers.each do |key, value|
92
92
  key = key.downcase
93
93
  s3_headers[key] = value.join("").strip if key[/^#{AMAZON_HEADER_PREFIX}|^content-md5$|^content-type$|^date$/o]
94
94
  end
95
95
  s3_headers['content-type'] ||= ''
96
96
  s3_headers['content-md5'] ||= ''
97
- s3_headers['date'] = '' if s3_headers.has_key? 'x-amz-date'
98
- s3_headers['date'] = expires if expires
97
+ s3_headers['date'] = '' if s3_headers.has_key? 'x-amz-date'
98
+ s3_headers['date'] = expires if expires
99
99
  # prepare output string
100
- out_string = "#{method}\n"
100
+ out_string = "#{method}\n"
101
101
  s3_headers.sort { |a, b| a[0] <=> b[0] }.each do |key, value|
102
102
  out_string << (key[/^#{AMAZON_HEADER_PREFIX}/o] ? "#{key}:#{value}\n" : "#{value}\n")
103
103
  end
@@ -123,8 +123,8 @@ module Aws
123
123
 
124
124
  def fetch_request_params(headers) #:nodoc:
125
125
  # default server to use
126
- server = @params[:server]
127
- service = @params[:service].to_s
126
+ server = @params[:server]
127
+ service = @params[:service].to_s
128
128
  service.chop! if service[%r{/$}] # remove trailing '/' from service
129
129
  # extract bucket name and check it's dns compartibility
130
130
  headers[:url].to_s[%r{^([a-z0-9._-]*)(/[^?]*)?(\?.+)?}i]
@@ -148,22 +148,22 @@ module Aws
148
148
  def generate_rest_request(method, headers) # :nodoc:
149
149
  # calculate request data
150
150
  server, path, path_to_sign = fetch_request_params(headers)
151
- data = headers[:data]
151
+ data = headers[:data]
152
152
  # remove unset(==optional) and symbolyc keys
153
153
  headers.each { |key, value| headers.delete(key) if (value.nil? || key.is_a?(Symbol)) }
154
154
  #
155
- headers['content-type'] ||= ''
156
- headers['date'] = Time.now.httpdate
155
+ headers['content-type'] ||= ''
156
+ headers['date'] = Time.now.httpdate
157
157
  # create request
158
- request = "Net::HTTP::#{method.capitalize}".constantize.new(path)
158
+ request = "Net::HTTP::#{method.capitalize}".constantize.new(path)
159
159
  request.body = data if data
160
160
  # set request headers and meta headers
161
161
  headers.each { |key, value| request[key.to_s] = value }
162
162
  #generate auth strings
163
- auth_string = canonical_string(request.method, path_to_sign, request.to_hash)
164
- signature = AwsUtils::sign(@aws_secret_access_key, auth_string)
163
+ auth_string = canonical_string(request.method, path_to_sign, request.to_hash)
164
+ signature = AwsUtils::sign(@aws_secret_access_key, auth_string)
165
165
  # set other headers
166
- request['Authorization'] = "AWS #{@aws_access_key_id}:#{signature}"
166
+ request['Authorization'] = "AWS #{@aws_access_key_id}:#{signature}"
167
167
  # prepare output hash
168
168
  {:request => request,
169
169
  :server => server,
@@ -202,9 +202,12 @@ module Aws
202
202
  # s3.create_bucket('my-awesome-bucket-eu', :location => :eu) #=> true
203
203
  #
204
204
  def create_bucket(bucket, headers={})
205
- data = nil
205
+ data = nil
206
206
  unless headers[:location].blank?
207
- data = "<CreateBucketConfiguration><LocationConstraint>#{headers[:location].to_s.upcase}</LocationConstraint></CreateBucketConfiguration>"
207
+ # data = "<CreateBucketConfiguration><LocationConstraint>#{headers[:location].to_s.upcase}</LocationConstraint></CreateBucketConfiguration>"
208
+ location = headers[:location].to_s
209
+ location.upcase! if location == 'eu'
210
+ data = "<CreateBucketConfiguration><LocationConstraint>#{location}</LocationConstraint></CreateBucketConfiguration>"
208
211
  end
209
212
  req_hash = generate_rest_request('PUT', headers.merge(:url=>bucket, :data => data))
210
213
  request_info(req_hash, RightHttp2xxParser.new)
@@ -289,7 +292,7 @@ module Aws
289
292
  # 'max-keys' => "5"}, ..., {...}]
290
293
  #
291
294
  def list_bucket(bucket, options={}, headers={})
292
- bucket += '?'+options.map { |k, v| "#{k.to_s}=#{CGI::escape v.to_s}" }.join('&') unless options.blank?
295
+ bucket += '?'+options.map { |k, v| "#{k.to_s}=#{CGI::escape v.to_s}" }.join('&') unless options.blank?
293
296
  req_hash = generate_rest_request('GET', headers.merge(:url=>bucket))
294
297
  request_info(req_hash, S3ListBucketParser.new(:logger => @logger))
295
298
  rescue
@@ -326,8 +329,8 @@ module Aws
326
329
  def incrementally_list_bucket(bucket, options={}, headers={}, &block)
327
330
  internal_options = options.symbolize_keys
328
331
  begin
329
- internal_bucket = bucket.dup
330
- internal_bucket += '?'+internal_options.map { |k, v| "#{k.to_s}=#{CGI::escape v.to_s}" }.join('&') unless internal_options.blank?
332
+ internal_bucket = bucket.dup
333
+ internal_bucket += '?'+internal_options.map { |k, v| "#{k.to_s}=#{CGI::escape v.to_s}" }.join('&') unless internal_options.blank?
331
334
  req_hash = generate_rest_request('GET', headers.merge(:url=>internal_bucket))
332
335
  response = request_info(req_hash, S3ImprovedListBucketParser.new(:logger => @logger))
333
336
  there_are_more_keys = response[:is_truncated]
@@ -409,8 +412,8 @@ module Aws
409
412
  if (data_size >= USE_100_CONTINUE_PUT_SIZE)
410
413
  headers['expect'] = '100-continue'
411
414
  end
412
- req_hash = generate_rest_request('PUT', headers.merge(:url =>"#{bucket}/#{CGI::escape key}", :data=>data,
413
- 'Content-Length' => data_size.to_s))
415
+ req_hash = generate_rest_request('PUT', headers.merge(:url =>"#{bucket}/#{CGI::escape key}", :data=>data,
416
+ 'Content-Length' => data_size.to_s))
414
417
  request_info(req_hash, RightHttp2xxParser.new)
415
418
  rescue
416
419
  on_exception
@@ -828,9 +831,9 @@ module Aws
828
831
  # calculate request data
829
832
  server, path, path_to_sign = fetch_request_params(headers)
830
833
  # expiration time
831
- expires ||= DEFAULT_EXPIRES_AFTER
832
- expires = Time.now.utc + expires if expires.is_a?(Fixnum) && (expires < ONE_YEAR_IN_SECONDS)
833
- expires = expires.to_i
834
+ expires ||= DEFAULT_EXPIRES_AFTER
835
+ expires = Time.now.utc + expires if expires.is_a?(Fixnum) && (expires < ONE_YEAR_IN_SECONDS)
836
+ expires = expires.to_i
834
837
  # remove unset(==optional) and symbolyc keys
835
838
  headers.each { |key, value| headers.delete(key) if (value.nil? || key.is_a?(Symbol)) }
836
839
  #generate auth strings
@@ -991,11 +994,11 @@ module Aws
991
994
  def tagend(name)
992
995
  case name
993
996
  when 'ID';
994
- @owner[:owner_id] = @text
997
+ @owner[:owner_id] = @text
995
998
  when 'DisplayName';
996
- @owner[:owner_display_name] = @text
999
+ @owner[:owner_display_name] = @text
997
1000
  when 'Name';
998
- @current_bucket[:name] = @text
1001
+ @current_bucket[:name] = @text
999
1002
  when 'CreationDate';
1000
1003
  @current_bucket[:creation_date] = @text
1001
1004
  when 'Bucket';
@@ -1019,34 +1022,34 @@ module Aws
1019
1022
  case name
1020
1023
  # service info
1021
1024
  when 'Name';
1022
- @service['name'] = @text
1025
+ @service['name'] = @text
1023
1026
  when 'Prefix';
1024
- @service['prefix'] = @text
1027
+ @service['prefix'] = @text
1025
1028
  when 'Marker';
1026
- @service['marker'] = @text
1029
+ @service['marker'] = @text
1027
1030
  when 'MaxKeys';
1028
- @service['max-keys'] = @text
1031
+ @service['max-keys'] = @text
1029
1032
  when 'Delimiter';
1030
- @service['delimiter'] = @text
1033
+ @service['delimiter'] = @text
1031
1034
  when 'IsTruncated';
1032
1035
  @service['is_truncated'] = (@text =~ /false/ ? false : true)
1033
1036
  # key data
1034
1037
  when 'Key';
1035
- @current_key[:key] = @text
1038
+ @current_key[:key] = @text
1036
1039
  when 'LastModified';
1037
- @current_key[:last_modified] = @text
1040
+ @current_key[:last_modified] = @text
1038
1041
  when 'ETag';
1039
- @current_key[:e_tag] = @text
1042
+ @current_key[:e_tag] = @text
1040
1043
  when 'Size';
1041
- @current_key[:size] = @text.to_i
1044
+ @current_key[:size] = @text.to_i
1042
1045
  when 'StorageClass';
1043
- @current_key[:storage_class] = @text
1046
+ @current_key[:storage_class] = @text
1044
1047
  when 'ID';
1045
- @current_key[:owner_id] = @text
1048
+ @current_key[:owner_id] = @text
1046
1049
  when 'DisplayName';
1047
1050
  @current_key[:owner_display_name] = @text
1048
1051
  when 'Contents';
1049
- @current_key[:service] = @service; @result << @current_key
1052
+ @current_key[:service] = @service; @result << @current_key
1050
1053
  end
1051
1054
  end
1052
1055
  end
@@ -1071,35 +1074,35 @@ module Aws
1071
1074
  case name
1072
1075
  # service info
1073
1076
  when 'Name';
1074
- @result[:name] = @text
1077
+ @result[:name] = @text
1075
1078
  # Amazon uses the same tag for the search prefix and for the entries
1076
1079
  # in common prefix...so use our simple flag to see which element
1077
1080
  # we are parsing
1078
1081
  when 'Prefix';
1079
1082
  @in_common_prefixes ? @common_prefixes << @text : @result[:prefix] = @text
1080
1083
  when 'Marker';
1081
- @result[:marker] = @text
1084
+ @result[:marker] = @text
1082
1085
  when 'MaxKeys';
1083
- @result[:max_keys] = @text
1086
+ @result[:max_keys] = @text
1084
1087
  when 'Delimiter';
1085
- @result[:delimiter] = @text
1088
+ @result[:delimiter] = @text
1086
1089
  when 'IsTruncated';
1087
1090
  @result[:is_truncated] = (@text =~ /false/ ? false : true)
1088
1091
  when 'NextMarker';
1089
- @result[:next_marker] = @text
1092
+ @result[:next_marker] = @text
1090
1093
  # key data
1091
1094
  when 'Key';
1092
- @current_key[:key] = @text
1095
+ @current_key[:key] = @text
1093
1096
  when 'LastModified';
1094
- @current_key[:last_modified] = @text
1097
+ @current_key[:last_modified] = @text
1095
1098
  when 'ETag';
1096
- @current_key[:e_tag] = @text
1099
+ @current_key[:e_tag] = @text
1097
1100
  when 'Size';
1098
- @current_key[:size] = @text.to_i
1101
+ @current_key[:size] = @text.to_i
1099
1102
  when 'StorageClass';
1100
- @current_key[:storage_class] = @text
1103
+ @current_key[:storage_class] = @text
1101
1104
  when 'ID';
1102
- @current_key[:owner_id] = @text
1105
+ @current_key[:owner_id] = @text
1103
1106
  when 'DisplayName';
1104
1107
  @current_key[:owner_display_name] = @text
1105
1108
  when 'Contents';
@@ -1189,7 +1192,7 @@ module Aws
1189
1192
  when 'LastModified' then
1190
1193
  @result[:last_modified] = @text
1191
1194
  when 'ETag' then
1192
- @result[:e_tag] = @text
1195
+ @result[:e_tag] = @text
1193
1196
  end
1194
1197
  end
1195
1198
  end
@@ -1208,7 +1211,7 @@ module Aws
1208
1211
  def headers_to_string(headers)
1209
1212
  result = {}
1210
1213
  headers.each do |key, value|
1211
- value = value[0] if value.is_a?(Array) && value.size<2
1214
+ value = value[0] if value.is_a?(Array) && value.size<2
1212
1215
  result[key] = value
1213
1216
  end
1214
1217
  result
@@ -88,16 +88,16 @@ module Aws
88
88
  #-----------------------------------------------------------------
89
89
  # Requests
90
90
  #-----------------------------------------------------------------
91
- def generate_request(action, params={}) #:nodoc:
92
- generate_request2(@aws_access_key_id, @aws_secret_access_key, action, API_VERSION, @params, params)
91
+ def generate_request(action, params={}, options={}) #:nodoc:
92
+ generate_request2(@aws_access_key_id, @aws_secret_access_key, action, API_VERSION, @params, params, options)
93
93
  end
94
94
 
95
95
 
96
96
  # Sends request to Amazon and parses the response
97
97
  # Raises AwsError if any banana happened
98
- def request_info(request, parser) #:nodoc:
98
+ def request_info(request, parser, options={}) #:nodoc:
99
99
  # request_info2(request, parser, :sdb_connection)
100
- request_info2(request, parser, @params, :sdb_connection, @logger, @@bench)
100
+ request_info2(request, parser, @params, :sdb_connection, @logger, @@bench, options)
101
101
 
102
102
  end
103
103
 
@@ -615,6 +615,11 @@ module Aws
615
615
  # { "37df6c36-75b0-11dd-9557-001bfc466dd7"=> {"name"=>["Mary"], "country"=>["USA"]} } ],
616
616
  # :box_usage=>"0.0000777663"}
617
617
  #
618
+ # options:
619
+ # :next_token
620
+ # :consistent_read
621
+ # :retries => maximum number of times to retry this query on an error response.
622
+ #
618
623
  # see: http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/index.html?SDB_API_Select.html
619
624
  # http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/index.html?UsingSelect.html
620
625
  # http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/index.html?SDBLimits.html
@@ -622,12 +627,20 @@ module Aws
622
627
  def select(select_expression, next_token = nil, consistent_read = nil)
623
628
  select_expression = query_expression_from_array(select_expression) if select_expression.is_a?(Array)
624
629
  @last_query_expression = select_expression
630
+
631
+ options = {}
632
+ if next_token.is_a?(Hash)
633
+ options = next_token
634
+ next_token = options[:next_token]
635
+ consistent_read = options[:consistent_read]
636
+ end
637
+
625
638
  #
626
639
  request_params = { 'SelectExpression' => select_expression,
627
640
  'NextToken' => next_token,
628
641
  'ConsistentRead' => consistent_read }
629
- link = generate_request("Select", request_params)
630
- result = select_response_to_ruby(request_info( link, QSdbSelectParser.new ))
642
+ link = generate_request("Select", request_params, options)
643
+ result = select_response_to_ruby(request_info( link, QSdbSelectParser.new, options ))
631
644
  return result unless block_given?
632
645
  # loop if block if given
633
646
  begin
@@ -636,7 +649,7 @@ module Aws
636
649
  # make new request
637
650
  request_params['NextToken'] = result[:next_token]
638
651
  link = generate_request("Select", request_params)
639
- result = select_response_to_ruby(request_info( link, QSdbSelectParser.new ))
652
+ result = select_response_to_ruby(request_info( link, QSdbSelectParser.new, options ))
640
653
  end while true
641
654
  rescue Exception
642
655
  on_exception
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 2
7
7
  - 3
8
- - 26
9
- version: 2.3.26
8
+ - 27
9
+ version: 2.3.27
10
10
  platform: ruby
11
11
  authors:
12
12
  - Travis Reeder
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-11-15 00:00:00 -08:00
19
+ date: 2010-12-02 00:00:00 -08:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -123,8 +123,8 @@ homepage: http://github.com/appoxy/aws/
123
123
  licenses: []
124
124
 
125
125
  post_install_message:
126
- rdoc_options:
127
- - --charset=UTF-8
126
+ rdoc_options: []
127
+
128
128
  require_paths:
129
129
  - lib
130
130
  required_ruby_version: !ruby/object:Gem::Requirement