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
@@ -1,488 +0,0 @@
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 'aws/errors'
15
- require 'aws/inflection'
16
- require 'aws/naming'
17
- require 'aws/response'
18
- require 'aws/async_handle'
19
- require 'aws/http/handler'
20
- require 'aws/http/request'
21
- require 'aws/http/response'
22
- require 'aws/xml_grammar'
23
- require 'aws/option_grammar'
24
- require 'aws/client_logging'
25
- require 'benchmark'
26
- require 'set'
27
-
28
- module AWS
29
-
30
- # Base class for all of the Amazon AWS service clients.
31
- # @private
32
- class BaseClient
33
-
34
- include ClientLogging
35
-
36
- extend Naming
37
-
38
- CACHEABLE_REQUESTS = Set.new
39
-
40
- # Creates a new low-level client.
41
- #
42
- # == Required Options
43
- #
44
- # To create a client you must provide access to AWS credentials.
45
- # There are two options:
46
- #
47
- # * +:signer+ -- An object that responds to +access_key_id+
48
- # (to return the AWS Access Key ID) and to
49
- # <code>sign(string_to_sign)</code> (to return a signature
50
- # for a given string). An example implementation is
51
- # AWS::DefaultSigner. This option is useful if you want to
52
- # more tightly control access to your secret access key (for
53
- # example by moving the signature computation into a
54
- # different process).
55
- #
56
- # * +:access_key_id+ and +:secret_access_key+ -- You can use
57
- # these options to provide the AWS Access Key ID and AWS
58
- # Secret Access Key directly to the client.
59
- #
60
- # == Optional
61
- #
62
- # * +:http_handler+ -- Any object that implements a
63
- # <code>handle(request, response)</code> method; an example
64
- # is BuiltinHttpHandler. This method is used to perform the
65
- # HTTP requests that this client constructs.
66
- #
67
- def initialize options = {}
68
-
69
- if options[:endpoint]
70
- options[:"#{self.class.service_ruby_name}_endpoint"] =
71
- options.delete(:endpoint)
72
- end
73
-
74
- options_without_config = options.dup
75
- @config = options_without_config.delete(:config)
76
- @config ||= AWS.config
77
- @config = @config.with(options_without_config)
78
- @signer = @config.signer
79
- @http_handler = @config.http_handler
80
- @stubs = {}
81
-
82
- end
83
-
84
- # @return [Configuration] This clients configuration.
85
- attr_reader :config
86
-
87
- # @return [DefaultSigner,Object] Returns the signer for this client.
88
- # This is normally a DefaultSigner, but it can be configured to
89
- # an other object.
90
- attr_reader :signer
91
-
92
- # @return [String] the configured endpoint for this client.
93
- def endpoint
94
- config.send(:"#{self.class.service_ruby_name}_endpoint")
95
- end
96
-
97
- # Returns a copy of the client with a different HTTP handler.
98
- # You can pass an object like BuiltinHttpHandler or you can
99
- # use a block; for example:
100
- #
101
- # s3_with_logging = s3.with_http_handler do |request, response|
102
- # $stderr.puts request.inspect
103
- # super
104
- # end
105
- #
106
- # The block executes in the context of an HttpHandler
107
- # instance, and +super+ delegates to the HTTP handler used by
108
- # this client. This provides an easy way to spy on requests
109
- # and responses. See HttpHandler, HttpRequest, and
110
- # HttpResponse for more details on how to implement a fully
111
- # functional HTTP handler using a different HTTP library than
112
- # the one that ships with Ruby.
113
- # @param handler (nil) A new http handler. Leave blank and pass a
114
- # block to wrap the current handler with the block.
115
- # @return [BaseClient] Returns a new instance of the client class with
116
- # the modified or wrapped http handler.
117
- def with_http_handler(handler = nil, &blk)
118
- handler ||= Http::Handler.new(@http_handler, &blk)
119
- with_options(:http_handler => handler)
120
- end
121
-
122
- # @param [Hash] options
123
- # @see AWS.config detailed list of accepted options.
124
- def with_options options
125
- with_config(config.with(options))
126
- end
127
-
128
- # @param [Configuration] The configuration object to use.
129
- # @return [BaseClient] Returns a new client object with the given
130
- # configuration.
131
- def with_config config
132
- self.class.new(:config => config)
133
- end
134
-
135
- # The stub returned is memoized.
136
- # @see new_stub_for
137
- # @private
138
- def stub_for method_name
139
- @stubs[method_name] ||= new_stub_for(method_name)
140
- end
141
-
142
- # Primarily used for testing, this method returns an empty psuedo
143
- # service response without making a request. Its used primarily for
144
- # testing the ligher level service interfaces.
145
- # @private
146
- def new_stub_for method_name
147
- response = Response.new(Http::Request.new, Http::Response.new)
148
- response.request_type = method_name
149
- response.request_options = {}
150
- send("simulate_#{method_name}_response", response)
151
- response.signal_success
152
- response
153
- end
154
-
155
- protected
156
- def new_request
157
- req = self.class::REQUEST_CLASS.new
158
- req.http_method = 'POST'
159
- req.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'
160
- req.add_param 'Timestamp', Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
161
- req.add_param 'Version', self.class::API_VERSION
162
- req
163
- end
164
-
165
- protected
166
- def new_response(*args, &block)
167
- Response.new(*args, &block)
168
- end
169
-
170
- private
171
- def make_async_request response
172
-
173
- pauses = async_request_with_retries(response, response.http_request)
174
-
175
- response
176
-
177
- end
178
-
179
- private
180
- def async_request_with_retries response, http_request, retry_delays = nil
181
-
182
- response.http_response = AWS::Http::Response.new
183
-
184
- handle = Object.new
185
- handle.extend AsyncHandle
186
- handle.on_complete do |status|
187
- case status
188
- when :failure
189
- response.error = StandardError.new("failed to contact the service")
190
- response.signal_failure
191
- when :success
192
- populate_error(response)
193
- retry_delays ||= sleep_durations(response)
194
- if should_retry?(response) and !retry_delays.empty?
195
- response.rebuild_request
196
- @http_handler.sleep_with_callback(retry_delays.shift) do
197
- async_request_with_retries(response, response.http_request, retry_delays)
198
- end
199
- else
200
- response.error ?
201
- response.signal_failure :
202
- response.signal_success
203
- end
204
- end
205
- end
206
-
207
- @http_handler.handle_async(http_request, response.http_response, handle)
208
-
209
- end
210
-
211
- private
212
- def make_sync_request response
213
- retry_server_errors do
214
-
215
- response.http_response = http_response =
216
- AWS::Http::Response.new
217
-
218
- @http_handler.handle(response.http_request, http_response)
219
-
220
- populate_error(response)
221
- response.signal_success unless response.error
222
- response
223
-
224
- end
225
- end
226
-
227
- private
228
- def retry_server_errors &block
229
-
230
- response = yield
231
-
232
- sleeps = sleep_durations(response)
233
- while should_retry?(response)
234
- break if sleeps.empty?
235
- Kernel.sleep(sleeps.shift)
236
-
237
- # rebuild the request to get a fresh signature
238
- response.rebuild_request
239
- response = yield
240
- end
241
-
242
- response
243
-
244
- end
245
-
246
- private
247
- def sleep_durations response
248
- factor = scaling_factor(response)
249
- Array.new(config.max_retries) {|n| (2 ** n) * factor }
250
- end
251
-
252
- private
253
- def scaling_factor response
254
- response.throttled? ? (0.5 + Kernel.rand * 0.1) : 0.3
255
- end
256
-
257
- private
258
- def should_retry? response
259
- response.timeout? or
260
- response.throttled? or
261
- response.error.kind_of?(Errors::ServerError)
262
- end
263
-
264
- private
265
- def return_or_raise options, &block
266
- response = yield
267
- unless options[:async]
268
- raise response.error if response.error
269
- end
270
- response
271
- end
272
-
273
- protected
274
- def populate_error response
275
-
276
- # clear out a previous error
277
- response.error = nil
278
- status = response.http_response.status
279
- code = nil
280
- code = xml_error_grammar.parse(response.http_response.body).code if
281
- xml_error_response?(response)
282
-
283
-
284
- case
285
- when response.timeout?
286
- response.error = Timeout::Error.new
287
-
288
- when code
289
- response.error =
290
- service_module::Errors.error_class(code).new(response.http_request,
291
- response.http_response)
292
- when status >= 500
293
- response.error =
294
- Errors::ServerError.new(response.http_request, response.http_response)
295
-
296
- when status >= 300
297
- response.error =
298
- Errors::ClientError.new(response.http_request, response.http_response)
299
- end
300
-
301
- end
302
-
303
- protected
304
- def xml_error_response? response
305
- response.http_response.status >= 300 and
306
- response.http_response.body and
307
- xml_error_grammar.parse(response.http_response.body).respond_to?(:code)
308
- end
309
-
310
- protected
311
- def xml_error_grammar
312
- if service_module::const_defined?(:Errors) and
313
- service_module::Errors::const_defined?(:BASE_ERROR_GRAMMAR)
314
- service_module::Errors::BASE_ERROR_GRAMMAR
315
- else
316
- XmlGrammar
317
- end
318
- end
319
-
320
- protected
321
- def service_module
322
- AWS.const_get(self.class.to_s[/(\w+)::Client/, 1])
323
- end
324
-
325
- private
326
- def client_request name, options, &block
327
- return_or_raise(options) do
328
- log_client_request(name, options) do
329
-
330
- if config.stub_requests?
331
-
332
- response = stub_for(name)
333
- response.http_request = build_request(name, options, &block)
334
- response.request_options = options
335
- response
336
-
337
- else
338
-
339
- client = self
340
- response = new_response { client.send(:build_request, name, options, &block) }
341
- response.request_type = name
342
- response.request_options = options
343
-
344
- if self.class::CACHEABLE_REQUESTS.include?(name) and
345
- cache = AWS.response_cache and
346
- cached_response = cache.cached(response)
347
- cached_response.cached = true
348
- cached_response
349
- else
350
- # process the http request
351
- options[:async] ?
352
- make_async_request(response) :
353
- make_sync_request(response)
354
-
355
- # process the http response
356
- response.on_success do
357
- send("process_#{name}_response", response)
358
- if cache = AWS.response_cache
359
- cache.add(response)
360
- end
361
- end
362
-
363
- response
364
-
365
- end
366
-
367
- end
368
-
369
- end
370
- end
371
- end
372
-
373
- private
374
- def build_request(name, options, &block)
375
- # we dont want to pass the async option to the configure block
376
- opts = options.dup
377
- opts.delete(:async)
378
-
379
- http_request = new_request
380
-
381
- # configure the http request
382
- http_request.host = endpoint
383
- http_request.proxy_uri = config.proxy_uri
384
- http_request.use_ssl = config.use_ssl?
385
- http_request.ssl_verify_peer = config.ssl_verify_peer?
386
- http_request.ssl_ca_file = config.ssl_ca_file
387
-
388
- send("configure_#{name}_request", http_request, opts, &block)
389
- http_request.headers["user-agent"] = user_agent_string
390
- http_request.add_authorization!(signer)
391
- http_request
392
- end
393
-
394
- private
395
- def user_agent_string
396
- engine = (RUBY_ENGINE rescue nil or "ruby")
397
- user_agent = "%s aws-sdk-ruby/#{VERSION} %s/%s %s" %
398
- [config.user_agent_prefix, engine, RUBY_VERSION, RUBY_PLATFORM]
399
- user_agent.strip!
400
- if AWS.memoizing?
401
- user_agent << " memoizing"
402
- end
403
- user_agent
404
- end
405
-
406
- private
407
- def self.add_client_request_method method_name, options = {}, &block
408
-
409
- method = ClientRequestMethodBuilder.new(self, method_name, &block)
410
-
411
- if xml_grammar = options[:xml_grammar]
412
-
413
- method.process_response do |resp|
414
- xml_grammar.parse(resp.http_response.body, :context => resp)
415
- super(resp)
416
- end
417
-
418
- method.simulate_response do |resp|
419
- xml_grammar.simulate(resp)
420
- super(resp)
421
- end
422
-
423
- end
424
-
425
- module_eval <<-END
426
- def #{method_name}(*args, &block)
427
- options = args.first ? args.first : {}
428
- client_request(#{method_name.inspect}, options, &block)
429
- end
430
- END
431
-
432
- end
433
-
434
- protected
435
- def self.configure_client
436
-
437
- module_eval('module Options; end')
438
- module_eval('module XML; end')
439
-
440
- name = :"#{service_ruby_name}_client"
441
- needs = [:signer, :http_handler, "#{service_ruby_name}_endpoint"]
442
- create_block = lambda {|config| new(:config => config) }
443
-
444
- Configuration.add_option_with_needs(name, needs, &create_block)
445
-
446
- end
447
-
448
- # @private
449
- class ClientRequestMethodBuilder
450
-
451
- def initialize client_class, method_name, &block
452
- @client_class = client_class
453
- @method_name = method_name
454
- configure_request {|request, options|}
455
- process_response {|response|}
456
- simulate_response {|response|}
457
- instance_eval(&block)
458
- end
459
-
460
- def configure_request options = {}, &block
461
- name = "configure_#{@method_name}_request"
462
- MetaUtils.class_extend_method(@client_class, name, &block)
463
-
464
- if block.arity == 3
465
- m = Module.new
466
- m.module_eval(<<-END)
467
- def #{name}(req, options, &block)
468
- super(req, options, block)
469
- end
470
- END
471
- @client_class.send(:include, m)
472
- end
473
- end
474
-
475
- def process_response &block
476
- name = "process_#{@method_name}_response"
477
- MetaUtils.class_extend_method(@client_class, name, &block)
478
- end
479
-
480
- def simulate_response &block
481
- name = "simulate_#{@method_name}_response"
482
- MetaUtils.class_extend_method(@client_class, name, &block)
483
- end
484
-
485
- end
486
-
487
- end
488
- end