aws-sdk 1.30.1 → 1.31.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -3
  3. data/lib/aws/api_config/CloudFront-2013-11-11.yml +2886 -0
  4. data/lib/aws/api_config/CloudTrail-2013-11-01.yml +36 -0
  5. data/lib/aws/api_config/ElasticTranscoder-2012-09-25.yml +67 -446
  6. data/lib/aws/auto_scaling.rb +0 -1
  7. data/lib/aws/auto_scaling/client.rb +2 -0
  8. data/lib/aws/cloud_formation.rb +0 -1
  9. data/lib/aws/cloud_formation/client.rb +2 -0
  10. data/lib/aws/cloud_front.rb +0 -1
  11. data/lib/aws/cloud_front/client.rb +6 -6
  12. data/lib/aws/cloud_search.rb +0 -1
  13. data/lib/aws/cloud_search/client.rb +3 -0
  14. data/lib/aws/cloud_trail.rb +0 -1
  15. data/lib/aws/cloud_trail/client.rb +2 -0
  16. data/lib/aws/cloud_watch.rb +0 -1
  17. data/lib/aws/cloud_watch/client.rb +2 -0
  18. data/lib/aws/core.rb +8 -6
  19. data/lib/aws/core/client.rb +30 -4
  20. data/lib/aws/core/configuration.rb +1 -1
  21. data/lib/aws/core/http/request.rb +2 -1
  22. data/lib/aws/core/signers/base.rb +46 -0
  23. data/lib/aws/core/signers/cloud_front.rb +56 -0
  24. data/lib/aws/core/signers/s3.rb +159 -0
  25. data/lib/aws/core/signers/version_2.rb +72 -0
  26. data/lib/aws/core/signers/version_3.rb +86 -0
  27. data/lib/aws/core/signers/version_3_https.rb +61 -0
  28. data/lib/aws/core/signers/version_4.rb +228 -0
  29. data/lib/aws/core/signers/version_4/chunk_signed_stream.rb +191 -0
  30. data/lib/aws/data_pipeline.rb +0 -1
  31. data/lib/aws/data_pipeline/client.rb +3 -0
  32. data/lib/aws/direct_connect.rb +0 -1
  33. data/lib/aws/direct_connect/client.rb +3 -0
  34. data/lib/aws/dynamo_db.rb +0 -1
  35. data/lib/aws/dynamo_db/client.rb +2 -0
  36. data/lib/aws/ec2.rb +0 -1
  37. data/lib/aws/ec2/client.rb +21 -0
  38. data/lib/aws/elastic_beanstalk.rb +0 -1
  39. data/lib/aws/elastic_beanstalk/client.rb +3 -0
  40. data/lib/aws/elastic_transcoder.rb +0 -1
  41. data/lib/aws/elastic_transcoder/client.rb +2 -0
  42. data/lib/aws/elasticache.rb +0 -1
  43. data/lib/aws/elasticache/client.rb +2 -0
  44. data/lib/aws/elb.rb +0 -1
  45. data/lib/aws/elb/client.rb +2 -0
  46. data/lib/aws/emr.rb +0 -1
  47. data/lib/aws/emr/client.rb +2 -0
  48. data/lib/aws/glacier.rb +0 -1
  49. data/lib/aws/glacier/client.rb +2 -0
  50. data/lib/aws/iam.rb +0 -1
  51. data/lib/aws/iam/client.rb +2 -0
  52. data/lib/aws/import_export.rb +0 -1
  53. data/lib/aws/import_export/client.rb +2 -0
  54. data/lib/aws/kinesis.rb +0 -1
  55. data/lib/aws/kinesis/client.rb +2 -0
  56. data/lib/aws/ops_works.rb +0 -1
  57. data/lib/aws/ops_works/client.rb +2 -0
  58. data/lib/aws/rds.rb +0 -1
  59. data/lib/aws/rds/client.rb +2 -0
  60. data/lib/aws/redshift.rb +0 -1
  61. data/lib/aws/redshift/client.rb +2 -0
  62. data/lib/aws/route_53.rb +0 -1
  63. data/lib/aws/route_53/client.rb +2 -0
  64. data/lib/aws/s3.rb +1 -0
  65. data/lib/aws/s3/bucket_collection.rb +9 -7
  66. data/lib/aws/s3/client.rb +70 -9
  67. data/lib/aws/s3/config.rb +12 -0
  68. data/lib/aws/s3/object_collection.rb +4 -9
  69. data/lib/aws/s3/presign_v4.rb +127 -0
  70. data/lib/aws/s3/presigned_post.rb +1 -1
  71. data/lib/aws/s3/request.rb +0 -136
  72. data/lib/aws/s3/s3_object.rb +40 -19
  73. data/lib/aws/simple_db.rb +0 -1
  74. data/lib/aws/simple_db/client.rb +2 -0
  75. data/lib/aws/simple_email_service.rb +0 -1
  76. data/lib/aws/simple_email_service/client.rb +2 -0
  77. data/lib/aws/simple_workflow.rb +0 -1
  78. data/lib/aws/simple_workflow/client.rb +2 -0
  79. data/lib/aws/sns.rb +0 -1
  80. data/lib/aws/sns/client.rb +2 -0
  81. data/lib/aws/sqs.rb +0 -1
  82. data/lib/aws/sqs/client.rb +2 -0
  83. data/lib/aws/storage_gateway.rb +0 -1
  84. data/lib/aws/storage_gateway/client.rb +2 -0
  85. data/lib/aws/sts.rb +0 -1
  86. data/lib/aws/sts/client.rb +2 -0
  87. data/lib/aws/support.rb +0 -1
  88. data/lib/aws/support/client.rb +2 -0
  89. data/lib/aws/version.rb +1 -1
  90. metadata +12 -38
  91. data/lib/aws/auto_scaling/request.rb +0 -29
  92. data/lib/aws/cloud_formation/request.rb +0 -29
  93. data/lib/aws/cloud_front/request.rb +0 -30
  94. data/lib/aws/cloud_search/request.rb +0 -23
  95. data/lib/aws/cloud_trail/request.rb +0 -30
  96. data/lib/aws/cloud_watch/request.rb +0 -29
  97. data/lib/aws/core/signature/version_2.rb +0 -56
  98. data/lib/aws/core/signature/version_3.rb +0 -77
  99. data/lib/aws/core/signature/version_3_https.rb +0 -54
  100. data/lib/aws/core/signature/version_4.rb +0 -135
  101. data/lib/aws/core/signer.rb +0 -46
  102. data/lib/aws/data_pipeline/request.rb +0 -26
  103. data/lib/aws/direct_connect/request.rb +0 -27
  104. data/lib/aws/dynamo_db/request.rb +0 -26
  105. data/lib/aws/ec2/request.rb +0 -21
  106. data/lib/aws/elastic_beanstalk/request.rb +0 -29
  107. data/lib/aws/elastic_transcoder/request.rb +0 -30
  108. data/lib/aws/elasticache/request.rb +0 -23
  109. data/lib/aws/elb/request.rb +0 -29
  110. data/lib/aws/emr/request.rb +0 -28
  111. data/lib/aws/glacier/request.rb +0 -29
  112. data/lib/aws/iam/request.rb +0 -29
  113. data/lib/aws/import_export/request.rb +0 -23
  114. data/lib/aws/kinesis/request.rb +0 -26
  115. data/lib/aws/ops_works/request.rb +0 -27
  116. data/lib/aws/rds/request.rb +0 -29
  117. data/lib/aws/redshift/request.rb +0 -29
  118. data/lib/aws/route_53/request.rb +0 -23
  119. data/lib/aws/simple_db/request.rb +0 -23
  120. data/lib/aws/simple_email_service/request.rb +0 -27
  121. data/lib/aws/simple_workflow/request.rb +0 -28
  122. data/lib/aws/sns/request.rb +0 -29
  123. data/lib/aws/sqs/request.rb +0 -31
  124. data/lib/aws/storage_gateway/request.rb +0 -28
  125. data/lib/aws/sts/request.rb +0 -29
  126. data/lib/aws/support/request.rb +0 -27
@@ -82,7 +82,6 @@ module AWS
82
82
  autoload :LaunchConfigurationCollection, 'aws/auto_scaling/launch_configuration_collection'
83
83
  autoload :NotificationConfiguration, 'aws/auto_scaling/notification_configuration'
84
84
  autoload :NotificationConfigurationCollection, 'aws/auto_scaling/notification_configuration_collection'
85
- autoload :Request, 'aws/auto_scaling/request'
86
85
  autoload :ScalingPolicy, 'aws/auto_scaling/scaling_policy'
87
86
  autoload :ScalingPolicyCollection, 'aws/auto_scaling/scaling_policy_collection'
88
87
  autoload :ScalingPolicyOptions, 'aws/auto_scaling/scaling_policy_options'
@@ -19,6 +19,8 @@ module AWS
19
19
 
20
20
  API_VERSION= '2011-01-01'
21
21
 
22
+ signature_version :Version4, 'autoscaling'
23
+
22
24
  # @api private
23
25
  CACHEABLE_REQUESTS = Set[
24
26
  :describe_adjustment_types,
@@ -147,7 +147,6 @@ module AWS
147
147
 
148
148
  autoload :Client, 'aws/cloud_formation/client'
149
149
  autoload :Errors, 'aws/cloud_formation/errors'
150
- autoload :Request, 'aws/cloud_formation/request'
151
150
  autoload :Stack, 'aws/cloud_formation/stack'
152
151
  autoload :StackCollection, 'aws/cloud_formation/stack_collection'
153
152
  autoload :StackEvent, 'aws/cloud_formation/stack_event'
@@ -19,6 +19,8 @@ module AWS
19
19
 
20
20
  API_VERSION = '2010-05-15'
21
21
 
22
+ signature_version :Version4, 'cloudformation'
23
+
22
24
  # @api private
23
25
  CACHEABLE_REQUESTS = Set[
24
26
  :describe_adjustment_types,
@@ -63,7 +63,6 @@ module AWS
63
63
 
64
64
  autoload :Client, 'aws/cloud_front/client'
65
65
  autoload :Errors, 'aws/cloud_front/errors'
66
- autoload :Request, 'aws/cloud_front/request'
67
66
 
68
67
  include Core::ServiceInterface
69
68
 
@@ -16,7 +16,9 @@ module AWS
16
16
 
17
17
  class Client < Core::RESTXMLClient
18
18
 
19
- API_VERSION = '2013-09-27'
19
+ API_VERSION = '2013-11-11'
20
+
21
+ signature_version :Version4, 'cloudfront'
20
22
 
21
23
  # @api private
22
24
  CACHEABLE_REQUESTS = Set[]
@@ -24,21 +26,19 @@ module AWS
24
26
  end
25
27
 
26
28
  class Client::V20130512 < Client
27
-
28
29
  define_client_methods('2013-05-12')
29
-
30
30
  end
31
31
 
32
32
  class Client::V20130826 < Client
33
-
34
33
  define_client_methods('2013-08-26')
35
-
36
34
  end
37
35
 
38
36
  class Client::V20130927 < Client
39
-
40
37
  define_client_methods('2013-09-27')
38
+ end
41
39
 
40
+ class Client::V20131111 < Client
41
+ define_client_methods('2013-11-11')
42
42
  end
43
43
 
44
44
  end
@@ -63,7 +63,6 @@ module AWS
63
63
 
64
64
  autoload :Client, 'aws/cloud_search/client'
65
65
  autoload :Errors, 'aws/cloud_search/errors'
66
- autoload :Request, 'aws/cloud_search/request'
67
66
 
68
67
  include Core::ServiceInterface
69
68
 
@@ -17,8 +17,11 @@ module AWS
17
17
  # Client class for Amazon Cloud Search.
18
18
  class Client < Core::QueryClient
19
19
 
20
+
20
21
  API_VERSION = '2011-02-01'
21
22
 
23
+ signature_version :Version4, 'cloudsearch'
24
+
22
25
  # @api private
23
26
  CACHEABLE_REQUESTS = Set[]
24
27
 
@@ -63,7 +63,6 @@ module AWS
63
63
 
64
64
  autoload :Client, 'aws/cloud_trail/client'
65
65
  autoload :Errors, 'aws/cloud_trail/errors'
66
- autoload :Request, 'aws/cloud_trail/request'
67
66
 
68
67
  include Core::ServiceInterface
69
68
 
@@ -18,6 +18,8 @@ module AWS
18
18
 
19
19
  API_VERSION = '2013-11-01'
20
20
 
21
+ signature_version :Version4, 'cloudtrail'
22
+
21
23
  # @api private
22
24
  CACHEABLE_REQUESTS = Set[]
23
25
 
@@ -71,7 +71,6 @@ module AWS
71
71
  autoload :MetricCollection, 'aws/cloud_watch/metric_collection'
72
72
  autoload :MetricAlarmCollection, 'aws/cloud_watch/metric_alarm_collection'
73
73
  autoload :MetricStatistics, 'aws/cloud_watch/metric_statistics'
74
- autoload :Request, 'aws/cloud_watch/request'
75
74
 
76
75
  include Core::ServiceInterface
77
76
 
@@ -19,6 +19,8 @@ module AWS
19
19
 
20
20
  API_VERSION = '2010-08-01'
21
21
 
22
+ signature_version :Version4, 'monitoring'
23
+
22
24
  # @api private
23
25
  CACHEABLE_REQUESTS = Set[
24
26
  :describe_alarm_history,
@@ -201,7 +201,6 @@ module AWS
201
201
  autoload :RESTResponseParser, "#{SRC}/core/rest_response_parser"
202
202
 
203
203
  autoload :ServiceInterface, "#{SRC}/core/service_interface"
204
- autoload :Signer, "#{SRC}/core/signer"
205
204
  autoload :UriEscape, "#{SRC}/core/uri_escape"
206
205
 
207
206
  module Options
@@ -210,11 +209,14 @@ module AWS
210
209
  autoload :Validator, "#{SRC}/core/options/validator"
211
210
  end
212
211
 
213
- module Signature
214
- autoload :Version2, "#{SRC}/core/signature/version_2"
215
- autoload :Version3, "#{SRC}/core/signature/version_3"
216
- autoload :Version3HTTPS, "#{SRC}/core/signature/version_3_https"
217
- autoload :Version4, "#{SRC}/core/signature/version_4"
212
+ module Signers
213
+ autoload :Base, "#{SRC}/core/signers/base"
214
+ autoload :CloudFront, "#{SRC}/core/signers/cloud_front"
215
+ autoload :S3, "#{SRC}/core/signers/s3"
216
+ autoload :Version2, "#{SRC}/core/signers/version_2"
217
+ autoload :Version3, "#{SRC}/core/signers/version_3"
218
+ autoload :Version3Https, "#{SRC}/core/signers/version_3_https"
219
+ autoload :Version4, "#{SRC}/core/signers/version_4"
218
220
  end
219
221
 
220
222
  module XML
@@ -48,7 +48,7 @@ module AWS
48
48
 
49
49
  # translate these into service specific configuration options,
50
50
  # e.g. :endpoint into :s3_endpoint
51
- [:endpoint, :region, :port].each do |opt|
51
+ [:endpoint, :region, :port, :signature_version].each do |opt|
52
52
  if options[opt]
53
53
  options[:"#{service_ruby_name}_#{opt}"] = options.delete(opt)
54
54
  end
@@ -57,6 +57,8 @@ module AWS
57
57
  @config = (options.delete(:config) || AWS.config)
58
58
  @config = @config.with(options)
59
59
 
60
+ @region = @config.send(:"#{service_ruby_name}_region")
61
+
60
62
  @credential_provider = @config.credential_provider
61
63
  @http_handler = @config.http_handler
62
64
  @endpoint = config.send(:"#{service_ruby_name}_endpoint")
@@ -188,7 +190,7 @@ module AWS
188
190
 
189
191
  # @api private
190
192
  def new_request
191
- eval(self.class.name.sub(/::Client.*$/, ''))::Request.new
193
+ Http::Request.new
192
194
  end
193
195
 
194
196
  def new_response(*args, &block)
@@ -480,7 +482,7 @@ module AWS
480
482
 
481
483
  response = new_response do
482
484
  req = client.send(:build_request, name, options)
483
- req.add_authorization!(credential_provider)
485
+ client.send(:sign_request, req)
484
486
  req
485
487
  end
486
488
 
@@ -543,7 +545,7 @@ module AWS
543
545
  http_request.service_ruby_name = service_ruby_name
544
546
  http_request.host = endpoint
545
547
  http_request.port = port
546
- http_request.region = config.send(:"#{service_ruby_name}_region")
548
+ http_request.region = @region
547
549
  http_request.use_ssl = config.use_ssl?
548
550
 
549
551
  send("configure_#{name}_request", http_request, opts)
@@ -565,6 +567,13 @@ module AWS
565
567
 
566
568
  end
567
569
 
570
+ # @param [Http::Request] req
571
+ # @return [Http::Request]
572
+ # @api private
573
+ def sign_request req
574
+ req
575
+ end
576
+
568
577
  def user_agent_string
569
578
  engine = (RUBY_ENGINE rescue nil or "ruby")
570
579
  user_agent = "%s aws-sdk-ruby/#{VERSION} %s/%s %s" %
@@ -675,6 +684,23 @@ module AWS
675
684
  YAML.load(File.read(path))
676
685
  end
677
686
 
687
+ # @param [Symbol] version
688
+ # @param [String,nil] service_signing_name Required for `:Version4`
689
+ # @api private
690
+ def signature_version version, service_signing_name = nil
691
+ define_method(:sign_request) do |req|
692
+ @signer ||= begin
693
+ signer_class = AWS::Core::Signers.const_get(version)
694
+ signer_args = (version == :Version4) ?
695
+ [credential_provider, service_signing_name, @region] :
696
+ [credential_provider]
697
+ signer_class.new(*signer_args)
698
+ end
699
+ @signer.sign_request(req)
700
+ req
701
+ end
702
+ end
703
+
678
704
  # Defines one method for each service operation described in
679
705
  # the API configuration.
680
706
  # @param [String] api_version
@@ -437,7 +437,7 @@ module AWS
437
437
  else
438
438
  'us-gov-west-1' # e.g. iam.us-gov.amazonaws.com
439
439
  end
440
- elsif matches = endpoint.match(/^.+?[.-](.+)\.amazonaws.com$/)
440
+ elsif matches = endpoint.match(/^.+?[.-](.+)\.amazonaws.com/)
441
441
  matches[1]
442
442
  else
443
443
  AWS.const_get(name).global_endpoint? ? 'us-east-1' : config.region
@@ -89,6 +89,7 @@ module AWS
89
89
  # @api private
90
90
  attr_accessor :continue_timeout
91
91
 
92
+ # @api private
92
93
  def endpoint
93
94
  scheme = use_ssl ? 'https' : 'http'
94
95
  port = case scheme
@@ -237,7 +238,7 @@ module AWS
237
238
  end
238
239
 
239
240
  def encoded
240
- value ? "#{escape(name)}=#{escape(value)}" : escape(name)
241
+ value ? "#{escape(name)}=#{escape(value)}" : "#{escape(name)}="
241
242
  end
242
243
 
243
244
  end
@@ -0,0 +1,46 @@
1
+ # Copyright 2011-2013 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 'base64'
15
+
16
+ module AWS
17
+ module Core
18
+ module Signers
19
+ # @api private
20
+ module Base
21
+
22
+ # Signs a string using the credentials stored in memory.
23
+ # @param [String] secret Usually an AWS secret access key.
24
+ # @param [String] string_to_sign The string to sign.
25
+ # @param [String] digest_method The digest method to use when
26
+ # computing the HMAC digest.
27
+ # @return [String] Returns the computed signature.
28
+ def sign secret, string_to_sign, digest_method = 'sha256'
29
+ Base64.encode64(hmac(secret, string_to_sign, digest_method)).strip
30
+ end
31
+ module_function :sign
32
+
33
+ # Computes an HMAC digest of the passed string.
34
+ # @param [String] key
35
+ # @param [String] value
36
+ # @param [String] digest ('sha256')
37
+ # @return [String]
38
+ def hmac key, value, digest = 'sha256'
39
+ OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new(digest), key, value)
40
+ end
41
+ module_function :hmac
42
+
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,56 @@
1
+ # Copyright 2011-2013 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 'time'
15
+
16
+ module AWS
17
+ module Core
18
+ module Signers
19
+ class CloudFront
20
+
21
+ include Base
22
+
23
+ # @param [CredentialProviders::Provider] credentials
24
+ def initialize credentials
25
+ @credentials = credentials
26
+ end
27
+
28
+ # @return [CredentialProviders::Provider]
29
+ attr_reader :credentials
30
+
31
+ # @param [Http::Request] req
32
+ # @return [Http::Request]
33
+ def sign_request req
34
+ req.headers['x-amz-security-token'] = credentials.session_token if
35
+ credentials.session_token
36
+ req.headers['authorization'] =
37
+ "AWS #{credentials.access_key_id}:#{signature(req)}"
38
+ req
39
+ end
40
+
41
+ private
42
+
43
+ # @param [Http::Request] req
44
+ def signature req
45
+ sign(credentials.secret_access_key, string_to_sign(req), 'sha1')
46
+ end
47
+
48
+ # @param [Http::Request] req
49
+ def string_to_sign req
50
+ req.headers['date'] ||= Time.now.httpdate
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,159 @@
1
+ # Copyright 2011-2013 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 Signers
17
+ # @api private
18
+ class S3
19
+
20
+ SUB_RESOURCES = %w(
21
+ acl location logging notification partNumber policy
22
+ requestPayment torrent uploadId uploads versionId
23
+ versioning versions restore delete lifecycle tagging cors
24
+ website
25
+ )
26
+
27
+ QUERY_PARAMS = %w(
28
+ response-content-type response-content-language
29
+ response-expires response-cache-control
30
+ response-content-disposition response-content-encoding
31
+ )
32
+
33
+ # @param [CredentialProviders::Provider] credentials
34
+ def initialize credentials
35
+ @credentials = credentials
36
+ end
37
+
38
+ # @return [CredentialProviders::Provider]
39
+ attr_reader :credentials
40
+
41
+ # @param [Http::Request] req
42
+ # @return [Http::Request]
43
+ def sign_request req
44
+ if token = credentials.session_token
45
+ req.headers["x-amz-security-token"] = token
46
+ end
47
+ req.headers["authorization"] = authorization(req)
48
+ end
49
+
50
+ private
51
+
52
+ def authorization req
53
+ "AWS #{credentials.access_key_id}:#{signature(req)}"
54
+ end
55
+
56
+ def signature req
57
+ secret = credentials.secret_access_key
58
+ signature = self.class.string_to_sign(req)
59
+ signature = Base.sign(credentials.secret_access_key, signature, 'sha1')
60
+ URI.escape(signature)
61
+ end
62
+
63
+ class << self
64
+
65
+ # From the S3 developer guide:
66
+ #
67
+ # StringToSign =
68
+ # HTTP-Verb ` "\n" `
69
+ # content-md5 ` "\n" `
70
+ # content-type ` "\n" `
71
+ # date ` "\n" `
72
+ # CanonicalizedAmzHeaders + CanonicalizedResource;
73
+ #
74
+ def string_to_sign req
75
+ [
76
+ req.http_method,
77
+ req.headers.values_at('content-md5', 'content-type').join("\n"),
78
+ signing_string_date(req),
79
+ canonicalized_headers(req),
80
+ canonicalized_resource(req),
81
+ ].flatten.compact.join("\n")
82
+ end
83
+
84
+ def signing_string_date req
85
+ # if a date is provided via x-amz-date then we should omit the
86
+ # Date header from the signing string (should appear as a blank line)
87
+ if req.headers.detect{|k,v| k.to_s =~ /^x-amz-date$/i }
88
+ ''
89
+ else
90
+ req.headers['date'] ||= Time.now.httpdate
91
+ end
92
+ end
93
+
94
+ # CanonicalizedAmzHeaders
95
+ #
96
+ # See the developer guide for more information on how this element
97
+ # is generated.
98
+ #
99
+ def canonicalized_headers req
100
+ x_amz = req.headers.select{|k, v| k.to_s =~ /^x-amz-/i }
101
+ x_amz = x_amz.collect{|k, v| [k.downcase, v] }
102
+ x_amz = x_amz.sort_by{|k, v| k }
103
+ x_amz = x_amz.collect{|k, v| "#{k}:#{v.to_s.strip}" }.join("\n")
104
+ x_amz == '' ? nil : x_amz
105
+ end
106
+
107
+ # From the S3 developer guide
108
+ #
109
+ # CanonicalizedResource =
110
+ # [ "/" ` Bucket ] `
111
+ # <HTTP-Request-URI, protocol name up to the querystring> +
112
+ # [ sub-resource, if present. e.g. "?acl", "?location",
113
+ # "?logging", or "?torrent"];
114
+ #
115
+ # @api private
116
+ def canonicalized_resource req
117
+
118
+ parts = []
119
+
120
+ # virtual hosted-style requests require the hostname to appear
121
+ # in the canonicalized resource prefixed by a forward slash.
122
+ if
123
+ AWS::S3::Client.dns_compatible_bucket_name?(req.bucket) and
124
+ !req.path_style?
125
+ then
126
+ parts << "/#{req.bucket}"
127
+ end
128
+
129
+ # all requests require the portion of the un-decoded uri up to
130
+ # but not including the query string
131
+ parts << req.path
132
+
133
+ # lastly any sub resource querystring params need to be appened
134
+ # in lexigraphical ordered joined by '&' and prefixed by '?'
135
+ params =
136
+ sub_resource_params(req) +
137
+ query_parameters_for_signature(req)
138
+
139
+ unless params.empty?
140
+ parts << '?'
141
+ parts << params.sort.collect{|p| p.to_s }.join('&')
142
+ end
143
+
144
+ parts.join
145
+ end
146
+
147
+ def sub_resource_params req
148
+ req.params.select{|p| SUB_RESOURCES.include?(p.name) }
149
+ end
150
+
151
+ def query_parameters_for_signature req
152
+ req.params.select { |p| QUERY_PARAMS.include?(p.name) }
153
+ end
154
+
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end