aws-sdk-s3 1.114.0 → 1.136.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 +163 -0
 - data/VERSION +1 -1
 - data/lib/aws-sdk-s3/bucket.rb +123 -61
 - 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 +2084 -1724
 - 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 +95 -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 +146 -0
 - data/lib/aws-sdk-s3/endpoint_provider.rb +509 -0
 - data/lib/aws-sdk-s3/endpoints.rb +2150 -0
 - data/lib/aws-sdk-s3/file_downloader.rb +170 -44
 - 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 +27 -13
 - data/lib/aws-sdk-s3/multipart_upload_part.rb +20 -10
 - data/lib/aws-sdk-s3/object.rb +156 -110
 - data/lib/aws-sdk-s3/object_acl.rb +14 -6
 - data/lib/aws-sdk-s3/object_copier.rb +7 -5
 - data/lib/aws-sdk-s3/object_multipart_copier.rb +41 -19
 - data/lib/aws-sdk-s3/object_summary.rb +149 -94
 - data/lib/aws-sdk-s3/object_version.rb +55 -21
 - 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 +32 -126
 - 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 +858 -4125
 - 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
 
| 
         @@ -105,6 +105,20 @@ module Aws::S3 
     | 
|
| 
       105 
105 
     | 
    
         
             
                  data[:owner]
         
     | 
| 
       106 
106 
     | 
    
         
             
                end
         
     | 
| 
       107 
107 
     | 
    
         | 
| 
      
 108 
     | 
    
         
            +
                # Specifies the restoration status of an object. Objects in certain
         
     | 
| 
      
 109 
     | 
    
         
            +
                # storage classes must be restored before they can be retrieved. For
         
     | 
| 
      
 110 
     | 
    
         
            +
                # more information about these storage classes and how to work with
         
     | 
| 
      
 111 
     | 
    
         
            +
                # archived objects, see [ Working with archived objects][1] in the
         
     | 
| 
      
 112 
     | 
    
         
            +
                # *Amazon S3 User Guide*.
         
     | 
| 
      
 113 
     | 
    
         
            +
                #
         
     | 
| 
      
 114 
     | 
    
         
            +
                #
         
     | 
| 
      
 115 
     | 
    
         
            +
                #
         
     | 
| 
      
 116 
     | 
    
         
            +
                # [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/archived-objects.html
         
     | 
| 
      
 117 
     | 
    
         
            +
                # @return [Types::RestoreStatus]
         
     | 
| 
      
 118 
     | 
    
         
            +
                def restore_status
         
     | 
| 
      
 119 
     | 
    
         
            +
                  data[:restore_status]
         
     | 
| 
      
 120 
     | 
    
         
            +
                end
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
       108 
122 
     | 
    
         
             
                # @!endgroup
         
     | 
| 
       109 
123 
     | 
    
         | 
| 
       110 
124 
     | 
    
         
             
                # @return [Client]
         
     | 
| 
         @@ -229,7 +243,9 @@ module Aws::S3 
     | 
|
| 
       229 
243 
     | 
    
         
             
                      :retry
         
     | 
| 
       230 
244 
     | 
    
         
             
                    end
         
     | 
| 
       231 
245 
     | 
    
         
             
                  end
         
     | 
| 
       232 
     | 
    
         
            -
                  Aws:: 
     | 
| 
      
 246 
     | 
    
         
            +
                  Aws::Plugins::UserAgent.feature('resource') do
         
     | 
| 
      
 247 
     | 
    
         
            +
                    Aws::Waiters::Waiter.new(options).wait({})
         
     | 
| 
      
 248 
     | 
    
         
            +
                  end
         
     | 
| 
       233 
249 
     | 
    
         
             
                end
         
     | 
| 
       234 
250 
     | 
    
         | 
| 
       235 
251 
     | 
    
         
             
                # @!group Actions
         
     | 
| 
         @@ -251,9 +267,11 @@ module Aws::S3 
     | 
|
| 
       251 
267 
     | 
    
         
             
                # @option options [String] :request_payer
         
     | 
| 
       252 
268 
     | 
    
         
             
                #   Confirms that the requester knows that they will be charged for the
         
     | 
| 
       253 
269 
     | 
    
         
             
                #   request. Bucket owners need not specify this parameter in their
         
     | 
| 
       254 
     | 
    
         
            -
                #   requests.  
     | 
| 
       255 
     | 
    
         
            -
                #   Pays  
     | 
| 
       256 
     | 
    
         
            -
                #    
     | 
| 
      
 270 
     | 
    
         
            +
                #   requests. If either the source or destination Amazon S3 bucket has
         
     | 
| 
      
 271 
     | 
    
         
            +
                #   Requester Pays enabled, the requester will pay for corresponding
         
     | 
| 
      
 272 
     | 
    
         
            +
                #   charges to copy the object. For information about downloading objects
         
     | 
| 
      
 273 
     | 
    
         
            +
                #   from Requester Pays buckets, see [Downloading Objects in Requester
         
     | 
| 
      
 274 
     | 
    
         
            +
                #   Pays Buckets][1] in the *Amazon S3 User Guide*.
         
     | 
| 
       257 
275 
     | 
    
         
             
                #
         
     | 
| 
       258 
276 
     | 
    
         
             
                #
         
     | 
| 
       259 
277 
     | 
    
         
             
                #
         
     | 
| 
         @@ -273,7 +291,9 @@ module Aws::S3 
     | 
|
| 
       273 
291 
     | 
    
         
             
                    key: @object_key,
         
     | 
| 
       274 
292 
     | 
    
         
             
                    version_id: @id
         
     | 
| 
       275 
293 
     | 
    
         
             
                  )
         
     | 
| 
       276 
     | 
    
         
            -
                  resp =  
     | 
| 
      
 294 
     | 
    
         
            +
                  resp = Aws::Plugins::UserAgent.feature('resource') do
         
     | 
| 
      
 295 
     | 
    
         
            +
                    @client.delete_object(options)
         
     | 
| 
      
 296 
     | 
    
         
            +
                  end
         
     | 
| 
       277 
297 
     | 
    
         
             
                  resp.data
         
     | 
| 
       278 
298 
     | 
    
         
             
                end
         
     | 
| 
       279 
299 
     | 
    
         | 
| 
         @@ -315,7 +335,7 @@ module Aws::S3 
     | 
|
| 
       315 
335 
     | 
    
         
             
                # @option options [String] :range
         
     | 
| 
       316 
336 
     | 
    
         
             
                #   Downloads the specified range bytes of an object. For more information
         
     | 
| 
       317 
337 
     | 
    
         
             
                #   about the HTTP Range header, see
         
     | 
| 
       318 
     | 
    
         
            -
                #   [https://www. 
     | 
| 
      
 338 
     | 
    
         
            +
                #   [https://www.rfc-editor.org/rfc/rfc9110.html#name-range][1].
         
     | 
| 
       319 
339 
     | 
    
         
             
                #
         
     | 
| 
       320 
340 
     | 
    
         
             
                #   <note markdown="1"> Amazon S3 doesn't support retrieving multiple ranges of data per
         
     | 
| 
       321 
341 
     | 
    
         
             
                #   `GET` request.
         
     | 
| 
         @@ -324,7 +344,7 @@ module Aws::S3 
     | 
|
| 
       324 
344 
     | 
    
         
             
                #
         
     | 
| 
       325 
345 
     | 
    
         
             
                #
         
     | 
| 
       326 
346 
     | 
    
         
             
                #
         
     | 
| 
       327 
     | 
    
         
            -
                #   [1]: https://www. 
     | 
| 
      
 347 
     | 
    
         
            +
                #   [1]: https://www.rfc-editor.org/rfc/rfc9110.html#name-range
         
     | 
| 
       328 
348 
     | 
    
         
             
                # @option options [String] :response_cache_control
         
     | 
| 
       329 
349 
     | 
    
         
             
                #   Sets the `Cache-Control` header of the response.
         
     | 
| 
       330 
350 
     | 
    
         
             
                # @option options [String] :response_content_disposition
         
     | 
| 
         @@ -353,9 +373,11 @@ module Aws::S3 
     | 
|
| 
       353 
373 
     | 
    
         
             
                # @option options [String] :request_payer
         
     | 
| 
       354 
374 
     | 
    
         
             
                #   Confirms that the requester knows that they will be charged for the
         
     | 
| 
       355 
375 
     | 
    
         
             
                #   request. Bucket owners need not specify this parameter in their
         
     | 
| 
       356 
     | 
    
         
            -
                #   requests.  
     | 
| 
       357 
     | 
    
         
            -
                #   Pays  
     | 
| 
       358 
     | 
    
         
            -
                #    
     | 
| 
      
 376 
     | 
    
         
            +
                #   requests. If either the source or destination Amazon S3 bucket has
         
     | 
| 
      
 377 
     | 
    
         
            +
                #   Requester Pays enabled, the requester will pay for corresponding
         
     | 
| 
      
 378 
     | 
    
         
            +
                #   charges to copy the object. For information about downloading objects
         
     | 
| 
      
 379 
     | 
    
         
            +
                #   from Requester Pays buckets, see [Downloading Objects in Requester
         
     | 
| 
      
 380 
     | 
    
         
            +
                #   Pays Buckets][1] in the *Amazon S3 User Guide*.
         
     | 
| 
       359 
381 
     | 
    
         
             
                #
         
     | 
| 
       360 
382 
     | 
    
         
             
                #
         
     | 
| 
       361 
383 
     | 
    
         
             
                #
         
     | 
| 
         @@ -378,7 +400,9 @@ module Aws::S3 
     | 
|
| 
       378 
400 
     | 
    
         
             
                    key: @object_key,
         
     | 
| 
       379 
401 
     | 
    
         
             
                    version_id: @id
         
     | 
| 
       380 
402 
     | 
    
         
             
                  )
         
     | 
| 
       381 
     | 
    
         
            -
                  resp =  
     | 
| 
      
 403 
     | 
    
         
            +
                  resp = Aws::Plugins::UserAgent.feature('resource') do
         
     | 
| 
      
 404 
     | 
    
         
            +
                    @client.get_object(options, &block)
         
     | 
| 
      
 405 
     | 
    
         
            +
                  end
         
     | 
| 
       382 
406 
     | 
    
         
             
                  resp.data
         
     | 
| 
       383 
407 
     | 
    
         
             
                end
         
     | 
| 
       384 
408 
     | 
    
         | 
| 
         @@ -412,8 +436,10 @@ module Aws::S3 
     | 
|
| 
       412 
436 
     | 
    
         
             
                #   Return the object only if it has not been modified since the specified
         
     | 
| 
       413 
437 
     | 
    
         
             
                #   time; otherwise, return a 412 (precondition failed) error.
         
     | 
| 
       414 
438 
     | 
    
         
             
                # @option options [String] :range
         
     | 
| 
       415 
     | 
    
         
            -
                #    
     | 
| 
       416 
     | 
    
         
            -
                #    
     | 
| 
      
 439 
     | 
    
         
            +
                #   HeadObject returns only the metadata for an object. If the Range is
         
     | 
| 
      
 440 
     | 
    
         
            +
                #   satisfiable, only the `ContentLength` is affected in the response. If
         
     | 
| 
      
 441 
     | 
    
         
            +
                #   the Range is not satisfiable, S3 returns a `416 - Requested Range Not
         
     | 
| 
      
 442 
     | 
    
         
            +
                #   Satisfiable` error.
         
     | 
| 
       417 
443 
     | 
    
         
             
                # @option options [String] :sse_customer_algorithm
         
     | 
| 
       418 
444 
     | 
    
         
             
                #   Specifies the algorithm to use to when encrypting the object (for
         
     | 
| 
       419 
445 
     | 
    
         
             
                #   example, AES256).
         
     | 
| 
         @@ -430,9 +456,11 @@ module Aws::S3 
     | 
|
| 
       430 
456 
     | 
    
         
             
                # @option options [String] :request_payer
         
     | 
| 
       431 
457 
     | 
    
         
             
                #   Confirms that the requester knows that they will be charged for the
         
     | 
| 
       432 
458 
     | 
    
         
             
                #   request. Bucket owners need not specify this parameter in their
         
     | 
| 
       433 
     | 
    
         
            -
                #   requests.  
     | 
| 
       434 
     | 
    
         
            -
                #   Pays  
     | 
| 
       435 
     | 
    
         
            -
                #    
     | 
| 
      
 459 
     | 
    
         
            +
                #   requests. If either the source or destination Amazon S3 bucket has
         
     | 
| 
      
 460 
     | 
    
         
            +
                #   Requester Pays enabled, the requester will pay for corresponding
         
     | 
| 
      
 461 
     | 
    
         
            +
                #   charges to copy the object. For information about downloading objects
         
     | 
| 
      
 462 
     | 
    
         
            +
                #   from Requester Pays buckets, see [Downloading Objects in Requester
         
     | 
| 
      
 463 
     | 
    
         
            +
                #   Pays Buckets][1] in the *Amazon S3 User Guide*.
         
     | 
| 
       436 
464 
     | 
    
         
             
                #
         
     | 
| 
       437 
465 
     | 
    
         
             
                #
         
     | 
| 
       438 
466 
     | 
    
         
             
                #
         
     | 
| 
         @@ -460,7 +488,9 @@ module Aws::S3 
     | 
|
| 
       460 
488 
     | 
    
         
             
                    key: @object_key,
         
     | 
| 
       461 
489 
     | 
    
         
             
                    version_id: @id
         
     | 
| 
       462 
490 
     | 
    
         
             
                  )
         
     | 
| 
       463 
     | 
    
         
            -
                  resp =  
     | 
| 
      
 491 
     | 
    
         
            +
                  resp = Aws::Plugins::UserAgent.feature('resource') do
         
     | 
| 
      
 492 
     | 
    
         
            +
                    @client.head_object(options)
         
     | 
| 
      
 493 
     | 
    
         
            +
                  end
         
     | 
| 
       464 
494 
     | 
    
         
             
                  resp.data
         
     | 
| 
       465 
495 
     | 
    
         
             
                end
         
     | 
| 
       466 
496 
     | 
    
         | 
| 
         @@ -543,9 +573,11 @@ module Aws::S3 
     | 
|
| 
       543 
573 
     | 
    
         
             
                  # @option options [String] :request_payer
         
     | 
| 
       544 
574 
     | 
    
         
             
                  #   Confirms that the requester knows that they will be charged for the
         
     | 
| 
       545 
575 
     | 
    
         
             
                  #   request. Bucket owners need not specify this parameter in their
         
     | 
| 
       546 
     | 
    
         
            -
                  #   requests.  
     | 
| 
       547 
     | 
    
         
            -
                  #   Pays  
     | 
| 
       548 
     | 
    
         
            -
                  #    
     | 
| 
      
 576 
     | 
    
         
            +
                  #   requests. If either the source or destination Amazon S3 bucket has
         
     | 
| 
      
 577 
     | 
    
         
            +
                  #   Requester Pays enabled, the requester will pay for corresponding
         
     | 
| 
      
 578 
     | 
    
         
            +
                  #   charges to copy the object. For information about downloading objects
         
     | 
| 
      
 579 
     | 
    
         
            +
                  #   from Requester Pays buckets, see [Downloading Objects in Requester
         
     | 
| 
      
 580 
     | 
    
         
            +
                  #   Pays Buckets][1] in the *Amazon S3 User Guide*.
         
     | 
| 
       549 
581 
     | 
    
         
             
                  #
         
     | 
| 
       550 
582 
     | 
    
         
             
                  #
         
     | 
| 
       551 
583 
     | 
    
         
             
                  #
         
     | 
| 
         @@ -589,7 +621,9 @@ module Aws::S3 
     | 
|
| 
       589 
621 
     | 
    
         
             
                          version_id: item.id
         
     | 
| 
       590 
622 
     | 
    
         
             
                        }
         
     | 
| 
       591 
623 
     | 
    
         
             
                      end
         
     | 
| 
       592 
     | 
    
         
            -
                       
     | 
| 
      
 624 
     | 
    
         
            +
                      Aws::Plugins::UserAgent.feature('resource') do
         
     | 
| 
      
 625 
     | 
    
         
            +
                        batch[0].client.delete_objects(params)
         
     | 
| 
      
 626 
     | 
    
         
            +
                      end
         
     | 
| 
       593 
627 
     | 
    
         
             
                    end
         
     | 
| 
       594 
628 
     | 
    
         
             
                    nil
         
     | 
| 
       595 
629 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -23,73 +23,26 @@ each bucket. [Go here for more information](http://docs.aws.amazon.com/AmazonS3/ 
     | 
|
| 
       23 
23 
     | 
    
         
             
                      operations = config.api.operation_names - [
         
     | 
| 
       24 
24 
     | 
    
         
             
                        :create_bucket, :list_buckets, :delete_bucket
         
     | 
| 
       25 
25 
     | 
    
         
             
                      ]
         
     | 
| 
       26 
     | 
    
         
            -
                      # Need 2 handlers so that the context can be set for other plugins
         
     | 
| 
       27 
     | 
    
         
            -
                      # and to remove :use_accelerate_endpoint from the params.
         
     | 
| 
       28 
26 
     | 
    
         
             
                      handlers.add(
         
     | 
| 
       29 
27 
     | 
    
         
             
                        OptionHandler, step: :initialize, operations: operations
         
     | 
| 
       30 
28 
     | 
    
         
             
                      )
         
     | 
| 
       31 
     | 
    
         
            -
                      handlers.add(
         
     | 
| 
       32 
     | 
    
         
            -
                        AccelerateHandler, step: :build, priority: 11, operations: operations
         
     | 
| 
       33 
     | 
    
         
            -
                      )
         
     | 
| 
       34 
29 
     | 
    
         
             
                    end
         
     | 
| 
       35 
30 
     | 
    
         | 
| 
       36 
31 
     | 
    
         
             
                    # @api private
         
     | 
| 
       37 
32 
     | 
    
         
             
                    class OptionHandler < Seahorse::Client::Handler
         
     | 
| 
       38 
33 
     | 
    
         
             
                      def call(context)
         
     | 
| 
       39 
34 
     | 
    
         
             
                        # Support client configuration and per-operation configuration
         
     | 
| 
      
 35 
     | 
    
         
            +
                        # TODO: move this to an options hash and warn here.
         
     | 
| 
       40 
36 
     | 
    
         
             
                        if context.params.is_a?(Hash)
         
     | 
| 
       41 
37 
     | 
    
         
             
                          accelerate = context.params.delete(:use_accelerate_endpoint)
         
     | 
| 
       42 
38 
     | 
    
         
             
                        end
         
     | 
| 
       43 
     | 
    
         
            -
                         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                        if accelerate && !context.config.regional_endpoint
         
     | 
| 
       46 
     | 
    
         
            -
                          raise ArgumentError,
         
     | 
| 
       47 
     | 
    
         
            -
                                'Cannot use both :use_accelerate_endpoint and :endpoint'
         
     | 
| 
       48 
     | 
    
         
            -
                        end
         
     | 
| 
       49 
     | 
    
         
            -
                        # Raise if :use_fips_endpoint and accelerate are both provided
         
     | 
| 
       50 
     | 
    
         
            -
                        if accelerate && context.config.use_fips_endpoint
         
     | 
| 
       51 
     | 
    
         
            -
                          raise ArgumentError,
         
     | 
| 
       52 
     | 
    
         
            -
                                'Cannot use both :use_accelerate_endpoint and '\
         
     | 
| 
       53 
     | 
    
         
            -
                                ':use_fips_endpoint'
         
     | 
| 
      
 39 
     | 
    
         
            +
                        if accelerate.nil?
         
     | 
| 
      
 40 
     | 
    
         
            +
                          accelerate = context.config.use_accelerate_endpoint
         
     | 
| 
       54 
41 
     | 
    
         
             
                        end
         
     | 
| 
       55 
42 
     | 
    
         
             
                        context[:use_accelerate_endpoint] = accelerate
         
     | 
| 
       56 
43 
     | 
    
         
             
                        @handler.call(context)
         
     | 
| 
       57 
44 
     | 
    
         
             
                      end
         
     | 
| 
       58 
45 
     | 
    
         
             
                    end
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
                    # @api private
         
     | 
| 
       61 
     | 
    
         
            -
                    class AccelerateHandler < Seahorse::Client::Handler
         
     | 
| 
       62 
     | 
    
         
            -
                      def call(context)
         
     | 
| 
       63 
     | 
    
         
            -
                        if context.config.regional_endpoint && context[:use_accelerate_endpoint]
         
     | 
| 
       64 
     | 
    
         
            -
                          dualstack = !!context[:use_dualstack_endpoint]
         
     | 
| 
       65 
     | 
    
         
            -
                          use_accelerate_endpoint(context, dualstack)
         
     | 
| 
       66 
     | 
    
         
            -
                        end
         
     | 
| 
       67 
     | 
    
         
            -
                        @handler.call(context)
         
     | 
| 
       68 
     | 
    
         
            -
                      end
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
                      private
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
                      def use_accelerate_endpoint(context, dualstack)
         
     | 
| 
       73 
     | 
    
         
            -
                        bucket_name = context.params[:bucket]
         
     | 
| 
       74 
     | 
    
         
            -
                        validate_bucket_name!(bucket_name)
         
     | 
| 
       75 
     | 
    
         
            -
                        endpoint = URI.parse(context.http_request.endpoint.to_s)
         
     | 
| 
       76 
     | 
    
         
            -
                        endpoint.scheme = 'https'
         
     | 
| 
       77 
     | 
    
         
            -
                        endpoint.port = 443
         
     | 
| 
       78 
     | 
    
         
            -
                        endpoint.host = "#{bucket_name}.s3-accelerate"\
         
     | 
| 
       79 
     | 
    
         
            -
                                        "#{'.dualstack' if dualstack}.amazonaws.com"
         
     | 
| 
       80 
     | 
    
         
            -
                        context.http_request.endpoint = endpoint.to_s
         
     | 
| 
       81 
     | 
    
         
            -
                        # s3 accelerate endpoint doesn't work with 'expect' header
         
     | 
| 
       82 
     | 
    
         
            -
                        context.http_request.headers.delete('expect')
         
     | 
| 
       83 
     | 
    
         
            -
                      end
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
                      def validate_bucket_name!(bucket_name)
         
     | 
| 
       86 
     | 
    
         
            -
                        unless BucketDns.dns_compatible?(bucket_name, _ssl = true)
         
     | 
| 
       87 
     | 
    
         
            -
                          raise ArgumentError,
         
     | 
| 
       88 
     | 
    
         
            -
                                'Unable to use `use_accelerate_endpoint: true` on buckets '\
         
     | 
| 
       89 
     | 
    
         
            -
                                'with non-DNS compatible names.'
         
     | 
| 
       90 
     | 
    
         
            -
                        end
         
     | 
| 
       91 
     | 
    
         
            -
                      end
         
     | 
| 
       92 
     | 
    
         
            -
                    end
         
     | 
| 
       93 
46 
     | 
    
         
             
                  end
         
     | 
| 
       94 
47 
     | 
    
         
             
                end
         
     | 
| 
       95 
48 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1,10 +1,5 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            require_relative '../arn/access_point_arn'
         
     | 
| 
       4 
     | 
    
         
            -
            require_relative '../arn/object_lambda_arn'
         
     | 
| 
       5 
     | 
    
         
            -
            require_relative '../arn/outpost_access_point_arn'
         
     | 
| 
       6 
     | 
    
         
            -
            require_relative '../arn/multi_region_access_point_arn'
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
3 
     | 
    
         
             
            module Aws
         
     | 
| 
       9 
4 
     | 
    
         
             
              module S3
         
     | 
| 
       10 
5 
     | 
    
         
             
                module Plugins
         
     | 
| 
         @@ -36,150 +31,9 @@ result in cross region requests. 
     | 
|
| 
       36 
31 
     | 
    
         
             
                      resolve_s3_disable_multiregion_access_points(cfg)
         
     | 
| 
       37 
32 
     | 
    
         
             
                    end
         
     | 
| 
       38 
33 
     | 
    
         | 
| 
       39 
     | 
    
         
            -
                    # param validator is validate:50
         
     | 
| 
       40 
     | 
    
         
            -
                    # endpoint is build:90 (populates the URI for the first time)
         
     | 
| 
       41 
     | 
    
         
            -
                    # endpoint pattern is build:10
         
     | 
| 
       42 
     | 
    
         
            -
                    def add_handlers(handlers, _config)
         
     | 
| 
       43 
     | 
    
         
            -
                      handlers.add(ARNHandler, step: :validate, priority: 75)
         
     | 
| 
       44 
     | 
    
         
            -
                      handlers.add(UrlHandler)
         
     | 
| 
       45 
     | 
    
         
            -
                    end
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
                    # After extracting out any ARN input, resolve a new URL with it.
         
     | 
| 
       48 
     | 
    
         
            -
                    class UrlHandler < Seahorse::Client::Handler
         
     | 
| 
       49 
     | 
    
         
            -
                      def call(context)
         
     | 
| 
       50 
     | 
    
         
            -
                        if context.metadata[:s3_arn]
         
     | 
| 
       51 
     | 
    
         
            -
                          ARN.resolve_url!(
         
     | 
| 
       52 
     | 
    
         
            -
                            context.http_request.endpoint,
         
     | 
| 
       53 
     | 
    
         
            -
                            context.metadata[:s3_arn][:arn],
         
     | 
| 
       54 
     | 
    
         
            -
                            context.metadata[:s3_arn][:resolved_region],
         
     | 
| 
       55 
     | 
    
         
            -
                            context.metadata[:s3_arn][:fips],
         
     | 
| 
       56 
     | 
    
         
            -
                            context.metadata[:s3_arn][:dualstack],
         
     | 
| 
       57 
     | 
    
         
            -
                            # if regional_endpoint is false, a custom endpoint was provided
         
     | 
| 
       58 
     | 
    
         
            -
                            # in this case, we want to prefix the endpoint using the ARN
         
     | 
| 
       59 
     | 
    
         
            -
                            !context.config.regional_endpoint
         
     | 
| 
       60 
     | 
    
         
            -
                          )
         
     | 
| 
       61 
     | 
    
         
            -
                        end
         
     | 
| 
       62 
     | 
    
         
            -
                        @handler.call(context)
         
     | 
| 
       63 
     | 
    
         
            -
                      end
         
     | 
| 
       64 
     | 
    
         
            -
                    end
         
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
                    # This plugin will extract out any ARN input and set context for other
         
     | 
| 
       67 
     | 
    
         
            -
                    # plugins to use without having to translate the ARN again.
         
     | 
| 
       68 
     | 
    
         
            -
                    class ARNHandler < Seahorse::Client::Handler
         
     | 
| 
       69 
     | 
    
         
            -
                      def call(context)
         
     | 
| 
       70 
     | 
    
         
            -
                        bucket_member = _bucket_member(context.operation.input.shape)
         
     | 
| 
       71 
     | 
    
         
            -
                        if bucket_member && (bucket = context.params[bucket_member])
         
     | 
| 
       72 
     | 
    
         
            -
                          resolved_region, arn = ARN.resolve_arn!(
         
     | 
| 
       73 
     | 
    
         
            -
                            bucket,
         
     | 
| 
       74 
     | 
    
         
            -
                            context.config.region,
         
     | 
| 
       75 
     | 
    
         
            -
                            context.config.s3_use_arn_region
         
     | 
| 
       76 
     | 
    
         
            -
                          )
         
     | 
| 
       77 
     | 
    
         
            -
                          if arn
         
     | 
| 
       78 
     | 
    
         
            -
                            validate_config!(context, arn)
         
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
                            context.metadata[:s3_arn] = {
         
     | 
| 
       81 
     | 
    
         
            -
                              arn: arn,
         
     | 
| 
       82 
     | 
    
         
            -
                              resolved_region: resolved_region,
         
     | 
| 
       83 
     | 
    
         
            -
                              fips: context.config.use_fips_endpoint,
         
     | 
| 
       84 
     | 
    
         
            -
                              dualstack: extract_dualstack_config!(context)
         
     | 
| 
       85 
     | 
    
         
            -
                            }
         
     | 
| 
       86 
     | 
    
         
            -
                          end
         
     | 
| 
       87 
     | 
    
         
            -
                        end
         
     | 
| 
       88 
     | 
    
         
            -
                        @handler.call(context)
         
     | 
| 
       89 
     | 
    
         
            -
                      end
         
     | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
       91 
     | 
    
         
            -
                      private
         
     | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
       93 
     | 
    
         
            -
                      def _bucket_member(input)
         
     | 
| 
       94 
     | 
    
         
            -
                        input.members.each do |member, ref|
         
     | 
| 
       95 
     | 
    
         
            -
                          return member if ref.shape.name == 'BucketName'
         
     | 
| 
       96 
     | 
    
         
            -
                        end
         
     | 
| 
       97 
     | 
    
         
            -
                        nil
         
     | 
| 
       98 
     | 
    
         
            -
                      end
         
     | 
| 
       99 
     | 
    
         
            -
             
     | 
| 
       100 
     | 
    
         
            -
                      # other plugins use dualstack so disable it when we're done
         
     | 
| 
       101 
     | 
    
         
            -
                      def extract_dualstack_config!(context)
         
     | 
| 
       102 
     | 
    
         
            -
                        dualstack = context[:use_dualstack_endpoint]
         
     | 
| 
       103 
     | 
    
         
            -
                        context[:use_dualstack_endpoint] = false if dualstack
         
     | 
| 
       104 
     | 
    
         
            -
                        dualstack
         
     | 
| 
       105 
     | 
    
         
            -
                      end
         
     | 
| 
       106 
     | 
    
         
            -
             
     | 
| 
       107 
     | 
    
         
            -
                      def validate_config!(context, arn)
         
     | 
| 
       108 
     | 
    
         
            -
                        if context.config.force_path_style
         
     | 
| 
       109 
     | 
    
         
            -
                          raise ArgumentError,
         
     | 
| 
       110 
     | 
    
         
            -
                                'Cannot provide an Access Point ARN when '\
         
     | 
| 
       111 
     | 
    
         
            -
                                '`:force_path_style` is set to true.'
         
     | 
| 
       112 
     | 
    
         
            -
                        end
         
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
                        if context.config.use_accelerate_endpoint
         
     | 
| 
       115 
     | 
    
         
            -
                          raise ArgumentError,
         
     | 
| 
       116 
     | 
    
         
            -
                                'Cannot provide an Access Point ARN when '\
         
     | 
| 
       117 
     | 
    
         
            -
                                '`:use_accelerate_endpoint` is set to true.'
         
     | 
| 
       118 
     | 
    
         
            -
                        end
         
     | 
| 
       119 
     | 
    
         
            -
             
     | 
| 
       120 
     | 
    
         
            -
                        if !arn.support_dualstack? && context[:use_dualstack_endpoint]
         
     | 
| 
       121 
     | 
    
         
            -
                          raise ArgumentError,
         
     | 
| 
       122 
     | 
    
         
            -
                                'Cannot provide an Outpost Access Point, Object Lambda, '\
         
     | 
| 
       123 
     | 
    
         
            -
                                'or Multi-region Access Point ARN'\
         
     | 
| 
       124 
     | 
    
         
            -
                                ' when `:use_dualstack_endpoint` is set to true.'
         
     | 
| 
       125 
     | 
    
         
            -
                        end
         
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
       127 
     | 
    
         
            -
                        if arn.region.empty? && context.config.s3_disable_multiregion_access_points
         
     | 
| 
       128 
     | 
    
         
            -
                          raise ArgumentError,
         
     | 
| 
       129 
     | 
    
         
            -
                                'Cannot provide a Multi-region Access Point ARN with '\
         
     | 
| 
       130 
     | 
    
         
            -
                                '`:s3_disable_multiregion_access_points` set to true'
         
     | 
| 
       131 
     | 
    
         
            -
                        end
         
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
       133 
     | 
    
         
            -
                        if context.config.use_fips_endpoint && !arn.support_fips?
         
     | 
| 
       134 
     | 
    
         
            -
                          raise ArgumentError,
         
     | 
| 
       135 
     | 
    
         
            -
                                'FIPS client regions are not supported for this type '\
         
     | 
| 
       136 
     | 
    
         
            -
                                'of ARN.'
         
     | 
| 
       137 
     | 
    
         
            -
                        end
         
     | 
| 
       138 
     | 
    
         
            -
                      end
         
     | 
| 
       139 
     | 
    
         
            -
                    end
         
     | 
| 
       140 
     | 
    
         
            -
             
     | 
| 
       141 
34 
     | 
    
         
             
                    class << self
         
     | 
| 
       142 
     | 
    
         
            -
                      # @api private
         
     | 
| 
       143 
     | 
    
         
            -
                      def resolve_arn!(member_value, region, use_arn_region)
         
     | 
| 
       144 
     | 
    
         
            -
                        if Aws::ARNParser.arn?(member_value)
         
     | 
| 
       145 
     | 
    
         
            -
                          arn = Aws::ARNParser.parse(member_value)
         
     | 
| 
       146 
     | 
    
         
            -
                          s3_arn = resolve_arn_type!(arn)
         
     | 
| 
       147 
     | 
    
         
            -
                          s3_arn.validate_arn!
         
     | 
| 
       148 
     | 
    
         
            -
                          validate_region_config!(s3_arn, region, use_arn_region)
         
     | 
| 
       149 
     | 
    
         
            -
                          region = s3_arn.region if use_arn_region
         
     | 
| 
       150 
     | 
    
         
            -
                          [region, s3_arn]
         
     | 
| 
       151 
     | 
    
         
            -
                        else
         
     | 
| 
       152 
     | 
    
         
            -
                          [region]
         
     | 
| 
       153 
     | 
    
         
            -
                        end
         
     | 
| 
       154 
     | 
    
         
            -
                      end
         
     | 
| 
       155 
     | 
    
         
            -
             
     | 
| 
       156 
     | 
    
         
            -
                      # @api private
         
     | 
| 
       157 
     | 
    
         
            -
                      def resolve_url!(url, arn, region, fips = false, dualstack = false, has_custom_endpoint = false)
         
     | 
| 
       158 
     | 
    
         
            -
                        custom_endpoint = url.host if has_custom_endpoint
         
     | 
| 
       159 
     | 
    
         
            -
                        url.host = arn.host_url(region, fips, dualstack, custom_endpoint)
         
     | 
| 
       160 
     | 
    
         
            -
                        url.path = url_path(url.path, arn)
         
     | 
| 
       161 
     | 
    
         
            -
                        url
         
     | 
| 
       162 
     | 
    
         
            -
                      end
         
     | 
| 
       163 
     | 
    
         
            -
             
     | 
| 
       164 
35 
     | 
    
         
             
                      private
         
     | 
| 
       165 
36 
     | 
    
         | 
| 
       166 
     | 
    
         
            -
                      def resolve_arn_type!(arn)
         
     | 
| 
       167 
     | 
    
         
            -
                        case arn.service
         
     | 
| 
       168 
     | 
    
         
            -
                        when 's3'
         
     | 
| 
       169 
     | 
    
         
            -
                          arn.region.empty? ?
         
     | 
| 
       170 
     | 
    
         
            -
                            Aws::S3::MultiRegionAccessPointARN.new(arn.to_h) :
         
     | 
| 
       171 
     | 
    
         
            -
                            Aws::S3::AccessPointARN.new(arn.to_h)
         
     | 
| 
       172 
     | 
    
         
            -
                        when 's3-outposts'
         
     | 
| 
       173 
     | 
    
         
            -
                          Aws::S3::OutpostAccessPointARN.new(arn.to_h)
         
     | 
| 
       174 
     | 
    
         
            -
                        when 's3-object-lambda'
         
     | 
| 
       175 
     | 
    
         
            -
                          Aws::S3::ObjectLambdaARN.new(arn.to_h)
         
     | 
| 
       176 
     | 
    
         
            -
                        else
         
     | 
| 
       177 
     | 
    
         
            -
                          raise ArgumentError,
         
     | 
| 
       178 
     | 
    
         
            -
                                'Only Access Point, Outposts, and Object Lambdas ARNs '\
         
     | 
| 
       179 
     | 
    
         
            -
                                'are currently supported.'
         
     | 
| 
       180 
     | 
    
         
            -
                        end
         
     | 
| 
       181 
     | 
    
         
            -
                      end
         
     | 
| 
       182 
     | 
    
         
            -
             
     | 
| 
       183 
37 
     | 
    
         
             
                      def resolve_s3_use_arn_region(cfg)
         
     | 
| 
       184 
38 
     | 
    
         
             
                        value = ENV['AWS_S3_USE_ARN_REGION'] ||
         
     | 
| 
       185 
39 
     | 
    
         
             
                                Aws.shared_config.s3_use_arn_region(profile: cfg.profile) ||
         
     | 
| 
         @@ -209,44 +63,6 @@ result in cross region requests. 
     | 
|
| 
       209 
63 
     | 
    
         
             
                        end
         
     | 
| 
       210 
64 
     | 
    
         
             
                        value
         
     | 
| 
       211 
65 
     | 
    
         
             
                      end
         
     | 
| 
       212 
     | 
    
         
            -
             
     | 
| 
       213 
     | 
    
         
            -
                      # Remove ARN from the path because we've already set the new host
         
     | 
| 
       214 
     | 
    
         
            -
                      def url_path(path, arn)
         
     | 
| 
       215 
     | 
    
         
            -
                        path = path.sub("/#{Seahorse::Util.uri_escape(arn.to_s)}", '')
         
     | 
| 
       216 
     | 
    
         
            -
                                   .sub("/#{arn}", '')
         
     | 
| 
       217 
     | 
    
         
            -
                        "/#{path}" unless path =~ /^\//
         
     | 
| 
       218 
     | 
    
         
            -
                        path
         
     | 
| 
       219 
     | 
    
         
            -
                      end
         
     | 
| 
       220 
     | 
    
         
            -
             
     | 
| 
       221 
     | 
    
         
            -
                      def validate_region_config!(arn, region, use_arn_region)
         
     | 
| 
       222 
     | 
    
         
            -
                        if ['s3-external-1', 'aws-global'].include?(region)
         
     | 
| 
       223 
     | 
    
         
            -
                          # These "regions" are not regional endpoints
         
     | 
| 
       224 
     | 
    
         
            -
                          unless use_arn_region
         
     | 
| 
       225 
     | 
    
         
            -
                            raise Aws::Errors::InvalidARNRegionError,
         
     | 
| 
       226 
     | 
    
         
            -
                                  'Configured client region is not a regional endpoint.'
         
     | 
| 
       227 
     | 
    
         
            -
                          end
         
     | 
| 
       228 
     | 
    
         
            -
                          # These "regions" are in the AWS partition
         
     | 
| 
       229 
     | 
    
         
            -
                          # Cannot use ARN region unless it's the same partition
         
     | 
| 
       230 
     | 
    
         
            -
                          unless arn.partition == 'aws'
         
     | 
| 
       231 
     | 
    
         
            -
                            raise Aws::Errors::InvalidARNPartitionError
         
     | 
| 
       232 
     | 
    
         
            -
                          end
         
     | 
| 
       233 
     | 
    
         
            -
                        else
         
     | 
| 
       234 
     | 
    
         
            -
                          # use_arn_region does not apply to MRAP (global) arns
         
     | 
| 
       235 
     | 
    
         
            -
                          unless arn.region.empty?
         
     | 
| 
       236 
     | 
    
         
            -
                            # Raise if the ARN and client regions are in different partitions
         
     | 
| 
       237 
     | 
    
         
            -
                            if use_arn_region &&
         
     | 
| 
       238 
     | 
    
         
            -
                               !Aws::Partitions.partition(arn.partition).region?(region)
         
     | 
| 
       239 
     | 
    
         
            -
                              raise Aws::Errors::InvalidARNPartitionError
         
     | 
| 
       240 
     | 
    
         
            -
                            end
         
     | 
| 
       241 
     | 
    
         
            -
             
     | 
| 
       242 
     | 
    
         
            -
                            # Raise if regions mismatch
         
     | 
| 
       243 
     | 
    
         
            -
                            # Either when it's a fips client or not using the ARN region
         
     | 
| 
       244 
     | 
    
         
            -
                            if !use_arn_region && region != arn.region
         
     | 
| 
       245 
     | 
    
         
            -
                              raise Aws::Errors::InvalidARNRegionError
         
     | 
| 
       246 
     | 
    
         
            -
                            end
         
     | 
| 
       247 
     | 
    
         
            -
                          end
         
     | 
| 
       248 
     | 
    
         
            -
                        end
         
     | 
| 
       249 
     | 
    
         
            -
                      end
         
     | 
| 
       250 
66 
     | 
    
         
             
                    end
         
     | 
| 
       251 
67 
     | 
    
         
             
                  end
         
     | 
| 
       252 
68 
     | 
    
         
             
                end
         
     | 
| 
         @@ -23,45 +23,10 @@ When set to `true`, the bucket name is always left in the 
     | 
|
| 
       23 
23 
     | 
    
         
             
            request URI and never moved to the host as a sub-domain.
         
     | 
| 
       24 
24 
     | 
    
         
             
                      DOCS
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
                     
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                     
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                    # @api private
         
     | 
| 
       31 
     | 
    
         
            -
                    class Handler < Seahorse::Client::Handler
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                      def call(context)
         
     | 
| 
       34 
     | 
    
         
            -
                        move_dns_compat_bucket_to_subdomain(context)
         
     | 
| 
       35 
     | 
    
         
            -
                        @handler.call(context)
         
     | 
| 
       36 
     | 
    
         
            -
                      end
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
                      private
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
                      def move_dns_compat_bucket_to_subdomain(context)
         
     | 
| 
       41 
     | 
    
         
            -
                        bucket_name = context.params[:bucket]
         
     | 
| 
       42 
     | 
    
         
            -
                        endpoint = context.http_request.endpoint
         
     | 
| 
       43 
     | 
    
         
            -
                        if bucket_name &&
         
     | 
| 
       44 
     | 
    
         
            -
                           BucketDns.dns_compatible?(bucket_name, https?(endpoint)) &&
         
     | 
| 
       45 
     | 
    
         
            -
                           context.operation_name.to_s != 'get_bucket_location'
         
     | 
| 
       46 
     | 
    
         
            -
                          move_bucket_to_subdomain(bucket_name, endpoint)
         
     | 
| 
       47 
     | 
    
         
            -
                        end
         
     | 
| 
       48 
     | 
    
         
            -
                      end
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
                      def move_bucket_to_subdomain(bucket_name, endpoint)
         
     | 
| 
       51 
     | 
    
         
            -
                        endpoint.host = "#{bucket_name}.#{endpoint.host}"
         
     | 
| 
       52 
     | 
    
         
            -
                        path = endpoint.path.sub("/#{bucket_name}", '')
         
     | 
| 
       53 
     | 
    
         
            -
                        path = "/#{path}" unless path.match(/^\//)
         
     | 
| 
       54 
     | 
    
         
            -
                        endpoint.path = path
         
     | 
| 
       55 
     | 
    
         
            -
                      end
         
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
                      def https?(uri)
         
     | 
| 
       58 
     | 
    
         
            -
                        uri.scheme == 'https'
         
     | 
| 
       59 
     | 
    
         
            -
                      end
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                    end
         
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
      
 26 
     | 
    
         
            +
                    # These class methods were originally used in a handler in this plugin.
         
     | 
| 
      
 27 
     | 
    
         
            +
                    # SigV2 legacy signer needs this logic so we keep it here as utility.
         
     | 
| 
      
 28 
     | 
    
         
            +
                    # New endpoint resolution will check this as a matcher.
         
     | 
| 
       63 
29 
     | 
    
         
             
                    class << self
         
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
30 
     | 
    
         
             
                      # @param [String] bucket_name
         
     | 
| 
       66 
31 
     | 
    
         
             
                      # @param [Boolean] ssl
         
     | 
| 
       67 
32 
     | 
    
         
             
                      # @return [Boolean]
         
     | 
| 
         @@ -81,7 +46,6 @@ request URI and never moved to the host as a sub-domain. 
     | 
|
| 
       81 
46 
     | 
    
         
             
                        bucket_name !~ /(\d+\.){3}\d+/ &&
         
     | 
| 
       82 
47 
     | 
    
         
             
                        bucket_name !~ /[.-]{2}/
         
     | 
| 
       83 
48 
     | 
    
         
             
                      end
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
49 
     | 
    
         
             
                    end
         
     | 
| 
       86 
50 
     | 
    
         
             
                  end
         
     | 
| 
       87 
51 
     | 
    
         
             
                end
         
     | 
| 
         @@ -13,12 +13,7 @@ module Aws 
     | 
|
| 
       13 
13 
     | 
    
         
             
                      def call(context)
         
     | 
| 
       14 
14 
     | 
    
         
             
                        bucket_member = _bucket_member(context.operation.input.shape)
         
     | 
| 
       15 
15 
     | 
    
         
             
                        if bucket_member && (bucket = context.params[bucket_member])
         
     | 
| 
       16 
     | 
    
         
            -
                           
     | 
| 
       17 
     | 
    
         
            -
                            bucket,
         
     | 
| 
       18 
     | 
    
         
            -
                            context.config.region,
         
     | 
| 
       19 
     | 
    
         
            -
                            context.config.s3_use_arn_region
         
     | 
| 
       20 
     | 
    
         
            -
                          )
         
     | 
| 
       21 
     | 
    
         
            -
                          if !arn && bucket.include?('/')
         
     | 
| 
      
 16 
     | 
    
         
            +
                          if !Aws::ARNParser.arn?(bucket) && bucket.include?('/')
         
     | 
| 
       22 
17 
     | 
    
         
             
                            raise ArgumentError,
         
     | 
| 
       23 
18 
     | 
    
         
             
                                  'bucket name must not contain a forward-slash (/)'
         
     | 
| 
       24 
19 
     | 
    
         
             
                          end
         
     | 
| 
         @@ -5,9 +5,8 @@ module Aws 
     | 
|
| 
       5 
5 
     | 
    
         
             
                module Plugins
         
     | 
| 
       6 
6 
     | 
    
         
             
                  # @api private
         
     | 
| 
       7 
7 
     | 
    
         
             
                  class Dualstack < Seahorse::Client::Plugin
         
     | 
| 
       8 
     | 
    
         
            -
                    def add_handlers(handlers,  
     | 
| 
      
 8 
     | 
    
         
            +
                    def add_handlers(handlers, _config)
         
     | 
| 
       9 
9 
     | 
    
         
             
                      handlers.add(OptionHandler, step: :initialize)
         
     | 
| 
       10 
     | 
    
         
            -
                      handlers.add(DualstackHandler, step: :build, priority: 49)
         
     | 
| 
       11 
10 
     | 
    
         
             
                    end
         
     | 
| 
       12 
11 
     | 
    
         | 
| 
       13 
12 
     | 
    
         
             
                    # @api private
         
     | 
| 
         @@ -18,57 +17,10 @@ module Aws 
     | 
|
| 
       18 
17 
     | 
    
         
             
                          dualstack = context.params.delete(:use_dualstack_endpoint)
         
     | 
| 
       19 
18 
     | 
    
         
             
                        end
         
     | 
| 
       20 
19 
     | 
    
         
             
                        dualstack = context.config.use_dualstack_endpoint if dualstack.nil?
         
     | 
| 
       21 
     | 
    
         
            -
                        # Raise if :endpoint and dualstack are both provided
         
     | 
| 
       22 
     | 
    
         
            -
                        if dualstack && !context.config.regional_endpoint
         
     | 
| 
       23 
     | 
    
         
            -
                          raise ArgumentError,
         
     | 
| 
       24 
     | 
    
         
            -
                                'Cannot use both :use_dualstack_endpoint and :endpoint'
         
     | 
| 
       25 
     | 
    
         
            -
                        end
         
     | 
| 
       26 
20 
     | 
    
         
             
                        context[:use_dualstack_endpoint] = dualstack
         
     | 
| 
       27 
21 
     | 
    
         
             
                        @handler.call(context)
         
     | 
| 
       28 
22 
     | 
    
         
             
                      end
         
     | 
| 
       29 
23 
     | 
    
         
             
                    end
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                    # @api private
         
     | 
| 
       32 
     | 
    
         
            -
                    class DualstackHandler < Seahorse::Client::Handler
         
     | 
| 
       33 
     | 
    
         
            -
                      def call(context)
         
     | 
| 
       34 
     | 
    
         
            -
                        # only rewrite the endpoint if it's not a custom endpoint
         
     | 
| 
       35 
     | 
    
         
            -
                        # accelerate/ARN already handle dualstack cases, so ignore these
         
     | 
| 
       36 
     | 
    
         
            -
                        # check to see if dualstack is on but configured off via operation
         
     | 
| 
       37 
     | 
    
         
            -
                        if context.config.regional_endpoint &&
         
     | 
| 
       38 
     | 
    
         
            -
                           use_dualstack_endpoint?(context)
         
     | 
| 
       39 
     | 
    
         
            -
                          apply_dualstack_endpoint(context)
         
     | 
| 
       40 
     | 
    
         
            -
                        end
         
     | 
| 
       41 
     | 
    
         
            -
                        @handler.call(context)
         
     | 
| 
       42 
     | 
    
         
            -
                      end
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
                      private
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
                      def apply_dualstack_endpoint(context)
         
     | 
| 
       47 
     | 
    
         
            -
                        new_endpoint = Aws::Partitions::EndpointProvider.resolve(
         
     | 
| 
       48 
     | 
    
         
            -
                          context.config.region,
         
     | 
| 
       49 
     | 
    
         
            -
                          's3',
         
     | 
| 
       50 
     | 
    
         
            -
                          'regional',
         
     | 
| 
       51 
     | 
    
         
            -
                          {
         
     | 
| 
       52 
     | 
    
         
            -
                            dualstack: context[:use_dualstack_endpoint],
         
     | 
| 
       53 
     | 
    
         
            -
                            fips: context.config.use_fips_endpoint
         
     | 
| 
       54 
     | 
    
         
            -
                          }
         
     | 
| 
       55 
     | 
    
         
            -
                        )
         
     | 
| 
       56 
     | 
    
         
            -
                        endpoint = URI.parse(context.http_request.endpoint.to_s)
         
     | 
| 
       57 
     | 
    
         
            -
                        endpoint.host = URI.parse(new_endpoint).host
         
     | 
| 
       58 
     | 
    
         
            -
                        context.http_request.endpoint = endpoint
         
     | 
| 
       59 
     | 
    
         
            -
                      end
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                      def use_dualstack_endpoint?(context)
         
     | 
| 
       62 
     | 
    
         
            -
                        # case when dualstack is turned off via operation
         
     | 
| 
       63 
     | 
    
         
            -
                        (context[:use_dualstack_endpoint] ||
         
     | 
| 
       64 
     | 
    
         
            -
                          context.config.use_dualstack_endpoint) &&
         
     | 
| 
       65 
     | 
    
         
            -
                          # accelerate plugin already applies dualstack
         
     | 
| 
       66 
     | 
    
         
            -
                          !context[:use_accelerate_endpoint] &&
         
     | 
| 
       67 
     | 
    
         
            -
                          # arns handle dualstack
         
     | 
| 
       68 
     | 
    
         
            -
                          !context.metadata[:s3_arn]
         
     | 
| 
       69 
     | 
    
         
            -
                      end
         
     | 
| 
       70 
     | 
    
         
            -
                    end
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
24 
     | 
    
         
             
                  end
         
     | 
| 
       73 
25 
     | 
    
         
             
                end
         
     | 
| 
       74 
26 
     | 
    
         
             
              end
         
     |