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.
- data/ca-bundle.crt +2 -348
- data/lib/aws.rb +24 -49
- data/lib/aws/{common.rb → core.rb} +120 -9
- data/lib/aws/{api_config.rb → core/api_config.rb} +19 -20
- data/lib/aws/core/api_config_transform.rb +36 -0
- data/lib/aws/core/async_handle.rb +91 -0
- data/lib/aws/core/authorize_v2.rb +39 -0
- data/lib/aws/{authorize_v3.rb → core/authorize_v3.rb} +16 -15
- data/lib/aws/{api_config_transform.rb → core/authorize_with_session_token.rb} +9 -12
- data/lib/aws/core/autoloader.rb +64 -0
- data/lib/aws/core/cacheable.rb +78 -0
- data/lib/aws/core/client.rb +471 -0
- data/lib/aws/core/client_logging.rb +125 -0
- data/lib/aws/core/collections.rb +229 -0
- data/lib/aws/core/configuration.rb +358 -0
- data/lib/aws/core/configured_client_methods.rb +76 -0
- data/lib/aws/core/configured_grammars.rb +63 -0
- data/lib/aws/{configured_option_grammars.rb → core/configured_option_grammars.rb} +18 -20
- data/lib/aws/{configured_xml_grammars.rb → core/configured_xml_grammars.rb} +19 -21
- data/lib/aws/core/default_signer.rb +67 -0
- data/lib/aws/core/http/curb_handler.rb +129 -0
- data/lib/aws/core/http/handler.rb +77 -0
- data/lib/aws/core/http/httparty_handler.rb +113 -0
- data/lib/aws/core/http/net_http_handler.rb +124 -0
- data/lib/aws/core/http/request.rb +207 -0
- data/lib/aws/core/http/response.rb +73 -0
- data/lib/aws/{ignore_result_element.rb → core/ignore_result_element.rb} +14 -18
- data/lib/aws/core/indifferent_hash.rb +88 -0
- data/lib/aws/core/inflection.rb +47 -0
- data/lib/aws/core/lazy_error_classes.rb +62 -0
- data/lib/aws/{uri_escape.rb → core/meta_utils.rb} +24 -23
- data/lib/aws/core/model.rb +57 -0
- data/lib/aws/{authorize_with_session_token.rb → core/naming.rb} +9 -8
- data/lib/aws/core/option_grammar.rb +562 -0
- data/lib/aws/core/policy.rb +914 -0
- data/lib/aws/core/resource.rb +380 -0
- data/lib/aws/core/resource_cache.rb +40 -0
- data/lib/aws/core/response.rb +125 -0
- data/lib/aws/core/response_cache.rb +50 -0
- data/lib/aws/core/service_interface.rb +60 -0
- data/lib/aws/core/uri_escape.rb +46 -0
- data/lib/aws/core/xml_grammar.rb +926 -0
- data/lib/aws/ec2.rb +47 -16
- data/lib/aws/ec2/attachment.rb +0 -2
- data/lib/aws/ec2/attachment_collection.rb +1 -6
- data/lib/aws/ec2/availability_zone.rb +0 -2
- data/lib/aws/ec2/availability_zone_collection.rb +0 -3
- data/lib/aws/ec2/client.rb +6 -9
- data/lib/aws/ec2/client/xml.rb +3 -6
- data/lib/aws/ec2/collection.rb +1 -4
- data/lib/aws/ec2/config.rb +18 -0
- data/lib/aws/ec2/elastic_ip.rb +0 -2
- data/lib/aws/ec2/elastic_ip_collection.rb +0 -4
- data/lib/aws/ec2/errors.rb +1 -4
- data/lib/aws/ec2/has_permissions.rb +0 -2
- data/lib/aws/ec2/image.rb +0 -5
- data/lib/aws/ec2/image_collection.rb +0 -6
- data/lib/aws/ec2/instance.rb +23 -9
- data/lib/aws/ec2/instance_collection.rb +85 -22
- data/lib/aws/ec2/key_pair.rb +0 -2
- data/lib/aws/ec2/key_pair_collection.rb +1 -4
- data/lib/aws/ec2/permission_collection.rb +2 -5
- data/lib/aws/ec2/region.rb +0 -2
- data/lib/aws/ec2/region_collection.rb +0 -4
- data/lib/aws/ec2/request.rb +4 -9
- data/lib/aws/ec2/reserved_instances.rb +0 -3
- data/lib/aws/ec2/reserved_instances_collection.rb +0 -4
- data/lib/aws/ec2/reserved_instances_offering.rb +0 -3
- data/lib/aws/ec2/reserved_instances_offering_collection.rb +0 -4
- data/lib/aws/ec2/resource.rb +3 -5
- data/lib/aws/ec2/resource_tag_collection.rb +1 -6
- data/lib/aws/ec2/security_group.rb +204 -72
- data/lib/aws/ec2/security_group/egress_ip_permission_collection.rb +53 -0
- data/lib/aws/ec2/security_group/ip_permission.rb +92 -10
- data/lib/aws/ec2/security_group/ip_permission_collection.rb +14 -15
- data/lib/aws/ec2/security_group_collection.rb +11 -8
- data/lib/aws/ec2/snapshot.rb +0 -4
- data/lib/aws/ec2/snapshot_collection.rb +0 -4
- data/lib/aws/ec2/tag.rb +0 -3
- data/lib/aws/ec2/tag_collection.rb +1 -8
- data/lib/aws/ec2/tagged_item.rb +1 -3
- data/lib/aws/ec2/volume.rb +0 -6
- data/lib/aws/ec2/volume_collection.rb +0 -4
- data/lib/aws/errors.rb +0 -3
- data/lib/aws/iam.rb +33 -12
- data/lib/aws/iam/access_key.rb +0 -3
- data/lib/aws/iam/access_key_collection.rb +0 -3
- data/lib/aws/iam/account_alias_collection.rb +0 -2
- data/lib/aws/iam/client.rb +6 -8
- data/lib/aws/iam/client/xml.rb +4 -8
- data/lib/aws/iam/collection.rb +2 -5
- data/lib/aws/iam/config.rb +18 -0
- data/lib/aws/iam/errors.rb +2 -4
- data/lib/aws/iam/group.rb +0 -5
- data/lib/aws/iam/group_collection.rb +0 -3
- data/lib/aws/iam/group_policy_collection.rb +0 -2
- data/lib/aws/iam/group_user_collection.rb +1 -4
- data/lib/aws/iam/login_profile.rb +0 -2
- data/lib/aws/iam/mfa_device.rb +1 -3
- data/lib/aws/iam/mfa_device_collection.rb +0 -3
- data/lib/aws/iam/policy.rb +2 -4
- data/lib/aws/iam/policy_collection.rb +0 -3
- data/lib/aws/iam/request.rb +3 -7
- data/lib/aws/iam/resource.rb +1 -4
- data/lib/aws/iam/server_certificate.rb +0 -2
- data/lib/aws/iam/server_certificate_collection.rb +0 -3
- data/lib/aws/iam/signing_certificate.rb +0 -2
- data/lib/aws/iam/signing_certificate_collection.rb +0 -3
- data/lib/aws/iam/user.rb +0 -7
- data/lib/aws/iam/user_collection.rb +0 -3
- data/lib/aws/iam/user_group_collection.rb +0 -3
- data/lib/aws/iam/user_policy.rb +0 -2
- data/lib/aws/iam/user_policy_collection.rb +0 -3
- data/lib/aws/rails.rb +5 -4
- data/lib/aws/record.rb +4 -1
- data/lib/aws/record/base.rb +3 -2
- data/lib/aws/record/errors.rb +1 -3
- data/lib/aws/s3.rb +31 -6
- data/lib/aws/s3/access_control_list.rb +0 -2
- data/lib/aws/s3/acl_object.rb +10 -12
- data/lib/aws/s3/bucket.rb +1 -9
- data/lib/aws/s3/bucket_collection.rb +2 -5
- data/lib/aws/s3/bucket_version_collection.rb +1 -5
- data/lib/aws/s3/client.rb +34 -37
- data/lib/aws/s3/client/xml.rb +11 -14
- data/lib/aws/{resource_cache.rb → s3/config.rb} +6 -20
- data/lib/aws/s3/errors.rb +6 -7
- data/lib/aws/s3/multipart_upload.rb +1 -4
- data/lib/aws/s3/multipart_upload_collection.rb +1 -6
- data/lib/aws/s3/object_collection.rb +1 -5
- data/lib/aws/s3/object_metadata.rb +1 -3
- data/lib/aws/s3/object_upload_collection.rb +1 -7
- data/lib/aws/s3/object_version.rb +1 -4
- data/lib/aws/s3/object_version_collection.rb +1 -4
- data/lib/aws/s3/policy.rb +3 -5
- data/lib/aws/s3/prefix_and_delimiter_collection.rb +0 -2
- data/lib/aws/s3/prefixed_collection.rb +0 -2
- data/lib/aws/s3/presigned_post.rb +1 -3
- data/lib/aws/s3/request.rb +2 -5
- data/lib/aws/s3/s3_object.rb +1 -8
- data/lib/aws/s3/tree.rb +8 -6
- data/lib/aws/s3/tree/branch_node.rb +0 -3
- data/lib/aws/s3/tree/child_collection.rb +1 -5
- data/lib/aws/s3/tree/leaf_node.rb +0 -5
- data/lib/aws/s3/tree/parent.rb +1 -4
- data/lib/aws/s3/uploaded_part.rb +1 -3
- data/lib/aws/s3/uploaded_part_collection.rb +1 -5
- data/lib/aws/simple_db.rb +21 -6
- data/lib/aws/simple_db/attribute.rb +1 -6
- data/lib/aws/simple_db/attribute_collection.rb +1 -7
- data/lib/aws/simple_db/client.rb +7 -9
- data/lib/aws/simple_db/client/options.rb +2 -4
- data/lib/aws/simple_db/client/xml.rb +5 -10
- data/lib/aws/{naming.rb → simple_db/config.rb} +3 -14
- data/lib/aws/simple_db/delete_attributes.rb +0 -2
- data/lib/aws/simple_db/domain.rb +1 -6
- data/lib/aws/simple_db/domain_collection.rb +1 -4
- data/lib/aws/simple_db/domain_metadata.rb +1 -3
- data/lib/aws/simple_db/errors.rb +1 -4
- data/lib/aws/simple_db/item.rb +1 -7
- data/lib/aws/simple_db/item_collection.rb +22 -23
- data/lib/aws/simple_db/put_attributes.rb +0 -2
- data/lib/aws/simple_db/request.rb +3 -7
- data/lib/aws/simple_email_service.rb +11 -6
- data/lib/aws/simple_email_service/client.rb +7 -9
- data/lib/aws/simple_email_service/client/options.rb +3 -6
- data/lib/aws/simple_email_service/client/xml.rb +4 -8
- data/lib/aws/simple_email_service/config.rb +19 -0
- data/lib/aws/simple_email_service/email_address_collection.rb +1 -3
- data/lib/aws/simple_email_service/errors.rb +1 -4
- data/lib/aws/simple_email_service/quotas.rb +1 -3
- data/lib/aws/simple_email_service/request.rb +3 -7
- data/lib/aws/sns.rb +15 -8
- data/lib/aws/sns/client.rb +7 -8
- data/lib/aws/sns/client/options.rb +3 -6
- data/lib/aws/sns/client/xml.rb +4 -8
- data/lib/aws/sns/config.rb +18 -0
- data/lib/aws/sns/errors.rb +1 -4
- data/lib/aws/sns/policy.rb +3 -5
- data/lib/aws/sns/request.rb +4 -9
- data/lib/aws/sns/subscription.rb +1 -5
- data/lib/aws/sns/subscription_collection.rb +1 -5
- data/lib/aws/sns/topic.rb +1 -6
- data/lib/aws/sns/topic_collection.rb +1 -4
- data/lib/aws/sns/topic_subscription_collection.rb +1 -4
- data/lib/aws/sqs.rb +14 -5
- data/lib/aws/sqs/client.rb +6 -9
- data/lib/aws/sqs/client/xml.rb +4 -7
- data/lib/aws/sqs/config.rb +18 -0
- data/lib/aws/sqs/errors.rb +1 -4
- data/lib/aws/sqs/policy.rb +3 -5
- data/lib/aws/sqs/queue.rb +2 -7
- data/lib/aws/sqs/queue_collection.rb +4 -5
- data/lib/aws/sqs/received_message.rb +1 -3
- data/lib/aws/sqs/received_sns_message.rb +2 -2
- data/lib/aws/sqs/request.rb +4 -7
- data/lib/aws/sts.rb +12 -6
- data/lib/aws/sts/client.rb +6 -8
- data/lib/aws/sts/client/xml.rb +4 -8
- data/lib/aws/sts/config.rb +18 -0
- data/lib/aws/sts/errors.rb +1 -4
- data/lib/aws/sts/federated_session.rb +0 -2
- data/lib/aws/sts/policy.rb +3 -5
- data/lib/aws/sts/request.rb +3 -7
- metadata +60 -50
- data/lib/aws/async_handle.rb +0 -90
- data/lib/aws/authorize_v2.rb +0 -37
- data/lib/aws/base_client.rb +0 -488
- data/lib/aws/cacheable.rb +0 -79
- data/lib/aws/client_logging.rb +0 -122
- data/lib/aws/collections.rb +0 -230
- data/lib/aws/configuration.rb +0 -357
- data/lib/aws/configured_client_methods.rb +0 -81
- data/lib/aws/configured_grammars.rb +0 -65
- data/lib/aws/default_signer.rb +0 -65
- data/lib/aws/http/curb_handler.rb +0 -127
- data/lib/aws/http/handler.rb +0 -77
- data/lib/aws/http/httparty_handler.rb +0 -103
- data/lib/aws/http/request.rb +0 -165
- data/lib/aws/http/request_param.rb +0 -64
- data/lib/aws/http/response.rb +0 -72
- data/lib/aws/indifferent_hash.rb +0 -86
- data/lib/aws/inflection.rb +0 -46
- data/lib/aws/lazy_error_classes.rb +0 -64
- data/lib/aws/meta_utils.rb +0 -43
- data/lib/aws/model.rb +0 -57
- data/lib/aws/option_grammar.rb +0 -565
- data/lib/aws/policy.rb +0 -914
- data/lib/aws/resource.rb +0 -381
- data/lib/aws/response.rb +0 -125
- data/lib/aws/response_cache.rb +0 -50
- data/lib/aws/service_interface.rb +0 -60
- data/lib/aws/xml_grammar.rb +0 -925
|
@@ -0,0 +1,77 @@
|
|
|
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
|
+
module Http
|
|
17
|
+
|
|
18
|
+
# @private
|
|
19
|
+
class Handler
|
|
20
|
+
|
|
21
|
+
attr_reader :base
|
|
22
|
+
|
|
23
|
+
def initialize(base, &block)
|
|
24
|
+
@base = base
|
|
25
|
+
if base.respond_to?(:handle)
|
|
26
|
+
|
|
27
|
+
unless block.arity == 2
|
|
28
|
+
raise ArgumentError, 'passed block must accept 2 arguments'
|
|
29
|
+
end
|
|
30
|
+
MetaUtils.extend_method(self, :handle, &block)
|
|
31
|
+
|
|
32
|
+
elsif base.respond_to?(:handle_async)
|
|
33
|
+
|
|
34
|
+
unless block.arity == 3
|
|
35
|
+
raise ArgumentError, 'passed block must accept 3 arguments'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
MetaUtils.extend_method(self, :handle_async) do |req, resp, handle|
|
|
39
|
+
@base.handle_async(req, resp, handle)
|
|
40
|
+
end
|
|
41
|
+
MetaUtils.extend(self) do
|
|
42
|
+
define_method(:handle) do |req, resp|
|
|
43
|
+
raise "attempted to call #handle on an async handler"
|
|
44
|
+
end
|
|
45
|
+
define_method(:handle_async, &block)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
else
|
|
49
|
+
raise ArgumentError, 'base must respond to #handle or #handle_async'
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def handle(request, http_response)
|
|
54
|
+
@base.handle(request, http_response)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def handle_async(request, http_response, handle)
|
|
58
|
+
Thread.new do
|
|
59
|
+
begin
|
|
60
|
+
self.handle(request, http_response)
|
|
61
|
+
rescue => e
|
|
62
|
+
handle.signal_failure
|
|
63
|
+
else
|
|
64
|
+
handle.signal_success
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def sleep_with_callback seconds, &block
|
|
70
|
+
Kernel.sleep(seconds)
|
|
71
|
+
yield
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
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 'httparty'
|
|
15
|
+
|
|
16
|
+
module AWS
|
|
17
|
+
module Core
|
|
18
|
+
module Http
|
|
19
|
+
|
|
20
|
+
# Makes HTTP requests using HTTParty. This is the default
|
|
21
|
+
# handler, so you don't need to do anything special to configure
|
|
22
|
+
# it. However, you can directly instantiate this class in order
|
|
23
|
+
# to send extra options to HTTParty, for example to enable an HTTP
|
|
24
|
+
# proxy:
|
|
25
|
+
#
|
|
26
|
+
# AWS.config(
|
|
27
|
+
# :http_handler => AWS::Http::HTTPartyHandler.new(
|
|
28
|
+
# :http_proxyaddr => "http://myproxy.com",
|
|
29
|
+
# :http_proxyport => 80
|
|
30
|
+
# )
|
|
31
|
+
# )
|
|
32
|
+
#
|
|
33
|
+
class HTTPartyHandler
|
|
34
|
+
|
|
35
|
+
# @return [Hash] The default options to send to HTTParty on each
|
|
36
|
+
# request.
|
|
37
|
+
attr_reader :default_request_options
|
|
38
|
+
|
|
39
|
+
# Constructs a new HTTP handler using HTTParty.
|
|
40
|
+
#
|
|
41
|
+
# @param [Hash] options Default options to send to HTTParty on
|
|
42
|
+
# each request. These options will be sent to +get+, +post+,
|
|
43
|
+
# +head+, +put+, or +delete+ when a request is made. Note
|
|
44
|
+
# that +:body+, +:headers+, +:parser+, and +:ssl_ca_file+ are
|
|
45
|
+
# ignored. If you need to set the CA file, you should use the
|
|
46
|
+
# +:ssl_ca_file+ option to {AWS.config} or
|
|
47
|
+
# {AWS::Configuration} instead.
|
|
48
|
+
def initialize options = {}
|
|
49
|
+
@default_request_options = options
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
include HTTParty
|
|
53
|
+
|
|
54
|
+
class NoOpParser < HTTParty::Parser
|
|
55
|
+
SupportedFormats = {}
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def handle(request, response)
|
|
59
|
+
|
|
60
|
+
opts = default_request_options.merge({
|
|
61
|
+
:body => request.body,
|
|
62
|
+
:parser => NoOpParser
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
if request.proxy_uri
|
|
66
|
+
opts[:http_proxyaddr] = request.proxy_uri.host
|
|
67
|
+
opts[:http_proxyport] = request.proxy_uri.port
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
if request.use_ssl?
|
|
71
|
+
url = "https://#{request.host}:443#{request.uri}"
|
|
72
|
+
opts[:ssl_ca_file] = request.ssl_ca_file if
|
|
73
|
+
request.ssl_verify_peer?
|
|
74
|
+
else
|
|
75
|
+
url = "http://#{request.host}#{request.uri}"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# get, post, put, delete, head
|
|
79
|
+
method = request.http_method.downcase
|
|
80
|
+
|
|
81
|
+
# Net::HTTP adds this header for us when the body is
|
|
82
|
+
# provided, but it messes up signing
|
|
83
|
+
headers = { 'content-type' => '' }
|
|
84
|
+
|
|
85
|
+
# headers must have string values (net http calls .strip on them)
|
|
86
|
+
request.headers.each_pair do |key,value|
|
|
87
|
+
headers[key] = value.to_s
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
opts[:headers] = headers
|
|
91
|
+
|
|
92
|
+
begin
|
|
93
|
+
http_response = self.class.send(method, url, opts)
|
|
94
|
+
rescue Timeout::Error, Errno::ETIMEDOUT => e
|
|
95
|
+
response.timeout = true
|
|
96
|
+
else
|
|
97
|
+
response.body = http_response.body
|
|
98
|
+
response.status = http_response.code.to_i
|
|
99
|
+
response.headers = http_response.to_hash
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# We move this from AWS::Http to AWS::Core::Http, but we want the
|
|
107
|
+
# previous default handler to remain accessible from its old namesapce
|
|
108
|
+
# @private
|
|
109
|
+
module Http
|
|
110
|
+
class HTTPartyHandler < Core::Http::HTTPartyHandler; end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
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 'net/http'
|
|
15
|
+
require 'net/https'
|
|
16
|
+
require 'openssl'
|
|
17
|
+
|
|
18
|
+
module AWS
|
|
19
|
+
module Core
|
|
20
|
+
module Http
|
|
21
|
+
|
|
22
|
+
# The default http request handler for the aws-sdk gem. It is based
|
|
23
|
+
# on Net::Http.
|
|
24
|
+
class NetHttpHandler
|
|
25
|
+
|
|
26
|
+
def handle request, response
|
|
27
|
+
http_session_for(request) do |http|
|
|
28
|
+
begin
|
|
29
|
+
http_resp = http.request(build_request(request))
|
|
30
|
+
response.body = http_resp.body
|
|
31
|
+
response.status = http_resp.code.to_i
|
|
32
|
+
response.headers = http_resp.to_hash
|
|
33
|
+
rescue Timeout::Error, Errno::ETIMEDOUT => e
|
|
34
|
+
response.timeout = true
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @private
|
|
40
|
+
protected
|
|
41
|
+
def http_session_for request, &block
|
|
42
|
+
begin
|
|
43
|
+
http = build_http(request)
|
|
44
|
+
http.start
|
|
45
|
+
yield(http)
|
|
46
|
+
ensure
|
|
47
|
+
http.finish if http.started?
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# @private
|
|
52
|
+
protected
|
|
53
|
+
def build_http request
|
|
54
|
+
|
|
55
|
+
http_args = []
|
|
56
|
+
http_args << request.host
|
|
57
|
+
http_args << (request.use_ssl? ? 443 : 80)
|
|
58
|
+
|
|
59
|
+
## add proxy arguments
|
|
60
|
+
|
|
61
|
+
if proxy = request.proxy_uri
|
|
62
|
+
proxy_addr = proxy.respond_to?(:request_uri) ?
|
|
63
|
+
"#{proxy.host}#{proxy.request_uri}" : proxy.host
|
|
64
|
+
http_args << proxy_addr
|
|
65
|
+
http_args << proxy.port
|
|
66
|
+
http_args << proxy.user
|
|
67
|
+
http_args << proxy.password
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# ruby 1.8.7 does not accept a hash of options at the end of
|
|
71
|
+
# Net::HTTP.new like 1.9 does, therefore we have to set ssl
|
|
72
|
+
# options on the returned http object
|
|
73
|
+
http = Net::HTTP.new(*http_args)
|
|
74
|
+
|
|
75
|
+
## configure ssl
|
|
76
|
+
|
|
77
|
+
if request.use_ssl?
|
|
78
|
+
http.use_ssl = true
|
|
79
|
+
if request.ssl_verify_peer?
|
|
80
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
|
81
|
+
http.ca_file = request.ssl_ca_file
|
|
82
|
+
else
|
|
83
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
84
|
+
end
|
|
85
|
+
else
|
|
86
|
+
http.use_ssl = false
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
http
|
|
90
|
+
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# @private
|
|
94
|
+
protected
|
|
95
|
+
def build_request request
|
|
96
|
+
|
|
97
|
+
# Net::HTTP adds a content-type header automatically unless its set
|
|
98
|
+
# and this messes with request signature signing. Also, it expects
|
|
99
|
+
# all header values to be strings (it call strip on them).
|
|
100
|
+
headers = { 'content-type' => '' }
|
|
101
|
+
request.headers.each_pair do |key,value|
|
|
102
|
+
headers[key] = value.to_s
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
req_class = case request.http_method
|
|
106
|
+
when 'GET' then Net::HTTP::Get
|
|
107
|
+
when 'PUT' then Net::HTTP::Put
|
|
108
|
+
when 'POST' then Net::HTTP::Post
|
|
109
|
+
when 'HEAD' then Net::HTTP::Head
|
|
110
|
+
when 'DELETE' then Net::HTTP::Delete
|
|
111
|
+
else raise "unsupported http method: #{request.http_method}"
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
net_http_req = req_class.new(request.uri, headers)
|
|
115
|
+
net_http_req.body = request.body
|
|
116
|
+
net_http_req
|
|
117
|
+
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
@@ -0,0 +1,207 @@
|
|
|
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
|
+
module Http
|
|
17
|
+
|
|
18
|
+
# Base class for all service reqeusts.
|
|
19
|
+
class Request
|
|
20
|
+
|
|
21
|
+
# Returns a new empty http request object.
|
|
22
|
+
def initialize
|
|
23
|
+
@host = nil
|
|
24
|
+
@http_method = 'POST'
|
|
25
|
+
@path = '/'
|
|
26
|
+
@headers = CaseInsensitiveHash.new
|
|
27
|
+
@params = []
|
|
28
|
+
@use_ssl = true
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @return [String] hostname of the request
|
|
32
|
+
attr_accessor :host
|
|
33
|
+
|
|
34
|
+
# @return [CaseInsensitiveHash] request headers
|
|
35
|
+
attr_reader :headers
|
|
36
|
+
|
|
37
|
+
# @return [Array] An array of request params, each param responds to
|
|
38
|
+
# #name and #value.
|
|
39
|
+
attr_reader :params
|
|
40
|
+
|
|
41
|
+
# @return [String] GET, PUT POST, HEAD or DELETE, defaults to POST
|
|
42
|
+
attr_accessor :http_method
|
|
43
|
+
|
|
44
|
+
# @return [String] path of the request URI, defaults to /
|
|
45
|
+
attr_reader :path
|
|
46
|
+
|
|
47
|
+
# @return [String] the AWS access key ID used to authorize the
|
|
48
|
+
# request
|
|
49
|
+
attr_accessor :access_key_id
|
|
50
|
+
|
|
51
|
+
# @return [nil, URI] The URI to the proxy server requests are
|
|
52
|
+
# sent through if configured. Returns nil if there is no proxy.
|
|
53
|
+
attr_accessor :proxy_uri
|
|
54
|
+
|
|
55
|
+
# @param [Boolean] ssl If the request should be sent over ssl or not.
|
|
56
|
+
def use_ssl= use_ssl
|
|
57
|
+
@use_ssl = use_ssl
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# @return [Boolean] If this request should be sent over ssl or not.
|
|
61
|
+
def use_ssl?
|
|
62
|
+
@use_ssl
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# @param [Boolean] verify_peer If the client should verify the
|
|
66
|
+
# peer certificate or not.
|
|
67
|
+
def ssl_verify_peer=(verify_peer)
|
|
68
|
+
@ssl_verify_peer = verify_peer
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# @return [Boolean] If the client should verify the peer
|
|
72
|
+
# certificate or not.
|
|
73
|
+
def ssl_verify_peer?
|
|
74
|
+
@ssl_verify_peer
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# @param [String] ca_file Path to a bundle of CA certs in PEM
|
|
78
|
+
# format; the HTTP handler should use this to verify all HTTPS
|
|
79
|
+
# requests if {#ssl_verify_peer?} is true.
|
|
80
|
+
def ssl_ca_file=(ca_file)
|
|
81
|
+
@ssl_ca_file = ca_file
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# @return [String] Path to a bundle of CA certs in PEM format;
|
|
85
|
+
# the HTTP handler should use this to verify all HTTPS
|
|
86
|
+
# requests if {#ssl_verify_peer?} is true.
|
|
87
|
+
def ssl_ca_file
|
|
88
|
+
@ssl_ca_file
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Adds a request param.
|
|
92
|
+
#
|
|
93
|
+
# @overload add_param(param_name, param_value = nil)
|
|
94
|
+
# Add a param (name/value)
|
|
95
|
+
# @param [String] param_name
|
|
96
|
+
# @param [String] param_value Leave blank for sub resources
|
|
97
|
+
#
|
|
98
|
+
# @overload add_param(param_obj)
|
|
99
|
+
# Add a param (object)
|
|
100
|
+
# @param [Param] param_obj
|
|
101
|
+
#
|
|
102
|
+
def add_param name_or_param, value = nil
|
|
103
|
+
if name_or_param.kind_of?(Param)
|
|
104
|
+
@params << name_or_param
|
|
105
|
+
else
|
|
106
|
+
@params << Param.new(name_or_param, value)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# @private
|
|
111
|
+
def get_param param_name
|
|
112
|
+
@params.detect{|p| p.name == param_name } ||
|
|
113
|
+
raise("undefined param #{param_name}")
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# @return [String] the request uri
|
|
117
|
+
def uri
|
|
118
|
+
querystring ? "#{path}?#{querystring}" : path
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# @return [String] Returns the request params url encoded, or nil if
|
|
122
|
+
# this request has no params.
|
|
123
|
+
def url_encoded_params
|
|
124
|
+
if @params.empty?
|
|
125
|
+
nil
|
|
126
|
+
else
|
|
127
|
+
@params.sort.collect{|p| p.encoded }.join('&')
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# @return [String, nil] Returns the requesty querystring.
|
|
132
|
+
def querystring
|
|
133
|
+
nil
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# @return [String, nil] Returns the request body.
|
|
137
|
+
def body
|
|
138
|
+
url_encoded_params
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# @private
|
|
142
|
+
class CaseInsensitiveHash < Hash
|
|
143
|
+
|
|
144
|
+
def []= key, value
|
|
145
|
+
super(key.to_s.downcase, value)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def [] key
|
|
149
|
+
super(key.to_s.downcase)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def has_key?(key)
|
|
153
|
+
super(key.to_s.downcase)
|
|
154
|
+
end
|
|
155
|
+
alias_method :key?, :has_key?
|
|
156
|
+
alias_method :include?, :has_key?
|
|
157
|
+
alias_method :member?, :has_key?
|
|
158
|
+
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Represents a single request paramater. Some services accept this
|
|
162
|
+
# in a form encoded body string, others as query parameters.
|
|
163
|
+
# It is up to each service's Request class to determine how to
|
|
164
|
+
# consume these params.
|
|
165
|
+
# @private
|
|
166
|
+
class Param
|
|
167
|
+
|
|
168
|
+
include UriEscape
|
|
169
|
+
|
|
170
|
+
attr_accessor :name, :value
|
|
171
|
+
|
|
172
|
+
def initialize name, value = nil
|
|
173
|
+
@name = name
|
|
174
|
+
@value = value
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def <=> other
|
|
178
|
+
@name <=> other.name
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def to_s
|
|
182
|
+
if value
|
|
183
|
+
"#{name}=#{value}"
|
|
184
|
+
else
|
|
185
|
+
name
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def ==(other)
|
|
190
|
+
other.kind_of?(Param) &&
|
|
191
|
+
to_s == other.to_s
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def encoded
|
|
195
|
+
if value
|
|
196
|
+
"#{escape(name)}=#{escape(value)}"
|
|
197
|
+
else
|
|
198
|
+
escape(name)
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|