aws-sdk 1.1.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (233) hide show
  1. data/ca-bundle.crt +2 -348
  2. data/lib/aws.rb +24 -49
  3. data/lib/aws/{common.rb → core.rb} +120 -9
  4. data/lib/aws/{api_config.rb → core/api_config.rb} +19 -20
  5. data/lib/aws/core/api_config_transform.rb +36 -0
  6. data/lib/aws/core/async_handle.rb +91 -0
  7. data/lib/aws/core/authorize_v2.rb +39 -0
  8. data/lib/aws/{authorize_v3.rb → core/authorize_v3.rb} +16 -15
  9. data/lib/aws/{api_config_transform.rb → core/authorize_with_session_token.rb} +9 -12
  10. data/lib/aws/core/autoloader.rb +64 -0
  11. data/lib/aws/core/cacheable.rb +78 -0
  12. data/lib/aws/core/client.rb +471 -0
  13. data/lib/aws/core/client_logging.rb +125 -0
  14. data/lib/aws/core/collections.rb +229 -0
  15. data/lib/aws/core/configuration.rb +358 -0
  16. data/lib/aws/core/configured_client_methods.rb +76 -0
  17. data/lib/aws/core/configured_grammars.rb +63 -0
  18. data/lib/aws/{configured_option_grammars.rb → core/configured_option_grammars.rb} +18 -20
  19. data/lib/aws/{configured_xml_grammars.rb → core/configured_xml_grammars.rb} +19 -21
  20. data/lib/aws/core/default_signer.rb +67 -0
  21. data/lib/aws/core/http/curb_handler.rb +129 -0
  22. data/lib/aws/core/http/handler.rb +77 -0
  23. data/lib/aws/core/http/httparty_handler.rb +113 -0
  24. data/lib/aws/core/http/net_http_handler.rb +124 -0
  25. data/lib/aws/core/http/request.rb +207 -0
  26. data/lib/aws/core/http/response.rb +73 -0
  27. data/lib/aws/{ignore_result_element.rb → core/ignore_result_element.rb} +14 -18
  28. data/lib/aws/core/indifferent_hash.rb +88 -0
  29. data/lib/aws/core/inflection.rb +47 -0
  30. data/lib/aws/core/lazy_error_classes.rb +62 -0
  31. data/lib/aws/{uri_escape.rb → core/meta_utils.rb} +24 -23
  32. data/lib/aws/core/model.rb +57 -0
  33. data/lib/aws/{authorize_with_session_token.rb → core/naming.rb} +9 -8
  34. data/lib/aws/core/option_grammar.rb +562 -0
  35. data/lib/aws/core/policy.rb +914 -0
  36. data/lib/aws/core/resource.rb +380 -0
  37. data/lib/aws/core/resource_cache.rb +40 -0
  38. data/lib/aws/core/response.rb +125 -0
  39. data/lib/aws/core/response_cache.rb +50 -0
  40. data/lib/aws/core/service_interface.rb +60 -0
  41. data/lib/aws/core/uri_escape.rb +46 -0
  42. data/lib/aws/core/xml_grammar.rb +926 -0
  43. data/lib/aws/ec2.rb +47 -16
  44. data/lib/aws/ec2/attachment.rb +0 -2
  45. data/lib/aws/ec2/attachment_collection.rb +1 -6
  46. data/lib/aws/ec2/availability_zone.rb +0 -2
  47. data/lib/aws/ec2/availability_zone_collection.rb +0 -3
  48. data/lib/aws/ec2/client.rb +6 -9
  49. data/lib/aws/ec2/client/xml.rb +3 -6
  50. data/lib/aws/ec2/collection.rb +1 -4
  51. data/lib/aws/ec2/config.rb +18 -0
  52. data/lib/aws/ec2/elastic_ip.rb +0 -2
  53. data/lib/aws/ec2/elastic_ip_collection.rb +0 -4
  54. data/lib/aws/ec2/errors.rb +1 -4
  55. data/lib/aws/ec2/has_permissions.rb +0 -2
  56. data/lib/aws/ec2/image.rb +0 -5
  57. data/lib/aws/ec2/image_collection.rb +0 -6
  58. data/lib/aws/ec2/instance.rb +23 -9
  59. data/lib/aws/ec2/instance_collection.rb +85 -22
  60. data/lib/aws/ec2/key_pair.rb +0 -2
  61. data/lib/aws/ec2/key_pair_collection.rb +1 -4
  62. data/lib/aws/ec2/permission_collection.rb +2 -5
  63. data/lib/aws/ec2/region.rb +0 -2
  64. data/lib/aws/ec2/region_collection.rb +0 -4
  65. data/lib/aws/ec2/request.rb +4 -9
  66. data/lib/aws/ec2/reserved_instances.rb +0 -3
  67. data/lib/aws/ec2/reserved_instances_collection.rb +0 -4
  68. data/lib/aws/ec2/reserved_instances_offering.rb +0 -3
  69. data/lib/aws/ec2/reserved_instances_offering_collection.rb +0 -4
  70. data/lib/aws/ec2/resource.rb +3 -5
  71. data/lib/aws/ec2/resource_tag_collection.rb +1 -6
  72. data/lib/aws/ec2/security_group.rb +204 -72
  73. data/lib/aws/ec2/security_group/egress_ip_permission_collection.rb +53 -0
  74. data/lib/aws/ec2/security_group/ip_permission.rb +92 -10
  75. data/lib/aws/ec2/security_group/ip_permission_collection.rb +14 -15
  76. data/lib/aws/ec2/security_group_collection.rb +11 -8
  77. data/lib/aws/ec2/snapshot.rb +0 -4
  78. data/lib/aws/ec2/snapshot_collection.rb +0 -4
  79. data/lib/aws/ec2/tag.rb +0 -3
  80. data/lib/aws/ec2/tag_collection.rb +1 -8
  81. data/lib/aws/ec2/tagged_item.rb +1 -3
  82. data/lib/aws/ec2/volume.rb +0 -6
  83. data/lib/aws/ec2/volume_collection.rb +0 -4
  84. data/lib/aws/errors.rb +0 -3
  85. data/lib/aws/iam.rb +33 -12
  86. data/lib/aws/iam/access_key.rb +0 -3
  87. data/lib/aws/iam/access_key_collection.rb +0 -3
  88. data/lib/aws/iam/account_alias_collection.rb +0 -2
  89. data/lib/aws/iam/client.rb +6 -8
  90. data/lib/aws/iam/client/xml.rb +4 -8
  91. data/lib/aws/iam/collection.rb +2 -5
  92. data/lib/aws/iam/config.rb +18 -0
  93. data/lib/aws/iam/errors.rb +2 -4
  94. data/lib/aws/iam/group.rb +0 -5
  95. data/lib/aws/iam/group_collection.rb +0 -3
  96. data/lib/aws/iam/group_policy_collection.rb +0 -2
  97. data/lib/aws/iam/group_user_collection.rb +1 -4
  98. data/lib/aws/iam/login_profile.rb +0 -2
  99. data/lib/aws/iam/mfa_device.rb +1 -3
  100. data/lib/aws/iam/mfa_device_collection.rb +0 -3
  101. data/lib/aws/iam/policy.rb +2 -4
  102. data/lib/aws/iam/policy_collection.rb +0 -3
  103. data/lib/aws/iam/request.rb +3 -7
  104. data/lib/aws/iam/resource.rb +1 -4
  105. data/lib/aws/iam/server_certificate.rb +0 -2
  106. data/lib/aws/iam/server_certificate_collection.rb +0 -3
  107. data/lib/aws/iam/signing_certificate.rb +0 -2
  108. data/lib/aws/iam/signing_certificate_collection.rb +0 -3
  109. data/lib/aws/iam/user.rb +0 -7
  110. data/lib/aws/iam/user_collection.rb +0 -3
  111. data/lib/aws/iam/user_group_collection.rb +0 -3
  112. data/lib/aws/iam/user_policy.rb +0 -2
  113. data/lib/aws/iam/user_policy_collection.rb +0 -3
  114. data/lib/aws/rails.rb +5 -4
  115. data/lib/aws/record.rb +4 -1
  116. data/lib/aws/record/base.rb +3 -2
  117. data/lib/aws/record/errors.rb +1 -3
  118. data/lib/aws/s3.rb +31 -6
  119. data/lib/aws/s3/access_control_list.rb +0 -2
  120. data/lib/aws/s3/acl_object.rb +10 -12
  121. data/lib/aws/s3/bucket.rb +1 -9
  122. data/lib/aws/s3/bucket_collection.rb +2 -5
  123. data/lib/aws/s3/bucket_version_collection.rb +1 -5
  124. data/lib/aws/s3/client.rb +34 -37
  125. data/lib/aws/s3/client/xml.rb +11 -14
  126. data/lib/aws/{resource_cache.rb → s3/config.rb} +6 -20
  127. data/lib/aws/s3/errors.rb +6 -7
  128. data/lib/aws/s3/multipart_upload.rb +1 -4
  129. data/lib/aws/s3/multipart_upload_collection.rb +1 -6
  130. data/lib/aws/s3/object_collection.rb +1 -5
  131. data/lib/aws/s3/object_metadata.rb +1 -3
  132. data/lib/aws/s3/object_upload_collection.rb +1 -7
  133. data/lib/aws/s3/object_version.rb +1 -4
  134. data/lib/aws/s3/object_version_collection.rb +1 -4
  135. data/lib/aws/s3/policy.rb +3 -5
  136. data/lib/aws/s3/prefix_and_delimiter_collection.rb +0 -2
  137. data/lib/aws/s3/prefixed_collection.rb +0 -2
  138. data/lib/aws/s3/presigned_post.rb +1 -3
  139. data/lib/aws/s3/request.rb +2 -5
  140. data/lib/aws/s3/s3_object.rb +1 -8
  141. data/lib/aws/s3/tree.rb +8 -6
  142. data/lib/aws/s3/tree/branch_node.rb +0 -3
  143. data/lib/aws/s3/tree/child_collection.rb +1 -5
  144. data/lib/aws/s3/tree/leaf_node.rb +0 -5
  145. data/lib/aws/s3/tree/parent.rb +1 -4
  146. data/lib/aws/s3/uploaded_part.rb +1 -3
  147. data/lib/aws/s3/uploaded_part_collection.rb +1 -5
  148. data/lib/aws/simple_db.rb +21 -6
  149. data/lib/aws/simple_db/attribute.rb +1 -6
  150. data/lib/aws/simple_db/attribute_collection.rb +1 -7
  151. data/lib/aws/simple_db/client.rb +7 -9
  152. data/lib/aws/simple_db/client/options.rb +2 -4
  153. data/lib/aws/simple_db/client/xml.rb +5 -10
  154. data/lib/aws/{naming.rb → simple_db/config.rb} +3 -14
  155. data/lib/aws/simple_db/delete_attributes.rb +0 -2
  156. data/lib/aws/simple_db/domain.rb +1 -6
  157. data/lib/aws/simple_db/domain_collection.rb +1 -4
  158. data/lib/aws/simple_db/domain_metadata.rb +1 -3
  159. data/lib/aws/simple_db/errors.rb +1 -4
  160. data/lib/aws/simple_db/item.rb +1 -7
  161. data/lib/aws/simple_db/item_collection.rb +22 -23
  162. data/lib/aws/simple_db/put_attributes.rb +0 -2
  163. data/lib/aws/simple_db/request.rb +3 -7
  164. data/lib/aws/simple_email_service.rb +11 -6
  165. data/lib/aws/simple_email_service/client.rb +7 -9
  166. data/lib/aws/simple_email_service/client/options.rb +3 -6
  167. data/lib/aws/simple_email_service/client/xml.rb +4 -8
  168. data/lib/aws/simple_email_service/config.rb +19 -0
  169. data/lib/aws/simple_email_service/email_address_collection.rb +1 -3
  170. data/lib/aws/simple_email_service/errors.rb +1 -4
  171. data/lib/aws/simple_email_service/quotas.rb +1 -3
  172. data/lib/aws/simple_email_service/request.rb +3 -7
  173. data/lib/aws/sns.rb +15 -8
  174. data/lib/aws/sns/client.rb +7 -8
  175. data/lib/aws/sns/client/options.rb +3 -6
  176. data/lib/aws/sns/client/xml.rb +4 -8
  177. data/lib/aws/sns/config.rb +18 -0
  178. data/lib/aws/sns/errors.rb +1 -4
  179. data/lib/aws/sns/policy.rb +3 -5
  180. data/lib/aws/sns/request.rb +4 -9
  181. data/lib/aws/sns/subscription.rb +1 -5
  182. data/lib/aws/sns/subscription_collection.rb +1 -5
  183. data/lib/aws/sns/topic.rb +1 -6
  184. data/lib/aws/sns/topic_collection.rb +1 -4
  185. data/lib/aws/sns/topic_subscription_collection.rb +1 -4
  186. data/lib/aws/sqs.rb +14 -5
  187. data/lib/aws/sqs/client.rb +6 -9
  188. data/lib/aws/sqs/client/xml.rb +4 -7
  189. data/lib/aws/sqs/config.rb +18 -0
  190. data/lib/aws/sqs/errors.rb +1 -4
  191. data/lib/aws/sqs/policy.rb +3 -5
  192. data/lib/aws/sqs/queue.rb +2 -7
  193. data/lib/aws/sqs/queue_collection.rb +4 -5
  194. data/lib/aws/sqs/received_message.rb +1 -3
  195. data/lib/aws/sqs/received_sns_message.rb +2 -2
  196. data/lib/aws/sqs/request.rb +4 -7
  197. data/lib/aws/sts.rb +12 -6
  198. data/lib/aws/sts/client.rb +6 -8
  199. data/lib/aws/sts/client/xml.rb +4 -8
  200. data/lib/aws/sts/config.rb +18 -0
  201. data/lib/aws/sts/errors.rb +1 -4
  202. data/lib/aws/sts/federated_session.rb +0 -2
  203. data/lib/aws/sts/policy.rb +3 -5
  204. data/lib/aws/sts/request.rb +3 -7
  205. metadata +60 -50
  206. data/lib/aws/async_handle.rb +0 -90
  207. data/lib/aws/authorize_v2.rb +0 -37
  208. data/lib/aws/base_client.rb +0 -488
  209. data/lib/aws/cacheable.rb +0 -79
  210. data/lib/aws/client_logging.rb +0 -122
  211. data/lib/aws/collections.rb +0 -230
  212. data/lib/aws/configuration.rb +0 -357
  213. data/lib/aws/configured_client_methods.rb +0 -81
  214. data/lib/aws/configured_grammars.rb +0 -65
  215. data/lib/aws/default_signer.rb +0 -65
  216. data/lib/aws/http/curb_handler.rb +0 -127
  217. data/lib/aws/http/handler.rb +0 -77
  218. data/lib/aws/http/httparty_handler.rb +0 -103
  219. data/lib/aws/http/request.rb +0 -165
  220. data/lib/aws/http/request_param.rb +0 -64
  221. data/lib/aws/http/response.rb +0 -72
  222. data/lib/aws/indifferent_hash.rb +0 -86
  223. data/lib/aws/inflection.rb +0 -46
  224. data/lib/aws/lazy_error_classes.rb +0 -64
  225. data/lib/aws/meta_utils.rb +0 -43
  226. data/lib/aws/model.rb +0 -57
  227. data/lib/aws/option_grammar.rb +0 -565
  228. data/lib/aws/policy.rb +0 -914
  229. data/lib/aws/resource.rb +0 -381
  230. data/lib/aws/response.rb +0 -125
  231. data/lib/aws/response_cache.rb +0 -50
  232. data/lib/aws/service_interface.rb +0 -60
  233. data/lib/aws/xml_grammar.rb +0 -925
@@ -0,0 +1,64 @@
1
+ # Copyright 2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ require 'set'
15
+
16
+ module AWS
17
+
18
+ @@eager = false
19
+ @@autoloads = {}
20
+
21
+ def self.register_autoloads klass, prefix = nil, &block
22
+ autoloader = Core::Autoloader.new(klass, prefix)
23
+ autoloader.instance_eval(&block)
24
+ autoloader.autoloads.each_pair do |const_name, file_path|
25
+ require(file_path) if @@eager
26
+ @@autoloads["#{klass}::#{const_name}"] = file_path
27
+ end
28
+ end
29
+
30
+ def self.eager_autoload!
31
+ unless @@eager
32
+ @@eager = true
33
+ @@autoloads.values.uniq.each {|file_path| require(file_path) }
34
+ end
35
+ end
36
+
37
+ def self.autoloads
38
+ @@autoloads
39
+ end
40
+
41
+ module Core
42
+
43
+ # @private
44
+ class Autoloader
45
+
46
+ def initialize klass, prefix = nil
47
+ @klass = klass
48
+ @prefix = prefix || klass.name.gsub(/::/, '/').downcase
49
+ @autoloads = {}
50
+ end
51
+
52
+ attr_reader :autoloads
53
+
54
+ def autoload const_name, file_name
55
+ path = "#{@prefix}/#{file_name}"
56
+ @klass.autoload(const_name, path)
57
+ @autoloads[const_name] = path
58
+ end
59
+
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,78 @@
1
+ # Copyright 2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ module Core
16
+
17
+ # @private
18
+ module Cacheable
19
+
20
+ # @private
21
+ class NoData < StandardError; end
22
+
23
+ def self.included base
24
+ base.extend Naming unless base.respond_to?(:service_ruby_name)
25
+ end
26
+
27
+ # @private
28
+ protected
29
+ def local_cache_key
30
+ raise NotImplementedError
31
+ end
32
+
33
+ # @private
34
+ protected
35
+ def cache_key
36
+ @cache_key ||= begin
37
+ endpoint_method = self.class.service_ruby_name + "_endpoint"
38
+ config.signer.access_key_id + ":" +
39
+ config.send(endpoint_method) + ":" +
40
+ self.class.name + ":" +
41
+ local_cache_key
42
+ end
43
+ end
44
+
45
+ # @private
46
+ public
47
+ def retrieve_attribute attr, &block
48
+
49
+ if cache = AWS.response_cache
50
+
51
+ if cache.resource_cache.cached?(cache_key, attr.name)
52
+ return cache.resource_cache.get(cache_key, attr.name)
53
+ end
54
+
55
+ cache.select(*attr.request_types).each do |response|
56
+ if attributes = attributes_from_response(response)
57
+ cache.resource_cache.store(cache_key, attributes)
58
+ return attributes[attr.name] if attributes.key?(attr.name)
59
+ end
60
+ end
61
+
62
+ end
63
+
64
+ response = yield
65
+
66
+ if attributes = attributes_from_response(response)
67
+ if cache = AWS.response_cache
68
+ cache.resource_cache.store(cache_key, attributes)
69
+ end
70
+ attributes[attr.name] if attributes.key?(attr.name)
71
+ else
72
+ raise NoData.new("no data in #{response.request_type} response")
73
+ end
74
+ end
75
+
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,471 @@
1
+ # Copyright 2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ require 'set'
15
+
16
+ module AWS
17
+ module Core
18
+
19
+ # Base class for all of the Amazon AWS service clients.
20
+ # @private
21
+ class Client
22
+
23
+ extend Naming
24
+
25
+ include ClientLogging
26
+
27
+ CACHEABLE_REQUESTS = Set.new
28
+
29
+ # Creates a new low-level client.
30
+ #
31
+ # == Required Options
32
+ #
33
+ # To create a client you must provide access to AWS credentials.
34
+ # There are two options:
35
+ #
36
+ # * +:signer+ -- An object that responds to +access_key_id+
37
+ # (to return the AWS Access Key ID) and to
38
+ # <code>sign(string_to_sign)</code> (to return a signature
39
+ # for a given string). An example implementation is
40
+ # AWS::Core::DefaultSigner. This option is useful if you want to
41
+ # more tightly control access to your secret access key (for
42
+ # example by moving the signature computation into a
43
+ # different process).
44
+ #
45
+ # * +:access_key_id+ and +:secret_access_key+ -- You can use
46
+ # these options to provide the AWS Access Key ID and AWS
47
+ # Secret Access Key directly to the client.
48
+ #
49
+ # == Optional
50
+ #
51
+ # * +:http_handler+ -- Any object that implements a
52
+ # <code>handle(request, response)</code> method; an example
53
+ # is BuiltinHttpHandler. This method is used to perform the
54
+ # HTTP requests that this client constructs.
55
+ #
56
+ def initialize options = {}
57
+
58
+ if options[:endpoint]
59
+ options[:"#{self.class.service_ruby_name}_endpoint"] =
60
+ options.delete(:endpoint)
61
+ end
62
+
63
+ options_without_config = options.dup
64
+ @config = options_without_config.delete(:config)
65
+ @config ||= AWS.config
66
+ @config = @config.with(options_without_config)
67
+ @signer = @config.signer
68
+ @http_handler = @config.http_handler
69
+ @stubs = {}
70
+
71
+ end
72
+
73
+ # @return [Configuration] This clients configuration.
74
+ attr_reader :config
75
+
76
+ # @return [DefaultSigner,Object] Returns the signer for this client.
77
+ # This is normally a DefaultSigner, but it can be configured to
78
+ # an other object.
79
+ attr_reader :signer
80
+
81
+ # @return [String] the configured endpoint for this client.
82
+ def endpoint
83
+ config.send(:"#{self.class.service_ruby_name}_endpoint")
84
+ end
85
+
86
+ # Returns a copy of the client with a different HTTP handler.
87
+ # You can pass an object like BuiltinHttpHandler or you can
88
+ # use a block; for example:
89
+ #
90
+ # s3_with_logging = s3.with_http_handler do |request, response|
91
+ # $stderr.puts request.inspect
92
+ # super
93
+ # end
94
+ #
95
+ # The block executes in the context of an HttpHandler
96
+ # instance, and +super+ delegates to the HTTP handler used by
97
+ # this client. This provides an easy way to spy on requests
98
+ # and responses. See HttpHandler, HttpRequest, and
99
+ # HttpResponse for more details on how to implement a fully
100
+ # functional HTTP handler using a different HTTP library than
101
+ # the one that ships with Ruby.
102
+ # @param handler (nil) A new http handler. Leave blank and pass a
103
+ # block to wrap the current handler with the block.
104
+ # @return [Core::Client] Returns a new instance of the client class with
105
+ # the modified or wrapped http handler.
106
+ def with_http_handler(handler = nil, &blk)
107
+ handler ||= Http::Handler.new(@http_handler, &blk)
108
+ with_options(:http_handler => handler)
109
+ end
110
+
111
+ # @param [Hash] options
112
+ # @see AWS.config detailed list of accepted options.
113
+ def with_options options
114
+ with_config(config.with(options))
115
+ end
116
+
117
+ # @param [Configuration] The configuration object to use.
118
+ # @return [Core::Client] Returns a new client object with the given
119
+ # configuration.
120
+ def with_config config
121
+ self.class.new(:config => config)
122
+ end
123
+
124
+ # The stub returned is memoized.
125
+ # @see new_stub_for
126
+ # @private
127
+ def stub_for method_name
128
+ @stubs[method_name] ||= new_stub_for(method_name)
129
+ end
130
+
131
+ # Primarily used for testing, this method returns an empty psuedo
132
+ # service response without making a request. Its used primarily for
133
+ # testing the ligher level service interfaces.
134
+ # @private
135
+ def new_stub_for method_name
136
+ response = Response.new(Http::Request.new, Http::Response.new)
137
+ response.request_type = method_name
138
+ response.request_options = {}
139
+ send("simulate_#{method_name}_response", response)
140
+ response.signal_success
141
+ response
142
+ end
143
+
144
+ protected
145
+ def new_request
146
+ req = self.class::REQUEST_CLASS.new
147
+ req.http_method = 'POST'
148
+ req.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'
149
+ req.add_param 'Timestamp', Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
150
+ req.add_param 'Version', self.class::API_VERSION
151
+ req
152
+ end
153
+
154
+ protected
155
+ def new_response(*args, &block)
156
+ Response.new(*args, &block)
157
+ end
158
+
159
+ private
160
+ def make_async_request response
161
+
162
+ pauses = async_request_with_retries(response, response.http_request)
163
+
164
+ response
165
+
166
+ end
167
+
168
+ private
169
+ def async_request_with_retries response, http_request, retry_delays = nil
170
+
171
+ response.http_response = Http::Response.new
172
+
173
+ handle = Object.new
174
+ handle.extend AsyncHandle
175
+ handle.on_complete do |status|
176
+ case status
177
+ when :failure
178
+ response.error = StandardError.new("failed to contact the service")
179
+ response.signal_failure
180
+ when :success
181
+ populate_error(response)
182
+ retry_delays ||= sleep_durations(response)
183
+ if should_retry?(response) and !retry_delays.empty?
184
+ response.rebuild_request
185
+ @http_handler.sleep_with_callback(retry_delays.shift) do
186
+ async_request_with_retries(response, response.http_request, retry_delays)
187
+ end
188
+ else
189
+ response.error ?
190
+ response.signal_failure :
191
+ response.signal_success
192
+ end
193
+ end
194
+ end
195
+
196
+ @http_handler.handle_async(http_request, response.http_response, handle)
197
+
198
+ end
199
+
200
+ private
201
+ def make_sync_request response
202
+ retry_server_errors do
203
+
204
+ response.http_response = http_response =
205
+ Http::Response.new
206
+
207
+ @http_handler.handle(response.http_request, http_response)
208
+
209
+ populate_error(response)
210
+ response.signal_success unless response.error
211
+ response
212
+
213
+ end
214
+ end
215
+
216
+ private
217
+ def retry_server_errors &block
218
+
219
+ response = yield
220
+
221
+ sleeps = sleep_durations(response)
222
+ while should_retry?(response)
223
+ break if sleeps.empty?
224
+ Kernel.sleep(sleeps.shift)
225
+
226
+ # rebuild the request to get a fresh signature
227
+ response.rebuild_request
228
+ response = yield
229
+ end
230
+
231
+ response
232
+
233
+ end
234
+
235
+ private
236
+ def sleep_durations response
237
+ factor = scaling_factor(response)
238
+ Array.new(config.max_retries) {|n| (2 ** n) * factor }
239
+ end
240
+
241
+ private
242
+ def scaling_factor response
243
+ response.throttled? ? (0.5 + Kernel.rand * 0.1) : 0.3
244
+ end
245
+
246
+ private
247
+ def should_retry? response
248
+ response.timeout? or
249
+ response.throttled? or
250
+ response.error.kind_of?(Errors::ServerError)
251
+ end
252
+
253
+ private
254
+ def return_or_raise options, &block
255
+ response = yield
256
+ unless options[:async]
257
+ raise response.error if response.error
258
+ end
259
+ response
260
+ end
261
+
262
+ protected
263
+ def populate_error response
264
+
265
+ # clear out a previous error
266
+ response.error = nil
267
+ status = response.http_response.status
268
+ code = nil
269
+ code = xml_error_grammar.parse(response.http_response.body).code if
270
+ xml_error_response?(response)
271
+
272
+
273
+ case
274
+ when response.timeout?
275
+ response.error = Timeout::Error.new
276
+
277
+ when code
278
+ response.error =
279
+ service_module::Errors.error_class(code).new(response.http_request,
280
+ response.http_response)
281
+ when status >= 500
282
+ response.error =
283
+ Errors::ServerError.new(response.http_request, response.http_response)
284
+
285
+ when status >= 300
286
+ response.error =
287
+ Errors::ClientError.new(response.http_request, response.http_response)
288
+ end
289
+
290
+ end
291
+
292
+ protected
293
+ def xml_error_response? response
294
+ response.http_response.status >= 300 and
295
+ response.http_response.body and
296
+ xml_error_grammar.parse(response.http_response.body).respond_to?(:code)
297
+ end
298
+
299
+ protected
300
+ def xml_error_grammar
301
+ if service_module::const_defined?(:Errors) and
302
+ service_module::Errors::const_defined?(:BASE_ERROR_GRAMMAR)
303
+ service_module::Errors::BASE_ERROR_GRAMMAR
304
+ else
305
+ XmlGrammar
306
+ end
307
+ end
308
+
309
+ protected
310
+ def service_module
311
+ AWS.const_get(self.class.to_s[/(\w+)::Client/, 1])
312
+ end
313
+
314
+ private
315
+ def client_request name, options, &block
316
+ return_or_raise(options) do
317
+ log_client_request(name, options) do
318
+
319
+ if config.stub_requests?
320
+
321
+ response = stub_for(name)
322
+ response.http_request = build_request(name, options, &block)
323
+ response.request_options = options
324
+ response
325
+
326
+ else
327
+
328
+ client = self
329
+ response = new_response { client.send(:build_request, name, options, &block) }
330
+ response.request_type = name
331
+ response.request_options = options
332
+
333
+ if self.class::CACHEABLE_REQUESTS.include?(name) and
334
+ cache = AWS.response_cache and
335
+ cached_response = cache.cached(response)
336
+ cached_response.cached = true
337
+ cached_response
338
+ else
339
+ # process the http request
340
+ options[:async] ?
341
+ make_async_request(response) :
342
+ make_sync_request(response)
343
+
344
+ # process the http response
345
+ response.on_success do
346
+ send("process_#{name}_response", response)
347
+ if cache = AWS.response_cache
348
+ cache.add(response)
349
+ end
350
+ end
351
+
352
+ response
353
+
354
+ end
355
+
356
+ end
357
+
358
+ end
359
+ end
360
+ end
361
+
362
+ private
363
+ def build_request(name, options, &block)
364
+ # we dont want to pass the async option to the configure block
365
+ opts = options.dup
366
+ opts.delete(:async)
367
+
368
+ http_request = new_request
369
+
370
+ # configure the http request
371
+ http_request.host = endpoint
372
+ http_request.proxy_uri = config.proxy_uri
373
+ http_request.use_ssl = config.use_ssl?
374
+ http_request.ssl_verify_peer = config.ssl_verify_peer?
375
+ http_request.ssl_ca_file = config.ssl_ca_file
376
+
377
+ send("configure_#{name}_request", http_request, opts, &block)
378
+ http_request.headers["user-agent"] = user_agent_string
379
+ http_request.add_authorization!(signer)
380
+ http_request
381
+ end
382
+
383
+ private
384
+ def user_agent_string
385
+ engine = (RUBY_ENGINE rescue nil or "ruby")
386
+ user_agent = "%s aws-sdk-ruby/#{VERSION} %s/%s %s" %
387
+ [config.user_agent_prefix, engine, RUBY_VERSION, RUBY_PLATFORM]
388
+ user_agent.strip!
389
+ if AWS.memoizing?
390
+ user_agent << " memoizing"
391
+ end
392
+ user_agent
393
+ end
394
+
395
+ private
396
+ def self.add_client_request_method method_name, options = {}, &block
397
+
398
+ method = ClientRequestMethodBuilder.new(self, method_name, &block)
399
+
400
+ if xml_grammar = options[:xml_grammar]
401
+
402
+ method.process_response do |resp|
403
+ xml_grammar.parse(resp.http_response.body, :context => resp)
404
+ super(resp)
405
+ end
406
+
407
+ method.simulate_response do |resp|
408
+ xml_grammar.simulate(resp)
409
+ super(resp)
410
+ end
411
+
412
+ end
413
+
414
+ module_eval <<-END
415
+ def #{method_name}(*args, &block)
416
+ options = args.first ? args.first : {}
417
+ client_request(#{method_name.inspect}, options, &block)
418
+ end
419
+ END
420
+
421
+ end
422
+
423
+ protected
424
+ def self.configure_client
425
+
426
+ module_eval('module Options; end')
427
+ module_eval('module XML; end')
428
+
429
+ end
430
+
431
+ # @private
432
+ class ClientRequestMethodBuilder
433
+
434
+ def initialize client_class, method_name, &block
435
+ @client_class = client_class
436
+ @method_name = method_name
437
+ configure_request {|request, options|}
438
+ process_response {|response|}
439
+ simulate_response {|response|}
440
+ instance_eval(&block)
441
+ end
442
+
443
+ def configure_request options = {}, &block
444
+ name = "configure_#{@method_name}_request"
445
+ MetaUtils.class_extend_method(@client_class, name, &block)
446
+ if block.arity == 3
447
+ m = Module.new
448
+ m.module_eval(<<-END)
449
+ def #{name}(req, options, &block)
450
+ super(req, options, block)
451
+ end
452
+ END
453
+ @client_class.send(:include, m)
454
+ end
455
+ end
456
+
457
+ def process_response &block
458
+ name = "process_#{@method_name}_response"
459
+ MetaUtils.class_extend_method(@client_class, name, &block)
460
+ end
461
+
462
+ def simulate_response &block
463
+ name = "simulate_#{@method_name}_response"
464
+ MetaUtils.class_extend_method(@client_class, name, &block)
465
+ end
466
+
467
+ end
468
+
469
+ end
470
+ end
471
+ end