opendal 0.1.6.pre.rc.1
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 +7 -0
- data/.standard.yml +20 -0
- data/.tool-versions +1 -0
- data/.yardopts +1 -0
- data/Cargo.toml +65 -0
- data/DEPENDENCIES.md +9 -0
- data/DEPENDENCIES.rust.tsv +277 -0
- data/Gemfile +35 -0
- data/README.md +159 -0
- data/Rakefile +149 -0
- data/build.rs +22 -0
- data/core/CHANGELOG.md +4929 -0
- data/core/CONTRIBUTING.md +61 -0
- data/core/Cargo.lock +10259 -0
- data/core/Cargo.toml +437 -0
- data/core/DEPENDENCIES.md +3 -0
- data/core/DEPENDENCIES.rust.tsv +185 -0
- data/core/LICENSE +201 -0
- data/core/README.md +228 -0
- data/core/benches/README.md +18 -0
- data/core/benches/ops/README.md +26 -0
- data/core/benches/ops/main.rs +25 -0
- data/core/benches/ops/read.rs +100 -0
- data/core/benches/ops/utils.rs +59 -0
- data/core/benches/ops/write.rs +106 -0
- data/core/benches/types/README.md +9 -0
- data/core/benches/types/buffer.rs +114 -0
- data/core/benches/types/main.rs +23 -0
- data/core/benches/types/tasks.rs +64 -0
- data/core/benches/vs_fs/Cargo.toml +32 -0
- data/core/benches/vs_fs/README.md +35 -0
- data/core/benches/vs_fs/src/main.rs +83 -0
- data/core/benches/vs_s3/Cargo.toml +38 -0
- data/core/benches/vs_s3/README.md +55 -0
- data/core/benches/vs_s3/src/main.rs +123 -0
- data/core/edge/README.md +3 -0
- data/core/edge/file_write_on_full_disk/Cargo.toml +31 -0
- data/core/edge/file_write_on_full_disk/README.md +14 -0
- data/core/edge/file_write_on_full_disk/src/main.rs +43 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/Cargo.toml +30 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/README.md +18 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/src/main.rs +34 -0
- data/core/edge/s3_read_on_wasm/.gitignore +3 -0
- data/core/edge/s3_read_on_wasm/Cargo.toml +38 -0
- data/core/edge/s3_read_on_wasm/README.md +42 -0
- data/core/edge/s3_read_on_wasm/src/lib.rs +60 -0
- data/core/edge/s3_read_on_wasm/webdriver.json +15 -0
- data/core/examples/README.md +23 -0
- data/core/examples/basic/Cargo.toml +29 -0
- data/core/examples/basic/README.md +15 -0
- data/core/examples/basic/src/main.rs +51 -0
- data/core/examples/concurrent-upload/Cargo.toml +29 -0
- data/core/examples/concurrent-upload/README.md +15 -0
- data/core/examples/concurrent-upload/src/main.rs +68 -0
- data/core/examples/multipart-upload/Cargo.toml +29 -0
- data/core/examples/multipart-upload/README.md +15 -0
- data/core/examples/multipart-upload/src/main.rs +56 -0
- data/core/fuzz/.gitignore +5 -0
- data/core/fuzz/Cargo.toml +92 -0
- data/core/fuzz/README.md +68 -0
- data/core/fuzz/fuzz_reader.rs +102 -0
- data/core/fuzz/fuzz_writer.rs +123 -0
- data/core/src/blocking/delete.rs +74 -0
- data/core/src/blocking/list.rs +71 -0
- data/core/src/blocking/mod.rs +33 -0
- data/core/src/blocking/operator.rs +729 -0
- data/core/src/blocking/read/buffer_iterator.rs +66 -0
- data/core/src/blocking/read/mod.rs +27 -0
- data/core/src/blocking/read/reader.rs +124 -0
- data/core/src/blocking/read/std_bytes_iterator.rs +69 -0
- data/core/src/blocking/read/std_reader.rs +95 -0
- data/core/src/blocking/write/mod.rs +22 -0
- data/core/src/blocking/write/std_writer.rs +82 -0
- data/core/src/blocking/write/writer.rs +109 -0
- data/core/src/docs/comparisons/mod.rs +30 -0
- data/core/src/docs/comparisons/vs_object_store.md +183 -0
- data/core/src/docs/concepts.rs +135 -0
- data/core/src/docs/internals/accessor.rs +306 -0
- data/core/src/docs/internals/layer.rs +42 -0
- data/core/src/docs/internals/mod.rs +62 -0
- data/core/src/docs/mod.rs +43 -0
- data/core/src/docs/performance/concurrent_write.md +101 -0
- data/core/src/docs/performance/http_optimization.md +124 -0
- data/core/src/docs/performance/mod.rs +32 -0
- data/core/src/docs/rfcs/0000_example.md +74 -0
- data/core/src/docs/rfcs/0000_foyer_integration.md +111 -0
- data/core/src/docs/rfcs/0041_object_native_api.md +185 -0
- data/core/src/docs/rfcs/0044_error_handle.md +198 -0
- data/core/src/docs/rfcs/0057_auto_region.md +160 -0
- data/core/src/docs/rfcs/0069_object_stream.md +145 -0
- data/core/src/docs/rfcs/0090_limited_reader.md +155 -0
- data/core/src/docs/rfcs/0112_path_normalization.md +79 -0
- data/core/src/docs/rfcs/0191_async_streaming_io.md +328 -0
- data/core/src/docs/rfcs/0203_remove_credential.md +96 -0
- data/core/src/docs/rfcs/0221_create_dir.md +89 -0
- data/core/src/docs/rfcs/0247_retryable_error.md +87 -0
- data/core/src/docs/rfcs/0293_object_id.md +67 -0
- data/core/src/docs/rfcs/0337_dir_entry.md +191 -0
- data/core/src/docs/rfcs/0409_accessor_capabilities.md +67 -0
- data/core/src/docs/rfcs/0413_presign.md +154 -0
- data/core/src/docs/rfcs/0423_command_line_interface.md +268 -0
- data/core/src/docs/rfcs/0429_init_from_iter.md +107 -0
- data/core/src/docs/rfcs/0438_multipart.md +163 -0
- data/core/src/docs/rfcs/0443_gateway.md +73 -0
- data/core/src/docs/rfcs/0501_new_builder.md +111 -0
- data/core/src/docs/rfcs/0554_write_refactor.md +96 -0
- data/core/src/docs/rfcs/0561_list_metadata_reuse.md +210 -0
- data/core/src/docs/rfcs/0599_blocking_api.md +157 -0
- data/core/src/docs/rfcs/0623_redis_service.md +300 -0
- data/core/src/docs/rfcs/0627_split_capabilities.md +89 -0
- data/core/src/docs/rfcs/0661_path_in_accessor.md +126 -0
- data/core/src/docs/rfcs/0793_generic_kv_services.md +209 -0
- data/core/src/docs/rfcs/0926_object_reader.md +93 -0
- data/core/src/docs/rfcs/0977_refactor_error.md +151 -0
- data/core/src/docs/rfcs/1085_object_handler.md +73 -0
- data/core/src/docs/rfcs/1391_object_metadataer.md +110 -0
- data/core/src/docs/rfcs/1398_query_based_metadata.md +125 -0
- data/core/src/docs/rfcs/1420_object_writer.md +147 -0
- data/core/src/docs/rfcs/1477_remove_object_concept.md +159 -0
- data/core/src/docs/rfcs/1735_operation_extension.md +117 -0
- data/core/src/docs/rfcs/2083_writer_sink_api.md +106 -0
- data/core/src/docs/rfcs/2133_append_api.md +88 -0
- data/core/src/docs/rfcs/2299_chain_based_operator_api.md +99 -0
- data/core/src/docs/rfcs/2602_object_versioning.md +138 -0
- data/core/src/docs/rfcs/2758_merge_append_into_write.md +79 -0
- data/core/src/docs/rfcs/2774_lister_api.md +66 -0
- data/core/src/docs/rfcs/2779_list_with_metakey.md +143 -0
- data/core/src/docs/rfcs/2852_native_capability.md +58 -0
- data/core/src/docs/rfcs/2884_merge_range_read_into_read.md +80 -0
- data/core/src/docs/rfcs/3017_remove_write_copy_from.md +94 -0
- data/core/src/docs/rfcs/3197_config.md +237 -0
- data/core/src/docs/rfcs/3232_align_list_api.md +69 -0
- data/core/src/docs/rfcs/3243_list_prefix.md +128 -0
- data/core/src/docs/rfcs/3356_lazy_reader.md +111 -0
- data/core/src/docs/rfcs/3526_list_recursive.md +59 -0
- data/core/src/docs/rfcs/3574_concurrent_stat_in_list.md +80 -0
- data/core/src/docs/rfcs/3734_buffered_reader.md +64 -0
- data/core/src/docs/rfcs/3898_concurrent_writer.md +66 -0
- data/core/src/docs/rfcs/3911_deleter_api.md +165 -0
- data/core/src/docs/rfcs/4382_range_based_read.md +213 -0
- data/core/src/docs/rfcs/4638_executor.md +215 -0
- data/core/src/docs/rfcs/5314_remove_metakey.md +120 -0
- data/core/src/docs/rfcs/5444_operator_from_uri.md +162 -0
- data/core/src/docs/rfcs/5479_context.md +140 -0
- data/core/src/docs/rfcs/5485_conditional_reader.md +112 -0
- data/core/src/docs/rfcs/5495_list_with_deleted.md +81 -0
- data/core/src/docs/rfcs/5556_write_returns_metadata.md +121 -0
- data/core/src/docs/rfcs/5871_read_returns_metadata.md +112 -0
- data/core/src/docs/rfcs/6189_remove_native_blocking.md +106 -0
- data/core/src/docs/rfcs/6209_glob_support.md +132 -0
- data/core/src/docs/rfcs/6213_options_api.md +142 -0
- data/core/src/docs/rfcs/README.md +62 -0
- data/core/src/docs/rfcs/mod.rs +278 -0
- data/core/src/docs/upgrade.md +1556 -0
- data/core/src/layers/async_backtrace.rs +174 -0
- data/core/src/layers/await_tree.rs +202 -0
- data/core/src/layers/capability_check.rs +239 -0
- data/core/src/layers/chaos.rs +170 -0
- data/core/src/layers/complete.rs +385 -0
- data/core/src/layers/concurrent_limit.rs +322 -0
- data/core/src/layers/correctness_check.rs +440 -0
- data/core/src/layers/dtrace.rs +294 -0
- data/core/src/layers/error_context.rs +310 -0
- data/core/src/layers/fastmetrics.rs +525 -0
- data/core/src/layers/fastrace.rs +271 -0
- data/core/src/layers/http_client.rs +206 -0
- data/core/src/layers/immutable_index.rs +408 -0
- data/core/src/layers/logging.rs +842 -0
- data/core/src/layers/metrics.rs +182 -0
- data/core/src/layers/mime_guess.rs +199 -0
- data/core/src/layers/mod.rs +130 -0
- data/core/src/layers/observe/metrics.rs +936 -0
- data/core/src/layers/observe/mod.rs +93 -0
- data/core/src/layers/otelmetrics.rs +496 -0
- data/core/src/layers/oteltrace.rs +203 -0
- data/core/src/layers/prometheus.rs +686 -0
- data/core/src/layers/prometheus_client.rs +519 -0
- data/core/src/layers/retry.rs +933 -0
- data/core/src/layers/throttle.rs +204 -0
- data/core/src/layers/timeout.rs +513 -0
- data/core/src/layers/tracing.rs +349 -0
- data/core/src/layers/type_eraser.rs +91 -0
- data/core/src/lib.rs +204 -0
- data/core/src/raw/accessor.rs +856 -0
- data/core/src/raw/adapters/kv/api.rs +164 -0
- data/core/src/raw/adapters/kv/backend.rs +253 -0
- data/core/src/raw/adapters/kv/mod.rs +31 -0
- data/core/src/raw/adapters/mod.rs +50 -0
- data/core/src/raw/adapters/typed_kv/api.rs +171 -0
- data/core/src/raw/adapters/typed_kv/backend.rs +279 -0
- data/core/src/raw/adapters/typed_kv/mod.rs +29 -0
- data/core/src/raw/atomic_util.rs +57 -0
- data/core/src/raw/azure.rs +570 -0
- data/core/src/raw/chrono_util.rs +109 -0
- data/core/src/raw/enum_utils.rs +201 -0
- data/core/src/raw/futures_util.rs +470 -0
- data/core/src/raw/http_util/body.rs +144 -0
- data/core/src/raw/http_util/bytes_content_range.rs +239 -0
- data/core/src/raw/http_util/bytes_range.rs +260 -0
- data/core/src/raw/http_util/client.rs +276 -0
- data/core/src/raw/http_util/error.rs +68 -0
- data/core/src/raw/http_util/header.rs +356 -0
- data/core/src/raw/http_util/mod.rs +78 -0
- data/core/src/raw/http_util/multipart.rs +1180 -0
- data/core/src/raw/http_util/uri.rs +190 -0
- data/core/src/raw/layer.rs +295 -0
- data/core/src/raw/mod.rs +101 -0
- data/core/src/raw/oio/buf/flex_buf.rs +118 -0
- data/core/src/raw/oio/buf/mod.rs +25 -0
- data/core/src/raw/oio/buf/pooled_buf.rs +126 -0
- data/core/src/raw/oio/buf/queue_buf.rs +117 -0
- data/core/src/raw/oio/delete/api.rs +102 -0
- data/core/src/raw/oio/delete/batch_delete.rs +127 -0
- data/core/src/raw/oio/delete/mod.rs +30 -0
- data/core/src/raw/oio/delete/one_shot_delete.rs +79 -0
- data/core/src/raw/oio/entry.rs +89 -0
- data/core/src/raw/oio/list/api.rs +69 -0
- data/core/src/raw/oio/list/flat_list.rs +137 -0
- data/core/src/raw/oio/list/hierarchy_list.rs +135 -0
- data/core/src/raw/oio/list/mod.rs +35 -0
- data/core/src/raw/oio/list/page_list.rs +105 -0
- data/core/src/raw/oio/list/prefix_list.rs +64 -0
- data/core/src/raw/oio/mod.rs +40 -0
- data/core/src/raw/oio/read/api.rs +119 -0
- data/core/src/raw/oio/read/mod.rs +21 -0
- data/core/src/raw/oio/write/api.rs +103 -0
- data/core/src/raw/oio/write/append_write.rs +111 -0
- data/core/src/raw/oio/write/block_write.rs +405 -0
- data/core/src/raw/oio/write/mod.rs +42 -0
- data/core/src/raw/oio/write/multipart_write.rs +518 -0
- data/core/src/raw/oio/write/one_shot_write.rs +77 -0
- data/core/src/raw/oio/write/position_write.rs +284 -0
- data/core/src/raw/operation.rs +88 -0
- data/core/src/raw/ops.rs +917 -0
- data/core/src/raw/path.rs +451 -0
- data/core/src/raw/path_cache.rs +244 -0
- data/core/src/raw/rps.rs +249 -0
- data/core/src/raw/serde_util.rs +423 -0
- data/core/src/raw/std_io_util.rs +65 -0
- data/core/src/raw/tests/mod.rs +30 -0
- data/core/src/raw/tests/read.rs +116 -0
- data/core/src/raw/tests/utils.rs +80 -0
- data/core/src/raw/tests/write.rs +79 -0
- data/core/src/raw/tokio_util.rs +24 -0
- data/core/src/raw/version.rs +19 -0
- data/core/src/services/aliyun_drive/backend.rs +421 -0
- data/core/src/services/aliyun_drive/config.rs +72 -0
- data/core/src/services/aliyun_drive/core.rs +651 -0
- data/core/src/services/aliyun_drive/delete.rs +51 -0
- data/core/src/services/aliyun_drive/docs.md +61 -0
- data/core/src/services/aliyun_drive/error.rs +56 -0
- data/core/src/services/aliyun_drive/lister.rs +134 -0
- data/core/src/services/aliyun_drive/mod.rs +39 -0
- data/core/src/services/aliyun_drive/writer.rs +114 -0
- data/core/src/services/alluxio/backend.rs +257 -0
- data/core/src/services/alluxio/config.rs +50 -0
- data/core/src/services/alluxio/core.rs +367 -0
- data/core/src/services/alluxio/delete.rs +38 -0
- data/core/src/services/alluxio/docs.md +45 -0
- data/core/src/services/alluxio/error.rs +99 -0
- data/core/src/services/alluxio/lister.rs +73 -0
- data/core/src/services/alluxio/mod.rs +39 -0
- data/core/src/services/alluxio/writer.rs +74 -0
- data/core/src/services/azblob/backend.rs +594 -0
- data/core/src/services/azblob/config.rs +220 -0
- data/core/src/services/azblob/core.rs +937 -0
- data/core/src/services/azblob/delete.rs +108 -0
- data/core/src/services/azblob/docs.md +77 -0
- data/core/src/services/azblob/error.rs +164 -0
- data/core/src/services/azblob/lister.rs +107 -0
- data/core/src/services/azblob/mod.rs +38 -0
- data/core/src/services/azblob/writer.rs +177 -0
- data/core/src/services/azdls/backend.rs +435 -0
- data/core/src/services/azdls/config.rs +89 -0
- data/core/src/services/azdls/core.rs +388 -0
- data/core/src/services/azdls/delete.rs +48 -0
- data/core/src/services/azdls/docs.md +73 -0
- data/core/src/services/azdls/error.rs +107 -0
- data/core/src/services/azdls/lister.rs +165 -0
- data/core/src/services/azdls/mod.rs +38 -0
- data/core/src/services/azdls/writer.rs +129 -0
- data/core/src/services/azfile/backend.rs +373 -0
- data/core/src/services/azfile/config.rs +61 -0
- data/core/src/services/azfile/core.rs +435 -0
- data/core/src/services/azfile/delete.rs +51 -0
- data/core/src/services/azfile/docs.md +65 -0
- data/core/src/services/azfile/error.rs +108 -0
- data/core/src/services/azfile/lister.rs +217 -0
- data/core/src/services/azfile/mod.rs +39 -0
- data/core/src/services/azfile/writer.rs +92 -0
- data/core/src/services/b2/backend.rs +434 -0
- data/core/src/services/b2/config.rs +64 -0
- data/core/src/services/b2/core.rs +742 -0
- data/core/src/services/b2/delete.rs +56 -0
- data/core/src/services/b2/docs.md +54 -0
- data/core/src/services/b2/error.rs +132 -0
- data/core/src/services/b2/lister.rs +110 -0
- data/core/src/services/b2/mod.rs +39 -0
- data/core/src/services/b2/writer.rs +189 -0
- data/core/src/services/cacache/backend.rs +160 -0
- data/core/src/services/cacache/config.rs +28 -0
- data/core/src/services/cacache/core.rs +96 -0
- data/core/src/services/cacache/delete.rs +39 -0
- data/core/src/services/cacache/docs.md +38 -0
- data/core/src/services/cacache/mod.rs +34 -0
- data/core/src/services/cacache/writer.rs +61 -0
- data/core/src/services/cloudflare_kv/backend.rs +513 -0
- data/core/src/services/cloudflare_kv/config.rs +55 -0
- data/core/src/services/cloudflare_kv/core.rs +168 -0
- data/core/src/services/cloudflare_kv/delete.rs +119 -0
- data/core/src/services/cloudflare_kv/docs.md +21 -0
- data/core/src/services/cloudflare_kv/error.rs +79 -0
- data/core/src/services/cloudflare_kv/lister.rs +170 -0
- data/core/src/services/cloudflare_kv/mod.rs +39 -0
- data/core/src/services/cloudflare_kv/model.rs +76 -0
- data/core/src/services/cloudflare_kv/writer.rs +68 -0
- data/core/src/services/compfs/backend.rs +290 -0
- data/core/src/services/compfs/config.rs +30 -0
- data/core/src/services/compfs/core.rs +159 -0
- data/core/src/services/compfs/delete.rs +53 -0
- data/core/src/services/compfs/lister.rs +98 -0
- data/core/src/services/compfs/mod.rs +38 -0
- data/core/src/services/compfs/reader.rs +79 -0
- data/core/src/services/compfs/writer.rs +90 -0
- data/core/src/services/cos/backend.rs +442 -0
- data/core/src/services/cos/config.rs +54 -0
- data/core/src/services/cos/core.rs +761 -0
- data/core/src/services/cos/delete.rs +48 -0
- data/core/src/services/cos/docs.md +55 -0
- data/core/src/services/cos/error.rs +105 -0
- data/core/src/services/cos/lister.rs +237 -0
- data/core/src/services/cos/mod.rs +39 -0
- data/core/src/services/cos/writer.rs +234 -0
- data/core/src/services/d1/backend.rs +330 -0
- data/core/src/services/d1/config.rs +55 -0
- data/core/src/services/d1/docs.md +48 -0
- data/core/src/services/d1/error.rs +79 -0
- data/core/src/services/d1/mod.rs +29 -0
- data/core/src/services/d1/model.rs +125 -0
- data/core/src/services/dashmap/backend.rs +203 -0
- data/core/src/services/dashmap/config.rs +37 -0
- data/core/src/services/dashmap/core.rs +61 -0
- data/core/src/services/dashmap/delete.rs +40 -0
- data/core/src/services/dashmap/docs.md +38 -0
- data/core/src/services/dashmap/lister.rs +63 -0
- data/core/src/services/dashmap/mod.rs +36 -0
- data/core/src/services/dashmap/writer.rs +87 -0
- data/core/src/services/dbfs/backend.rs +258 -0
- data/core/src/services/dbfs/config.rs +48 -0
- data/core/src/services/dbfs/core.rs +191 -0
- data/core/src/services/dbfs/delete.rs +49 -0
- data/core/src/services/dbfs/docs.md +57 -0
- data/core/src/services/dbfs/error.rs +74 -0
- data/core/src/services/dbfs/lister.rs +96 -0
- data/core/src/services/dbfs/mod.rs +38 -0
- data/core/src/services/dbfs/writer.rs +64 -0
- data/core/src/services/dropbox/backend.rs +187 -0
- data/core/src/services/dropbox/builder.rs +222 -0
- data/core/src/services/dropbox/config.rs +47 -0
- data/core/src/services/dropbox/core.rs +496 -0
- data/core/src/services/dropbox/delete.rs +54 -0
- data/core/src/services/dropbox/docs.md +64 -0
- data/core/src/services/dropbox/error.rs +85 -0
- data/core/src/services/dropbox/lister.rs +117 -0
- data/core/src/services/dropbox/mod.rs +40 -0
- data/core/src/services/dropbox/writer.rs +51 -0
- data/core/src/services/etcd/backend.rs +345 -0
- data/core/src/services/etcd/config.rs +86 -0
- data/core/src/services/etcd/core.rs +143 -0
- data/core/src/services/etcd/deleter.rs +41 -0
- data/core/src/services/etcd/docs.md +45 -0
- data/core/src/services/etcd/error.rs +26 -0
- data/core/src/services/etcd/lister.rs +79 -0
- data/core/src/services/etcd/mod.rs +36 -0
- data/core/src/services/etcd/writer.rs +61 -0
- data/core/src/services/foundationdb/backend.rs +171 -0
- data/core/src/services/foundationdb/config.rs +45 -0
- data/core/src/services/foundationdb/docs.md +42 -0
- data/core/src/services/foundationdb/mod.rs +24 -0
- data/core/src/services/fs/backend.rs +299 -0
- data/core/src/services/fs/config.rs +33 -0
- data/core/src/services/fs/core.rs +227 -0
- data/core/src/services/fs/delete.rs +53 -0
- data/core/src/services/fs/docs.md +49 -0
- data/core/src/services/fs/error.rs +31 -0
- data/core/src/services/fs/lister.rs +81 -0
- data/core/src/services/fs/mod.rs +40 -0
- data/core/src/services/fs/reader.rs +83 -0
- data/core/src/services/fs/writer.rs +212 -0
- data/core/src/services/ftp/backend.rs +388 -0
- data/core/src/services/ftp/config.rs +46 -0
- data/core/src/services/ftp/core.rs +136 -0
- data/core/src/services/ftp/delete.rs +62 -0
- data/core/src/services/ftp/docs.md +42 -0
- data/core/src/services/ftp/err.rs +47 -0
- data/core/src/services/ftp/lister.rs +72 -0
- data/core/src/services/ftp/mod.rs +41 -0
- data/core/src/services/ftp/reader.rs +84 -0
- data/core/src/services/ftp/writer.rs +122 -0
- data/core/src/services/gcs/backend.rs +499 -0
- data/core/src/services/gcs/config.rs +168 -0
- data/core/src/services/gcs/core.rs +1079 -0
- data/core/src/services/gcs/delete.rs +98 -0
- data/core/src/services/gcs/docs.md +76 -0
- data/core/src/services/gcs/error.rs +122 -0
- data/core/src/services/gcs/lister.rs +136 -0
- data/core/src/services/gcs/mod.rs +40 -0
- data/core/src/services/gcs/uri.rs +75 -0
- data/core/src/services/gcs/writer.rs +163 -0
- data/core/src/services/gdrive/backend.rs +176 -0
- data/core/src/services/gdrive/builder.rs +228 -0
- data/core/src/services/gdrive/config.rs +47 -0
- data/core/src/services/gdrive/core.rs +499 -0
- data/core/src/services/gdrive/delete.rs +57 -0
- data/core/src/services/gdrive/docs.md +65 -0
- data/core/src/services/gdrive/error.rs +80 -0
- data/core/src/services/gdrive/lister.rs +110 -0
- data/core/src/services/gdrive/mod.rs +40 -0
- data/core/src/services/gdrive/writer.rs +77 -0
- data/core/src/services/ghac/backend.rs +285 -0
- data/core/src/services/ghac/config.rs +36 -0
- data/core/src/services/ghac/core.rs +459 -0
- data/core/src/services/ghac/docs.md +84 -0
- data/core/src/services/ghac/error.rs +52 -0
- data/core/src/services/ghac/mod.rs +35 -0
- data/core/src/services/ghac/writer.rs +201 -0
- data/core/src/services/github/backend.rs +285 -0
- data/core/src/services/github/config.rs +59 -0
- data/core/src/services/github/core.rs +351 -0
- data/core/src/services/github/delete.rs +41 -0
- data/core/src/services/github/docs.md +52 -0
- data/core/src/services/github/error.rs +101 -0
- data/core/src/services/github/lister.rs +112 -0
- data/core/src/services/github/mod.rs +38 -0
- data/core/src/services/github/writer.rs +51 -0
- data/core/src/services/gridfs/backend.rs +166 -0
- data/core/src/services/gridfs/config.rs +50 -0
- data/core/src/services/gridfs/core.rs +154 -0
- data/core/src/services/gridfs/docs.md +46 -0
- data/core/src/services/gridfs/mod.rs +26 -0
- data/core/src/services/hdfs/backend.rs +413 -0
- data/core/src/services/hdfs/config.rs +59 -0
- data/core/src/services/hdfs/delete.rs +62 -0
- data/core/src/services/hdfs/docs.md +140 -0
- data/core/src/services/hdfs/lister.rs +70 -0
- data/core/src/services/hdfs/mod.rs +36 -0
- data/core/src/services/hdfs/reader.rs +79 -0
- data/core/src/services/hdfs/writer.rs +104 -0
- data/core/src/services/hdfs_native/backend.rs +340 -0
- data/core/src/services/hdfs_native/config.rs +45 -0
- data/core/src/services/hdfs_native/delete.rs +47 -0
- data/core/src/services/hdfs_native/docs.md +35 -0
- data/core/src/services/hdfs_native/error.rs +59 -0
- data/core/src/services/hdfs_native/lister.rs +85 -0
- data/core/src/services/hdfs_native/mod.rs +39 -0
- data/core/src/services/hdfs_native/reader.rs +62 -0
- data/core/src/services/hdfs_native/writer.rs +61 -0
- data/core/src/services/http/backend.rs +291 -0
- data/core/src/services/http/config.rs +49 -0
- data/core/src/services/http/core.rs +125 -0
- data/core/src/services/http/docs.md +45 -0
- data/core/src/services/http/error.rs +53 -0
- data/core/src/services/http/mod.rs +32 -0
- data/core/src/services/huggingface/backend.rs +289 -0
- data/core/src/services/huggingface/config.rs +75 -0
- data/core/src/services/huggingface/core.rs +406 -0
- data/core/src/services/huggingface/docs.md +61 -0
- data/core/src/services/huggingface/error.rs +93 -0
- data/core/src/services/huggingface/lister.rs +91 -0
- data/core/src/services/huggingface/mod.rs +34 -0
- data/core/src/services/ipfs/backend.rs +257 -0
- data/core/src/services/ipfs/config.rs +32 -0
- data/core/src/services/ipfs/core.rs +239 -0
- data/core/src/services/ipfs/docs.md +45 -0
- data/core/src/services/ipfs/error.rs +52 -0
- data/core/src/services/ipfs/ipld.rs +162 -0
- data/core/src/services/ipfs/mod.rs +34 -0
- data/core/src/services/ipmfs/backend.rs +147 -0
- data/core/src/services/ipmfs/builder.rs +166 -0
- data/core/src/services/ipmfs/config.rs +32 -0
- data/core/src/services/ipmfs/core.rs +142 -0
- data/core/src/services/ipmfs/delete.rs +48 -0
- data/core/src/services/ipmfs/docs.md +14 -0
- data/core/src/services/ipmfs/error.rs +83 -0
- data/core/src/services/ipmfs/lister.rs +135 -0
- data/core/src/services/ipmfs/mod.rs +40 -0
- data/core/src/services/ipmfs/writer.rs +49 -0
- data/core/src/services/koofr/backend.rs +361 -0
- data/core/src/services/koofr/config.rs +50 -0
- data/core/src/services/koofr/core.rs +458 -0
- data/core/src/services/koofr/delete.rs +50 -0
- data/core/src/services/koofr/docs.md +51 -0
- data/core/src/services/koofr/error.rs +72 -0
- data/core/src/services/koofr/lister.rs +88 -0
- data/core/src/services/koofr/mod.rs +38 -0
- data/core/src/services/koofr/writer.rs +53 -0
- data/core/src/services/lakefs/backend.rs +309 -0
- data/core/src/services/lakefs/config.rs +81 -0
- data/core/src/services/lakefs/core.rs +261 -0
- data/core/src/services/lakefs/delete.rs +54 -0
- data/core/src/services/lakefs/docs.md +62 -0
- data/core/src/services/lakefs/error.rs +93 -0
- data/core/src/services/lakefs/lister.rs +120 -0
- data/core/src/services/lakefs/mod.rs +38 -0
- data/core/src/services/lakefs/writer.rs +50 -0
- data/core/src/services/memcached/backend.rs +284 -0
- data/core/src/services/memcached/binary.rs +289 -0
- data/core/src/services/memcached/config.rs +43 -0
- data/core/src/services/memcached/docs.md +47 -0
- data/core/src/services/memcached/mod.rs +27 -0
- data/core/src/services/memory/backend.rs +205 -0
- data/core/src/services/memory/config.rs +30 -0
- data/core/src/services/memory/core.rs +80 -0
- data/core/src/services/memory/delete.rs +42 -0
- data/core/src/services/memory/docs.md +36 -0
- data/core/src/services/memory/lister.rs +56 -0
- data/core/src/services/memory/mod.rs +36 -0
- data/core/src/services/memory/writer.rs +85 -0
- data/core/src/services/mini_moka/backend.rs +260 -0
- data/core/src/services/mini_moka/config.rs +56 -0
- data/core/src/services/mini_moka/core.rs +52 -0
- data/core/src/services/mini_moka/delete.rs +42 -0
- data/core/src/services/mini_moka/docs.md +19 -0
- data/core/src/services/mini_moka/lister.rs +68 -0
- data/core/src/services/mini_moka/mod.rs +36 -0
- data/core/src/services/mini_moka/writer.rs +84 -0
- data/core/src/services/mod.rs +206 -0
- data/core/src/services/moka/backend.rs +326 -0
- data/core/src/services/moka/config.rs +59 -0
- data/core/src/services/moka/core.rs +62 -0
- data/core/src/services/moka/delete.rs +42 -0
- data/core/src/services/moka/docs.md +42 -0
- data/core/src/services/moka/lister.rs +65 -0
- data/core/src/services/moka/mod.rs +41 -0
- data/core/src/services/moka/writer.rs +83 -0
- data/core/src/services/mongodb/backend.rs +291 -0
- data/core/src/services/mongodb/config.rs +54 -0
- data/core/src/services/mongodb/docs.md +49 -0
- data/core/src/services/mongodb/mod.rs +24 -0
- data/core/src/services/monoiofs/backend.rs +238 -0
- data/core/src/services/monoiofs/config.rs +34 -0
- data/core/src/services/monoiofs/core.rs +313 -0
- data/core/src/services/monoiofs/delete.rs +64 -0
- data/core/src/services/monoiofs/docs.md +46 -0
- data/core/src/services/monoiofs/mod.rs +36 -0
- data/core/src/services/monoiofs/reader.rs +147 -0
- data/core/src/services/monoiofs/writer.rs +189 -0
- data/core/src/services/mysql/backend.rs +256 -0
- data/core/src/services/mysql/config.rs +66 -0
- data/core/src/services/mysql/docs.md +47 -0
- data/core/src/services/mysql/mod.rs +24 -0
- data/core/src/services/obs/backend.rs +442 -0
- data/core/src/services/obs/config.rs +53 -0
- data/core/src/services/obs/core.rs +608 -0
- data/core/src/services/obs/delete.rs +48 -0
- data/core/src/services/obs/docs.md +54 -0
- data/core/src/services/obs/error.rs +106 -0
- data/core/src/services/obs/lister.rs +101 -0
- data/core/src/services/obs/mod.rs +38 -0
- data/core/src/services/obs/writer.rs +235 -0
- data/core/src/services/onedrive/backend.rs +127 -0
- data/core/src/services/onedrive/builder.rs +236 -0
- data/core/src/services/onedrive/config.rs +49 -0
- data/core/src/services/onedrive/core.rs +691 -0
- data/core/src/services/onedrive/delete.rs +47 -0
- data/core/src/services/onedrive/docs.md +115 -0
- data/core/src/services/onedrive/error.rs +61 -0
- data/core/src/services/onedrive/graph_model.rs +425 -0
- data/core/src/services/onedrive/lister.rs +150 -0
- data/core/src/services/onedrive/mod.rs +42 -0
- data/core/src/services/onedrive/writer.rs +168 -0
- data/core/src/services/opfs/backend.rs +50 -0
- data/core/src/services/opfs/config.rs +25 -0
- data/core/src/services/opfs/core.rs +74 -0
- data/core/src/services/opfs/docs.md +18 -0
- data/core/src/services/opfs/error.rs +27 -0
- data/core/src/services/opfs/mod.rs +30 -0
- data/core/src/services/opfs/utils.rs +70 -0
- data/core/src/services/oss/backend.rs +734 -0
- data/core/src/services/oss/config.rs +113 -0
- data/core/src/services/oss/core.rs +1088 -0
- data/core/src/services/oss/delete.rs +109 -0
- data/core/src/services/oss/docs.md +74 -0
- data/core/src/services/oss/error.rs +109 -0
- data/core/src/services/oss/lister.rs +256 -0
- data/core/src/services/oss/mod.rs +38 -0
- data/core/src/services/oss/writer.rs +228 -0
- data/core/src/services/pcloud/backend.rs +358 -0
- data/core/src/services/pcloud/config.rs +51 -0
- data/core/src/services/pcloud/core.rs +461 -0
- data/core/src/services/pcloud/delete.rs +66 -0
- data/core/src/services/pcloud/docs.md +51 -0
- data/core/src/services/pcloud/error.rs +88 -0
- data/core/src/services/pcloud/lister.rs +95 -0
- data/core/src/services/pcloud/mod.rs +38 -0
- data/core/src/services/pcloud/writer.rs +66 -0
- data/core/src/services/persy/backend.rs +226 -0
- data/core/src/services/persy/config.rs +32 -0
- data/core/src/services/persy/docs.md +43 -0
- data/core/src/services/persy/mod.rs +24 -0
- data/core/src/services/postgresql/backend.rs +258 -0
- data/core/src/services/postgresql/config.rs +66 -0
- data/core/src/services/postgresql/docs.md +47 -0
- data/core/src/services/postgresql/mod.rs +24 -0
- data/core/src/services/redb/backend.rs +280 -0
- data/core/src/services/redb/config.rs +34 -0
- data/core/src/services/redb/docs.md +41 -0
- data/core/src/services/redb/mod.rs +24 -0
- data/core/src/services/redis/backend.rs +442 -0
- data/core/src/services/redis/config.rs +79 -0
- data/core/src/services/redis/core.rs +209 -0
- data/core/src/services/redis/delete.rs +40 -0
- data/core/src/services/redis/docs.md +43 -0
- data/core/src/services/redis/mod.rs +34 -0
- data/core/src/services/redis/writer.rs +57 -0
- data/core/src/services/rocksdb/backend.rs +159 -0
- data/core/src/services/rocksdb/config.rs +34 -0
- data/core/src/services/rocksdb/docs.md +54 -0
- data/core/src/services/rocksdb/mod.rs +24 -0
- data/core/src/services/s3/backend.rs +1293 -0
- data/core/src/services/s3/compatible_services.md +126 -0
- data/core/src/services/s3/config.rs +327 -0
- data/core/src/services/s3/core.rs +1741 -0
- data/core/src/services/s3/delete.rs +109 -0
- data/core/src/services/s3/docs.md +244 -0
- data/core/src/services/s3/error.rs +171 -0
- data/core/src/services/s3/lister.rs +405 -0
- data/core/src/services/s3/mod.rs +38 -0
- data/core/src/services/s3/writer.rs +262 -0
- data/core/src/services/seafile/backend.rs +297 -0
- data/core/src/services/seafile/config.rs +56 -0
- data/core/src/services/seafile/core.rs +475 -0
- data/core/src/services/seafile/delete.rs +40 -0
- data/core/src/services/seafile/docs.md +54 -0
- data/core/src/services/seafile/error.rs +86 -0
- data/core/src/services/seafile/lister.rs +83 -0
- data/core/src/services/seafile/mod.rs +38 -0
- data/core/src/services/seafile/writer.rs +55 -0
- data/core/src/services/sftp/backend.rs +397 -0
- data/core/src/services/sftp/config.rs +50 -0
- data/core/src/services/sftp/core.rs +154 -0
- data/core/src/services/sftp/delete.rs +55 -0
- data/core/src/services/sftp/docs.md +49 -0
- data/core/src/services/sftp/error.rs +57 -0
- data/core/src/services/sftp/lister.rs +88 -0
- data/core/src/services/sftp/mod.rs +42 -0
- data/core/src/services/sftp/reader.rs +78 -0
- data/core/src/services/sftp/utils.rs +51 -0
- data/core/src/services/sftp/writer.rs +67 -0
- data/core/src/services/sled/backend.rs +194 -0
- data/core/src/services/sled/config.rs +45 -0
- data/core/src/services/sled/docs.md +39 -0
- data/core/src/services/sled/mod.rs +24 -0
- data/core/src/services/sqlite/backend.rs +326 -0
- data/core/src/services/sqlite/config.rs +70 -0
- data/core/src/services/sqlite/docs.md +46 -0
- data/core/src/services/sqlite/mod.rs +24 -0
- data/core/src/services/surrealdb/backend.rs +365 -0
- data/core/src/services/surrealdb/config.rs +64 -0
- data/core/src/services/surrealdb/docs.md +54 -0
- data/core/src/services/surrealdb/mod.rs +24 -0
- data/core/src/services/swift/backend.rs +275 -0
- data/core/src/services/swift/compatible_services.md +53 -0
- data/core/src/services/swift/config.rs +53 -0
- data/core/src/services/swift/core.rs +310 -0
- data/core/src/services/swift/delete.rs +49 -0
- data/core/src/services/swift/docs.md +52 -0
- data/core/src/services/swift/error.rs +90 -0
- data/core/src/services/swift/lister.rs +119 -0
- data/core/src/services/swift/mod.rs +38 -0
- data/core/src/services/swift/writer.rs +53 -0
- data/core/src/services/tikv/backend.rs +237 -0
- data/core/src/services/tikv/config.rs +52 -0
- data/core/src/services/tikv/docs.md +43 -0
- data/core/src/services/tikv/mod.rs +24 -0
- data/core/src/services/upyun/backend.rs +317 -0
- data/core/src/services/upyun/config.rs +51 -0
- data/core/src/services/upyun/core.rs +521 -0
- data/core/src/services/upyun/delete.rs +50 -0
- data/core/src/services/upyun/docs.md +51 -0
- data/core/src/services/upyun/error.rs +97 -0
- data/core/src/services/upyun/lister.rs +101 -0
- data/core/src/services/upyun/mod.rs +38 -0
- data/core/src/services/upyun/writer.rs +127 -0
- data/core/src/services/vercel_artifacts/backend.rs +99 -0
- data/core/src/services/vercel_artifacts/builder.rs +117 -0
- data/core/src/services/vercel_artifacts/config.rs +39 -0
- data/core/src/services/vercel_artifacts/core.rs +112 -0
- data/core/src/services/vercel_artifacts/docs.md +40 -0
- data/core/src/services/vercel_artifacts/error.rs +50 -0
- data/core/src/services/vercel_artifacts/mod.rs +36 -0
- data/core/src/services/vercel_artifacts/writer.rs +58 -0
- data/core/src/services/vercel_blob/backend.rs +251 -0
- data/core/src/services/vercel_blob/config.rs +45 -0
- data/core/src/services/vercel_blob/core.rs +449 -0
- data/core/src/services/vercel_blob/delete.rs +38 -0
- data/core/src/services/vercel_blob/docs.md +45 -0
- data/core/src/services/vercel_blob/error.rs +110 -0
- data/core/src/services/vercel_blob/lister.rs +69 -0
- data/core/src/services/vercel_blob/mod.rs +38 -0
- data/core/src/services/vercel_blob/writer.rs +143 -0
- data/core/src/services/webdav/backend.rs +318 -0
- data/core/src/services/webdav/config.rs +53 -0
- data/core/src/services/webdav/core.rs +859 -0
- data/core/src/services/webdav/delete.rs +47 -0
- data/core/src/services/webdav/docs.md +49 -0
- data/core/src/services/webdav/error.rs +53 -0
- data/core/src/services/webdav/lister.rs +106 -0
- data/core/src/services/webdav/mod.rs +38 -0
- data/core/src/services/webdav/writer.rs +56 -0
- data/core/src/services/webhdfs/backend.rs +376 -0
- data/core/src/services/webhdfs/config.rs +52 -0
- data/core/src/services/webhdfs/core.rs +398 -0
- data/core/src/services/webhdfs/delete.rs +46 -0
- data/core/src/services/webhdfs/docs.md +90 -0
- data/core/src/services/webhdfs/error.rs +126 -0
- data/core/src/services/webhdfs/lister.rs +130 -0
- data/core/src/services/webhdfs/message.rs +249 -0
- data/core/src/services/webhdfs/mod.rs +41 -0
- data/core/src/services/webhdfs/writer.rs +177 -0
- data/core/src/services/yandex_disk/backend.rs +267 -0
- data/core/src/services/yandex_disk/config.rs +45 -0
- data/core/src/services/yandex_disk/core.rs +340 -0
- data/core/src/services/yandex_disk/delete.rs +54 -0
- data/core/src/services/yandex_disk/docs.md +45 -0
- data/core/src/services/yandex_disk/error.rs +104 -0
- data/core/src/services/yandex_disk/lister.rs +113 -0
- data/core/src/services/yandex_disk/mod.rs +38 -0
- data/core/src/services/yandex_disk/writer.rs +52 -0
- data/core/src/types/buffer.rs +991 -0
- data/core/src/types/builder.rs +152 -0
- data/core/src/types/capability.rs +209 -0
- data/core/src/types/context/mod.rs +22 -0
- data/core/src/types/context/read.rs +231 -0
- data/core/src/types/context/write.rs +441 -0
- data/core/src/types/delete/deleter.rs +220 -0
- data/core/src/types/delete/futures_delete_sink.rs +176 -0
- data/core/src/types/delete/input.rs +97 -0
- data/core/src/types/delete/mod.rs +26 -0
- data/core/src/types/entry.rs +69 -0
- data/core/src/types/error.rs +570 -0
- data/core/src/types/execute/api.rs +110 -0
- data/core/src/types/execute/executor.rs +96 -0
- data/core/src/types/execute/executors/mod.rs +27 -0
- data/core/src/types/execute/executors/tokio_executor.rs +60 -0
- data/core/src/types/execute/mod.rs +25 -0
- data/core/src/types/list.rs +137 -0
- data/core/src/types/metadata.rs +436 -0
- data/core/src/types/mod.rs +72 -0
- data/core/src/types/mode.rs +68 -0
- data/core/src/types/operator/builder.rs +535 -0
- data/core/src/types/operator/info.rs +63 -0
- data/core/src/types/operator/mod.rs +33 -0
- data/core/src/types/operator/operator.rs +2236 -0
- data/core/src/types/operator/operator_futures.rs +1430 -0
- data/core/src/types/operator/registry.rs +129 -0
- data/core/src/types/options.rs +548 -0
- data/core/src/types/read/buffer_stream.rs +273 -0
- data/core/src/types/read/futures_async_reader.rs +289 -0
- data/core/src/types/read/futures_bytes_stream.rs +157 -0
- data/core/src/types/read/mod.rs +29 -0
- data/core/src/types/read/reader.rs +604 -0
- data/core/src/types/scheme.rs +475 -0
- data/core/src/types/write/buffer_sink.rs +188 -0
- data/core/src/types/write/futures_async_writer.rs +136 -0
- data/core/src/types/write/futures_bytes_sink.rs +103 -0
- data/core/src/types/write/mod.rs +26 -0
- data/core/src/types/write/writer.rs +411 -0
- data/core/tests/behavior/README.md +77 -0
- data/core/tests/behavior/async_copy.rs +314 -0
- data/core/tests/behavior/async_create_dir.rs +53 -0
- data/core/tests/behavior/async_delete.rs +354 -0
- data/core/tests/behavior/async_list.rs +739 -0
- data/core/tests/behavior/async_presign.rs +175 -0
- data/core/tests/behavior/async_read.rs +871 -0
- data/core/tests/behavior/async_rename.rs +210 -0
- data/core/tests/behavior/async_stat.rs +628 -0
- data/core/tests/behavior/async_write.rs +819 -0
- data/core/tests/behavior/main.rs +78 -0
- data/core/tests/behavior/utils.rs +187 -0
- data/core/tests/data/normal_dir/.gitkeep +0 -0
- data/core/tests/data/normal_file.txt +1041 -0
- data/core/tests/data/special_dir !@#$%^&()_+-=;',/.gitkeep +0 -0
- data/core/tests/data/special_file !@#$%^&()_+-=;',.txt +1041 -0
- data/core/users.md +13 -0
- data/extconf.rb +24 -0
- data/lib/opendal.rb +25 -0
- data/lib/opendal_ruby/entry.rb +35 -0
- data/lib/opendal_ruby/io.rb +70 -0
- data/lib/opendal_ruby/metadata.rb +44 -0
- data/lib/opendal_ruby/operator.rb +29 -0
- data/lib/opendal_ruby/operator_info.rb +26 -0
- data/src/capability.rs +146 -0
- data/src/io.rs +464 -0
- data/src/lib.rs +63 -0
- data/src/lister.rs +141 -0
- data/src/metadata.rs +111 -0
- data/src/middlewares.rs +174 -0
- data/src/operator.rs +310 -0
- data/src/operator_info.rs +83 -0
- data/test/blocking_op_test.rb +112 -0
- data/test/capability_test.rb +42 -0
- data/test/io_test.rb +172 -0
- data/test/lister_test.rb +77 -0
- data/test/metadata_test.rb +78 -0
- data/test/middlewares_test.rb +46 -0
- data/test/operator_info_test.rb +35 -0
- data/test/test_helper.rb +36 -0
- metadata +857 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::sync::Arc;
|
|
19
|
+
|
|
20
|
+
use bytes::Buf;
|
|
21
|
+
use http::StatusCode;
|
|
22
|
+
|
|
23
|
+
use super::core::*;
|
|
24
|
+
use super::error::parse_error;
|
|
25
|
+
use super::error::parse_s3_error_code;
|
|
26
|
+
use crate::raw::oio::BatchDeleteResult;
|
|
27
|
+
use crate::raw::*;
|
|
28
|
+
use crate::*;
|
|
29
|
+
|
|
30
|
+
pub struct S3Deleter {
|
|
31
|
+
core: Arc<S3Core>,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
impl S3Deleter {
|
|
35
|
+
pub fn new(core: Arc<S3Core>) -> Self {
|
|
36
|
+
Self { core }
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
impl oio::BatchDelete for S3Deleter {
|
|
41
|
+
async fn delete_once(&self, path: String, args: OpDelete) -> Result<()> {
|
|
42
|
+
// This would delete the bucket, do not perform
|
|
43
|
+
if self.core.root == "/" && path == "/" {
|
|
44
|
+
return Ok(());
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let resp = self.core.s3_delete_object(&path, &args).await?;
|
|
48
|
+
|
|
49
|
+
let status = resp.status();
|
|
50
|
+
|
|
51
|
+
match status {
|
|
52
|
+
StatusCode::NO_CONTENT => Ok(()),
|
|
53
|
+
// Allow 404 when deleting a non-existing object
|
|
54
|
+
// This is not a standard behavior, only some s3 alike service like GCS XML API do this.
|
|
55
|
+
// ref: <https://cloud.google.com/storage/docs/xml-api/delete-object>
|
|
56
|
+
StatusCode::NOT_FOUND => Ok(()),
|
|
57
|
+
_ => Err(parse_error(resp)),
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async fn delete_batch(&self, batch: Vec<(String, OpDelete)>) -> Result<BatchDeleteResult> {
|
|
62
|
+
let resp = self.core.s3_delete_objects(batch).await?;
|
|
63
|
+
|
|
64
|
+
let status = resp.status();
|
|
65
|
+
if status != StatusCode::OK {
|
|
66
|
+
return Err(parse_error(resp));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let bs = resp.into_body();
|
|
70
|
+
|
|
71
|
+
let result: DeleteObjectsResult =
|
|
72
|
+
quick_xml::de::from_reader(bs.reader()).map_err(new_xml_deserialize_error)?;
|
|
73
|
+
|
|
74
|
+
let mut batched_result = BatchDeleteResult {
|
|
75
|
+
succeeded: Vec::with_capacity(result.deleted.len()),
|
|
76
|
+
failed: Vec::with_capacity(result.error.len()),
|
|
77
|
+
};
|
|
78
|
+
for i in result.deleted {
|
|
79
|
+
let path = build_rel_path(&self.core.root, &i.key);
|
|
80
|
+
let mut op = OpDelete::new();
|
|
81
|
+
if let Some(version_id) = i.version_id {
|
|
82
|
+
op = op.with_version(version_id.as_str());
|
|
83
|
+
}
|
|
84
|
+
batched_result.succeeded.push((path, op));
|
|
85
|
+
}
|
|
86
|
+
for i in result.error {
|
|
87
|
+
let path = build_rel_path(&self.core.root, &i.key);
|
|
88
|
+
let mut op = OpDelete::new();
|
|
89
|
+
if let Some(version_id) = &i.version_id {
|
|
90
|
+
op = op.with_version(version_id.as_str());
|
|
91
|
+
}
|
|
92
|
+
batched_result
|
|
93
|
+
.failed
|
|
94
|
+
.push((path, op, parse_delete_objects_result_error(i)));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
Ok(batched_result)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
fn parse_delete_objects_result_error(err: DeleteObjectsResultError) -> Error {
|
|
102
|
+
let (kind, retryable) =
|
|
103
|
+
parse_s3_error_code(err.code.as_str()).unwrap_or((ErrorKind::Unexpected, false));
|
|
104
|
+
let mut err: Error = Error::new(kind, format!("{err:?}"));
|
|
105
|
+
if retryable {
|
|
106
|
+
err = err.set_temporary();
|
|
107
|
+
}
|
|
108
|
+
err
|
|
109
|
+
}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
## Capabilities
|
|
2
|
+
|
|
3
|
+
This service can be used to:
|
|
4
|
+
|
|
5
|
+
- [x] stat
|
|
6
|
+
- [x] read
|
|
7
|
+
- [x] write
|
|
8
|
+
- [x] append
|
|
9
|
+
- [x] create_dir
|
|
10
|
+
- [x] delete
|
|
11
|
+
- [x] copy
|
|
12
|
+
- [ ] rename
|
|
13
|
+
- [x] list
|
|
14
|
+
- [x] presign
|
|
15
|
+
- [ ] blocking
|
|
16
|
+
|
|
17
|
+
## Configuration
|
|
18
|
+
|
|
19
|
+
- `root`: Set the work dir for backend.
|
|
20
|
+
- `bucket`: Set the container name for backend.
|
|
21
|
+
- `endpoint`: Set the endpoint for backend.
|
|
22
|
+
- `region`: Set the region for backend.
|
|
23
|
+
- `access_key_id`: Set the access_key_id for backend.
|
|
24
|
+
- `secret_access_key`: Set the secret_access_key for backend.
|
|
25
|
+
- `session_token`: Set the session_token for backend.
|
|
26
|
+
- `default_storage_class`: Set the default storage_class for backend.
|
|
27
|
+
- `server_side_encryption`: Set the server_side_encryption for backend.
|
|
28
|
+
- `server_side_encryption_aws_kms_key_id`: Set the server_side_encryption_aws_kms_key_id for backend.
|
|
29
|
+
- `server_side_encryption_customer_algorithm`: Set the server_side_encryption_customer_algorithm for backend.
|
|
30
|
+
- `server_side_encryption_customer_key`: Set the server_side_encryption_customer_key for backend.
|
|
31
|
+
- `server_side_encryption_customer_key_md5`: Set the server_side_encryption_customer_key_md5 for backend.
|
|
32
|
+
- `disable_config_load`: Disable aws config load from env.
|
|
33
|
+
- `enable_virtual_host_style`: Enable virtual host style.
|
|
34
|
+
- `disable_write_with_if_match`: Disable write with if match.
|
|
35
|
+
- `enable_request_payer`: Enable the request payer for backend.
|
|
36
|
+
|
|
37
|
+
Refer to [`S3Builder`]'s public API docs for more information.
|
|
38
|
+
|
|
39
|
+
## Temporary security credentials
|
|
40
|
+
|
|
41
|
+
OpenDAL now provides support for S3 temporary security credentials in IAM.
|
|
42
|
+
|
|
43
|
+
The way to take advantage of this feature is to build your S3 backend with `Builder::session_token`.
|
|
44
|
+
|
|
45
|
+
But OpenDAL will not refresh the temporary security credentials, please keep in mind to refresh those credentials in time.
|
|
46
|
+
|
|
47
|
+
## Server Side Encryption
|
|
48
|
+
|
|
49
|
+
OpenDAL provides full support of S3 Server Side Encryption(SSE) features.
|
|
50
|
+
|
|
51
|
+
The easiest way to configure them is to use helper functions like
|
|
52
|
+
|
|
53
|
+
- SSE-KMS: `server_side_encryption_with_aws_managed_kms_key`
|
|
54
|
+
- SSE-KMS: `server_side_encryption_with_customer_managed_kms_key`
|
|
55
|
+
- SSE-S3: `server_side_encryption_with_s3_key`
|
|
56
|
+
- SSE-C: `server_side_encryption_with_customer_key`
|
|
57
|
+
|
|
58
|
+
If those functions don't fulfill need, low-level options are also provided:
|
|
59
|
+
|
|
60
|
+
- Use service managed kms key
|
|
61
|
+
- `server_side_encryption="aws:kms"`
|
|
62
|
+
- Use customer provided kms key
|
|
63
|
+
- `server_side_encryption="aws:kms"`
|
|
64
|
+
- `server_side_encryption_aws_kms_key_id="your-kms-key"`
|
|
65
|
+
- Use S3 managed key
|
|
66
|
+
- `server_side_encryption="AES256"`
|
|
67
|
+
- Use customer key
|
|
68
|
+
- `server_side_encryption_customer_algorithm="AES256"`
|
|
69
|
+
- `server_side_encryption_customer_key="base64-of-your-aes256-key"`
|
|
70
|
+
- `server_side_encryption_customer_key_md5="base64-of-your-aes256-key-md5"`
|
|
71
|
+
|
|
72
|
+
After SSE have been configured, all requests send by this backed will attach those headers.
|
|
73
|
+
|
|
74
|
+
Reference: [Protecting data using server-side encryption](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)
|
|
75
|
+
|
|
76
|
+
## Example
|
|
77
|
+
|
|
78
|
+
## Via Builder
|
|
79
|
+
|
|
80
|
+
### Basic Setup
|
|
81
|
+
|
|
82
|
+
```rust,no_run
|
|
83
|
+
use std::sync::Arc;
|
|
84
|
+
|
|
85
|
+
use anyhow::Result;
|
|
86
|
+
use opendal::services::S3;
|
|
87
|
+
use opendal::Operator;
|
|
88
|
+
|
|
89
|
+
#[tokio::main]
|
|
90
|
+
async fn main() -> Result<()> {
|
|
91
|
+
// Create s3 backend builder.
|
|
92
|
+
let mut builder = S3::default()
|
|
93
|
+
// Set the root for s3, all operations will happen under this root.
|
|
94
|
+
//
|
|
95
|
+
// NOTE: the root must be absolute path.
|
|
96
|
+
.root("/path/to/dir")
|
|
97
|
+
// Set the bucket name. This is required.
|
|
98
|
+
.bucket("test")
|
|
99
|
+
// Set the region. This is required for some services, if you don't care about it, for example Minio service, just set it to "auto", it will be ignored.
|
|
100
|
+
.region("us-east-1")
|
|
101
|
+
// Set the endpoint.
|
|
102
|
+
//
|
|
103
|
+
// For examples:
|
|
104
|
+
// - "https://s3.amazonaws.com"
|
|
105
|
+
// - "http://127.0.0.1:9000"
|
|
106
|
+
// - "https://oss-ap-northeast-1.aliyuncs.com"
|
|
107
|
+
// - "https://cos.ap-seoul.myqcloud.com"
|
|
108
|
+
//
|
|
109
|
+
// Default to "https://s3.amazonaws.com"
|
|
110
|
+
.endpoint("https://s3.amazonaws.com")
|
|
111
|
+
// Set the access_key_id and secret_access_key.
|
|
112
|
+
//
|
|
113
|
+
// OpenDAL will try load credential from the env.
|
|
114
|
+
// If credential not set and no valid credential in env, OpenDAL will
|
|
115
|
+
// send request without signing like anonymous user.
|
|
116
|
+
.access_key_id("access_key_id")
|
|
117
|
+
.secret_access_key("secret_access_key");
|
|
118
|
+
|
|
119
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
120
|
+
|
|
121
|
+
Ok(())
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### S3 with SSE-C
|
|
127
|
+
|
|
128
|
+
```rust,no_run
|
|
129
|
+
use anyhow::Result;
|
|
130
|
+
use log::info;
|
|
131
|
+
use opendal::services::S3;
|
|
132
|
+
use opendal::Operator;
|
|
133
|
+
|
|
134
|
+
#[tokio::main]
|
|
135
|
+
async fn main() -> Result<()> {
|
|
136
|
+
let mut builder = S3::default()
|
|
137
|
+
.root("/path/to/dir")
|
|
138
|
+
.bucket("test")
|
|
139
|
+
.region("us-east-1")
|
|
140
|
+
.endpoint("https://s3.amazonaws.com")
|
|
141
|
+
.access_key_id("access_key_id")
|
|
142
|
+
.secret_access_key("secret_access_key")
|
|
143
|
+
// Enable SSE-C
|
|
144
|
+
.server_side_encryption_with_customer_key("AES256", "customer_key".as_bytes());
|
|
145
|
+
|
|
146
|
+
let op = Operator::new(builder)?.finish();
|
|
147
|
+
info!("operator: {:?}", op);
|
|
148
|
+
|
|
149
|
+
// Writing your testing code here.
|
|
150
|
+
|
|
151
|
+
Ok(())
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### S3 with SSE-KMS and aws managed kms key
|
|
156
|
+
|
|
157
|
+
```rust,no_run
|
|
158
|
+
use anyhow::Result;
|
|
159
|
+
use log::info;
|
|
160
|
+
use opendal::services::S3;
|
|
161
|
+
use opendal::Operator;
|
|
162
|
+
|
|
163
|
+
#[tokio::main]
|
|
164
|
+
async fn main() -> Result<()> {
|
|
165
|
+
let mut builder = S3::default()
|
|
166
|
+
// Setup builders
|
|
167
|
+
.root("/path/to/dir")
|
|
168
|
+
.bucket("test")
|
|
169
|
+
.region("us-east-1")
|
|
170
|
+
.endpoint("https://s3.amazonaws.com")
|
|
171
|
+
.access_key_id("access_key_id")
|
|
172
|
+
.secret_access_key("secret_access_key")
|
|
173
|
+
// Enable SSE-KMS with aws managed kms key
|
|
174
|
+
.server_side_encryption_with_aws_managed_kms_key();
|
|
175
|
+
|
|
176
|
+
let op = Operator::new(builder)?.finish();
|
|
177
|
+
info!("operator: {:?}", op);
|
|
178
|
+
|
|
179
|
+
// Writing your testing code here.
|
|
180
|
+
|
|
181
|
+
Ok(())
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### S3 with SSE-KMS and customer managed kms key
|
|
186
|
+
|
|
187
|
+
```rust,no_run
|
|
188
|
+
use anyhow::Result;
|
|
189
|
+
use log::info;
|
|
190
|
+
use opendal::services::S3;
|
|
191
|
+
use opendal::Operator;
|
|
192
|
+
|
|
193
|
+
#[tokio::main]
|
|
194
|
+
async fn main() -> Result<()> {
|
|
195
|
+
let mut builder = S3::default()
|
|
196
|
+
// Setup builders
|
|
197
|
+
.root("/path/to/dir")
|
|
198
|
+
.bucket("test")
|
|
199
|
+
.region("us-east-1")
|
|
200
|
+
.endpoint("https://s3.amazonaws.com")
|
|
201
|
+
.access_key_id("access_key_id")
|
|
202
|
+
.secret_access_key("secret_access_key")
|
|
203
|
+
// Enable SSE-KMS with customer managed kms key
|
|
204
|
+
.server_side_encryption_with_customer_managed_kms_key("aws_kms_key_id");
|
|
205
|
+
|
|
206
|
+
let op = Operator::new(builder)?.finish();
|
|
207
|
+
info!("operator: {:?}", op);
|
|
208
|
+
|
|
209
|
+
// Writing your testing code here.
|
|
210
|
+
|
|
211
|
+
Ok(())
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### S3 with SSE-S3
|
|
216
|
+
|
|
217
|
+
```rust,no_run
|
|
218
|
+
use anyhow::Result;
|
|
219
|
+
use log::info;
|
|
220
|
+
use opendal::services::S3;
|
|
221
|
+
use opendal::Operator;
|
|
222
|
+
|
|
223
|
+
#[tokio::main]
|
|
224
|
+
async fn main() -> Result<()> {
|
|
225
|
+
let mut builder = S3::default()
|
|
226
|
+
// Setup builders
|
|
227
|
+
.root("/path/to/dir")
|
|
228
|
+
.bucket("test")
|
|
229
|
+
.region("us-east-1")
|
|
230
|
+
.endpoint("https://s3.amazonaws.com")
|
|
231
|
+
.access_key_id("access_key_id")
|
|
232
|
+
.secret_access_key("secret_access_key")
|
|
233
|
+
// Enable SSE-S3
|
|
234
|
+
.server_side_encryption_with_s3_key();
|
|
235
|
+
|
|
236
|
+
let op = Operator::new(builder)?.finish();
|
|
237
|
+
info!("operator: {:?}", op);
|
|
238
|
+
|
|
239
|
+
// Writing your testing code here.
|
|
240
|
+
|
|
241
|
+
Ok(())
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use bytes::Buf;
|
|
19
|
+
use http::response::Parts;
|
|
20
|
+
use http::Response;
|
|
21
|
+
use quick_xml::de;
|
|
22
|
+
use serde::Deserialize;
|
|
23
|
+
|
|
24
|
+
use crate::raw::*;
|
|
25
|
+
use crate::*;
|
|
26
|
+
|
|
27
|
+
/// S3Error is the error returned by s3 service.
|
|
28
|
+
#[derive(Default, Debug, Deserialize, PartialEq, Eq)]
|
|
29
|
+
#[serde(default, rename_all = "PascalCase")]
|
|
30
|
+
pub(crate) struct S3Error {
|
|
31
|
+
pub code: String,
|
|
32
|
+
pub message: String,
|
|
33
|
+
pub resource: String,
|
|
34
|
+
pub request_id: String,
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// Parse error response into Error.
|
|
38
|
+
pub(super) fn parse_error(resp: Response<Buffer>) -> Error {
|
|
39
|
+
let (parts, body) = resp.into_parts();
|
|
40
|
+
let bs = body.to_bytes();
|
|
41
|
+
|
|
42
|
+
let (mut kind, mut retryable) = match parts.status.as_u16() {
|
|
43
|
+
403 => (ErrorKind::PermissionDenied, false),
|
|
44
|
+
404 => (ErrorKind::NotFound, false),
|
|
45
|
+
304 | 412 => (ErrorKind::ConditionNotMatch, false),
|
|
46
|
+
// Service like R2 could return 499 error with a message like:
|
|
47
|
+
// Client Disconnect, we should retry it.
|
|
48
|
+
499 => (ErrorKind::Unexpected, true),
|
|
49
|
+
500 | 502 | 503 | 504 => (ErrorKind::Unexpected, true),
|
|
50
|
+
429 => (ErrorKind::RateLimited, true),
|
|
51
|
+
_ => (ErrorKind::Unexpected, false),
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
let body_content = bs.chunk();
|
|
55
|
+
let (message, s3_err) = de::from_reader::<_, S3Error>(body_content.reader())
|
|
56
|
+
.map(|s3_err| (format!("{s3_err:?}"), Some(s3_err)))
|
|
57
|
+
.unwrap_or_else(|_| (String::from_utf8_lossy(&bs).into_owned(), None));
|
|
58
|
+
|
|
59
|
+
if let Some(s3_err) = s3_err {
|
|
60
|
+
(kind, retryable) = parse_s3_error_code(s3_err.code.as_str()).unwrap_or((kind, retryable));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let mut err = Error::new(kind, message);
|
|
64
|
+
|
|
65
|
+
err = with_error_response_context(err, parts);
|
|
66
|
+
|
|
67
|
+
if retryable {
|
|
68
|
+
err = err.set_temporary();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
err
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/// Util function to build [`Error`] from a [`S3Error`] object.
|
|
75
|
+
pub(crate) fn from_s3_error(s3_error: S3Error, parts: Parts) -> Error {
|
|
76
|
+
let (kind, retryable) =
|
|
77
|
+
parse_s3_error_code(s3_error.code.as_str()).unwrap_or((ErrorKind::Unexpected, false));
|
|
78
|
+
let mut err = Error::new(kind, format!("{s3_error:?}"));
|
|
79
|
+
|
|
80
|
+
err = with_error_response_context(err, parts);
|
|
81
|
+
|
|
82
|
+
if retryable {
|
|
83
|
+
err = err.set_temporary();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
err
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/// Returns the `Error kind` of this code and whether the error is retryable.
|
|
90
|
+
/// All possible error code: <https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList>
|
|
91
|
+
pub fn parse_s3_error_code(code: &str) -> Option<(ErrorKind, bool)> {
|
|
92
|
+
match code {
|
|
93
|
+
// > The specified bucket does not exist.
|
|
94
|
+
//
|
|
95
|
+
// Although the status code is 404, NoSuchBucket is
|
|
96
|
+
// a config invalid error, and it's not retryable from OpenDAL.
|
|
97
|
+
"NoSuchBucket" => Some((ErrorKind::ConfigInvalid, false)),
|
|
98
|
+
// > Your socket connection to the server was not read from
|
|
99
|
+
// > or written to within the timeout period."
|
|
100
|
+
//
|
|
101
|
+
// It's Ok for us to retry it again.
|
|
102
|
+
"RequestTimeout" => Some((ErrorKind::Unexpected, true)),
|
|
103
|
+
// > An internal error occurred. Try again.
|
|
104
|
+
"InternalError" => Some((ErrorKind::Unexpected, true)),
|
|
105
|
+
// > A conflicting conditional operation is currently in progress
|
|
106
|
+
// > against this resource. Try again.
|
|
107
|
+
"OperationAborted" => Some((ErrorKind::Unexpected, true)),
|
|
108
|
+
// > Please reduce your request rate.
|
|
109
|
+
//
|
|
110
|
+
// It's Ok to retry since later on the request rate may get reduced.
|
|
111
|
+
"SlowDown" => Some((ErrorKind::RateLimited, true)),
|
|
112
|
+
// > Service is unable to handle request.
|
|
113
|
+
//
|
|
114
|
+
// ServiceUnavailable is considered a retryable error because it typically
|
|
115
|
+
// indicates a temporary issue with the service or server, such as high load,
|
|
116
|
+
// maintenance, or an internal problem.
|
|
117
|
+
"ServiceUnavailable" => Some((ErrorKind::Unexpected, true)),
|
|
118
|
+
// > Too Many Requests - rate limit exceeded.
|
|
119
|
+
//
|
|
120
|
+
// It's Ok to retry since later on the request rate may get reduced.
|
|
121
|
+
"TooManyRequests" => Some((ErrorKind::RateLimited, true)),
|
|
122
|
+
_ => None,
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
#[cfg(test)]
|
|
127
|
+
mod tests {
|
|
128
|
+
use super::*;
|
|
129
|
+
|
|
130
|
+
/// Error response example is from https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html
|
|
131
|
+
#[test]
|
|
132
|
+
fn test_parse_error() {
|
|
133
|
+
let bs = bytes::Bytes::from(
|
|
134
|
+
r#"
|
|
135
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
136
|
+
<Error>
|
|
137
|
+
<Code>NoSuchKey</Code>
|
|
138
|
+
<Message>The resource you requested does not exist</Message>
|
|
139
|
+
<Resource>/mybucket/myfoto.jpg</Resource>
|
|
140
|
+
<RequestId>4442587FB7D0A2F9</RequestId>
|
|
141
|
+
</Error>
|
|
142
|
+
"#,
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
let out: S3Error = de::from_reader(bs.reader()).expect("must success");
|
|
146
|
+
println!("{out:?}");
|
|
147
|
+
|
|
148
|
+
assert_eq!(out.code, "NoSuchKey");
|
|
149
|
+
assert_eq!(out.message, "The resource you requested does not exist");
|
|
150
|
+
assert_eq!(out.resource, "/mybucket/myfoto.jpg");
|
|
151
|
+
assert_eq!(out.request_id, "4442587FB7D0A2F9");
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
#[test]
|
|
155
|
+
fn test_parse_error_from_unrelated_input() {
|
|
156
|
+
let bs = bytes::Bytes::from(
|
|
157
|
+
r#"
|
|
158
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
159
|
+
<CompleteMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
|
|
160
|
+
<Location>http://Example-Bucket.s3.ap-southeast-1.amazonaws.com/Example-Object</Location>
|
|
161
|
+
<Bucket>Example-Bucket</Bucket>
|
|
162
|
+
<Key>Example-Object</Key>
|
|
163
|
+
<ETag>"3858f62230ac3c915f300c664312c11f-9"</ETag>
|
|
164
|
+
</CompleteMultipartUploadResult>
|
|
165
|
+
"#,
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
let out: S3Error = de::from_reader(bs.reader()).expect("must success");
|
|
169
|
+
assert_eq!(out, S3Error::default());
|
|
170
|
+
}
|
|
171
|
+
}
|