aws-sdk 1.0.0
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/.yardopts +6 -0
- data/LICENSE.txt +171 -0
- data/NOTICE.txt +2 -0
- data/README.rdoc +189 -0
- data/lib/aws-sdk.rb +14 -0
- data/lib/aws.rb +63 -0
- data/lib/aws/api_config.rb +45 -0
- data/lib/aws/api_config/.document +0 -0
- data/lib/aws/api_config/EC2-2011-02-28.yml +2314 -0
- data/lib/aws/api_config/SNS-2010-03-31.yml +171 -0
- data/lib/aws/api_config/SQS-2009-02-01.yml +161 -0
- data/lib/aws/api_config/SimpleDB-2009-04-15.yml +278 -0
- data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +147 -0
- data/lib/aws/api_config_transform.rb +32 -0
- data/lib/aws/async_handle.rb +90 -0
- data/lib/aws/authorize_v2.rb +37 -0
- data/lib/aws/authorize_v3.rb +37 -0
- data/lib/aws/base_client.rb +524 -0
- data/lib/aws/cacheable.rb +92 -0
- data/lib/aws/common.rb +228 -0
- data/lib/aws/configurable.rb +36 -0
- data/lib/aws/configuration.rb +272 -0
- data/lib/aws/configured_client_methods.rb +81 -0
- data/lib/aws/configured_grammars.rb +65 -0
- data/lib/aws/configured_option_grammars.rb +46 -0
- data/lib/aws/configured_xml_grammars.rb +47 -0
- data/lib/aws/default_signer.rb +38 -0
- data/lib/aws/ec2.rb +321 -0
- data/lib/aws/ec2/attachment.rb +149 -0
- data/lib/aws/ec2/attachment_collection.rb +57 -0
- data/lib/aws/ec2/availability_zone.rb +80 -0
- data/lib/aws/ec2/availability_zone_collection.rb +47 -0
- data/lib/aws/ec2/block_device_mappings.rb +53 -0
- data/lib/aws/ec2/client.rb +54 -0
- data/lib/aws/ec2/client/xml.rb +127 -0
- data/lib/aws/ec2/collection.rb +39 -0
- data/lib/aws/ec2/config_transform.rb +63 -0
- data/lib/aws/ec2/elastic_ip.rb +107 -0
- data/lib/aws/ec2/elastic_ip_collection.rb +85 -0
- data/lib/aws/ec2/errors.rb +29 -0
- data/lib/aws/ec2/filtered_collection.rb +65 -0
- data/lib/aws/ec2/has_permissions.rb +46 -0
- data/lib/aws/ec2/image.rb +245 -0
- data/lib/aws/ec2/image_collection.rb +235 -0
- data/lib/aws/ec2/instance.rb +515 -0
- data/lib/aws/ec2/instance_collection.rb +276 -0
- data/lib/aws/ec2/key_pair.rb +86 -0
- data/lib/aws/ec2/key_pair_collection.rb +102 -0
- data/lib/aws/ec2/permission_collection.rb +177 -0
- data/lib/aws/ec2/region.rb +81 -0
- data/lib/aws/ec2/region_collection.rb +55 -0
- data/lib/aws/ec2/request.rb +27 -0
- data/lib/aws/ec2/reserved_instances.rb +50 -0
- data/lib/aws/ec2/reserved_instances_collection.rb +44 -0
- data/lib/aws/ec2/reserved_instances_offering.rb +55 -0
- data/lib/aws/ec2/reserved_instances_offering_collection.rb +43 -0
- data/lib/aws/ec2/resource.rb +340 -0
- data/lib/aws/ec2/resource_tag_collection.rb +218 -0
- data/lib/aws/ec2/security_group.rb +246 -0
- data/lib/aws/ec2/security_group/ip_permission.rb +70 -0
- data/lib/aws/ec2/security_group/ip_permission_collection.rb +59 -0
- data/lib/aws/ec2/security_group_collection.rb +132 -0
- data/lib/aws/ec2/snapshot.rb +138 -0
- data/lib/aws/ec2/snapshot_collection.rb +90 -0
- data/lib/aws/ec2/tag.rb +88 -0
- data/lib/aws/ec2/tag_collection.rb +114 -0
- data/lib/aws/ec2/tagged_collection.rb +48 -0
- data/lib/aws/ec2/tagged_item.rb +87 -0
- data/lib/aws/ec2/volume.rb +190 -0
- data/lib/aws/ec2/volume_collection.rb +95 -0
- data/lib/aws/errors.rb +129 -0
- data/lib/aws/http/builtin_handler.rb +69 -0
- data/lib/aws/http/curb_handler.rb +123 -0
- data/lib/aws/http/handler.rb +77 -0
- data/lib/aws/http/httparty_handler.rb +61 -0
- data/lib/aws/http/request.rb +136 -0
- data/lib/aws/http/request_param.rb +63 -0
- data/lib/aws/http/response.rb +75 -0
- data/lib/aws/ignore_result_element.rb +38 -0
- data/lib/aws/indifferent_hash.rb +86 -0
- data/lib/aws/inflection.rb +46 -0
- data/lib/aws/lazy_error_classes.rb +64 -0
- data/lib/aws/meta_utils.rb +43 -0
- data/lib/aws/model.rb +57 -0
- data/lib/aws/naming.rb +32 -0
- data/lib/aws/option_grammar.rb +544 -0
- data/lib/aws/policy.rb +912 -0
- data/lib/aws/rails.rb +209 -0
- data/lib/aws/record.rb +79 -0
- data/lib/aws/record/attribute.rb +94 -0
- data/lib/aws/record/attribute_macros.rb +288 -0
- data/lib/aws/record/attributes/boolean.rb +49 -0
- data/lib/aws/record/attributes/datetime.rb +86 -0
- data/lib/aws/record/attributes/float.rb +48 -0
- data/lib/aws/record/attributes/integer.rb +68 -0
- data/lib/aws/record/attributes/sortable_float.rb +60 -0
- data/lib/aws/record/attributes/sortable_integer.rb +95 -0
- data/lib/aws/record/attributes/string.rb +69 -0
- data/lib/aws/record/base.rb +728 -0
- data/lib/aws/record/conversion.rb +38 -0
- data/lib/aws/record/dirty_tracking.rb +286 -0
- data/lib/aws/record/errors.rb +153 -0
- data/lib/aws/record/exceptions.rb +48 -0
- data/lib/aws/record/finder_methods.rb +262 -0
- data/lib/aws/record/naming.rb +31 -0
- data/lib/aws/record/scope.rb +157 -0
- data/lib/aws/record/validations.rb +653 -0
- data/lib/aws/record/validator.rb +237 -0
- data/lib/aws/record/validators/acceptance.rb +51 -0
- data/lib/aws/record/validators/block.rb +38 -0
- data/lib/aws/record/validators/confirmation.rb +43 -0
- data/lib/aws/record/validators/count.rb +108 -0
- data/lib/aws/record/validators/exclusion.rb +43 -0
- data/lib/aws/record/validators/format.rb +57 -0
- data/lib/aws/record/validators/inclusion.rb +56 -0
- data/lib/aws/record/validators/length.rb +107 -0
- data/lib/aws/record/validators/numericality.rb +138 -0
- data/lib/aws/record/validators/presence.rb +45 -0
- data/lib/aws/resource_cache.rb +39 -0
- data/lib/aws/response.rb +113 -0
- data/lib/aws/response_cache.rb +50 -0
- data/lib/aws/s3.rb +109 -0
- data/lib/aws/s3/access_control_list.rb +252 -0
- data/lib/aws/s3/acl_object.rb +266 -0
- data/lib/aws/s3/bucket.rb +320 -0
- data/lib/aws/s3/bucket_collection.rb +122 -0
- data/lib/aws/s3/bucket_version_collection.rb +85 -0
- data/lib/aws/s3/client.rb +999 -0
- data/lib/aws/s3/client/xml.rb +190 -0
- data/lib/aws/s3/data_options.rb +99 -0
- data/lib/aws/s3/errors.rb +43 -0
- data/lib/aws/s3/multipart_upload.rb +318 -0
- data/lib/aws/s3/multipart_upload_collection.rb +78 -0
- data/lib/aws/s3/object_collection.rb +159 -0
- data/lib/aws/s3/object_metadata.rb +67 -0
- data/lib/aws/s3/object_upload_collection.rb +83 -0
- data/lib/aws/s3/object_version.rb +141 -0
- data/lib/aws/s3/object_version_collection.rb +78 -0
- data/lib/aws/s3/paginated_collection.rb +94 -0
- data/lib/aws/s3/policy.rb +76 -0
- data/lib/aws/s3/prefix_and_delimiter_collection.rb +56 -0
- data/lib/aws/s3/prefixed_collection.rb +84 -0
- data/lib/aws/s3/presigned_post.rb +504 -0
- data/lib/aws/s3/request.rb +198 -0
- data/lib/aws/s3/s3_object.rb +794 -0
- data/lib/aws/s3/tree.rb +116 -0
- data/lib/aws/s3/tree/branch_node.rb +71 -0
- data/lib/aws/s3/tree/child_collection.rb +108 -0
- data/lib/aws/s3/tree/leaf_node.rb +99 -0
- data/lib/aws/s3/tree/node.rb +22 -0
- data/lib/aws/s3/tree/parent.rb +90 -0
- data/lib/aws/s3/uploaded_part.rb +82 -0
- data/lib/aws/s3/uploaded_part_collection.rb +86 -0
- data/lib/aws/service_interface.rb +60 -0
- data/lib/aws/simple_db.rb +202 -0
- data/lib/aws/simple_db/attribute.rb +159 -0
- data/lib/aws/simple_db/attribute_collection.rb +227 -0
- data/lib/aws/simple_db/client.rb +52 -0
- data/lib/aws/simple_db/client/options.rb +34 -0
- data/lib/aws/simple_db/client/xml.rb +68 -0
- data/lib/aws/simple_db/consistent_read_option.rb +42 -0
- data/lib/aws/simple_db/delete_attributes.rb +64 -0
- data/lib/aws/simple_db/domain.rb +118 -0
- data/lib/aws/simple_db/domain_collection.rb +116 -0
- data/lib/aws/simple_db/domain_metadata.rb +112 -0
- data/lib/aws/simple_db/errors.rb +46 -0
- data/lib/aws/simple_db/expect_condition_option.rb +45 -0
- data/lib/aws/simple_db/item.rb +84 -0
- data/lib/aws/simple_db/item_collection.rb +594 -0
- data/lib/aws/simple_db/item_data.rb +70 -0
- data/lib/aws/simple_db/put_attributes.rb +62 -0
- data/lib/aws/simple_db/request.rb +27 -0
- data/lib/aws/simple_email_service.rb +373 -0
- data/lib/aws/simple_email_service/client.rb +39 -0
- data/lib/aws/simple_email_service/client/options.rb +24 -0
- data/lib/aws/simple_email_service/client/xml.rb +38 -0
- data/lib/aws/simple_email_service/email_address_collection.rb +66 -0
- data/lib/aws/simple_email_service/errors.rb +29 -0
- data/lib/aws/simple_email_service/quotas.rb +64 -0
- data/lib/aws/simple_email_service/request.rb +27 -0
- data/lib/aws/sns.rb +69 -0
- data/lib/aws/sns/client.rb +37 -0
- data/lib/aws/sns/client/options.rb +24 -0
- data/lib/aws/sns/client/xml.rb +38 -0
- data/lib/aws/sns/errors.rb +29 -0
- data/lib/aws/sns/policy.rb +49 -0
- data/lib/aws/sns/request.rb +27 -0
- data/lib/aws/sns/subscription.rb +100 -0
- data/lib/aws/sns/subscription_collection.rb +84 -0
- data/lib/aws/sns/topic.rb +384 -0
- data/lib/aws/sns/topic_collection.rb +70 -0
- data/lib/aws/sns/topic_subscription_collection.rb +58 -0
- data/lib/aws/sqs.rb +70 -0
- data/lib/aws/sqs/client.rb +38 -0
- data/lib/aws/sqs/client/xml.rb +36 -0
- data/lib/aws/sqs/errors.rb +33 -0
- data/lib/aws/sqs/policy.rb +50 -0
- data/lib/aws/sqs/queue.rb +507 -0
- data/lib/aws/sqs/queue_collection.rb +105 -0
- data/lib/aws/sqs/received_message.rb +184 -0
- data/lib/aws/sqs/received_sns_message.rb +112 -0
- data/lib/aws/sqs/request.rb +44 -0
- data/lib/aws/xml_grammar.rb +923 -0
- data/rails/init.rb +15 -0
- metadata +298 -0
|
@@ -0,0 +1,69 @@
|
|
|
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
|
+
|
|
17
|
+
module AWS
|
|
18
|
+
module Http
|
|
19
|
+
|
|
20
|
+
# @private
|
|
21
|
+
class BuiltinHandler
|
|
22
|
+
|
|
23
|
+
def handle(request, response)
|
|
24
|
+
|
|
25
|
+
http = Net::HTTP.new(request.host, request.use_ssl? ? 443 : 80)
|
|
26
|
+
|
|
27
|
+
# http://www.ruby-lang.org/en/news/2007/10/04/net-https-vulnerability/
|
|
28
|
+
if request.use_ssl?
|
|
29
|
+
http.use_ssl = true
|
|
30
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
|
31
|
+
store = OpenSSL::X509::Store.new
|
|
32
|
+
store.set_default_paths
|
|
33
|
+
http.cert_store = store
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
http.start do
|
|
37
|
+
|
|
38
|
+
# Net::HTTP adds this header for us when the body is
|
|
39
|
+
# provided, but it messes up signing
|
|
40
|
+
headers = { 'content-type' => '' }
|
|
41
|
+
|
|
42
|
+
# Net::HTTP calls strip on each header value, this causes errors
|
|
43
|
+
# when the values are numbers (like Content-Length)
|
|
44
|
+
request.headers.each_pair do |key,value|
|
|
45
|
+
headers[key] = value.to_s
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
http_request_class = case request.http_method
|
|
49
|
+
when 'HEAD' then Net::HTTP::Head
|
|
50
|
+
when 'GET' then Net::HTTP::Get
|
|
51
|
+
when 'PUT' then Net::HTTP::Put
|
|
52
|
+
when 'POST' then Net::HTTP::Post
|
|
53
|
+
when 'DELETE' then Net::HTTP::Delete
|
|
54
|
+
else raise "unsupported http request method: #{request.http_method}"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
http_request = http_request_class.new(request.uri, headers)
|
|
58
|
+
http.request(http_request, request.body) do |http_response|
|
|
59
|
+
response.body = http_response.body
|
|
60
|
+
response.status = http_response.code.to_i
|
|
61
|
+
response.headers = http_response.to_hash
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,123 @@
|
|
|
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 'thread'
|
|
15
|
+
|
|
16
|
+
module AWS
|
|
17
|
+
module Http
|
|
18
|
+
|
|
19
|
+
# @private
|
|
20
|
+
class CurbHandler
|
|
21
|
+
|
|
22
|
+
def initialize
|
|
23
|
+
@q = []
|
|
24
|
+
@sem = Mutex.new
|
|
25
|
+
@multi = Curl::Multi.new
|
|
26
|
+
|
|
27
|
+
start_processor
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def handle request, response
|
|
31
|
+
raise "unsupport http reqest method: #{request.http_method}" unless
|
|
32
|
+
['GET', 'HEAD', 'PUT', 'POST', 'DELETE'].include? request.http_method
|
|
33
|
+
@sem.synchronize do
|
|
34
|
+
@q << [request, response, Thread.current]
|
|
35
|
+
@processor.wakeup
|
|
36
|
+
end
|
|
37
|
+
Thread.stop
|
|
38
|
+
nil
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# fills the Curl::Multi handle with the given array of queue
|
|
42
|
+
# items, calling make_easy_handle on each one first
|
|
43
|
+
private
|
|
44
|
+
def fill_multi(items)
|
|
45
|
+
items.each do |item|
|
|
46
|
+
c = make_easy_handle(*item)
|
|
47
|
+
@multi.add(c)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# starts a background thread that waits for new items and
|
|
52
|
+
# sends them through the Curl::Multi handle
|
|
53
|
+
private
|
|
54
|
+
def start_processor
|
|
55
|
+
@processor = Thread.new do
|
|
56
|
+
loop do
|
|
57
|
+
items = nil
|
|
58
|
+
@sem.synchronize do
|
|
59
|
+
items = @q.slice!(0..-1)
|
|
60
|
+
end
|
|
61
|
+
unless items.empty?
|
|
62
|
+
fill_multi(items)
|
|
63
|
+
@multi.perform do
|
|
64
|
+
# curl is idle, so process more items if we can get them
|
|
65
|
+
# without blocking
|
|
66
|
+
if !@q.empty? && @sem.try_lock
|
|
67
|
+
begin
|
|
68
|
+
fill_multi(@q.slice!(0..-1))
|
|
69
|
+
ensure
|
|
70
|
+
@sem.unlock
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# wait for a new item to show up before continuing
|
|
77
|
+
Thread.stop if @q.empty?
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
private
|
|
83
|
+
def make_easy_handle request, response, thread = nil
|
|
84
|
+
|
|
85
|
+
url = request.use_ssl? ?
|
|
86
|
+
"https://#{request.host}:443#{request.uri}" :
|
|
87
|
+
"http://#{request.host}#{request.uri}"
|
|
88
|
+
puts url
|
|
89
|
+
|
|
90
|
+
curl = Curl::Easy.new(url)
|
|
91
|
+
curl.headers = request.headers
|
|
92
|
+
|
|
93
|
+
curl.on_header {|header_data|
|
|
94
|
+
name, value = header_data.strip.split(/:\s+/, 2)
|
|
95
|
+
response.headers[name] = value
|
|
96
|
+
header_data.length
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
case request.http_method
|
|
100
|
+
when 'GET'
|
|
101
|
+
# ....
|
|
102
|
+
when 'HEAD'
|
|
103
|
+
curl.head = true
|
|
104
|
+
when 'PUT'
|
|
105
|
+
curl.put_data = request.body
|
|
106
|
+
when 'POST'
|
|
107
|
+
curl.post_body = request.body
|
|
108
|
+
when 'DELETE'
|
|
109
|
+
curl.delete = true
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
curl.on_complete do
|
|
113
|
+
response.body = curl.body_str
|
|
114
|
+
response.status = curl.response_code
|
|
115
|
+
thread.run if thread
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
curl
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -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
|
+
require 'aws/meta_utils'
|
|
15
|
+
|
|
16
|
+
module AWS
|
|
17
|
+
module Http
|
|
18
|
+
|
|
19
|
+
# @private
|
|
20
|
+
class Handler
|
|
21
|
+
|
|
22
|
+
attr_reader :base
|
|
23
|
+
|
|
24
|
+
def initialize(base, &block)
|
|
25
|
+
@base = base
|
|
26
|
+
if base.respond_to?(:handle)
|
|
27
|
+
|
|
28
|
+
unless block.arity == 2
|
|
29
|
+
raise ArgumentError, 'passed block must accept 2 arguments'
|
|
30
|
+
end
|
|
31
|
+
MetaUtils.extend_method(self, :handle, &block)
|
|
32
|
+
|
|
33
|
+
elsif base.respond_to?(:handle_async)
|
|
34
|
+
|
|
35
|
+
unless block.arity == 3
|
|
36
|
+
raise ArgumentError, 'passed block must accept 3 arguments'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
MetaUtils.extend_method(self, :handle_async) do |req, resp, handle|
|
|
40
|
+
@base.handle_async(req, resp, handle)
|
|
41
|
+
end
|
|
42
|
+
MetaUtils.extend(self) do
|
|
43
|
+
define_method(:handle) do |req, resp|
|
|
44
|
+
raise "attempted to call #handle on an async handler"
|
|
45
|
+
end
|
|
46
|
+
define_method(:handle_async, &block)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
else
|
|
50
|
+
raise ArgumentError, 'base must respond to #handle or #handle_async'
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def handle(request, http_response)
|
|
55
|
+
@base.handle(request, http_response)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def handle_async(request, http_response, handle)
|
|
59
|
+
Thread.new do
|
|
60
|
+
begin
|
|
61
|
+
self.handle(request, http_response)
|
|
62
|
+
rescue => e
|
|
63
|
+
handle.signal_failure
|
|
64
|
+
else
|
|
65
|
+
handle.signal_success
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def sleep_with_callback seconds, &block
|
|
71
|
+
Kernel.sleep(seconds)
|
|
72
|
+
yield
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
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 Http
|
|
18
|
+
|
|
19
|
+
# @private
|
|
20
|
+
class HTTPartyHandler
|
|
21
|
+
|
|
22
|
+
include HTTParty
|
|
23
|
+
|
|
24
|
+
class NoOpParser < HTTParty::Parser
|
|
25
|
+
SupportedFormats = {}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def handle(request, response)
|
|
29
|
+
|
|
30
|
+
url = request.use_ssl? ?
|
|
31
|
+
"https://#{request.host}:443#{request.uri}" :
|
|
32
|
+
"http://#{request.host}#{request.uri}"
|
|
33
|
+
|
|
34
|
+
# get, post, put, delete, head
|
|
35
|
+
method = request.http_method.downcase
|
|
36
|
+
|
|
37
|
+
# Net::HTTP adds this header for us when the body is
|
|
38
|
+
# provided, but it messes up signing
|
|
39
|
+
headers = { 'content-type' => '' }
|
|
40
|
+
|
|
41
|
+
# headers must have string values (net http calls .strip on them)
|
|
42
|
+
request.headers.each_pair do |key,value|
|
|
43
|
+
headers[key] = value.to_s
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
begin
|
|
47
|
+
http_response = self.class.send(method, url,
|
|
48
|
+
:headers => headers,
|
|
49
|
+
:body => request.body,
|
|
50
|
+
:parser => NoOpParser)
|
|
51
|
+
rescue Timeout::Error => e
|
|
52
|
+
response.timeout = true
|
|
53
|
+
else
|
|
54
|
+
response.body = http_response.body
|
|
55
|
+
response.status = http_response.code.to_i
|
|
56
|
+
response.headers = http_response.to_hash
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
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 'stringio'
|
|
15
|
+
require 'aws/http/request_param'
|
|
16
|
+
|
|
17
|
+
module AWS
|
|
18
|
+
module Http
|
|
19
|
+
|
|
20
|
+
# Base class for all service reqeusts.
|
|
21
|
+
# @private
|
|
22
|
+
class Request
|
|
23
|
+
|
|
24
|
+
# Returns a new empty http request object.
|
|
25
|
+
def initialize
|
|
26
|
+
@host = nil
|
|
27
|
+
@http_method = 'POST'
|
|
28
|
+
@path = '/'
|
|
29
|
+
@headers = CaseInsensitiveHash.new
|
|
30
|
+
@params = []
|
|
31
|
+
@use_ssl = true
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @return [String] hostname of the request
|
|
35
|
+
attr_accessor :host
|
|
36
|
+
|
|
37
|
+
# @return [CaseInsensitiveHash] request headers
|
|
38
|
+
attr_reader :headers
|
|
39
|
+
|
|
40
|
+
# @return [Array] An array of request params, each param responds to
|
|
41
|
+
# #name and #value.
|
|
42
|
+
attr_reader :params
|
|
43
|
+
|
|
44
|
+
# @return [String] GET, PUT POST, HEAD or DELETE, defaults to POST
|
|
45
|
+
attr_accessor :http_method
|
|
46
|
+
|
|
47
|
+
# @return [String] path of the request URI, defaults to /
|
|
48
|
+
attr_reader :path
|
|
49
|
+
|
|
50
|
+
# @return [String] the AWS access key ID used to authorize the
|
|
51
|
+
# request
|
|
52
|
+
attr_accessor :access_key_id
|
|
53
|
+
|
|
54
|
+
# @param [Boolean] ssl If the request should be sent over ssl or not.
|
|
55
|
+
def use_ssl= use_ssl
|
|
56
|
+
@use_ssl = use_ssl
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# @return [Boolean] If this request should be sent over ssl or not.
|
|
60
|
+
def use_ssl?
|
|
61
|
+
@use_ssl
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Adds a request param.
|
|
65
|
+
#
|
|
66
|
+
# @overload add_param(param_name, param_value = nil)
|
|
67
|
+
# Add a param (name/value)
|
|
68
|
+
# @param [String] param_name
|
|
69
|
+
# @param [String] param_value Leave blank for sub resources
|
|
70
|
+
#
|
|
71
|
+
# @overload add_param(param_obj)
|
|
72
|
+
# Add a param (object)
|
|
73
|
+
# @param [Param] param_obj
|
|
74
|
+
#
|
|
75
|
+
def add_param name_or_param, value = nil
|
|
76
|
+
if name_or_param.kind_of?(Param)
|
|
77
|
+
@params << name_or_param
|
|
78
|
+
else
|
|
79
|
+
@params << Param.new(name_or_param, value)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @private
|
|
84
|
+
def get_param param_name
|
|
85
|
+
@params.detect{|p| p.name == param_name } ||
|
|
86
|
+
raise("undefined param #{param_name}")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# @return [String] the request uri
|
|
90
|
+
def uri
|
|
91
|
+
querystring ? "#{path}?#{querystring}" : path
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# @return [String] Returns the request params url encoded, or nil if
|
|
95
|
+
# this request has no params.
|
|
96
|
+
def url_encoded_params
|
|
97
|
+
if @params.empty?
|
|
98
|
+
nil
|
|
99
|
+
else
|
|
100
|
+
@params.sort.collect{|p| p.encoded }.join('&')
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# @return [String, nil] Returns the requesty querystring.
|
|
105
|
+
def querystring
|
|
106
|
+
nil
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# @return [String, nil] Returns the request body.
|
|
110
|
+
def body
|
|
111
|
+
url_encoded_params
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# @private
|
|
115
|
+
class CaseInsensitiveHash < Hash
|
|
116
|
+
|
|
117
|
+
def []= key, value
|
|
118
|
+
super(key.to_s.downcase, value)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def [] key
|
|
122
|
+
super(key.to_s.downcase)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def has_key?(key)
|
|
126
|
+
super(key.to_s.downcase)
|
|
127
|
+
end
|
|
128
|
+
alias_method :key?, :has_key?
|
|
129
|
+
alias_method :include?, :has_key?
|
|
130
|
+
alias_method :member?, :has_key?
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|