aws-sdk 1.4.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (193) hide show
  1. data/.yardopts +0 -1
  2. data/lib/aws/api_config/AutoScaling-2011-01-01.yml +772 -544
  3. data/lib/aws/api_config/CloudFormation-2010-05-15.yml +284 -185
  4. data/lib/aws/api_config/DynamoDB-2011-12-05.yml +458 -738
  5. data/lib/aws/api_config/EC2-2011-12-15.yml +3502 -2653
  6. data/lib/aws/api_config/ELB-2011-08-15.yml +484 -352
  7. data/lib/aws/api_config/IAM-2010-05-08.yml +899 -711
  8. data/lib/aws/api_config/SNS-2010-03-31.yml +235 -167
  9. data/lib/aws/api_config/SQS-2011-10-01.yml +290 -251
  10. data/lib/aws/api_config/STS-2011-06-15.yml +35 -41
  11. data/lib/aws/api_config/SimpleDB-2009-04-15.yml +290 -263
  12. data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +144 -130
  13. data/lib/aws/api_config/SimpleWorkflow-2012-01-25.yml +697 -1139
  14. data/lib/aws/auto_scaling/activity_collection.rb +1 -1
  15. data/lib/aws/auto_scaling/client.rb +724 -9
  16. data/lib/aws/auto_scaling/errors.rb +1 -5
  17. data/lib/aws/auto_scaling/group.rb +1 -1
  18. data/lib/aws/auto_scaling/group_collection.rb +1 -1
  19. data/lib/aws/auto_scaling/instance_collection.rb +1 -1
  20. data/lib/aws/auto_scaling/launch_configuration.rb +1 -1
  21. data/lib/aws/auto_scaling/launch_configuration_collection.rb +1 -1
  22. data/lib/aws/auto_scaling/notification_configuration_collection.rb +1 -1
  23. data/lib/aws/auto_scaling/request.rb +1 -2
  24. data/lib/aws/auto_scaling/scaling_policy_collection.rb +1 -1
  25. data/lib/aws/auto_scaling/scheduled_action_collection.rb +3 -3
  26. data/lib/aws/auto_scaling/tag_collection.rb +1 -1
  27. data/lib/aws/cloud_formation.rb +1 -18
  28. data/lib/aws/cloud_formation/client.rb +314 -8
  29. data/lib/aws/cloud_formation/errors.rb +1 -5
  30. data/lib/aws/cloud_formation/request.rb +1 -2
  31. data/lib/aws/cloud_formation/stack.rb +4 -3
  32. data/lib/aws/cloud_formation/stack_collection.rb +2 -2
  33. data/lib/aws/cloud_formation/stack_resource_collection.rb +1 -1
  34. data/lib/aws/cloud_formation/stack_resource_summary_collection.rb +2 -2
  35. data/lib/aws/cloud_formation/stack_summary_collection.rb +1 -1
  36. data/lib/aws/core.rb +29 -14
  37. data/lib/aws/core/async_handle.rb +11 -12
  38. data/lib/aws/core/client.rb +112 -102
  39. data/lib/aws/core/client/query_json.rb +110 -0
  40. data/lib/aws/core/client/query_xml.rb +122 -0
  41. data/lib/aws/core/data.rb +242 -0
  42. data/lib/aws/core/http/request.rb +7 -4
  43. data/lib/aws/core/lazy_error_classes.rb +60 -38
  44. data/lib/aws/core/option_grammar.rb +1 -0
  45. data/lib/aws/core/policy.rb +2 -1
  46. data/lib/aws/core/resource.rb +38 -33
  47. data/lib/aws/core/response.rb +109 -44
  48. data/lib/aws/core/signature/version_2.rb +42 -0
  49. data/lib/aws/core/signature/version_3.rb +73 -0
  50. data/lib/aws/core/signature/version_3_http.rb +72 -0
  51. data/lib/aws/core/signature/version_4.rb +138 -0
  52. data/lib/aws/core/uri_escape.rb +6 -9
  53. data/lib/aws/core/xml/frame.rb +242 -0
  54. data/lib/aws/core/xml/frame_stack.rb +85 -0
  55. data/lib/aws/core/xml/grammar.rb +299 -0
  56. data/lib/aws/core/xml/parser.rb +70 -0
  57. data/lib/aws/core/xml/root_frame.rb +65 -0
  58. data/lib/aws/core/{configured_xml_grammars.rb → xml/sax_handlers/libxml.rb} +22 -20
  59. data/lib/aws/core/xml/sax_handlers/nokogiri.rb +55 -0
  60. data/lib/aws/core/{authorize_with_session_token.rb → xml/sax_handlers/ox.rb} +19 -7
  61. data/lib/aws/core/{configured_option_grammars.rb → xml/sax_handlers/rexml.rb} +22 -23
  62. data/lib/aws/core/xml/stub.rb +123 -0
  63. data/lib/aws/dynamo_db/batch_get.rb +1 -1
  64. data/lib/aws/dynamo_db/client.rb +796 -14
  65. data/lib/aws/dynamo_db/errors.rb +1 -38
  66. data/lib/aws/dynamo_db/item_collection.rb +29 -28
  67. data/lib/aws/dynamo_db/request.rb +3 -53
  68. data/lib/aws/dynamo_db/table.rb +6 -2
  69. data/lib/aws/ec2/attachment.rb +1 -1
  70. data/lib/aws/ec2/client.rb +3954 -9
  71. data/lib/aws/ec2/dhcp_options.rb +3 -3
  72. data/lib/aws/ec2/errors.rb +10 -4
  73. data/lib/aws/ec2/instance.rb +7 -6
  74. data/lib/aws/ec2/instance_collection.rb +2 -2
  75. data/lib/aws/ec2/key_pair_collection.rb +3 -3
  76. data/lib/aws/ec2/network_acl.rb +4 -2
  77. data/lib/aws/ec2/network_acl/entry.rb +10 -10
  78. data/lib/aws/ec2/network_interface.rb +2 -3
  79. data/lib/aws/ec2/network_interface/attachment.rb +8 -8
  80. data/lib/aws/ec2/permission_collection.rb +3 -3
  81. data/lib/aws/ec2/request.rb +1 -3
  82. data/lib/aws/ec2/resource_tag_collection.rb +4 -8
  83. data/lib/aws/ec2/route_table.rb +3 -2
  84. data/lib/aws/ec2/route_table/route.rb +7 -7
  85. data/lib/aws/ec2/security_group.rb +2 -2
  86. data/lib/aws/ec2/security_group/egress_ip_permission_collection.rb +16 -5
  87. data/lib/aws/ec2/security_group/ingress_ip_permission_collection.rb +4 -3
  88. data/lib/aws/ec2/security_group/ip_permission.rb +1 -2
  89. data/lib/aws/ec2/snapshot_collection.rb +6 -3
  90. data/lib/aws/ec2/subnet.rb +1 -1
  91. data/lib/aws/ec2/volume.rb +1 -3
  92. data/lib/aws/ec2/volume_collection.rb +2 -0
  93. data/lib/aws/elb/availability_zone_collection.rb +2 -2
  94. data/lib/aws/elb/backend_server_policy_collection.rb +1 -1
  95. data/lib/aws/elb/client.rb +513 -9
  96. data/lib/aws/elb/errors.rb +2 -6
  97. data/lib/aws/elb/instance_collection.rb +2 -2
  98. data/lib/aws/elb/request.rb +1 -1
  99. data/lib/aws/errors.rb +61 -74
  100. data/lib/aws/iam.rb +2 -3
  101. data/lib/aws/iam/client.rb +1178 -10
  102. data/lib/aws/iam/collection.rb +2 -1
  103. data/lib/aws/iam/errors.rb +1 -6
  104. data/lib/aws/iam/group.rb +8 -9
  105. data/lib/aws/iam/request.rb +1 -1
  106. data/lib/aws/iam/server_certificate_collection.rb +8 -5
  107. data/lib/aws/iam/signing_certificate.rb +1 -1
  108. data/lib/aws/iam/user.rb +2 -2
  109. data/lib/aws/iam/user_policy.rb +3 -2
  110. data/lib/aws/rails.rb +1 -2
  111. data/lib/aws/record.rb +3 -3
  112. data/lib/aws/record/abstract_base.rb +0 -3
  113. data/lib/aws/record/attributes.rb +7 -7
  114. data/lib/aws/record/model.rb +19 -19
  115. data/lib/aws/record/model/finder_methods.rb +7 -7
  116. data/lib/aws/s3/bucket.rb +7 -2
  117. data/lib/aws/s3/client.rb +391 -398
  118. data/lib/aws/s3/client/xml.rb +44 -71
  119. data/lib/aws/s3/data_options.rb +3 -2
  120. data/lib/aws/s3/errors.rb +8 -11
  121. data/lib/aws/s3/multipart_upload_collection.rb +1 -3
  122. data/lib/aws/s3/object_collection.rb +2 -1
  123. data/lib/aws/s3/object_metadata.rb +2 -2
  124. data/lib/aws/s3/paginated_collection.rb +2 -2
  125. data/lib/aws/s3/prefix_and_delimiter_collection.rb +1 -1
  126. data/lib/aws/s3/presigned_post.rb +18 -17
  127. data/lib/aws/s3/request.rb +4 -3
  128. data/lib/aws/s3/s3_object.rb +8 -10
  129. data/lib/aws/simple_db/attribute.rb +2 -2
  130. data/lib/aws/simple_db/attribute_collection.rb +14 -4
  131. data/lib/aws/simple_db/client.rb +313 -14
  132. data/lib/aws/simple_db/domain.rb +1 -1
  133. data/lib/aws/simple_db/domain_collection.rb +4 -4
  134. data/lib/aws/simple_db/domain_metadata.rb +1 -1
  135. data/lib/aws/simple_db/errors.rb +14 -2
  136. data/lib/aws/simple_db/expect_condition_option.rb +1 -1
  137. data/lib/aws/simple_db/item.rb +1 -1
  138. data/lib/aws/simple_db/item_collection.rb +9 -9
  139. data/lib/aws/simple_db/item_data.rb +9 -6
  140. data/lib/aws/simple_db/request.rb +1 -1
  141. data/lib/aws/simple_email_service.rb +8 -7
  142. data/lib/aws/simple_email_service/client.rb +174 -9
  143. data/lib/aws/simple_email_service/email_address_collection.rb +0 -1
  144. data/lib/aws/simple_email_service/errors.rb +1 -5
  145. data/lib/aws/simple_email_service/quotas.rb +8 -6
  146. data/lib/aws/simple_email_service/request.rb +7 -1
  147. data/lib/aws/simple_workflow/client.rb +1383 -6
  148. data/lib/aws/simple_workflow/decision_task.rb +1 -3
  149. data/lib/aws/simple_workflow/errors.rb +1 -38
  150. data/lib/aws/simple_workflow/history_event_collection.rb +2 -2
  151. data/lib/aws/simple_workflow/request.rb +5 -49
  152. data/lib/aws/simple_workflow/type.rb +1 -1
  153. data/lib/aws/simple_workflow/type_collection.rb +4 -3
  154. data/lib/aws/simple_workflow/workflow_execution_collection.rb +2 -2
  155. data/lib/aws/sns/client.rb +345 -9
  156. data/lib/aws/sns/errors.rb +1 -5
  157. data/lib/aws/sns/request.rb +1 -2
  158. data/lib/aws/sns/subscription_collection.rb +2 -2
  159. data/lib/aws/sns/topic.rb +15 -14
  160. data/lib/aws/sns/topic_collection.rb +1 -1
  161. data/lib/aws/sqs/client.rb +334 -9
  162. data/lib/aws/sqs/errors.rb +1 -6
  163. data/lib/aws/sqs/queue.rb +20 -21
  164. data/lib/aws/sqs/queue_collection.rb +3 -3
  165. data/lib/aws/sqs/request.rb +2 -2
  166. data/lib/aws/sts.rb +8 -10
  167. data/lib/aws/sts/client.rb +67 -10
  168. data/lib/aws/sts/errors.rb +1 -5
  169. data/lib/aws/sts/request.rb +1 -1
  170. data/lib/user.rb +49 -0
  171. metadata +21 -28
  172. data/lib/aws/auto_scaling/client/xml.rb +0 -32
  173. data/lib/aws/cloud_formation/client/xml.rb +0 -32
  174. data/lib/aws/core/api_config.rb +0 -44
  175. data/lib/aws/core/authorize_v2.rb +0 -39
  176. data/lib/aws/core/authorize_v3.rb +0 -38
  177. data/lib/aws/core/authorize_v4.rb +0 -149
  178. data/lib/aws/core/configured_client_methods.rb +0 -76
  179. data/lib/aws/core/configured_grammars.rb +0 -63
  180. data/lib/aws/core/configured_json_client_methods.rb +0 -74
  181. data/lib/aws/core/ignore_result_element.rb +0 -34
  182. data/lib/aws/core/json_client.rb +0 -41
  183. data/lib/aws/core/xml_grammar.rb +0 -957
  184. data/lib/aws/ec2/client/xml.rb +0 -175
  185. data/lib/aws/elb/client/xml.rb +0 -33
  186. data/lib/aws/elb/listener_spec.rb +0 -14
  187. data/lib/aws/iam/client/xml.rb +0 -34
  188. data/lib/aws/simple_db/client/options.rb +0 -32
  189. data/lib/aws/simple_db/client/xml.rb +0 -63
  190. data/lib/aws/simple_email_service/client/xml.rb +0 -34
  191. data/lib/aws/sns/client/xml.rb +0 -34
  192. data/lib/aws/sqs/client/xml.rb +0 -33
  193. data/lib/aws/sts/client/xml.rb +0 -34
@@ -15,7 +15,10 @@ module AWS
15
15
  module Core
16
16
  module Http
17
17
 
18
- # Base class for all service reqeusts.
18
+ # Base class for all service reqeusts. This class describes
19
+ # a basic HTTP request, but will not make one. It is consumed
20
+ # by a HTTP handler class that sends the actual request
21
+ # and parses the actual response.
19
22
  class Request
20
23
 
21
24
  # Returns a new empty http request object.
@@ -67,9 +70,9 @@ module AWS
67
70
  # to be populated for requests against signature v4 endpoints.
68
71
  attr_accessor :region
69
72
 
70
- # @param [Boolean] ssl If the request should be sent over ssl or not.
71
- def use_ssl= use_ssl
72
- @use_ssl = use_ssl
73
+ # @param [Boolean] state If the request should be sent over ssl or not.
74
+ def use_ssl= state
75
+ @use_ssl = state
73
76
  end
74
77
 
75
78
  # @return [Boolean] If this request should be sent over ssl or not.
@@ -16,53 +16,75 @@ require 'thread'
16
16
  module AWS
17
17
  module Core
18
18
 
19
- # @private
19
+ # Provides lazy creation of error classes via {#const_missing}.
20
+ #
21
+ # Extend this module provides 3 benefits to another module:
22
+ #
23
+ # * A method that accepts strings and returns error classes.
24
+ # * Thread-safe dynamic error class creation via {#const_missing}
25
+ # * An error grammar for parsing AWS xml errors
26
+ #
27
+ # Here is an example of how it works:
28
+ #
29
+ # Class Foo
30
+ # module Errors
31
+ # extend AWS::Core::LazyErrorClasses
32
+ # end
33
+ # end
34
+ #
35
+ # Foo::Errors.error_class('NoSuchKey')
36
+ # #=> Foo::Errors::NoSuckKey
37
+ #
38
+ # Foo::Errors.error_class('Nested.Error.Klasses')
39
+ # #=> Foo::Errors::Nested::Error::Klasses
40
+ #
41
+ # The errors returned from {#error_class} are subclasses
42
+ # of {AWS::Errors::Base}.
43
+ #
20
44
  module LazyErrorClasses
21
-
22
- # @private
23
- module ClassMethods
24
-
25
- def const_missing(name)
26
- base_error_grammar = self::BASE_ERROR_GRAMMAR
27
- mod = self::ERROR_MODULE
28
- const_missing_mutex.synchronize do
29
- const_set(name,
30
- Class.new(self::Base) do
31
- include mod::ModeledError
32
45
 
33
- # so that MyService::Errors::Foo::Bar will work
34
- const_set(:BASE_ERROR_GRAMMAR, base_error_grammar)
35
- const_set(:ERROR_MODULE, mod)
36
- include LazyErrorClasses
37
- end)
38
- end
39
- end
40
-
41
- def error_class(code)
42
- module_eval("#{self}::#{code.gsub('.Range','Range').gsub(".","::")}")
46
+ # This grammar parses the defualt AWS XML error format
47
+ BASE_ERROR_GRAMMAR = XML::Grammar.customize do
48
+ element("Error") do
49
+ ignore
43
50
  end
44
-
45
- def included(mod)
46
- raise NotImplementedError.new("#{self} lazy-generates error classes; "+
47
- "therefore it is not suitable for "+
48
- "inclusion in other modules")
51
+ end
52
+
53
+ # @private
54
+ def self.extended base
55
+
56
+ unless base.const_defined?(:GRAMMAR)
57
+ base.const_set(:GRAMMAR, BASE_ERROR_GRAMMAR)
49
58
  end
50
-
59
+
60
+ mutex = Mutex.new
61
+ MetaUtils.extend_method(base, :const_missing_mutex) { mutex }
62
+
51
63
  end
52
64
 
53
- def self.included(mod)
54
- unless mod.const_defined?(:BASE_ERROR_GRAMMAR)
55
- mod.const_set(:BASE_ERROR_GRAMMAR, XmlGrammar)
56
- end
57
- unless mod.const_defined?(:ERROR_MODULE)
58
- mod.const_set(:ERROR_MODULE, mod)
65
+ # Defines a new error class.
66
+ # @param [String,Symbol] constant
67
+ # @return [nil]
68
+ def const_missing constant
69
+ const_missing_mutex.synchronize do
70
+ const_set(constant, Class.new(Errors::Base) { extend LazyErrorClasses })
59
71
  end
60
- mutex = Mutex.new
61
- MetaUtils.extend_method(mod, :const_missing_mutex) { mutex }
62
- mod.send(:include, Errors)
63
- mod.extend(ClassMethods)
72
+ end
73
+
74
+ # Converts the error code into an error class constant.
75
+ #
76
+ # AWS::EC2::Errors.error_class('Non.Existent.Error')
77
+ # #=> AWS::EC2::Errors::Non::Existent::Error
78
+ #
79
+ # @param [String] code An AWS error code.
80
+ #
81
+ # @return [Class] Returns the error class defiend by the error code.
82
+ #
83
+ def error_class code
84
+ module_eval("#{self}::#{code.gsub('.Range','Range').gsub(".","::")}")
64
85
  end
65
86
 
66
87
  end
88
+
67
89
  end
68
90
  end
@@ -477,6 +477,7 @@ module AWS
477
477
  descriptors.each do |desc|
478
478
  if desc.kind_of?(Hash)
479
479
  (name, arg) = desc.to_a.first
480
+ next if name == :documentation
480
481
  else
481
482
  name = desc
482
483
  arg = nil
@@ -354,7 +354,7 @@ module AWS
354
354
  # http://docs.amazonwebservices.com/AmazonS3/latest/dev/UsingResOpsConditions.html
355
355
  # for a list of the available keys for each action in S3.
356
356
  #
357
- # @param value The value to compare against.
357
+ # @param [Mixed] values The value to compare against.
358
358
  # This can be:
359
359
  # * a String
360
360
  # * a number
@@ -362,6 +362,7 @@ module AWS
362
362
  # * a boolean value
363
363
  # This method does not attempt to validate that the values
364
364
  # are valid for the operators or keys they are used with.
365
+ #
365
366
  def add(operator, key, *values)
366
367
  if operator.kind_of?(Symbol)
367
368
  converted_values = values.map { |v| convert_value(v) }
@@ -121,21 +121,31 @@ module AWS
121
121
  # @private
122
122
  public
123
123
  def attributes_from_response resp
124
-
125
- attributes = {}
126
-
124
+
125
+ # check each provider for this request type to see if it
126
+ # can find the resource and some of its attributes
127
+ attributes = []
127
128
  self.class.attribute_providers_for(resp.request_type).each do |provider|
128
- attributes.merge!(provider.attributes_from_response(self, resp))
129
+ attributes << provider.attributes_from_response(self, resp)
129
130
  end
131
+
132
+ # drop out those that returned no attributesj
133
+ attributes.compact!
134
+
135
+ # stop here if nothing was found for this resource
136
+ return nil if attributes.empty?
137
+
138
+ # merge the attributes together into a single hash
139
+ attributes = attributes.inject({}) {|hash,attribs| hash.merge(attribs) }
130
140
 
131
141
  # cache static attributes
132
- attributes.each do |attr_name,value|
142
+ attributes.each_pair do |attr_name,value|
133
143
  if self.class.attributes[attr_name].static?
134
144
  static_attributes[attr_name] = value
135
145
  end
136
146
  end
137
-
138
- attributes.empty? ? nil : attributes
147
+
148
+ attributes
139
149
 
140
150
  end
141
151
 
@@ -347,15 +357,16 @@ module AWS
347
357
  # Indicates that all of the the named attributes can be retrieved
348
358
  # from an appropriate response object.
349
359
  #
350
- # @param [Symbol] attr_names A list of attributes provided
351
- # @param [Hash] options
352
- # @option options [Boolean] :value_wrapped (false) If true, then
353
- # the value returned by the response object will also receive
354
- # the message :value before it is translated and returned.
355
- # @option options [Symbol] :get_as Defaults to the method named
356
- # by the attribute. This is useful when you have two providers
357
- # for the same attribute but their response object name
358
- # them differently.
360
+ # @overload provides(*attr_names, options = {})
361
+ # @param [Symbol] attr_names A list of attributes provided
362
+ # @param [Hash] options
363
+ # @option options [Boolean] :value_wrapped (false) If true, then
364
+ # the value returned by the response object will also receive
365
+ # the message :value before it is translated and returned.
366
+ # @option options [Symbol] :get_as Defaults to the method named
367
+ # by the attribute. This is useful when you have two providers
368
+ # for the same attribute but their response object name
369
+ # them differently.
359
370
  def provides *attr_names
360
371
  options = attr_names.last.is_a?(Hash) ? attr_names.pop : {}
361
372
  attr_names.each do |attr_name|
@@ -369,32 +380,26 @@ module AWS
369
380
  if response_object = resource.send(finder_method, response)
370
381
  attributes_from_response_object(response_object)
371
382
  else
372
- {}
383
+ nil
373
384
  end
374
385
  end
375
386
 
376
387
  def attributes_from_response_object resp_obj
377
- attributes = {}
378
- @provides.each do |attr_name, options|
379
-
388
+
389
+ @provides.inject({}) do |attributes,(attr_name,options)|
390
+
380
391
  attr = @klass.attributes[attr_name]
392
+
381
393
  method = options[:get_as] || attr.get_as
382
394
 
383
- v = case
384
- when resp_obj.respond_to?(:key?) && resp_obj.key?(method.to_s)
385
- resp_obj[method.to_s]
386
- when resp_obj.respond_to?(method)
387
- resp_obj.send(method)
388
- else
389
- nil
390
- end
391
- v = v.value if v and options[:value_wrapped]
395
+ v = resp_obj.key?(method) ? resp_obj[method] : resp_obj[method.to_s]
396
+ v = v[:value] if v and options[:value_wrapped]
392
397
  v = attr.translate_output_value(v)
393
-
394
- attributes[attr_name] = v
395
-
398
+
399
+ attributes.merge(attr_name => v)
400
+
396
401
  end
397
- attributes
402
+
398
403
  end
399
404
 
400
405
  end
@@ -14,33 +14,76 @@
14
14
  module AWS
15
15
  module Core
16
16
 
17
- # @private
17
+ # = Response
18
+ #
19
+ # Each service request returns a response object. Responses provide
20
+ # access to response data and request/response metadata.
21
+ #
22
+ # == Response Data
23
+ #
24
+ # Each response has a hash of data that represents the data
25
+ # returned by the service. You can get at this data by
26
+ # calling {#data} (you can also use the {#[]} method as a shortcut)
27
+ #
28
+ # # make a request to describe one instance
29
+ # ec2 = AWS::EC2.new
30
+ # response = ec2.client.describe_instances(:instance_ids => ['i-12345678'])
31
+ #
32
+ # # find the instance in the response data (2 ways to get the data)
33
+ # instance = response[:reservation_set].first[:instance_set].first
34
+ # instance = response.data[:reservation_set].first[:instance_set].first
35
+ #
36
+ # instance[:status] #=> 'running'
37
+ #
38
+ # == Response Metadata
39
+ #
40
+ # In addition to the response data, there is additional information
41
+ # available with the response, including:
42
+ #
43
+ # * the name of the client request method called
44
+ # * the hash of options passed to the client request
45
+ # * the HTTP request object (useful for debugging)
46
+ # * the HTTP response object (useful for debugging)
47
+ #
48
+ # Given the example and response object from above:
49
+ #
50
+ # response.request_type #=> :describe_instances
51
+ # response.request_options #=> { :instance_ids => ['i-12345678'] }
52
+ # response.http_request #=> #<AWS::Core::Http::Request>
53
+ # response.http_response #=> #<AWS::Core::Http::Response>
54
+ #
18
55
  class Response
19
56
 
20
57
  include AsyncHandle
58
+
59
+ # @return [Hash] Returns the response data as a hash.
60
+ attr_accessor :data
21
61
 
22
- # @return [AWS::Error] Returns nil unless the request failed.
23
- # Normally this will be nil unless you are using the Asynchronous
24
- # interface.
25
- attr_accessor :error
62
+ # @return [Symbol] The name of the client request method that
63
+ # returned this response.
64
+ attr_accessor :request_type
26
65
 
27
- # @return [Hash] The hash of options passed to the low level request
28
- # method that generated this response.
66
+ # @return [Hash] Returns the hash of options passed to the client
67
+ # request method that generated this response.
29
68
  attr_accessor :request_options
30
-
31
- # @return [Symbol] The low-level request method that generated
32
- # this response
33
- attr_accessor :request_type
34
69
 
35
- # @return [Http::Request] the HTTP request object
70
+ # @return [Core::Http::Request]
36
71
  attr_accessor :http_request
37
72
 
38
- # @return [Http::Response] the HTTP response object
73
+ # @return [Core::Http::Response]
39
74
  attr_accessor :http_response
40
75
 
41
- # @return [Boolean] true if the response is cached
76
+ # @return [Boolean] true if the response was generated from a
77
+ # another cached response.
42
78
  attr_accessor :cached
43
79
 
80
+ alias_method :cached?, :cached
81
+
82
+ # @return [AWS::Error,nil] Returns nil unless the request failed.
83
+ # Normally this will be nil unless you are using the Asynchronous
84
+ # interface.
85
+ attr_accessor :error
86
+
44
87
  # @return [Integer] Returns the number of times the request
45
88
  # was retried.
46
89
  attr_accessor :retry_count
@@ -50,22 +93,27 @@ module AWS
50
93
  attr_accessor :duration
51
94
 
52
95
  # @param [Http::Request] http_request
53
- # @param [Http::Response] http_request
96
+ # @param [Http::Response] http_response
54
97
  def initialize http_request = nil, http_response = nil, &block
55
98
  @http_request = http_request
56
99
  @http_response = http_response
57
100
  @request_builder = block
101
+ @data = {}
58
102
  @retry_count = 0
59
103
  @duration = 0
60
104
  rebuild_request if @request_builder && !http_request
61
105
  end
62
-
63
- # Rebuilds the HTTP request using the block passed to the initializer
64
- def rebuild_request
65
- @http_request = @request_builder.call
106
+
107
+ # Provides access to the response data. This is a short-cut
108
+ # for calling +response.data[key]+.
109
+ #
110
+ # @param [Symbol,String] key
111
+ # @return [Hash,nil]
112
+ def [] key
113
+ data[key]
66
114
  end
67
115
 
68
- # @return [Boolean] Returns true unless there is a response error.
116
+ # @return [Boolean] Returns true if there is no response error.
69
117
  def successful?
70
118
  error.nil?
71
119
  end
@@ -74,9 +122,9 @@ module AWS
74
122
  # by AWS.
75
123
  def throttled?
76
124
  if !successful? and http_response.body
77
- error = XmlGrammar.parse(http_response.body)
78
- error = error.error if error.respond_to?(:error)
79
- error.respond_to?(:code) and error.code == "Throttling"
125
+ error = XML::Parser.new.parse(http_response.body)
126
+ error = error[:error] if error[:error]
127
+ error[:code] == "Throttling"
80
128
  else
81
129
  false
82
130
  end
@@ -87,49 +135,66 @@ module AWS
87
135
  http_response.timeout?
88
136
  end
89
137
 
138
+ # @return [String]
90
139
  # @private
91
140
  def inspect
92
- if request_type
93
- "<#{self.class}:#{request_type}>"
94
- else
95
- "<#{self.class}>"
96
- end
141
+ data.inspect
97
142
  end
98
143
 
144
+ # @return [String]
145
+ # @private
99
146
  def cache_key
100
- [http_request.access_key_id,
101
- http_request.host,
102
- request_type,
103
- serialized_options].join(":")
147
+ [
148
+ http_request.access_key_id,
149
+ http_request.host,
150
+ request_type,
151
+ serialized_options
152
+ ].join(":")
153
+ end
154
+
155
+ # Rebuilds the HTTP request using the block passed to the initializer.
156
+ # This is primarily used by the client when a request must be retried
157
+ # (throttling, server errors, socket errors, etc).
158
+ # @private
159
+ def rebuild_request
160
+ @http_request = @request_builder.call
161
+ end
162
+
163
+ protected
164
+
165
+ # @note The prefered method to get as response data is to use {#[]}.
166
+ #
167
+ # This provides a backwards-compat layer to the old response objects
168
+ # where each response value had a method extended onto this object.
169
+ # Now all response data is accessible as a hash.
170
+ #
171
+ # @see #[]
172
+ # @see #data
173
+ #
174
+ def method_missing *args, &block
175
+ Core::Data.new(data).send(*args, &block)
104
176
  end
105
177
 
106
178
  def serialized_options
107
179
  serialize_options_hash(request_options)
108
180
  end
109
181
 
110
- private
111
182
  def serialize_options_hash(hash)
112
183
  "(" + hash.keys.sort_by(&:to_s).map do |key|
113
184
  "#{key}=#{serialize_options_value(hash[key])}"
114
185
  end.join(" ") + ")"
115
186
  end
116
187
 
117
- private
118
188
  def serialize_options_value(value)
119
189
  case value
120
- when Hash
121
- serialize_options_hash(value)
122
- when Array
123
- serialize_options_array(value)
124
- else
125
- value.inspect
190
+ when Hash then serialize_options_hash(value)
191
+ when Array then serialize_options_array(value)
192
+ else value.inspect
126
193
  end
127
194
  end
128
195
 
129
- private
130
- def serialize_options_array(ary)
131
- "[" + ary.map { |v| serialize_options_value(v) }.join(" ") +
132
- "]"
196
+ def serialize_options_array array
197
+ "[" + array.map{|v| serialize_options_value(v) }.join(" ") + "]"
133
198
  end
134
199
 
135
200
  end