aws 2.3.26 → 2.3.27

Sign up to get free protection for your applications and to get access to all the features.
@@ -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