aws-sdk 1.30.1 → 1.31.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.
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