aws-sdk 1.1.3 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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