aws-sdk-s3 1.113.0 → 1.129.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +131 -0
- data/VERSION +1 -1
- data/lib/aws-sdk-s3/bucket.rb +108 -55
- data/lib/aws-sdk-s3/bucket_acl.rb +9 -3
- data/lib/aws-sdk-s3/bucket_cors.rb +12 -4
- data/lib/aws-sdk-s3/bucket_lifecycle.rb +12 -4
- data/lib/aws-sdk-s3/bucket_lifecycle_configuration.rb +12 -4
- data/lib/aws-sdk-s3/bucket_logging.rb +9 -3
- data/lib/aws-sdk-s3/bucket_notification.rb +9 -3
- data/lib/aws-sdk-s3/bucket_policy.rb +12 -4
- data/lib/aws-sdk-s3/bucket_request_payment.rb +9 -3
- data/lib/aws-sdk-s3/bucket_tagging.rb +12 -4
- data/lib/aws-sdk-s3/bucket_versioning.rb +15 -5
- data/lib/aws-sdk-s3/bucket_website.rb +12 -4
- data/lib/aws-sdk-s3/client.rb +1869 -1550
- data/lib/aws-sdk-s3/client_api.rb +213 -189
- data/lib/aws-sdk-s3/customizations/bucket.rb +23 -47
- data/lib/aws-sdk-s3/customizations/errors.rb +27 -0
- data/lib/aws-sdk-s3/customizations/object.rb +32 -19
- data/lib/aws-sdk-s3/customizations/types/permanent_redirect.rb +26 -0
- data/lib/aws-sdk-s3/customizations.rb +2 -0
- data/lib/aws-sdk-s3/encryption/client.rb +6 -2
- data/lib/aws-sdk-s3/encryption/kms_cipher_provider.rb +13 -9
- data/lib/aws-sdk-s3/encryptionV2/client.rb +6 -2
- data/lib/aws-sdk-s3/encryptionV2/decrypt_handler.rb +1 -0
- data/lib/aws-sdk-s3/encryptionV2/kms_cipher_provider.rb +10 -6
- data/lib/aws-sdk-s3/endpoint_parameters.rb +142 -0
- data/lib/aws-sdk-s3/endpoint_provider.rb +733 -0
- data/lib/aws-sdk-s3/endpoints.rb +2150 -0
- data/lib/aws-sdk-s3/file_downloader.rb +28 -24
- data/lib/aws-sdk-s3/file_uploader.rb +8 -6
- data/lib/aws-sdk-s3/multipart_stream_uploader.rb +41 -13
- data/lib/aws-sdk-s3/multipart_upload.rb +12 -4
- data/lib/aws-sdk-s3/multipart_upload_part.rb +10 -4
- data/lib/aws-sdk-s3/object.rb +105 -77
- data/lib/aws-sdk-s3/object_acl.rb +9 -3
- data/lib/aws-sdk-s3/object_copier.rb +7 -5
- data/lib/aws-sdk-s3/object_multipart_copier.rb +11 -5
- data/lib/aws-sdk-s3/object_summary.rb +106 -65
- data/lib/aws-sdk-s3/object_version.rb +35 -9
- data/lib/aws-sdk-s3/plugins/accelerate.rb +3 -50
- data/lib/aws-sdk-s3/plugins/arn.rb +0 -184
- data/lib/aws-sdk-s3/plugins/bucket_dns.rb +3 -39
- data/lib/aws-sdk-s3/plugins/bucket_name_restrictions.rb +1 -6
- data/lib/aws-sdk-s3/plugins/dualstack.rb +1 -49
- data/lib/aws-sdk-s3/plugins/endpoints.rb +262 -0
- data/lib/aws-sdk-s3/plugins/expect_100_continue.rb +2 -1
- data/lib/aws-sdk-s3/plugins/iad_regional_endpoint.rb +0 -29
- data/lib/aws-sdk-s3/plugins/s3_signer.rb +35 -124
- data/lib/aws-sdk-s3/plugins/streaming_retry.rb +23 -2
- data/lib/aws-sdk-s3/presigned_post.rb +61 -59
- data/lib/aws-sdk-s3/presigner.rb +24 -35
- data/lib/aws-sdk-s3/resource.rb +7 -3
- data/lib/aws-sdk-s3/types.rb +714 -4040
- data/lib/aws-sdk-s3.rb +5 -1
- metadata +12 -11
- data/lib/aws-sdk-s3/arn/access_point_arn.rb +0 -69
- data/lib/aws-sdk-s3/arn/multi_region_access_point_arn.rb +0 -68
- data/lib/aws-sdk-s3/arn/object_lambda_arn.rb +0 -69
- data/lib/aws-sdk-s3/arn/outpost_access_point_arn.rb +0 -74
- data/lib/aws-sdk-s3/plugins/object_lambda_endpoint.rb +0 -25
| @@ -5,28 +5,13 @@ require 'aws-sigv4' | |
| 5 5 | 
             
            module Aws
         | 
| 6 6 | 
             
              module S3
         | 
| 7 7 | 
             
                module Plugins
         | 
| 8 | 
            -
                  # This plugin  | 
| 8 | 
            +
                  # This plugin used to have a V4 signer but it was removed in favor of
         | 
| 9 | 
            +
                  # generic Sign plugin that uses endpoint auth scheme.
         | 
| 10 | 
            +
                  #
         | 
| 9 11 | 
             
                  # @api private
         | 
| 10 12 | 
             
                  class S3Signer < Seahorse::Client::Plugin
         | 
| 11 13 | 
             
                    option(:signature_version, 'v4')
         | 
| 12 14 |  | 
| 13 | 
            -
                    option(:sigv4_signer) do |cfg|
         | 
| 14 | 
            -
                      S3Signer.build_v4_signer(
         | 
| 15 | 
            -
                        service: 's3',
         | 
| 16 | 
            -
                        region: cfg.sigv4_region,
         | 
| 17 | 
            -
                        credentials: cfg.credentials
         | 
| 18 | 
            -
                      )
         | 
| 19 | 
            -
                    end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                    option(:sigv4_region) do |cfg|
         | 
| 22 | 
            -
                      # S3 removes core's signature_v4 plugin that checks for this
         | 
| 23 | 
            -
                      raise Aws::Errors::MissingRegionError if cfg.region.nil?
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                      Aws::Partitions::EndpointProvider.signing_region(
         | 
| 26 | 
            -
                        cfg.region, 's3'
         | 
| 27 | 
            -
                      )
         | 
| 28 | 
            -
                    end
         | 
| 29 | 
            -
             | 
| 30 15 | 
             
                    def add_handlers(handlers, cfg)
         | 
| 31 16 | 
             
                      case cfg.signature_version
         | 
| 32 17 | 
             
                      when 'v4' then add_v4_handlers(handlers)
         | 
| @@ -39,11 +24,11 @@ module Aws | |
| 39 24 |  | 
| 40 25 | 
             
                    def add_v4_handlers(handlers)
         | 
| 41 26 | 
             
                      handlers.add(CachedBucketRegionHandler, step: :sign, priority: 60)
         | 
| 42 | 
            -
                      handlers.add(V4Handler, step: :sign)
         | 
| 43 27 | 
             
                      handlers.add(BucketRegionErrorHandler, step: :sign, priority: 40)
         | 
| 44 28 | 
             
                    end
         | 
| 45 29 |  | 
| 46 30 | 
             
                    def add_legacy_handler(handlers)
         | 
| 31 | 
            +
                      # generic Sign plugin will be skipped if it sees sigv2
         | 
| 47 32 | 
             
                      handlers.add(LegacyHandler, step: :sign)
         | 
| 48 33 | 
             
                    end
         | 
| 49 34 |  | 
| @@ -54,53 +39,6 @@ module Aws | |
| 54 39 | 
             
                      end
         | 
| 55 40 | 
             
                    end
         | 
| 56 41 |  | 
| 57 | 
            -
                    class V4Handler < Seahorse::Client::Handler
         | 
| 58 | 
            -
                      def call(context)
         | 
| 59 | 
            -
                        Aws::Plugins::SignatureV4.apply_signature(
         | 
| 60 | 
            -
                          context: context,
         | 
| 61 | 
            -
                          signer: sigv4_signer(context)
         | 
| 62 | 
            -
                        )
         | 
| 63 | 
            -
                        @handler.call(context)
         | 
| 64 | 
            -
                      end
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                      private
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                      def sigv4_signer(context)
         | 
| 69 | 
            -
                        # If the client was configured with the wrong region,
         | 
| 70 | 
            -
                        # we have to build a new signer.
         | 
| 71 | 
            -
                        if context[:cached_sigv4_region] &&
         | 
| 72 | 
            -
                           context[:cached_sigv4_region] != context.config.sigv4_signer.region
         | 
| 73 | 
            -
                          S3Signer.build_v4_signer(
         | 
| 74 | 
            -
                            service: 's3',
         | 
| 75 | 
            -
                            region: context[:cached_sigv4_region],
         | 
| 76 | 
            -
                            credentials: context.config.credentials
         | 
| 77 | 
            -
                          )
         | 
| 78 | 
            -
                        elsif (arn = context.metadata[:s3_arn])
         | 
| 79 | 
            -
                          if arn[:arn].is_a?(MultiRegionAccessPointARN)
         | 
| 80 | 
            -
                            signing_region = '*'
         | 
| 81 | 
            -
                            signing_algorithm = :sigv4a
         | 
| 82 | 
            -
                          else
         | 
| 83 | 
            -
                            signing_region = arn[:resolved_region]
         | 
| 84 | 
            -
                            signing_algorithm = :sigv4
         | 
| 85 | 
            -
                          end
         | 
| 86 | 
            -
                          S3Signer.build_v4_signer(
         | 
| 87 | 
            -
                            service: arn[:arn].service,
         | 
| 88 | 
            -
                            signing_algorithm: signing_algorithm,
         | 
| 89 | 
            -
                            region: signing_region,
         | 
| 90 | 
            -
                            credentials: context.config.credentials
         | 
| 91 | 
            -
                          )
         | 
| 92 | 
            -
                        elsif context.operation.name == 'WriteGetObjectResponse'
         | 
| 93 | 
            -
                          S3Signer.build_v4_signer(
         | 
| 94 | 
            -
                            service: 's3-object-lambda',
         | 
| 95 | 
            -
                            region: context.config.sigv4_region,
         | 
| 96 | 
            -
                            credentials: context.config.credentials
         | 
| 97 | 
            -
                          )
         | 
| 98 | 
            -
                        else
         | 
| 99 | 
            -
                          context.config.sigv4_signer
         | 
| 100 | 
            -
                        end
         | 
| 101 | 
            -
                      end
         | 
| 102 | 
            -
                    end
         | 
| 103 | 
            -
             | 
| 104 42 | 
             
                    # This handler will update the http endpoint when the bucket region
         | 
| 105 43 | 
             
                    # is known/cached.
         | 
| 106 44 | 
             
                    class CachedBucketRegionHandler < Seahorse::Client::Handler
         | 
| @@ -114,11 +52,13 @@ module Aws | |
| 114 52 |  | 
| 115 53 | 
             
                      def check_for_cached_region(context, bucket)
         | 
| 116 54 | 
             
                        cached_region = S3::BUCKET_REGIONS[bucket]
         | 
| 117 | 
            -
                        if cached_region && | 
| 55 | 
            +
                        if cached_region &&
         | 
| 56 | 
            +
                           cached_region != context.config.region &&
         | 
| 57 | 
            +
                           !S3Signer.custom_endpoint?(context)
         | 
| 118 58 | 
             
                          context.http_request.endpoint.host = S3Signer.new_hostname(
         | 
| 119 59 | 
             
                            context, cached_region
         | 
| 120 60 | 
             
                          )
         | 
| 121 | 
            -
                          context[: | 
| 61 | 
            +
                          context[:sigv4_region] = cached_region # Sign plugin will use this
         | 
| 122 62 | 
             
                        end
         | 
| 123 63 | 
             
                      end
         | 
| 124 64 | 
             
                    end
         | 
| @@ -126,7 +66,8 @@ module Aws | |
| 126 66 | 
             
                    # This handler detects when a request fails because of a mismatched bucket
         | 
| 127 67 | 
             
                    # region. It follows up by making a request to determine the correct
         | 
| 128 68 | 
             
                    # region, then finally a version 4 signed request against the correct
         | 
| 129 | 
            -
                    # regional endpoint.
         | 
| 69 | 
            +
                    # regional endpoint. This is intended for s3's global endpoint which
         | 
| 70 | 
            +
                    # will return 400 if the bucket is not in region.
         | 
| 130 71 | 
             
                    class BucketRegionErrorHandler < Seahorse::Client::Handler
         | 
| 131 72 | 
             
                      def call(context)
         | 
| 132 73 | 
             
                        response = @handler.call(context)
         | 
| @@ -138,7 +79,8 @@ module Aws | |
| 138 79 | 
             
                      def handle_region_errors(response)
         | 
| 139 80 | 
             
                        if wrong_sigv4_region?(response) &&
         | 
| 140 81 | 
             
                           !fips_region?(response) &&
         | 
| 141 | 
            -
                           !custom_endpoint?(response)
         | 
| 82 | 
            +
                           !S3Signer.custom_endpoint?(response.context) &&
         | 
| 83 | 
            +
                           !expired_credentials?(response)
         | 
| 142 84 | 
             
                          get_region_and_retry(response.context)
         | 
| 143 85 | 
             
                        else
         | 
| 144 86 | 
             
                          response
         | 
| @@ -159,19 +101,11 @@ module Aws | |
| 159 101 | 
             
                      end
         | 
| 160 102 |  | 
| 161 103 | 
             
                      def fips_region?(resp)
         | 
| 162 | 
            -
                        resp.context.http_request.endpoint.host.include?('fips')
         | 
| 104 | 
            +
                        resp.context.http_request.endpoint.host.include?('s3-fips.')
         | 
| 163 105 | 
             
                      end
         | 
| 164 106 |  | 
| 165 | 
            -
                      def  | 
| 166 | 
            -
                         | 
| 167 | 
            -
                          resp.context.config.region,
         | 
| 168 | 
            -
                          's3',
         | 
| 169 | 
            -
                          {
         | 
| 170 | 
            -
                            dualstack: resp.context[:use_dualstack_endpoint],
         | 
| 171 | 
            -
                            fips: resp.context.config.use_fips_endpoint
         | 
| 172 | 
            -
                          }
         | 
| 173 | 
            -
                        )
         | 
| 174 | 
            -
                        !resp.context.http_request.endpoint.hostname.include?(resolved_suffix)
         | 
| 107 | 
            +
                      def expired_credentials?(resp)
         | 
| 108 | 
            +
                        resp.context.http_response.body_contents.match(/<Code>ExpiredToken<\/Code>/)
         | 
| 175 109 | 
             
                      end
         | 
| 176 110 |  | 
| 177 111 | 
             
                      def wrong_sigv4_region?(resp)
         | 
| @@ -186,18 +120,14 @@ module Aws | |
| 186 120 | 
             
                          context, actual_region
         | 
| 187 121 | 
             
                        )
         | 
| 188 122 | 
             
                        context.metadata[:redirect_region] = actual_region
         | 
| 189 | 
            -
             | 
| 190 | 
            -
                         | 
| 191 | 
            -
                           | 
| 192 | 
            -
             | 
| 193 | 
            -
             | 
| 194 | 
            -
                          context: context,
         | 
| 195 | 
            -
                          signer: S3Signer.build_v4_signer(
         | 
| 196 | 
            -
                            service: service || 's3',
         | 
| 197 | 
            -
                            region: actual_region,
         | 
| 198 | 
            -
                            credentials: context.config.credentials
         | 
| 199 | 
            -
                          )
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                        signer = Aws::Plugins::Sign.signer_for(
         | 
| 125 | 
            +
                          context[:auth_scheme],
         | 
| 126 | 
            +
                          context.config,
         | 
| 127 | 
            +
                          actual_region
         | 
| 200 128 | 
             
                        )
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                        signer.sign(context)
         | 
| 201 131 | 
             
                      end
         | 
| 202 132 |  | 
| 203 133 | 
             
                      def region_from_body(body)
         | 
| @@ -223,41 +153,22 @@ module Aws | |
| 223 153 | 
             
                    end
         | 
| 224 154 |  | 
| 225 155 | 
             
                    class << self
         | 
| 226 | 
            -
                       | 
| 227 | 
            -
             | 
| 228 | 
            -
             | 
| 229 | 
            -
             | 
| 230 | 
            -
                         | 
| 231 | 
            -
                           | 
| 232 | 
            -
             | 
| 233 | 
            -
                          credentials_provider: options[:credentials],
         | 
| 234 | 
            -
                          signing_algorithm: options.fetch(:signing_algorithm, :sigv4),
         | 
| 235 | 
            -
                          uri_escape_path: false,
         | 
| 236 | 
            -
                          unsigned_headers: ['content-length', 'x-amzn-trace-id']
         | 
| 237 | 
            -
                        )
         | 
| 156 | 
            +
                      def new_hostname(context, region)
         | 
| 157 | 
            +
                        endpoint_params = context[:endpoint_params].dup
         | 
| 158 | 
            +
                        endpoint_params.region = region
         | 
| 159 | 
            +
                        endpoint_params.endpoint = nil
         | 
| 160 | 
            +
                        endpoint =
         | 
| 161 | 
            +
                          context.config.endpoint_provider.resolve_endpoint(endpoint_params)
         | 
| 162 | 
            +
                        URI(endpoint.url).host
         | 
| 238 163 | 
             
                      end
         | 
| 239 164 |  | 
| 240 | 
            -
                       | 
| 241 | 
            -
             | 
| 242 | 
            -
             | 
| 243 | 
            -
                         | 
| 244 | 
            -
                          Aws::Partitions::EndpointProvider.resolve(
         | 
| 245 | 
            -
                            region, 's3', 'regional',
         | 
| 246 | 
            -
                            {
         | 
| 247 | 
            -
                              dualstack: context[:use_dualstack_endpoint],
         | 
| 248 | 
            -
                              fips: context.config.use_fips_endpoint
         | 
| 249 | 
            -
                            }
         | 
| 250 | 
            -
                          )
         | 
| 251 | 
            -
                        )
         | 
| 165 | 
            +
                      def custom_endpoint?(context)
         | 
| 166 | 
            +
                        region = context.config.region
         | 
| 167 | 
            +
                        partition = Aws::Endpoints::Matchers.aws_partition(region)
         | 
| 168 | 
            +
                        endpoint = context.http_request.endpoint
         | 
| 252 169 |  | 
| 253 | 
            -
                         | 
| 254 | 
            -
                           | 
| 255 | 
            -
                          ARN.resolve_url!(
         | 
| 256 | 
            -
                            uri, arn[:arn], region, arn[:fips], arn[:dualstack]
         | 
| 257 | 
            -
                          ).host
         | 
| 258 | 
            -
                        else
         | 
| 259 | 
            -
                          "#{context.params[:bucket]}.#{uri.host}"
         | 
| 260 | 
            -
                        end
         | 
| 170 | 
            +
                        !endpoint.hostname.include?(partition['dnsSuffix']) &&
         | 
| 171 | 
            +
                          !endpoint.hostname.include?(partition['dualStackDnsSuffix'])
         | 
| 261 172 | 
             
                      end
         | 
| 262 173 | 
             
                    end
         | 
| 263 174 | 
             
                  end
         | 
| @@ -36,6 +36,17 @@ module Aws | |
| 36 36 | 
             
                    def rewind; end
         | 
| 37 37 | 
             
                  end
         | 
| 38 38 |  | 
| 39 | 
            +
                  class NonRetryableStreamingError < StandardError
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    def initialize(error)
         | 
| 42 | 
            +
                      super('Unable to retry request - retry could result in processing duplicated chunks.')
         | 
| 43 | 
            +
                      set_backtrace(error.backtrace)
         | 
| 44 | 
            +
                      @original_error = error
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                    attr_reader :original_error
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 39 50 | 
             
                  # This handler works with the ResponseTarget plugin to provide smart
         | 
| 40 51 | 
             
                  # retries of S3 streaming operations that support the range parameter
         | 
| 41 52 | 
             
                  # (currently only: get_object).  When a 200 OK with a TruncatedBodyError
         | 
| @@ -84,8 +95,18 @@ module Aws | |
| 84 95 | 
             
                        end
         | 
| 85 96 |  | 
| 86 97 | 
             
                        context.http_response.on_error do |error|
         | 
| 87 | 
            -
                          if retryable_body?(context) | 
| 88 | 
            -
                             | 
| 98 | 
            +
                          if retryable_body?(context)
         | 
| 99 | 
            +
                            if truncated_body?(error)
         | 
| 100 | 
            +
                              context.http_request.headers[:range] = "bytes=#{context.http_response.body.size}-"
         | 
| 101 | 
            +
                            else
         | 
| 102 | 
            +
                              case context.http_response.body
         | 
| 103 | 
            +
                              when RetryableManagedFile
         | 
| 104 | 
            +
                                # call rewind on the underlying file
         | 
| 105 | 
            +
                                context.http_response.body.instance_variable_get(:@file).rewind
         | 
| 106 | 
            +
                              else
         | 
| 107 | 
            +
                                raise NonRetryableStreamingError, error
         | 
| 108 | 
            +
                              end
         | 
| 109 | 
            +
                            end
         | 
| 89 110 | 
             
                          end
         | 
| 90 111 | 
             
                        end
         | 
| 91 112 | 
             
                      end
         | 
| @@ -315,26 +315,28 @@ module Aws | |
| 315 315 |  | 
| 316 316 | 
             
                  # @!group Fields
         | 
| 317 317 |  | 
| 318 | 
            -
                  #  | 
| 319 | 
            -
                  #  | 
| 320 | 
            -
                  #  | 
| 318 | 
            +
                  # @!method key(key)
         | 
| 319 | 
            +
                  #   The key to use for the uploaded object. You can use `${filename}`
         | 
| 320 | 
            +
                  #   as a variable in the key. This will be replaced with the name
         | 
| 321 | 
            +
                  #   of the file as provided by the user.
         | 
| 321 322 | 
             
                  #
         | 
| 322 | 
            -
                  # | 
| 323 | 
            -
                  # | 
| 324 | 
            -
                  # | 
| 323 | 
            +
                  #   For example, if the key is given as `/user/betty/${filename}` and
         | 
| 324 | 
            +
                  #   the file uploaded is named `lolcatz.jpg`, the resultant key will
         | 
| 325 | 
            +
                  #   be `/user/betty/lolcatz.jpg`.
         | 
| 325 326 | 
             
                  #
         | 
| 326 | 
            -
                  # | 
| 327 | 
            -
                  # | 
| 328 | 
            -
                  # | 
| 327 | 
            +
                  #   @param [String] key
         | 
| 328 | 
            +
                  #   @see http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html)
         | 
| 329 | 
            +
                  #   @return [self]
         | 
| 329 330 | 
             
                  define_field(:key) do |key|
         | 
| 330 331 | 
             
                    @key_set = true
         | 
| 331 332 | 
             
                    with('key', key)
         | 
| 332 333 | 
             
                  end
         | 
| 333 334 |  | 
| 334 | 
            -
                  #  | 
| 335 | 
            -
                  #  | 
| 336 | 
            -
                  # | 
| 337 | 
            -
                  # | 
| 335 | 
            +
                  # @!method key_starts_with(prefix)
         | 
| 336 | 
            +
                  #   Specify a prefix the uploaded
         | 
| 337 | 
            +
                  #   @param [String] prefix
         | 
| 338 | 
            +
                  #   @see #key
         | 
| 339 | 
            +
                  #   @return [self]
         | 
| 338 340 | 
             
                  define_field(:key_starts_with) do |prefix|
         | 
| 339 341 | 
             
                    @key_set = true
         | 
| 340 342 | 
             
                    starts_with('key', prefix)
         | 
| @@ -412,26 +414,29 @@ module Aws | |
| 412 414 | 
             
                  #   @return [self]
         | 
| 413 415 | 
             
                  define_field(:content_encoding, 'Content-Encoding', starts_with: true)
         | 
| 414 416 |  | 
| 415 | 
            -
                  #  | 
| 416 | 
            -
                  #  | 
| 417 | 
            -
                  #    | 
| 418 | 
            -
                  # | 
| 419 | 
            -
                  # | 
| 420 | 
            -
                  # | 
| 417 | 
            +
                  # @!method expires(time)
         | 
| 418 | 
            +
                  #   The date and time at which the object is no longer cacheable.
         | 
| 419 | 
            +
                  #   @note This does not affect the expiration of the presigned post
         | 
| 420 | 
            +
                  #     signature.
         | 
| 421 | 
            +
                  #   @param [Time] time
         | 
| 422 | 
            +
                  #   @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21
         | 
| 423 | 
            +
                  #   @return [self]
         | 
| 421 424 | 
             
                  define_field(:expires) do |time|
         | 
| 422 425 | 
             
                    with('Expires', time.httpdate)
         | 
| 423 426 | 
             
                  end
         | 
| 424 427 |  | 
| 425 | 
            -
                  #  | 
| 426 | 
            -
                  # | 
| 427 | 
            -
                  # | 
| 428 | 
            +
                  # @!method expires_starts_with(prefix)
         | 
| 429 | 
            +
                  #   @param [String] prefix
         | 
| 430 | 
            +
                  #   @see #expires
         | 
| 431 | 
            +
                  #   @return [self]
         | 
| 428 432 | 
             
                  define_field(:expires_starts_with) do |prefix|
         | 
| 429 433 | 
             
                    starts_with('Expires', prefix)
         | 
| 430 434 | 
             
                  end
         | 
| 431 435 |  | 
| 432 | 
            -
                  #  | 
| 433 | 
            -
                  #  | 
| 434 | 
            -
                  # | 
| 436 | 
            +
                  # @!method content_length_range(byte_range)
         | 
| 437 | 
            +
                  #   The minimum and maximum allowable size for the uploaded content.
         | 
| 438 | 
            +
                  #   @param [Range<Integer>] byte_range
         | 
| 439 | 
            +
                  #   @return [self]
         | 
| 435 440 | 
             
                  define_field(:content_length_range) do |byte_range|
         | 
| 436 441 | 
             
                    min = byte_range.begin
         | 
| 437 442 | 
             
                    max = byte_range.end
         | 
| @@ -507,10 +512,11 @@ module Aws | |
| 507 512 | 
             
                  #   @return [self]
         | 
| 508 513 | 
             
                  define_field(:website_redirect_location, 'x-amz-website-redirect-location')
         | 
| 509 514 |  | 
| 510 | 
            -
                  #  | 
| 511 | 
            -
                  #  | 
| 512 | 
            -
                  #  | 
| 513 | 
            -
                  # | 
| 515 | 
            +
                  # @!method metadata(hash)
         | 
| 516 | 
            +
                  #   Metadata hash to store with the uploaded object. Hash keys will be
         | 
| 517 | 
            +
                  #   prefixed with "x-amz-meta-".
         | 
| 518 | 
            +
                  #   @param [Hash<String,String>] hash
         | 
| 519 | 
            +
                  #   @return [self]
         | 
| 514 520 | 
             
                  define_field(:metadata) do |hash|
         | 
| 515 521 | 
             
                    hash.each do |key, value|
         | 
| 516 522 | 
             
                      with("x-amz-meta-#{key}", value)
         | 
| @@ -518,10 +524,11 @@ module Aws | |
| 518 524 | 
             
                    self
         | 
| 519 525 | 
             
                  end
         | 
| 520 526 |  | 
| 521 | 
            -
                  #  | 
| 522 | 
            -
                  #  | 
| 523 | 
            -
                  # | 
| 524 | 
            -
                  # | 
| 527 | 
            +
                  # @!method metadata_starts_with(hash)
         | 
| 528 | 
            +
                  #   Specify allowable prefix for each key in the metadata hash.
         | 
| 529 | 
            +
                  #   @param [Hash<String,String>] hash
         | 
| 530 | 
            +
                  #   @see #metadata
         | 
| 531 | 
            +
                  #   @return [self]
         | 
| 525 532 | 
             
                  define_field(:metadata_starts_with) do |hash|
         | 
| 526 533 | 
             
                    hash.each do |key, value|
         | 
| 527 534 | 
             
                      starts_with("x-amz-meta-#{key}", value)
         | 
| @@ -571,24 +578,26 @@ module Aws | |
| 571 578 | 
             
                    'x-amz-server-side-encryption-customer-algorithm'
         | 
| 572 579 | 
             
                  )
         | 
| 573 580 |  | 
| 574 | 
            -
                  #  | 
| 575 | 
            -
                  #  | 
| 576 | 
            -
                  #  | 
| 581 | 
            +
                  # @!method server_side_encryption_customer_key(value)
         | 
| 582 | 
            +
                  #   Specifies the customer-provided encryption key for Amazon S3 to use
         | 
| 583 | 
            +
                  #   in encrypting data. This value is used to store the object and then
         | 
| 584 | 
            +
                  #   it is discarded; Amazon does not store the encryption key.
         | 
| 577 585 | 
             
                  #
         | 
| 578 | 
            -
                  # | 
| 586 | 
            +
                  #   You must also call {#server_side_encryption_customer_algorithm}.
         | 
| 579 587 | 
             
                  #
         | 
| 580 | 
            -
                  # | 
| 581 | 
            -
                  # | 
| 582 | 
            -
                  # | 
| 588 | 
            +
                  #   @param [String] value
         | 
| 589 | 
            +
                  #   @see #server_side_encryption_customer_algorithm
         | 
| 590 | 
            +
                  #   @return [self]
         | 
| 583 591 | 
             
                  define_field(:server_side_encryption_customer_key) do |value|
         | 
| 584 592 | 
             
                    field_name = 'x-amz-server-side-encryption-customer-key'
         | 
| 585 593 | 
             
                    with(field_name, base64(value))
         | 
| 586 594 | 
             
                    with(field_name + '-MD5', base64(OpenSSL::Digest::MD5.digest(value)))
         | 
| 587 595 | 
             
                  end
         | 
| 588 596 |  | 
| 589 | 
            -
                  #  | 
| 590 | 
            -
                  # | 
| 591 | 
            -
                  # | 
| 597 | 
            +
                  # @!method server_side_encryption_customer_key_starts_with(prefix)
         | 
| 598 | 
            +
                  #   @param [String] prefix
         | 
| 599 | 
            +
                  #   @see #server_side_encryption_customer_key
         | 
| 600 | 
            +
                  #   @return [self]
         | 
| 592 601 | 
             
                  define_field(:server_side_encryption_customer_key_starts_with) do |prefix|
         | 
| 593 602 | 
             
                    field_name = 'x-amz-server-side-encryption-customer-key'
         | 
| 594 603 | 
             
                    starts_with(field_name, prefix)
         | 
| @@ -629,22 +638,15 @@ module Aws | |
| 629 638 | 
             
                  end
         | 
| 630 639 |  | 
| 631 640 | 
             
                  def bucket_url
         | 
| 632 | 
            -
                     | 
| 633 | 
            -
                     | 
| 634 | 
            -
             | 
| 635 | 
            -
                       | 
| 636 | 
            -
             | 
| 637 | 
            -
                       | 
| 638 | 
            -
             | 
| 639 | 
            -
             | 
| 640 | 
            -
                     | 
| 641 | 
            -
                      url.path = "/#{@bucket_name}"
         | 
| 642 | 
            -
                    end
         | 
| 643 | 
            -
                    if @bucket_region == 'us-east-1'
         | 
| 644 | 
            -
                      # keep legacy behavior by default
         | 
| 645 | 
            -
                      url.host = Plugins::IADRegionalEndpoint.legacy_host(url.host)
         | 
| 646 | 
            -
                    end
         | 
| 647 | 
            -
                    url.to_s
         | 
| 641 | 
            +
                    # Taken from Aws::S3::Endpoints module
         | 
| 642 | 
            +
                    params = Aws::S3::EndpointParameters.new(
         | 
| 643 | 
            +
                      bucket: @bucket_name,
         | 
| 644 | 
            +
                      region: @bucket_region,
         | 
| 645 | 
            +
                      accelerate: @accelerate,
         | 
| 646 | 
            +
                      use_global_endpoint: true
         | 
| 647 | 
            +
                    )
         | 
| 648 | 
            +
                    endpoint = Aws::S3::EndpointProvider.new.resolve_endpoint(params)
         | 
| 649 | 
            +
                    endpoint.url
         | 
| 648 650 | 
             
                  end
         | 
| 649 651 |  | 
| 650 652 | 
             
                  # @return [Hash]
         | 
    
        data/lib/aws-sdk-s3/presigner.rb
    CHANGED
    
    | @@ -49,7 +49,8 @@ module Aws | |
| 49 49 | 
             
                  #   before the presigned URL expires. Defaults to 15 minutes. As signature
         | 
| 50 50 | 
             
                  #   version 4 has a maximum expiry time of one week for presigned URLs,
         | 
| 51 51 | 
             
                  #   attempts to set this value to greater than one week (604800) will
         | 
| 52 | 
            -
                  #   raise an exception.
         | 
| 52 | 
            +
                  #   raise an exception. The min value of this option and the credentials
         | 
| 53 | 
            +
                  #   expiration time is used in the presigned URL.
         | 
| 53 54 | 
             
                  #
         | 
| 54 55 | 
             
                  # @option params [Time] :time (Time.now) The starting time for when the
         | 
| 55 56 | 
             
                  #   presigned url becomes active.
         | 
| @@ -96,7 +97,8 @@ module Aws | |
| 96 97 | 
             
                  #   before the presigned URL expires. Defaults to 15 minutes. As signature
         | 
| 97 98 | 
             
                  #   version 4 has a maximum expiry time of one week for presigned URLs,
         | 
| 98 99 | 
             
                  #   attempts to set this value to greater than one week (604800) will
         | 
| 99 | 
            -
                  #   raise an exception.
         | 
| 100 | 
            +
                  #   raise an exception. The min value of this option and the credentials
         | 
| 101 | 
            +
                  #   expiration time is used in the presigned URL.
         | 
| 100 102 | 
             
                  #
         | 
| 101 103 | 
             
                  # @option params [Time] :time (Time.now) The starting time for when the
         | 
| 102 104 | 
             
                  #   presigned url becomes active.
         | 
| @@ -133,7 +135,7 @@ module Aws | |
| 133 135 | 
             
                    virtual_host = params.delete(:virtual_host)
         | 
| 134 136 | 
             
                    time = params.delete(:time)
         | 
| 135 137 | 
             
                    unsigned_headers = unsigned_headers(params)
         | 
| 136 | 
            -
                     | 
| 138 | 
            +
                    secure = params.delete(:secure) != false
         | 
| 137 139 | 
             
                    expires_in = expires_in(params)
         | 
| 138 140 |  | 
| 139 141 | 
             
                    req = @client.build_request(method, params)
         | 
| @@ -141,7 +143,7 @@ module Aws | |
| 141 143 | 
             
                    handle_presigned_url_context(req)
         | 
| 142 144 |  | 
| 143 145 | 
             
                    x_amz_headers = sign_but_dont_send(
         | 
| 144 | 
            -
                      req, expires_in,  | 
| 146 | 
            +
                      req, expires_in, secure, time, unsigned_headers, hoist
         | 
| 145 147 | 
             
                    )
         | 
| 146 148 | 
             
                    [req.send_request.data, x_amz_headers]
         | 
| 147 149 | 
             
                  end
         | 
| @@ -151,14 +153,6 @@ module Aws | |
| 151 153 | 
             
                    BLACKLISTED_HEADERS - whitelist_headers
         | 
| 152 154 | 
             
                  end
         | 
| 153 155 |  | 
| 154 | 
            -
                  def http_scheme(params)
         | 
| 155 | 
            -
                    if params.delete(:secure) == false
         | 
| 156 | 
            -
                      'http'
         | 
| 157 | 
            -
                    else
         | 
| 158 | 
            -
                      @client.config.endpoint.scheme
         | 
| 159 | 
            -
                    end
         | 
| 160 | 
            -
                  end
         | 
| 161 | 
            -
             | 
| 162 156 | 
             
                  def expires_in(params)
         | 
| 163 157 | 
             
                    if (expires_in = params.delete(:expires_in))
         | 
| 164 158 | 
             
                      if expires_in > ONE_WEEK
         | 
| @@ -175,8 +169,7 @@ module Aws | |
| 175 169 | 
             
                  end
         | 
| 176 170 |  | 
| 177 171 | 
             
                  def use_bucket_as_hostname(req)
         | 
| 178 | 
            -
                    req. | 
| 179 | 
            -
                    req.handle do |context|
         | 
| 172 | 
            +
                    req.handle(priority: 35) do |context|
         | 
| 180 173 | 
             
                      uri = context.http_request.endpoint
         | 
| 181 174 | 
             
                      uri.host = context.params[:bucket]
         | 
| 182 175 | 
             
                      uri.path.sub!("/#{context.params[:bucket]}", '')
         | 
| @@ -197,22 +190,21 @@ module Aws | |
| 197 190 |  | 
| 198 191 | 
             
                  # @param [Seahorse::Client::Request] req
         | 
| 199 192 | 
             
                  def sign_but_dont_send(
         | 
| 200 | 
            -
                    req, expires_in,  | 
| 193 | 
            +
                    req, expires_in, secure, time, unsigned_headers, hoist = true
         | 
| 201 194 | 
             
                  )
         | 
| 202 195 | 
             
                    x_amz_headers = {}
         | 
| 203 196 |  | 
| 204 197 | 
             
                    http_req = req.context.http_request
         | 
| 205 198 |  | 
| 206 199 | 
             
                    req.handlers.remove(Aws::S3::Plugins::S3Signer::LegacyHandler)
         | 
| 207 | 
            -
                    req.handlers.remove(Aws:: | 
| 200 | 
            +
                    req.handlers.remove(Aws::Plugins::Sign::Handler)
         | 
| 208 201 | 
             
                    req.handlers.remove(Seahorse::Client::Plugins::ContentLength::Handler)
         | 
| 209 202 |  | 
| 210 203 | 
             
                    req.handle(step: :send) do |context|
         | 
| 211 | 
            -
                      if  | 
| 212 | 
            -
             | 
| 213 | 
            -
                        endpoint.scheme =  | 
| 214 | 
            -
                        endpoint.port =  | 
| 215 | 
            -
                        http_req.endpoint = URI.parse(endpoint.to_s)
         | 
| 204 | 
            +
                      # if an endpoint was not provided, force secure or insecure
         | 
| 205 | 
            +
                      if context.config.regional_endpoint
         | 
| 206 | 
            +
                        http_req.endpoint.scheme = secure ? 'https' : 'http'
         | 
| 207 | 
            +
                        http_req.endpoint.port = secure ? 443 : 80
         | 
| 216 208 | 
             
                      end
         | 
| 217 209 |  | 
| 218 210 | 
             
                      query = http_req.endpoint.query ? http_req.endpoint.query.split('&') : []
         | 
| @@ -231,24 +223,21 @@ module Aws | |
| 231 223 | 
             
                      end
         | 
| 232 224 | 
             
                      http_req.endpoint.query = query.join('&') unless query.empty?
         | 
| 233 225 |  | 
| 234 | 
            -
                       | 
| 235 | 
            -
             | 
| 236 | 
            -
                       | 
| 237 | 
            -
             | 
| 238 | 
            -
             | 
| 239 | 
            -
             | 
| 240 | 
            -
             | 
| 241 | 
            -
                        signing_algorithm = arn[:arn].is_a?(MultiRegionAccessPointARN) ? :sigv4a : :sigv4
         | 
| 242 | 
            -
                      end
         | 
| 243 | 
            -
             | 
| 226 | 
            +
                      auth_scheme = context[:auth_scheme]
         | 
| 227 | 
            +
                      scheme_name = auth_scheme['name']
         | 
| 228 | 
            +
                      region = if scheme_name == 'sigv4a'
         | 
| 229 | 
            +
                                 auth_scheme['signingRegionSet'].first
         | 
| 230 | 
            +
                               else
         | 
| 231 | 
            +
                                 auth_scheme['signingRegion']
         | 
| 232 | 
            +
                               end
         | 
| 244 233 | 
             
                      signer = Aws::Sigv4::Signer.new(
         | 
| 245 | 
            -
                        service:  | 
| 234 | 
            +
                        service: auth_scheme['signingName'] || 's3',
         | 
| 246 235 | 
             
                        region: region || context.config.region,
         | 
| 247 | 
            -
                        signing_algorithm: signing_algorithm,
         | 
| 248 236 | 
             
                        credentials_provider: context.config.credentials,
         | 
| 237 | 
            +
                        signing_algorithm: scheme_name.to_sym,
         | 
| 238 | 
            +
                        uri_escape_path: !!!auth_scheme['disableDoubleEncoding'],
         | 
| 249 239 | 
             
                        unsigned_headers: unsigned_headers,
         | 
| 250 | 
            -
                        apply_checksum_header: false | 
| 251 | 
            -
                        uri_escape_path: false
         | 
| 240 | 
            +
                        apply_checksum_header: false
         | 
| 252 241 | 
             
                      )
         | 
| 253 242 |  | 
| 254 243 | 
             
                      url = signer.presign_url(
         | 
    
        data/lib/aws-sdk-s3/resource.rb
    CHANGED
    
    | @@ -41,7 +41,7 @@ module Aws::S3 | |
| 41 41 | 
             
                #     acl: "private", # accepts private, public-read, public-read-write, authenticated-read
         | 
| 42 42 | 
             
                #     bucket: "BucketName", # required
         | 
| 43 43 | 
             
                #     create_bucket_configuration: {
         | 
| 44 | 
            -
                #       location_constraint: "af-south-1", # accepts af-south-1, ap-east-1, ap-northeast-1, ap-northeast-2, ap-northeast-3, ap-south-1, ap-southeast-1, ap-southeast-2, ca-central-1, cn-north-1, cn-northwest-1, EU, eu-central-1, eu-north-1, eu-south-1, eu-west-1, eu-west-2, eu-west-3, me-south-1, sa-east-1, us-east-2, us-gov-east-1, us-gov-west-1, us-west-1, us-west-2
         | 
| 44 | 
            +
                #       location_constraint: "af-south-1", # accepts af-south-1, ap-east-1, ap-northeast-1, ap-northeast-2, ap-northeast-3, ap-south-1, ap-southeast-1, ap-southeast-2, ap-southeast-3, ca-central-1, cn-north-1, cn-northwest-1, EU, eu-central-1, eu-north-1, eu-south-1, eu-west-1, eu-west-2, eu-west-3, me-south-1, sa-east-1, us-east-2, us-gov-east-1, us-gov-west-1, us-west-1, us-west-2
         | 
| 45 45 | 
             
                #     },
         | 
| 46 46 | 
             
                #     grant_full_control: "GrantFullControl",
         | 
| 47 47 | 
             
                #     grant_read: "GrantRead",
         | 
| @@ -94,7 +94,9 @@ module Aws::S3 | |
| 94 94 | 
             
                #   equivalent form of this ACL expressed in the XML format.
         | 
| 95 95 | 
             
                # @return [Bucket]
         | 
| 96 96 | 
             
                def create_bucket(options = {})
         | 
| 97 | 
            -
                   | 
| 97 | 
            +
                  Aws::Plugins::UserAgent.feature('resource') do
         | 
| 98 | 
            +
                    @client.create_bucket(options)
         | 
| 99 | 
            +
                  end
         | 
| 98 100 | 
             
                  Bucket.new(
         | 
| 99 101 | 
             
                    name: options[:bucket],
         | 
| 100 102 | 
             
                    client: @client
         | 
| @@ -120,7 +122,9 @@ module Aws::S3 | |
| 120 122 | 
             
                def buckets(options = {})
         | 
| 121 123 | 
             
                  batches = Enumerator.new do |y|
         | 
| 122 124 | 
             
                    batch = []
         | 
| 123 | 
            -
                    resp =  | 
| 125 | 
            +
                    resp = Aws::Plugins::UserAgent.feature('resource') do
         | 
| 126 | 
            +
                      @client.list_buckets(options)
         | 
| 127 | 
            +
                    end
         | 
| 124 128 | 
             
                    resp.data.buckets.each do |b|
         | 
| 125 129 | 
             
                      batch << Bucket.new(
         | 
| 126 130 | 
             
                        name: b.name,
         |