diff --git a/requirements.txt b/requirements.txt index 275c9dfb40..29201c864b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ # generated from manifests external_dependencies +boto3>=1.35.0,<1.42.31 fsspec>=2024.5.0 fsspec>=2025.3.0 fsspec[s3] diff --git a/setup/storage_backend_s3/odoo/addons/storage_backend_s3 b/setup/storage_backend_s3/odoo/addons/storage_backend_s3 new file mode 120000 index 0000000000..ec8c7ff362 --- /dev/null +++ b/setup/storage_backend_s3/odoo/addons/storage_backend_s3 @@ -0,0 +1 @@ +../../../../storage_backend_s3 \ No newline at end of file diff --git a/setup/storage_backend_s3/setup.py b/setup/storage_backend_s3/setup.py new file mode 100644 index 0000000000..28c57bb640 --- /dev/null +++ b/setup/storage_backend_s3/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/storage_backend_s3/README.rst b/storage_backend_s3/README.rst new file mode 100644 index 0000000000..e78c9930fd --- /dev/null +++ b/storage_backend_s3/README.rst @@ -0,0 +1,83 @@ +================== +Storage Backend S3 +================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:76e4ebc7d37af8aa2744514100e89ce4934c00275d1271e22f1d0249bedff7fa + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstorage-lightgray.png?logo=github + :target: https://github.com/OCA/storage/tree/16.0/storage_backend_s3 + :alt: OCA/storage +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/storage-16-0/storage-16-0-storage_backend_s3 + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/storage&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Add the possibility to store and get data from amazon S3 for your storage backend + +**Table of contents** + +.. contents:: + :local: + +Known issues / Roadmap +====================== + +There is an issue with the latest version of `boto3` and `urllib3` +- boto3 needs to be `boto3<=1.15.18` related with https://github.com/OCA/storage/issues/67 + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Akretion + +Contributors +~~~~~~~~~~~~ + +* Sebastien Beau +* Raphaël Reverdy + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/storage `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/storage_backend_s3/__init__.py b/storage_backend_s3/__init__.py new file mode 100644 index 0000000000..0f00a6730d --- /dev/null +++ b/storage_backend_s3/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import components diff --git a/storage_backend_s3/__manifest__.py b/storage_backend_s3/__manifest__.py new file mode 100644 index 0000000000..14cfb60233 --- /dev/null +++ b/storage_backend_s3/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2017 Akretion (http://www.akretion.com). +# @author Sébastien BEAU +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +{ + "name": "Storage Backend S3", + "summary": "Implement amazon S3 Storage", + "version": "16.0.1.0.0", + "category": "Storage", + "website": "https://github.com/OCA/storage", + "author": " Akretion, Odoo Community Association (OCA)", + "license": "LGPL-3", + "installable": True, + "external_dependencies": {"python": ["boto3>=1.35.0,<1.42.31"]}, + "depends": ["storage_backend"], + "data": ["views/backend_storage_view.xml"], +} diff --git a/storage_backend_s3/components/__init__.py b/storage_backend_s3/components/__init__.py new file mode 100644 index 0000000000..0d8ef55eeb --- /dev/null +++ b/storage_backend_s3/components/__init__.py @@ -0,0 +1 @@ +from . import s3_adapter diff --git a/storage_backend_s3/components/s3_adapter.py b/storage_backend_s3/components/s3_adapter.py new file mode 100644 index 0000000000..15d9d40528 --- /dev/null +++ b/storage_backend_s3/components/s3_adapter.py @@ -0,0 +1,121 @@ +# Copyright 2017 Akretion (http://www.akretion.com). +# @author Sébastien BEAU +# Copyright 2019 Camptocamp SA (http://www.camptocamp.com). +# @author Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import io +import logging + +from odoo import _, exceptions + +from odoo.addons.component.core import Component + +_logger = logging.getLogger(__name__) + +try: + import boto3 + from botocore.exceptions import ClientError, EndpointConnectionError + +except ImportError as err: # pragma: no cover + _logger.debug(err) + + +class S3StorageAdapter(Component): + _name = "s3.adapter" + _inherit = "base.storage.adapter" + _usage = "amazon_s3" + + def _aws_bucket_params(self): + params = { + "aws_access_key_id": self.collection.aws_access_key_id, + "aws_secret_access_key": self.collection.aws_secret_access_key, + } + if self.collection.aws_host: + params["endpoint_url"] = self.collection.aws_host + + if self.collection.aws_region: + if self.collection.aws_region != "other": + params["region_name"] = self.collection.aws_region + elif self.collection.aws_other_region: + params["region_name"] = self.collection.aws_other_region + return params + + def _get_bucket(self): + params = self._aws_bucket_params() + s3 = boto3.resource("s3", **params) + bucket_name = self.collection.aws_bucket + bucket = s3.Bucket(bucket_name) + exists = True + try: + s3.meta.client.head_bucket(Bucket=bucket_name) + except ClientError as e: + # If a client error is thrown, then check that it was a 404 error. + # If it was a 404 error, then the bucket does not exist. + error_code = e.response["Error"]["Code"] + if error_code == "404": + exists = False + except EndpointConnectionError as error: + # log verbose error from s3, return short message for user + _logger.exception("Error during connection on S3") + raise exceptions.UserError(str(error)) from error + region_name = params.get("region_name") + if not exists: + if not region_name: + bucket = s3.create_bucket(Bucket=bucket_name) + else: + bucket = s3.create_bucket( + Bucket=bucket_name, + CreateBucketConfiguration={"LocationConstraint": region_name}, + ) + return bucket + + def _get_object(self, relative_path=None): + bucket = self._get_bucket() + path = None + if relative_path: + path = self._fullpath(relative_path) + return bucket.Object(key=path) + + def add(self, relative_path, bin_data, mimetype=None, **kwargs): + s3object = self._get_object(relative_path) + file_params = self._aws_upload_fileobj_params(mimetype=mimetype, **kwargs) + with io.BytesIO() as fileobj: + fileobj.write(bin_data) + fileobj.seek(0) + try: + s3object.upload_fileobj(fileobj, **file_params) + except ClientError as error: + # log verbose error from s3, return short message for user + _logger.exception("Error during storage of the file %s" % relative_path) + raise exceptions.UserError( + _("The file could not be stored: %s") % str(error) + ) from error + + def _aws_upload_fileobj_params(self, mimetype=None, **kw): + extra_args = {} + if mimetype: + extra_args["ContentType"] = mimetype + if self.collection.aws_cache_control: + extra_args["CacheControl"] = self.collection.aws_cache_control + if self.collection.aws_file_acl: + extra_args["ACL"] = self.collection.aws_file_acl + if extra_args: + return {"ExtraArgs": extra_args} + return {} + + def get(self, relative_path): + s3object = self._get_object(relative_path) + return s3object.get()["Body"].read() + + def list(self, relative_path): + bucket = self._get_bucket() + dir_path = self.collection.directory_path or "" + return [ + o.key.replace(dir_path, "").lstrip("/") + for o in bucket.objects.filter(Prefix=dir_path) + ] + + def delete(self, relative_path): + s3object = self._get_object(relative_path) + s3object.delete() diff --git a/storage_backend_s3/i18n/storage_backend_s3.pot b/storage_backend_s3/i18n/storage_backend_s3.pot new file mode 100644 index 0000000000..954bdea0fc --- /dev/null +++ b/storage_backend_s3/i18n/storage_backend_s3.pot @@ -0,0 +1,116 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * storage_backend_s3 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: storage_backend_s3 +#: model:ir.model.fields,field_description:storage_backend_s3.field_storage_backend__aws_host +msgid "AWS Host" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields,field_description:storage_backend_s3.field_storage_backend__aws_access_key_id +msgid "Access Key ID" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields.selection,name:storage_backend_s3.selection__storage_backend__backend_type__amazon_s3 +#: model_terms:ir.ui.view,arch_db:storage_backend_s3.storage_backend_view_form +msgid "Amazon S3" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields,field_description:storage_backend_s3.field_storage_backend__aws_cache_control +msgid "Aws Cache Control" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields,field_description:storage_backend_s3.field_storage_backend__aws_file_acl +msgid "Aws File Acl" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields,field_description:storage_backend_s3.field_storage_backend__backend_type +msgid "Backend Type" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields,field_description:storage_backend_s3.field_storage_backend__aws_bucket +msgid "Bucket" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields,help:storage_backend_s3.field_storage_backend__aws_host +msgid "If you are using a different host than standard AWS ones, eg: Exoscale" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields,field_description:storage_backend_s3.field_storage_backend__aws_other_region +msgid "Other region" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields,field_description:storage_backend_s3.field_storage_backend__aws_region +msgid "Region" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields,field_description:storage_backend_s3.field_storage_backend__aws_secret_access_key +msgid "Secret Access Key" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model,name:storage_backend_s3.model_storage_backend +msgid "Storage Backend" +msgstr "" + +#. module: storage_backend_s3 +#: code:addons/storage_backend_s3/components/s3_adapter.py:0 +#, python-format +msgid "The file could not be stored: %s" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields.selection,name:storage_backend_s3.selection__storage_backend__aws_file_acl__authenticated-read +msgid "authenticated-read" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields.selection,name:storage_backend_s3.selection__storage_backend__aws_file_acl__aws-exec-read +msgid "aws-exec-read" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields.selection,name:storage_backend_s3.selection__storage_backend__aws_file_acl__bucket-owner-full-control +msgid "bucket-owner-full-control" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields.selection,name:storage_backend_s3.selection__storage_backend__aws_file_acl__bucket-owner-read +msgid "bucket-owner-read" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields.selection,name:storage_backend_s3.selection__storage_backend__aws_file_acl__private +msgid "private" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields.selection,name:storage_backend_s3.selection__storage_backend__aws_file_acl__public-read +msgid "public-read" +msgstr "" + +#. module: storage_backend_s3 +#: model:ir.model.fields.selection,name:storage_backend_s3.selection__storage_backend__aws_file_acl__public-read-write +msgid "public-read-write" +msgstr "" diff --git a/storage_backend_s3/models/__init__.py b/storage_backend_s3/models/__init__.py new file mode 100644 index 0000000000..f45f402268 --- /dev/null +++ b/storage_backend_s3/models/__init__.py @@ -0,0 +1 @@ +from . import storage_backend diff --git a/storage_backend_s3/models/storage_backend.py b/storage_backend_s3/models/storage_backend.py new file mode 100644 index 0000000000..6a0d04a706 --- /dev/null +++ b/storage_backend_s3/models/storage_backend.py @@ -0,0 +1,86 @@ +# Copyright 2017 Akretion (http://www.akretion.com). +# @author Sébastien BEAU +# Copyright 2019 Camptocamp SA (http://www.camptocamp.com). +# @author Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import logging + +from odoo import fields, models + +_logger = logging.getLogger(__name__) + +try: + import boto3 +except ImportError as err: # pragma: no cover + _logger.debug(err) + + +def _load_aws_regions(): + _logger.info("Loading available AWS regions") + session = boto3.session.Session() + return [ + (region, region.replace("-", " ").capitalize()) + for region in session.get_available_regions("s3") + ] + + +# AWS regions won't change that often, fine to retrieve them at instance load. +# Also, this prevents to call AWS every time the selection list is accessed. +AWS_REGIONS = _load_aws_regions() + + +class StorageBackend(models.Model): + _inherit = "storage.backend" + + backend_type = fields.Selection( + selection_add=[("amazon_s3", "Amazon S3")], + ondelete={"amazon_s3": "set default"}, + ) + aws_host = fields.Char( + string="AWS Host", + help="If you are using a different host than standard AWS ones, " + "eg: Exoscale", + ) + aws_bucket = fields.Char(string="Bucket") + aws_access_key_id = fields.Char(string="Access Key ID") + aws_secret_access_key = fields.Char(string="Secret Access Key") + aws_region = fields.Selection(selection="_selection_aws_region", string="Region") + aws_cache_control = fields.Char(default="max-age=31536000, public") + aws_other_region = fields.Char(string="Other region") + aws_file_acl = fields.Selection( + selection=[ + ("", ""), + ("private", "private"), + ("public-read", "public-read"), + ("public-read-write", "public-read-write"), + ("aws-exec-read", "aws-exec-read"), + ("authenticated-read", "authenticated-read"), + ("bucket-owner-read", "bucket-owner-read"), + ("bucket-owner-full-control", "bucket-owner-full-control"), + ] + ) + + @property + def _server_env_fields(self): + env_fields = super()._server_env_fields + env_fields.update( + { + "aws_host": {}, + "aws_bucket": {}, + "aws_access_key_id": {}, + "aws_secret_access_key": {}, + "aws_region": {}, + "aws_other_region": {}, + "aws_cache_control": {}, + "aws_file_acl": {}, + } + ) + return env_fields + + def _selection_aws_region(self): + return ( + [("", "None")] + + AWS_REGIONS + + [("other", "Empty or Other (Manually specify below)")] + ) diff --git a/storage_backend_s3/readme/CONTRIBUTORS.rst b/storage_backend_s3/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..3cd662081b --- /dev/null +++ b/storage_backend_s3/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Sebastien Beau +* Raphaël Reverdy diff --git a/storage_backend_s3/readme/DESCRIPTION.rst b/storage_backend_s3/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..8d9fd944e8 --- /dev/null +++ b/storage_backend_s3/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Add the possibility to store and get data from amazon S3 for your storage backend diff --git a/storage_backend_s3/readme/ROADMAP.rst b/storage_backend_s3/readme/ROADMAP.rst new file mode 100644 index 0000000000..898d925979 --- /dev/null +++ b/storage_backend_s3/readme/ROADMAP.rst @@ -0,0 +1,2 @@ +There is an issue with the latest version of `boto3` and `urllib3` +- boto3 needs to be `boto3<=1.15.18` related with https://github.com/OCA/storage/issues/67 diff --git a/storage_backend_s3/static/description/icon.png b/storage_backend_s3/static/description/icon.png new file mode 100644 index 0000000000..3a0328b516 Binary files /dev/null and b/storage_backend_s3/static/description/icon.png differ diff --git a/storage_backend_s3/static/description/index.html b/storage_backend_s3/static/description/index.html new file mode 100644 index 0000000000..215d902869 --- /dev/null +++ b/storage_backend_s3/static/description/index.html @@ -0,0 +1,427 @@ + + + + + +Storage Backend S3 + + + +
+

Storage Backend S3

+ + +

Beta License: LGPL-3 OCA/storage Translate me on Weblate Try me on Runboat

+

Add the possibility to store and get data from amazon S3 for your storage backend

+

Table of contents

+ +
+

Known issues / Roadmap

+

There is an issue with the latest version of boto3 and urllib3 +- boto3 needs to be boto3<=1.15.18 related with https://github.com/OCA/storage/issues/67

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Akretion
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/storage project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/storage_backend_s3/tests/__init__.py b/storage_backend_s3/tests/__init__.py new file mode 100644 index 0000000000..1282cd2ce0 --- /dev/null +++ b/storage_backend_s3/tests/__init__.py @@ -0,0 +1 @@ +from . import test_amazon_s3 diff --git a/storage_backend_s3/tests/cassettes/AmazonS3Case.test_setting_and_getting_data_from_dir.yaml b/storage_backend_s3/tests/cassettes/AmazonS3Case.test_setting_and_getting_data_from_dir.yaml new file mode 100644 index 0000000000..fbbc7c633f --- /dev/null +++ b/storage_backend_s3/tests/cassettes/AmazonS3Case.test_setting_and_getting_data_from_dir.yaml @@ -0,0 +1,932 @@ +interactions: +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzIxWg== + amz-sdk-invocation-id: + - !!binary | + M2FiMDU2NjAtYjQ4MC00OTE2LWIxMmYtYzg2ODlkM2JjZmI5 + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.amazonaws.com/ + response: + body: + string: '' + headers: + Connection: + - close + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:21 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - XHryKE5v/+9xYFikJ9YKRU5XJKKuK8+geu+LGRENRZ3gwrNhGZD8X/gHhm6ayl81/DLAxIoH3Lc= + x-amz-request-id: + - Y7APJ03KWPSNXXGQ + status: + code: 400 + message: Bad Request +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzIyWg== + amz-sdk-invocation-id: + - !!binary | + M2FiMDU2NjAtYjQ4MC00OTE2LWIxMmYtYzg2ODlkM2JjZmI5 + amz-sdk-request: + - !!binary | + dHRsPTIwMjUwNDAxVDEyMzgyMVo7IGF0dGVtcHQ9MjsgbWF4PTU= + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/ + response: + body: + string: '' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:23 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-access-point-alias: + - 'false' + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - eZXUpgh/8z5YX7a+55rO9GnJVcCQnvJRiBdZbm8cZVuEa5N2JG5bhL+WJ53oPydSM3np1krXp4C60dzb3m/kFQrxdOluNAase2lnpDL8tbw= + x-amz-request-id: + - Y7AY2XD5KQ1PSEB0 + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIG0vQyBjZmcvcmV0cnktbW9kZSNsZWdhY3kgQm90b2NvcmUvMS4zNy4yNCBS + ZXNvdXJjZQ== + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzIyWg== + amz-sdk-invocation-id: + - !!binary | + MDQ0NmNmZDctOTYyYy00ZDI3LThiNmYtMmNjMTZmOTkzYzY0 + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: GET + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/?prefix=subdirectory%2Fhere&encoding-type=url + response: + body: + string: ' + + test-storage-backendsubdirectory/here1000urlfalse' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:23 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - EYLuAA8D+fRAzWFdfSjWfd090LRqIGTE4yfTWvyrjmFvUh/OI5ajfsywFnuCM92vyqd67Mw7/xKyAHd9PlpD/gMuaW6N2B/bkZZwQaojAJ4= + x-amz-request-id: + - Y7AG7X98PKPEY9NY + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzIyWg== + amz-sdk-invocation-id: + - !!binary | + YzA4Mzk1NTQtNjE0Zi00ODk2LWFiMmItZTA3NjQ3MzVhNTgx + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.amazonaws.com/ + response: + body: + string: '' + headers: + Connection: + - close + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:22 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - S1eJaSy44a/J2n9Qpz4Hj0arGi78gu17YE/Du443VTnqdNLpNjH4Nhrp/FfK7IsLK4TPpxp0i7M= + x-amz-request-id: + - Y7AJNB0TP5XHDY08 + status: + code: 400 + message: Bad Request +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzIyWg== + amz-sdk-invocation-id: + - !!binary | + YzA4Mzk1NTQtNjE0Zi00ODk2LWFiMmItZTA3NjQ3MzVhNTgx + amz-sdk-request: + - !!binary | + dHRsPTIwMjUwNDAxVDEyMzgyMlo7IGF0dGVtcHQ9MjsgbWF4PTU= + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/ + response: + body: + string: '' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:23 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-access-point-alias: + - 'false' + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - s6Z8CPLTB1j19HeTNKEvmgilAMNnPZdlJ9yY36yEPwMCuHVnAJzP2p+xiCXC+CErSpBtTUO5mH2rWIrvijuGUSiB9SCErMaDdOftzMdEMww= + x-amz-request-id: + - Y7APDR8CJ50V4JEZ + status: + code: 200 + message: OK +- request: + body: !!python/object/new:_io.BytesIO + state: !!python/tuple + - !!binary | + MTUNClRoaXMgaXMgYSBzaW1wbGUgZmlsZQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6SVBYRm53 + PT0NCg0K + - 0 + - null + headers: + Content-Encoding: + - !!binary | + YXdzLWNodW5rZWQ= + Content-Type: + - !!binary | + dGV4dC9wbGFpbg== + Expect: + - !!binary | + MTAwLWNvbnRpbnVl + Transfer-Encoding: + - !!binary | + Y2h1bmtlZA== + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIG0vRyBjZmcvcmV0cnktbW9kZSNsZWdhY3kgQm90b2NvcmUvMS4zNy4yNCBS + ZXNvdXJjZQ== + X-Amz-Content-SHA256: + - !!binary | + U1RSRUFNSU5HLVVOU0lHTkVELVBBWUxPQUQtVFJBSUxFUg== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzIzWg== + X-Amz-Decoded-Content-Length: + - !!binary | + MjE= + X-Amz-Trailer: + - !!binary | + eC1hbXotY2hlY2tzdW0tY3JjMzI= + amz-sdk-invocation-id: + - !!binary | + ZTYzNDU5NDgtMjZiOS00MTdmLWJkYjUtNTI2NDE2MDU1Y2Y3 + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + x-amz-sdk-checksum-algorithm: + - !!binary | + Q1JDMzI= + method: PUT + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/subdirectory/here/test_file.txt + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 01 Apr 2025 12:37:24 GMT + ETag: + - '"190aa3117b11aab3f2c5f4e5f7d9e402"' + Server: + - AmazonS3 + x-amz-checksum-crc32: + - IPXFnw== + x-amz-checksum-type: + - FULL_OBJECT + x-amz-id-2: + - dbIo37f/bBSR59hLg6dFhW48QtZpTcsawzH5GbdF/kMNuBiD1BR0kSsP6FnijarldqW2dxuAXAaXw4S1BLKtgrZKbdHlt0QE8BkeptICbPs= + x-amz-request-id: + - 97FYMA8KQ06EWMBT + x-amz-server-side-encryption: + - AES256 + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzIzWg== + amz-sdk-invocation-id: + - !!binary | + ZTRkN2Q0OTktYjRiNS00ZmRjLTkwMTctY2M4ZjM4ODllOWEy + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.amazonaws.com/ + response: + body: + string: '' + headers: + Connection: + - close + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:23 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - 3WcA7ZG0UHMfByPAWo4sENFridfJqslztAypidYrYzJFR3zn8MW/7Uw4xLEv/VGy8wt4WTVvxr0= + x-amz-request-id: + - 97FJKZ80MCG078RE + status: + code: 400 + message: Bad Request +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzIzWg== + amz-sdk-invocation-id: + - !!binary | + ZTRkN2Q0OTktYjRiNS00ZmRjLTkwMTctY2M4ZjM4ODllOWEy + amz-sdk-request: + - !!binary | + dHRsPTIwMjUwNDAxVDEyMzgyM1o7IGF0dGVtcHQ9MjsgbWF4PTU= + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/ + response: + body: + string: '' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:24 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-access-point-alias: + - 'false' + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - WcXV2Wa6XoQACZm3q5JJtdVl7/v9aBO8WiUsC20F/Ypw0IKmswjmX3gwiwnLmZARAqzu6W8T4qAVHG1iQy3/ReNrOgCcIQ9NP0wZhDjdS8M= + x-amz-request-id: + - 97FTVVPR09AGNJ65 + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIG0vQyBjZmcvcmV0cnktbW9kZSNsZWdhY3kgQm90b2NvcmUvMS4zNy4yNCBS + ZXNvdXJjZQ== + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzIzWg== + amz-sdk-invocation-id: + - !!binary | + OGE2N2RmZTgtNjEzMS00NmIxLTkwNmMtNDM5YWY1OTk5ZmZl + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: GET + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/?prefix=subdirectory%2Fhere&encoding-type=url + response: + body: + string: ' + + test-storage-backendsubdirectory/here1000urlfalsesubdirectory/here/test_file.txt2025-04-01T12:37:24.000Z"190aa3117b11aab3f2c5f4e5f7d9e402"CRC32FULL_OBJECT2111dffaa7549a53de7a009200f8a1def3cb720e61ee61bc3b6617dd5be15b9ad9STANDARD' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:24 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - roMDY5xgrUptWSr5SQ3EGVpsivXXzalulZLm7zPHQU7vlz781NwDq/mD3lehyz0kWuHg+k1Ms+vqrzsVK64V68C2QTbZNYVFpSIP8EmA+K4= + x-amz-request-id: + - 97FKX1CHRQENWE38 + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzIzWg== + amz-sdk-invocation-id: + - !!binary | + OWE4ODczYzQtMGMwZS00OTUyLTlkYTEtMGNkMjZhMGQyMDdm + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.amazonaws.com/ + response: + body: + string: '' + headers: + Connection: + - close + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:24 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - v1S1bg0Hvzvy0Ju7+ZMAgiiocE8ir1q0cRExCusgNBYEhQvCclBe/kbfg0nn7iC7hk17AX6kJ8w= + x-amz-request-id: + - QHT8GE37ZMGDZZZH + status: + code: 400 + message: Bad Request +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI0Wg== + amz-sdk-invocation-id: + - !!binary | + OWE4ODczYzQtMGMwZS00OTUyLTlkYTEtMGNkMjZhMGQyMDdm + amz-sdk-request: + - !!binary | + dHRsPTIwMjUwNDAxVDEyMzgyNFo7IGF0dGVtcHQ9MjsgbWF4PTU= + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/ + response: + body: + string: '' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:25 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-access-point-alias: + - 'false' + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - jX8R9xtf5ZA6NPZjlG3KnpIin8lP0hCuU4fS6+GJJFNeHaVzWqqieV/4LYoAuAl+OOYMVsF+7oCiNZcrr3vP0VnH2qRqQxoXHxyJkLP+7BI= + x-amz-request-id: + - QHT7XQHTXFNEPW2Q + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI0Wg== + amz-sdk-invocation-id: + - !!binary | + ZmM0MmMyMDgtYjJjYS00MzZkLWJlNGItZjEyZTJiMjA4N2Nj + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + x-amz-checksum-mode: + - !!binary | + RU5BQkxFRA== + method: GET + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/subdirectory/here/test_file.txt + response: + body: + string: This is a simple file + headers: + Accept-Ranges: + - bytes + Content-Length: + - '21' + Content-Type: + - text/plain + Date: + - Tue, 01 Apr 2025 12:37:25 GMT + ETag: + - '"190aa3117b11aab3f2c5f4e5f7d9e402"' + Last-Modified: + - Tue, 01 Apr 2025 12:37:24 GMT + Server: + - AmazonS3 + x-amz-checksum-crc32: + - IPXFnw== + x-amz-checksum-type: + - FULL_OBJECT + x-amz-id-2: + - PMYREPjneuUmA4bcjFvDgeOv1ZUxCNPC4w7lk3VPb4MnQ6e5ZrzmatrjkHCqLg2qJFfExpqkijYI1BwwHfJozY+uUEuSRNT9dGj25Yk5dBw= + x-amz-request-id: + - QHT4A3BMM14KJSJ9 + x-amz-server-side-encryption: + - AES256 + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI0Wg== + amz-sdk-invocation-id: + - !!binary | + YWY0NWRjOGQtZmNlMi00NTAxLWEzYzUtMzhjMTdhYmRiMmYy + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.amazonaws.com/ + response: + body: + string: '' + headers: + Connection: + - close + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:23 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - zrCgmwJWXcikyQNPdhHkTjBTcXg75jqapOGh2QmCRYBK62S57VIhYquik2OFwdTIBzjfRWh3GVo= + x-amz-request-id: + - QHTFG853AKJK3PC3 + status: + code: 400 + message: Bad Request +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI0Wg== + amz-sdk-invocation-id: + - !!binary | + YWY0NWRjOGQtZmNlMi00NTAxLWEzYzUtMzhjMTdhYmRiMmYy + amz-sdk-request: + - !!binary | + dHRsPTIwMjUwNDAxVDEyMzgyM1o7IGF0dGVtcHQ9MjsgbWF4PTU= + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/ + response: + body: + string: '' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:25 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-access-point-alias: + - 'false' + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - Ug0qGaYA2wUpm3K1TJkepEB8h20JmHzzYMCJVeK4pMPn8nAeGelw80lubnsY1zKPhNjEfilqsPZXW2xav1iesq6YPc06OXb9RC6sNIMC9nM= + x-amz-request-id: + - QHTB80F090EK0ZVF + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI0Wg== + amz-sdk-invocation-id: + - !!binary | + NDM3MjJiMDItZmNmZS00NWEzLWI3MjAtNzEzZTEwMDI1NWY2 + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/subdirectory/here/test_file.txt + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '21' + Content-Type: + - text/plain + Date: + - Tue, 01 Apr 2025 12:37:26 GMT + ETag: + - '"190aa3117b11aab3f2c5f4e5f7d9e402"' + Last-Modified: + - Tue, 01 Apr 2025 12:37:24 GMT + Server: + - AmazonS3 + x-amz-id-2: + - lsYY2KmyQdA3sRSDk3BubRkj98XDGM9X2nnDVKWuZrSurMDkftvhRe0HbPM3cqw6s+n0Lg01JzRVN4nn/HkXU3WydmYLei38CFRT6kPQEmQ= + x-amz-request-id: + - EV6PDKDPCCBMWG2Z + x-amz-server-side-encryption: + - AES256 + status: + code: 200 + message: OK +- request: + body: null + headers: + Content-Length: + - '0' + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI1Wg== + amz-sdk-invocation-id: + - !!binary | + OTMzZDIxNTEtMDM5Zi00M2FmLWI4ZGMtM2FjMmU5OTZiZTY1 + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: DELETE + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/subdirectory/here/test_file.txt + response: + body: + string: '' + headers: + Date: + - Tue, 01 Apr 2025 12:37:26 GMT + Server: + - AmazonS3 + x-amz-id-2: + - g4vUtA2QShVS9f2qY2kVSZ60LkSP75XFT+UwotD5pnOxSDZMvHEXcnZOZswuKzYnt4Iu2YY1bSyHlfjjUvUUbGwR0dq8q/6L1anY/mwGbW8= + x-amz-request-id: + - EV6Q3K8TF80Y1HTN + status: + code: 204 + message: No Content +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI1Wg== + amz-sdk-invocation-id: + - !!binary | + MDk2MTlkZTMtOTdiMS00OTI5LTkyMWQtYjI1ZDlmZDRkMmU1 + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.amazonaws.com/ + response: + body: + string: '' + headers: + Connection: + - close + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:25 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - qr1rS9HjLXAIgyF78ggBAbADv+5wGkKOWN+zriwRn8XMpt6fu0l/Ac510eRtc+P+XrX6oAXzbTA= + x-amz-request-id: + - EV6TDF3RT5N118HZ + status: + code: 400 + message: Bad Request +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI1Wg== + amz-sdk-invocation-id: + - !!binary | + MDk2MTlkZTMtOTdiMS00OTI5LTkyMWQtYjI1ZDlmZDRkMmU1 + amz-sdk-request: + - !!binary | + dHRsPTIwMjUwNDAxVDEyMzgyNVo7IGF0dGVtcHQ9MjsgbWF4PTU= + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/ + response: + body: + string: '' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:26 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-access-point-alias: + - 'false' + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - +X5fGFzmGdFrQA2HDpg4NbsgEdkEMN7fELsYhOIptH5wiU7aD8cdExn0JhXwEoqdfZJDRRwExfn6F6B+z4TWwwAhDzrWOxvdhLqL5gB9xRA= + x-amz-request-id: + - EV6YDW68BAZ53VCH + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIG0vQyBjZmcvcmV0cnktbW9kZSNsZWdhY3kgQm90b2NvcmUvMS4zNy4yNCBS + ZXNvdXJjZQ== + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI1Wg== + amz-sdk-invocation-id: + - !!binary | + NTcyNWI3YzYtZWNiNy00YzA2LTkwMzEtYjc3MzY4NDgxMTg1 + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: GET + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/?prefix=subdirectory%2Fhere&encoding-type=url + response: + body: + string: ' + + test-storage-backendsubdirectory/here1000urlfalse' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:26 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - B6vRthDEH+rboNtzIcA4qz41YleCTpw/DrZkcTdpGQGLYC6S7+ugzMtTR3OdjbCptSTvOYDRuLClMXAv7wjAHsmgYYqUDDng22WFF2kN/t8= + x-amz-request-id: + - EV6NKHY95T2X379A + status: + code: 200 + message: OK +version: 1 diff --git a/storage_backend_s3/tests/cassettes/AmazonS3Case.test_setting_and_getting_data_from_root.yaml b/storage_backend_s3/tests/cassettes/AmazonS3Case.test_setting_and_getting_data_from_root.yaml new file mode 100644 index 0000000000..593e48c101 --- /dev/null +++ b/storage_backend_s3/tests/cassettes/AmazonS3Case.test_setting_and_getting_data_from_root.yaml @@ -0,0 +1,932 @@ +interactions: +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI1Wg== + amz-sdk-invocation-id: + - !!binary | + MGM2ZjdhMDgtOGFlYi00NjAwLWEzZGYtNTkxZGNmMTA5MGJm + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.amazonaws.com/ + response: + body: + string: '' + headers: + Connection: + - close + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:25 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - r+g6tPwU214RusxFoP0UH4uFMlq2qCNsAQNZ60OKsHQHdtjgvdh+sj0l3mwfKCmZL4Wuk6PRXCw= + x-amz-request-id: + - DYNEM5JRYT6SZGPY + status: + code: 400 + message: Bad Request +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI2Wg== + amz-sdk-invocation-id: + - !!binary | + MGM2ZjdhMDgtOGFlYi00NjAwLWEzZGYtNTkxZGNmMTA5MGJm + amz-sdk-request: + - !!binary | + dHRsPTIwMjUwNDAxVDEyMzgyNVo7IGF0dGVtcHQ9MjsgbWF4PTU= + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/ + response: + body: + string: '' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:27 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-access-point-alias: + - 'false' + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - qE3QZw8lsL7CNs734L6lmtbDNFnKtgnM7MxwT8/kp75mBDVr6nSJlJQ1BnrosJqdY3xmt5NyJcz2sBh9Kkn3MDRjL3fKfO8gewZx0zk2lqM= + x-amz-request-id: + - DYN78JTKSC81A28M + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIG0vQyBjZmcvcmV0cnktbW9kZSNsZWdhY3kgQm90b2NvcmUvMS4zNy4yNCBS + ZXNvdXJjZQ== + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI2Wg== + amz-sdk-invocation-id: + - !!binary | + MmY3NTg3OWItYjJjOC00YzYyLWFkZGEtY2E3NTliNTg2ZDE0 + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: GET + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/?prefix=&encoding-type=url + response: + body: + string: ' + + test-storage-backend1000urlfalse' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:27 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - XOfEiwDxp4U5LAdfefazjp0AsVy2YdO0SiBHtrDcHu5WfNPP/b+JlZZvq2JULiHHLRVVzjbWAaw1/XbYFgXbL9xy+2uvlmepel6Ub/m+wlw= + x-amz-request-id: + - DYN8CT6ATC5YDDND + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI2Wg== + amz-sdk-invocation-id: + - !!binary | + Yjc5NDRhMzAtYTVlYi00ZmRmLWE0OGEtZmE3NDM2ODkwZWM5 + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.amazonaws.com/ + response: + body: + string: '' + headers: + Connection: + - close + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:26 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - /8jjK0fm88XJFuMMmBSrnlJ+adUryij0R3QOttMuErxCX1e+4PmUQFRotDqhzNo3X7WyrIidkEc= + x-amz-request-id: + - DYN85BE37VSGSV1C + status: + code: 400 + message: Bad Request +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI2Wg== + amz-sdk-invocation-id: + - !!binary | + Yjc5NDRhMzAtYTVlYi00ZmRmLWE0OGEtZmE3NDM2ODkwZWM5 + amz-sdk-request: + - !!binary | + dHRsPTIwMjUwNDAxVDEyMzgyNlo7IGF0dGVtcHQ9MjsgbWF4PTU= + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/ + response: + body: + string: '' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:27 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-access-point-alias: + - 'false' + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - srQDx1XjKsUajtEB0HxiZ5qYHYHGaiIjJ+KgdrEwmBCL6HBkRfxX+CY+2uB54JbnaxobHD2PShUnNjq/jUWTmq1w31r3bxAxNP22apLIJLg= + x-amz-request-id: + - DYN9DF6DA4WSH5TP + status: + code: 200 + message: OK +- request: + body: !!python/object/new:_io.BytesIO + state: !!python/tuple + - !!binary | + MTUNClRoaXMgaXMgYSBzaW1wbGUgZmlsZQ0KMA0KeC1hbXotY2hlY2tzdW0tY3JjMzI6SVBYRm53 + PT0NCg0K + - 0 + - null + headers: + Content-Encoding: + - !!binary | + YXdzLWNodW5rZWQ= + Content-Type: + - !!binary | + dGV4dC9wbGFpbg== + Expect: + - !!binary | + MTAwLWNvbnRpbnVl + Transfer-Encoding: + - !!binary | + Y2h1bmtlZA== + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIG0vRyBjZmcvcmV0cnktbW9kZSNsZWdhY3kgQm90b2NvcmUvMS4zNy4yNCBS + ZXNvdXJjZQ== + X-Amz-Content-SHA256: + - !!binary | + U1RSRUFNSU5HLVVOU0lHTkVELVBBWUxPQUQtVFJBSUxFUg== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI2Wg== + X-Amz-Decoded-Content-Length: + - !!binary | + MjE= + X-Amz-Trailer: + - !!binary | + eC1hbXotY2hlY2tzdW0tY3JjMzI= + amz-sdk-invocation-id: + - !!binary | + Yjk3OWNmNTctNzg0Ny00NGNjLTgzNTgtNjhjOTg2MDFjMjAx + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + x-amz-sdk-checksum-algorithm: + - !!binary | + Q1JDMzI= + method: PUT + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/test_file.txt + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 01 Apr 2025 12:37:28 GMT + ETag: + - '"190aa3117b11aab3f2c5f4e5f7d9e402"' + Server: + - AmazonS3 + x-amz-checksum-crc32: + - IPXFnw== + x-amz-checksum-type: + - FULL_OBJECT + x-amz-id-2: + - KB5mHSdPysFRvHD8CrBK8zGni8utrrvG7ErPzF8I6H15pHyXm66VBvjjKQlozBAd02BiGA2tzscSQ9WExb0eXeh8pn2/iOlmSFaG5rGt7cg= + x-amz-request-id: + - SYQGX5JQCFVHH9N1 + x-amz-server-side-encryption: + - AES256 + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI3Wg== + amz-sdk-invocation-id: + - !!binary | + MTEwNjBiNjYtMzY1Yy00OTI2LTliMTItOTZkMDk4NTFhYjQy + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.amazonaws.com/ + response: + body: + string: '' + headers: + Connection: + - close + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:26 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - WWDvbEdqSYWz0YtjY4/Ewi2dne7bIaBrtx9L7/nIG6MchG+1vs4KdLasn+QZcqULBzX+SeodBCY= + x-amz-request-id: + - SYQW7QRVDR4A0T9C + status: + code: 400 + message: Bad Request +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI3Wg== + amz-sdk-invocation-id: + - !!binary | + MTEwNjBiNjYtMzY1Yy00OTI2LTliMTItOTZkMDk4NTFhYjQy + amz-sdk-request: + - !!binary | + dHRsPTIwMjUwNDAxVDEyMzgyNlo7IGF0dGVtcHQ9MjsgbWF4PTU= + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/ + response: + body: + string: '' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:28 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-access-point-alias: + - 'false' + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - uyY8pkcct4UGYrRVJ2zwb2Jln+oljvT7UcWS0Mm20USlNMvnoR9lVO65HCM2XGC5agEs68ue2Nz4D16zoaw2kmjPGB/XrLt7jzEGHXopm8k= + x-amz-request-id: + - SYQWSTC16V5VWK2Q + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIG0vQyBjZmcvcmV0cnktbW9kZSNsZWdhY3kgQm90b2NvcmUvMS4zNy4yNCBS + ZXNvdXJjZQ== + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI3Wg== + amz-sdk-invocation-id: + - !!binary | + MzU1YjY5ODEtOTA5Yy00ZTBjLTgwY2UtNGNmNTQ4MWM2ZjBk + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: GET + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/?prefix=&encoding-type=url + response: + body: + string: ' + + test-storage-backend1000urlfalsetest_file.txt2025-04-01T12:37:28.000Z"190aa3117b11aab3f2c5f4e5f7d9e402"CRC32FULL_OBJECT2111dffaa7549a53de7a009200f8a1def3cb720e61ee61bc3b6617dd5be15b9ad9STANDARD' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:28 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - OsbAyrJXZP+jJMyDAowdEKWRFU8M3W29sPTSni29lMm0yGz7CRkh+DCxPE85oedsMvrXRvjT9Kp/ixoeTe8Sw/lcDXQ+TYtUX9xIIGV85E0= + x-amz-request-id: + - SYQJP2GFW4BXVHY5 + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI3Wg== + amz-sdk-invocation-id: + - !!binary | + ZjJhYjUyOTQtYTAyYS00NGQyLTkyM2ItM2MzMWY2YTgxZGQ5 + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.amazonaws.com/ + response: + body: + string: '' + headers: + Connection: + - close + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:27 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - oddwKWi89vpcuAP8cfkWubJ/qxcn74IOe1tOgpdn8n7FfyVt4W664rGxlZ2clHbzBslSDQIsDxw= + x-amz-request-id: + - SYQV694Y3GGS0N8K + status: + code: 400 + message: Bad Request +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI3Wg== + amz-sdk-invocation-id: + - !!binary | + ZjJhYjUyOTQtYTAyYS00NGQyLTkyM2ItM2MzMWY2YTgxZGQ5 + amz-sdk-request: + - !!binary | + dHRsPTIwMjUwNDAxVDEyMzgyN1o7IGF0dGVtcHQ9MjsgbWF4PTU= + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/ + response: + body: + string: '' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:29 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-access-point-alias: + - 'false' + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - b3IMzBMaVddW0o1kZD1LA2UPMprhxLPTT7lcpgIsD1JHkr5XGYLF02ynYTFFTwBt5vmK6fdV92ADmu6PxbCj2ZI7YuX8MXcoYN955vbpzf0= + x-amz-request-id: + - SPP3V5PDKF87J0TD + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI4Wg== + amz-sdk-invocation-id: + - !!binary | + MGVhYzIwMmMtZTI1MC00ZTJjLTgwMmEtZGYwMTU2OWFlYmUw + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + x-amz-checksum-mode: + - !!binary | + RU5BQkxFRA== + method: GET + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/test_file.txt + response: + body: + string: This is a simple file + headers: + Accept-Ranges: + - bytes + Content-Length: + - '21' + Content-Type: + - text/plain + Date: + - Tue, 01 Apr 2025 12:37:29 GMT + ETag: + - '"190aa3117b11aab3f2c5f4e5f7d9e402"' + Last-Modified: + - Tue, 01 Apr 2025 12:37:28 GMT + Server: + - AmazonS3 + x-amz-checksum-crc32: + - IPXFnw== + x-amz-checksum-type: + - FULL_OBJECT + x-amz-id-2: + - j6AHPstM98fMi9SElqqLcvLu6jlDAvQcVQ03HAHDUNNXYrFxidt2ORrCnmq8+mrF6BzEEHkGnzFL5hheTaP2xk6sYviRcQOuqW1Gk/9vINs= + x-amz-request-id: + - SPP0YHV0Z0KC4XAG + x-amz-server-side-encryption: + - AES256 + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI4Wg== + amz-sdk-invocation-id: + - !!binary | + OTAxZGZhZGUtMTVjYi00MjNkLTlkMTgtZTk5NTFiMThlMGYx + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.amazonaws.com/ + response: + body: + string: '' + headers: + Connection: + - close + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:28 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - zwvBD5CYRNNJVOCjFj2ha37+7f1dv0QPYaevqanYjLknh+v3l5XFA1AFtrTU0/9MJCNkeD/AM68= + x-amz-request-id: + - SPPDWZQADB3J0QMW + status: + code: 400 + message: Bad Request +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI4Wg== + amz-sdk-invocation-id: + - !!binary | + OTAxZGZhZGUtMTVjYi00MjNkLTlkMTgtZTk5NTFiMThlMGYx + amz-sdk-request: + - !!binary | + dHRsPTIwMjUwNDAxVDEyMzgyOFo7IGF0dGVtcHQ9MjsgbWF4PTU= + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/ + response: + body: + string: '' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:29 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-access-point-alias: + - 'false' + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - keg4zK/iYgJeK5P/uPdaxTh/TWXq5BdtfYTE5XpjPdJTFUJJstUQiwR5BDGHOjqTrJtzspavPh2G6NiT8reseGWRebWY8NMcfphlz1c1Inw= + x-amz-request-id: + - SPP9SVDCV0YT94H5 + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI4Wg== + amz-sdk-invocation-id: + - !!binary | + YTViMzVhYTMtNjIyZC00MzlmLWExMzItYjBmYWMxZjFmMjAz + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/test_file.txt + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '21' + Content-Type: + - text/plain + Date: + - Tue, 01 Apr 2025 12:37:29 GMT + ETag: + - '"190aa3117b11aab3f2c5f4e5f7d9e402"' + Last-Modified: + - Tue, 01 Apr 2025 12:37:28 GMT + Server: + - AmazonS3 + x-amz-id-2: + - SrQ1apQL0Swf5AdbXWT6q0E+YFsntttiAwaIyaMUPvu/wBDJ/IRgvaZwEshukcm7t65oeDqpbI8ZxOfsyc6ZD8Y3dWPyPZ1prM5uwVPilB8= + x-amz-request-id: + - SPP4CKEZEFSEPV5C + x-amz-server-side-encryption: + - AES256 + status: + code: 200 + message: OK +- request: + body: null + headers: + Content-Length: + - '0' + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI4Wg== + amz-sdk-invocation-id: + - !!binary | + NzcyZDBhMzAtNjQyZS00NGVhLWJlMGQtMWFjMTBhNGRlNTU0 + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: DELETE + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/test_file.txt + response: + body: + string: '' + headers: + Date: + - Tue, 01 Apr 2025 12:37:30 GMT + Server: + - AmazonS3 + x-amz-id-2: + - BEABJ8LeRdn4qzGU7kZn9vkm+WanVEG9TCsNE4PNbVegQaG9p1mMukMQ+Y/JDUebEo+x2gP6a/NRc180rVwUTNpjEaB/IzaHAcBKcE+zrG8= + x-amz-request-id: + - PDCSQY0CH07RPW2V + status: + code: 204 + message: No Content +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI5Wg== + amz-sdk-invocation-id: + - !!binary | + ZjJkZTQzZjAtMWVkNS00Y2I0LTgwZjItMzYxODQwNWUxOWQ2 + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: HEAD + uri: https://test-storage-backend.s3.amazonaws.com/ + response: + body: + string: '' + headers: + Connection: + - close + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:28 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - M1bOw5p5Q+hCkkOxR7mAXFg8N4hDwOiZJk1eumk9APb7kzHyOQtvx58r6OzV+RqXNpxFOKLJZLU= + x-amz-request-id: + - PDCM78QGKAQCD71P + status: + code: 400 + message: Bad Request +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIGNmZy9yZXRyeS1tb2RlI2xlZ2FjeSBCb3RvY29yZS8xLjM3LjI0IFJlc291 + cmNl + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI5Wg== + amz-sdk-invocation-id: + - !!binary | + ZjJkZTQzZjAtMWVkNS00Y2I0LTgwZjItMzYxODQwNWUxOWQ2 + amz-sdk-request: + - !!binary | + dHRsPTIwMjUwNDAxVDEyMzgyOFo7IGF0dGVtcHQ9MjsgbWF4PTU= + method: HEAD + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/ + response: + body: + string: '' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:30 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-access-point-alias: + - 'false' + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - PyK8CS290QPrAFH4icMh40lirWJLz8LKK3Ou3jmcrL7XRWAmtXNdrJF+7zk+q0yl7OjkYFgFg+YgjHcv3ra32Wh91BsbCQq4/PcCjHSEB5U= + x-amz-request-id: + - PDCZFD8M3R3GJGWQ + status: + code: 200 + message: OK +- request: + body: null + headers: + User-Agent: + - !!binary | + Qm90bzMvMS4zNy4yNCBtZC9Cb3RvY29yZSMxLjM3LjI0IHVhLzIuMSBvcy9saW51eCM2LjEyLjEw + LTc2MDYxMjAzLWdlbmVyaWMgbWQvYXJjaCN4ODZfNjQgbGFuZy9weXRob24jMy4xMi4wIG1kL3B5 + aW1wbCNDUHl0aG9uIG0vQyBjZmcvcmV0cnktbW9kZSNsZWdhY3kgQm90b2NvcmUvMS4zNy4yNCBS + ZXNvdXJjZQ== + X-Amz-Content-SHA256: + - !!binary | + ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3 + ODUyYjg1NQ== + X-Amz-Date: + - !!binary | + MjAyNTA0MDFUMTIzNzI5Wg== + amz-sdk-invocation-id: + - !!binary | + NjgyZGZiY2MtNjUwNy00NzI5LThiOTctODk4NWQ3NTdiNzEx + amz-sdk-request: + - !!binary | + YXR0ZW1wdD0x + method: GET + uri: https://test-storage-backend.s3.eu-central-1.amazonaws.com/?prefix=&encoding-type=url + response: + body: + string: ' + + test-storage-backend1000urlfalse' + headers: + Content-Type: + - application/xml + Date: + - Tue, 01 Apr 2025 12:37:30 GMT + Server: + - AmazonS3 + Transfer-Encoding: + - chunked + x-amz-bucket-region: + - eu-central-1 + x-amz-id-2: + - hM4PCDgv3HS/joBHR3JTPTISyNDdxzeESyTA63X9Bk/hgoPCipj9FBJ8l1HvuAcyBhuBRiT+XCLqxdnk0ZB7YkTZM1rR7sGEdqpRJjpl3nw= + x-amz-request-id: + - PDCK8M1A3T0C1FEX + status: + code: 200 + message: OK +version: 1 diff --git a/storage_backend_s3/tests/test_amazon_s3.py b/storage_backend_s3/tests/test_amazon_s3.py new file mode 100644 index 0000000000..fdbc8a2470 --- /dev/null +++ b/storage_backend_s3/tests/test_amazon_s3.py @@ -0,0 +1,74 @@ +# Copyright 2017 Akretion (http://www.akretion.com). +# @author Sébastien BEAU +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +# pylint: disable=missing-manifest-dependency +# disable warning on 'vcr' missing in manifest: this is only a dependency for +# dev/tests + +import logging +import os + +from vcr_unittest import VCRMixin + +from odoo.addons.storage_backend.tests.common import BackendStorageTestMixin, CommonCase + +_logger = logging.getLogger(__name__) + + +class AmazonS3Case(VCRMixin, CommonCase, BackendStorageTestMixin): + def _get_vcr_kwargs(self, **kwargs): + return { + "record_mode": "once", + "match_on": ["method", "path", "query"], + "filter_headers": ["Authorization"], + "decode_compressed_response": True, + } + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.backend.write( + { + "backend_type": "amazon_s3", + "aws_bucket": os.environ.get("AWS_BUCKET", "test-storage-backend"), + "aws_access_key_id": os.environ.get( + "AWS_ACCESS_KEY_ID", "FAKE_ACCESS_KEY_ID" + ), + "aws_secret_access_key": os.environ.get( + "AWS_SECRET_ACCESS_KEY", "FAKE_SECRET_ACCESS_KEY" + ), + } + ) + + def test_setting_and_getting_data_from_root(self): + self._test_setting_and_getting_data_from_root() + + def test_setting_and_getting_data_from_dir(self): + self._test_setting_and_getting_data_from_dir() + + def test_params(self): + adapter = self.backend._get_adapter() + self.backend.aws_host = "" + params = adapter._aws_bucket_params() + self.assertNotIn("endpoint_url", params) + self.backend.aws_host = "another.s3.endpoint.com" + params = adapter._aws_bucket_params() + self.assertEqual(params["endpoint_url"], "another.s3.endpoint.com") + + def test_aws_other_region_filled(self): + adapter = self.backend._get_adapter() + self.assertFalse(self.backend.aws_region) + self.backend.aws_other_region = "fr-par" + params = adapter._aws_bucket_params() + # no region as "aws_region" is empty + self.assertNotIn("region_name", params) + self.backend.aws_region = "other" + params = adapter._aws_bucket_params() + self.assertEqual(params["region_name"], "fr-par") + + def test_aws_other_region_empty(self): + self.backend.aws_other_region = "" + adapter = self.backend._get_adapter() + params = adapter._aws_bucket_params() + self.assertNotIn("region_name", params) diff --git a/storage_backend_s3/views/backend_storage_view.xml b/storage_backend_s3/views/backend_storage_view.xml new file mode 100644 index 0000000000..80a0df38d2 --- /dev/null +++ b/storage_backend_s3/views/backend_storage_view.xml @@ -0,0 +1,45 @@ + + + + storage.backend + + + + + + + + + + + + + + + + + + + + + diff --git a/test-requirements.txt b/test-requirements.txt index 4ad8e0ecea..f31697ff4a 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1 +1,2 @@ odoo-test-helper +vcrpy-unittest