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
@@ -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