Compare commits

...

3 Commits

Author SHA1 Message Date
安正超
007d9c0b21 fix: normalize ETag comparison in multipart upload and replication (#627)
- Normalize ETags by removing quotes before comparison in complete_multipart_upload
- Fix ETag comparison in replication logic to handle quoted ETags from API responses
- Fix ETag comparison in transition object logic
- Add unit tests for trim_etag function

This fixes the ETag mismatch error when uploading large files (5GB+) via multipart upload,
which was caused by PR #592 adding quotes to ETag responses while internal storage remains unquoted.

Fixes #625
2025-10-08 21:19:57 +08:00
Nugine
626c7ed34a fix: CompleteMultipartUpload encryption (#626) 2025-10-08 20:27:40 +08:00
houseme
0e680eae31 fix typos and bump the dependencies group with 9 updates (#614)
* fix typos

* build(deps): bump the dependencies group with 9 updates (#613)

Bumps the dependencies group with 9 updates:

| Package | From | To |
| --- | --- | --- |
| [axum](https://github.com/tokio-rs/axum) | `0.8.4` | `0.8.6` |
| [axum-extra](https://github.com/tokio-rs/axum) | `0.10.1` | `0.10.3` |
| [regex](https://github.com/rust-lang/regex) | `1.11.2` | `1.11.3` |
| [serde](https://github.com/serde-rs/serde) | `1.0.226` | `1.0.228` |
| [shadow-rs](https://github.com/baoyachi/shadow-rs) | `1.3.0` | `1.4.0` |
| [sysinfo](https://github.com/GuillaumeGomez/sysinfo) | `0.37.0` | `0.37.1` |
| [thiserror](https://github.com/dtolnay/thiserror) | `2.0.16` | `2.0.17` |
| [tokio-rustls](https://github.com/rustls/tokio-rustls) | `0.26.3` | `0.26.4` |
| [zeroize](https://github.com/RustCrypto/utils) | `1.8.1` | `1.8.2` |


Updates `axum` from 0.8.4 to 0.8.6
- [Release notes](https://github.com/tokio-rs/axum/releases)
- [Changelog](https://github.com/tokio-rs/axum/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/axum/compare/axum-v0.8.4...axum-v0.8.6)

Updates `axum-extra` from 0.10.1 to 0.10.3
- [Release notes](https://github.com/tokio-rs/axum/releases)
- [Changelog](https://github.com/tokio-rs/axum/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/axum/compare/axum-extra-v0.10.1...axum-extra-v0.10.3)

Updates `regex` from 1.11.2 to 1.11.3
- [Release notes](https://github.com/rust-lang/regex/releases)
- [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/regex/compare/1.11.2...1.11.3)

Updates `serde` from 1.0.226 to 1.0.228
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.226...v1.0.228)

Updates `shadow-rs` from 1.3.0 to 1.4.0
- [Release notes](https://github.com/baoyachi/shadow-rs/releases)
- [Commits](https://github.com/baoyachi/shadow-rs/compare/1.3.0...v1.4.0)

Updates `sysinfo` from 0.37.0 to 0.37.1
- [Changelog](https://github.com/GuillaumeGomez/sysinfo/blob/master/CHANGELOG.md)
- [Commits](https://github.com/GuillaumeGomez/sysinfo/compare/v0.37.0...v0.37.1)

Updates `thiserror` from 2.0.16 to 2.0.17
- [Release notes](https://github.com/dtolnay/thiserror/releases)
- [Commits](https://github.com/dtolnay/thiserror/compare/2.0.16...2.0.17)

Updates `tokio-rustls` from 0.26.3 to 0.26.4
- [Release notes](https://github.com/rustls/tokio-rustls/releases)
- [Commits](https://github.com/rustls/tokio-rustls/compare/v/0.26.3...v/0.26.4)

Updates `zeroize` from 1.8.1 to 1.8.2
- [Commits](https://github.com/RustCrypto/utils/compare/zeroize-v1.8.1...zeroize-v1.8.2)

---
updated-dependencies:
- dependency-name: axum
  dependency-version: 0.8.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: axum-extra
  dependency-version: 0.10.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: regex
  dependency-version: 1.11.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: serde
  dependency-version: 1.0.228
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: shadow-rs
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: dependencies
- dependency-name: sysinfo
  dependency-version: 0.37.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: thiserror
  dependency-version: 2.0.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: tokio-rustls
  dependency-version: 0.26.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies
- dependency-name: zeroize
  dependency-version: 1.8.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-02 23:29:18 +08:00
9 changed files with 136 additions and 128 deletions

171
Cargo.lock generated
View File

@@ -854,7 +854,7 @@ dependencies = [
"rustls-native-certs 0.8.1",
"rustls-pki-types",
"tokio",
"tokio-rustls 0.26.3",
"tokio-rustls 0.26.4",
"tower",
"tracing",
]
@@ -979,9 +979,9 @@ dependencies = [
[[package]]
name = "axum"
version = "0.8.4"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5"
checksum = "8a18ed336352031311f4e0b4dd2ff392d4fbb370777c9d18d7fc9d7359f73871"
dependencies = [
"axum-core",
"bytes",
@@ -998,8 +998,7 @@ dependencies = [
"mime",
"percent-encoding",
"pin-project-lite",
"rustversion",
"serde",
"serde_core",
"serde_json",
"serde_path_to_error",
"serde_urlencoded",
@@ -1013,9 +1012,9 @@ dependencies = [
[[package]]
name = "axum-core"
version = "0.5.2"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6"
checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22"
dependencies = [
"bytes",
"futures-core",
@@ -1024,7 +1023,6 @@ dependencies = [
"http-body-util",
"mime",
"pin-project-lite",
"rustversion",
"sync_wrapper",
"tower-layer",
"tower-service",
@@ -1033,9 +1031,9 @@ dependencies = [
[[package]]
name = "axum-extra"
version = "0.10.1"
version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "45bf463831f5131b7d3c756525b305d40f1185b688565648a92e1392ca35713d"
checksum = "9963ff19f40c6102c76756ef0a46004c0d58957d87259fc9208ff8441c12ab96"
dependencies = [
"axum",
"axum-core",
@@ -1047,10 +1045,10 @@ dependencies = [
"mime",
"pin-project-lite",
"rustversion",
"serde",
"tower",
"serde_core",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
@@ -1071,7 +1069,7 @@ dependencies = [
"rustls-pemfile 2.2.0",
"rustls-pki-types",
"tokio",
"tokio-rustls 0.26.3",
"tokio-rustls 0.26.4",
"tower-service",
]
@@ -1338,7 +1336,7 @@ dependencies = [
"serde",
"serde-untagged",
"serde-value",
"thiserror 2.0.16",
"thiserror 2.0.17",
"toml",
"unicode-xid",
"url",
@@ -1356,7 +1354,7 @@ dependencies = [
"semver",
"serde",
"serde_json",
"thiserror 2.0.16",
"thiserror 2.0.17",
]
[[package]]
@@ -3153,7 +3151,7 @@ dependencies = [
"regex",
"serde",
"serde_derive",
"thiserror 2.0.16",
"thiserror 2.0.17",
"toml",
"tracing",
"tracing-subscriber",
@@ -3499,10 +3497,10 @@ dependencies = [
"rand 0.9.2",
"ring",
"rustls 0.23.32",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tinyvec",
"tokio",
"tokio-rustls 0.26.3",
"tokio-rustls 0.26.4",
"tracing",
"url",
]
@@ -3524,9 +3522,9 @@ dependencies = [
"resolv-conf",
"rustls 0.23.32",
"smallvec",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tokio-rustls 0.26.3",
"tokio-rustls 0.26.4",
"tracing",
]
@@ -3723,7 +3721,7 @@ dependencies = [
"rustls-native-certs 0.8.1",
"rustls-pki-types",
"tokio",
"tokio-rustls 0.26.3",
"tokio-rustls 0.26.4",
"tower-service",
"webpki-roots",
]
@@ -4246,7 +4244,7 @@ dependencies = [
"once_cell",
"serde",
"sha2 0.10.9",
"thiserror 2.0.16",
"thiserror 2.0.17",
"uuid",
]
@@ -4297,7 +4295,7 @@ checksum = "656b3b27f8893f7bbf9485148ff9a65f019e3f33bd5cdc87c83cab16b3fd9ec8"
dependencies = [
"libc",
"neli",
"thiserror 2.0.16",
"thiserror 2.0.17",
"windows-sys 0.59.0",
]
@@ -4424,9 +4422,9 @@ checksum = "ae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0"
[[package]]
name = "memchr"
version = "2.7.5"
version = "2.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
[[package]]
name = "memmap2"
@@ -4669,15 +4667,6 @@ dependencies = [
"windows-sys 0.52.0",
]
[[package]]
name = "nugine-rust-utils"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04dcd9cfa92246a9c7ca0671e00733c4e9d77ee1fa0ae08c9a181b7c8802aea2"
dependencies = [
"simdutf8",
]
[[package]]
name = "num"
version = "0.4.3"
@@ -4898,7 +4887,7 @@ dependencies = [
"itertools 0.14.0",
"parking_lot",
"percent-encoding",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tracing",
"url",
@@ -4951,7 +4940,7 @@ dependencies = [
"futures-sink",
"js-sys",
"pin-project-lite",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tracing",
]
@@ -4980,7 +4969,7 @@ dependencies = [
"opentelemetry-proto",
"opentelemetry_sdk",
"prost 0.13.5",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tonic 0.13.1",
"tracing",
@@ -5028,7 +5017,7 @@ dependencies = [
"percent-encoding",
"rand 0.9.2",
"serde_json",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tokio-stream",
]
@@ -5415,7 +5404,7 @@ dependencies = [
"spin 0.10.0",
"symbolic-demangle",
"tempfile",
"thiserror 2.0.16",
"thiserror 2.0.17",
]
[[package]]
@@ -5666,7 +5655,7 @@ dependencies = [
"rustc-hash",
"rustls 0.23.32",
"socket2 0.6.0",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tracing",
"web-time",
@@ -5687,7 +5676,7 @@ dependencies = [
"rustls 0.23.32",
"rustls-pki-types",
"slab",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tinyvec",
"tracing",
"web-time",
@@ -5882,7 +5871,7 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
dependencies = [
"getrandom 0.2.16",
"libredox",
"thiserror 2.0.16",
"thiserror 2.0.17",
]
[[package]]
@@ -5917,9 +5906,9 @@ dependencies = [
[[package]]
name = "regex"
version = "1.11.2"
version = "1.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912"
checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c"
dependencies = [
"aho-corasick",
"memchr",
@@ -5929,9 +5918,9 @@ dependencies = [
[[package]]
name = "regex-automata"
version = "0.4.10"
version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6"
checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad"
dependencies = [
"aho-corasick",
"memchr",
@@ -5982,7 +5971,7 @@ dependencies = [
"serde_urlencoded",
"sync_wrapper",
"tokio",
"tokio-rustls 0.26.3",
"tokio-rustls 0.26.4",
"tokio-util",
"tower",
"tower-http",
@@ -6050,7 +6039,7 @@ dependencies = [
"schemars",
"serde",
"serde_json",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tokio-util",
"tracing",
@@ -6125,9 +6114,9 @@ dependencies = [
"rustls-native-certs 0.8.1",
"rustls-pemfile 2.2.0",
"rustls-webpki 0.102.8",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tokio-rustls 0.26.3",
"tokio-rustls 0.26.4",
"tokio-stream",
"tokio-util",
]
@@ -6252,11 +6241,11 @@ dependencies = [
"shadow-rs",
"socket2 0.6.0",
"sysctl",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tikv-jemallocator",
"time",
"tokio",
"tokio-rustls 0.26.3",
"tokio-rustls 0.26.4",
"tokio-stream",
"tokio-tar",
"tokio-util",
@@ -6289,7 +6278,7 @@ dependencies = [
"serde_json",
"serial_test",
"tempfile",
"thiserror 2.0.16",
"thiserror 2.0.17",
"time",
"tokio",
"tokio-util",
@@ -6322,7 +6311,7 @@ dependencies = [
"rustfs-targets",
"serde",
"serde_json",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tracing",
"url",
@@ -6381,7 +6370,7 @@ dependencies = [
"serde_json",
"sha2 0.10.9",
"test-case",
"thiserror 2.0.16",
"thiserror 2.0.17",
"time",
]
@@ -6452,7 +6441,7 @@ dependencies = [
"smallvec",
"temp-env",
"tempfile",
"thiserror 2.0.16",
"thiserror 2.0.17",
"time",
"tokio",
"tokio-stream",
@@ -6481,7 +6470,7 @@ dependencies = [
"s3s",
"serde",
"serde_json",
"thiserror 2.0.16",
"thiserror 2.0.17",
"time",
"tokio",
"tracing",
@@ -6506,7 +6495,7 @@ dependencies = [
"rustfs-utils",
"serde",
"serde_json",
"thiserror 2.0.16",
"thiserror 2.0.17",
"time",
"tokio",
"tokio-util",
@@ -6531,7 +6520,7 @@ dependencies = [
"serde_json",
"sha2 0.10.9",
"tempfile",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tokio-test",
"tracing",
@@ -6556,7 +6545,7 @@ dependencies = [
"serde_json",
"smallvec",
"smartstring",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tonic 0.14.2",
"tracing",
@@ -6612,7 +6601,7 @@ dependencies = [
"rustfs-utils",
"serde",
"serde_json",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tracing",
"tracing-subscriber",
@@ -6643,7 +6632,7 @@ dependencies = [
"serde_json",
"smallvec",
"sysinfo",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tracing",
"tracing-core",
@@ -6666,7 +6655,7 @@ dependencies = [
"serde_json",
"strum 0.27.2",
"test-case",
"thiserror 2.0.16",
"thiserror 2.0.17",
"time",
"tokio",
]
@@ -6799,7 +6788,7 @@ dependencies = [
"serde",
"serde_json",
"snap",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tracing",
"url",
@@ -6844,7 +6833,7 @@ dependencies = [
"snap",
"sysinfo",
"tempfile",
"thiserror 2.0.16",
"thiserror 2.0.17",
"tokio",
"tracing",
"transform-stream",
@@ -7058,9 +7047,9 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
[[package]]
name = "s3s"
version = "0.12.0-rc.1"
version = "0.12.0-rc.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0c7ae94d88d3d0d4ab0cb3f8e106199832b2943609680b5d75b0d7f686f6be3"
checksum = "6fbf35b8b229398629d8df8a0cb908a70a24da69f65911fe0461fba3f4e9dda5"
dependencies = [
"arrayvec",
"async-trait",
@@ -7068,6 +7057,7 @@ dependencies = [
"base64-simd",
"bytes",
"bytestring",
"cfg-if",
"chrono",
"const-str",
"crc32c",
@@ -7086,7 +7076,6 @@ dependencies = [
"memchr",
"mime",
"nom 7.1.3",
"nugine-rust-utils",
"numeric_cast",
"pin-project-lite",
"quick-xml 0.37.5",
@@ -7098,7 +7087,7 @@ dependencies = [
"std-next",
"subtle",
"sync_wrapper",
"thiserror 2.0.16",
"thiserror 2.0.17",
"time",
"tokio",
"tower",
@@ -7251,9 +7240,9 @@ checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc"
[[package]]
name = "serde"
version = "1.0.226"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd"
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
"serde_derive",
@@ -7295,18 +7284,18 @@ dependencies = [
[[package]]
name = "serde_core"
version = "1.0.226"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4"
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.226"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33"
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
@@ -7449,9 +7438,9 @@ dependencies = [
[[package]]
name = "shadow-rs"
version = "1.3.0"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8aa5c0570cd9654158bd39f0f8caba24edbc058313946e89f4648b1de1ecf49"
checksum = "72d18183cef626bce22836103349c7050d73db799be0171386b80947d157ae32"
dependencies = [
"cargo_metadata",
"const_format",
@@ -7534,7 +7523,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb"
dependencies = [
"num-bigint",
"num-traits",
"thiserror 2.0.16",
"thiserror 2.0.17",
"time",
]
@@ -7710,7 +7699,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04082e93ed1a06debd9148c928234b46d2cf260bc65f44e1d1d3fa594c5beebc"
dependencies = [
"simdutf8",
"thiserror 2.0.16",
"thiserror 2.0.17",
]
[[package]]
@@ -7942,15 +7931,15 @@ dependencies = [
"byteorder",
"enum-as-inner",
"libc",
"thiserror 2.0.16",
"thiserror 2.0.17",
"walkdir",
]
[[package]]
name = "sysinfo"
version = "0.37.0"
version = "0.37.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07cec4dc2d2e357ca1e610cfb07de2fa7a10fc3e9fe89f72545f3d244ea87753"
checksum = "3bddd368fda2f82ead69c03d46d351987cfa0c2a57abfa37a017f3aa3e9bf69a"
dependencies = [
"libc",
"memchr",
@@ -8053,11 +8042,11 @@ dependencies = [
[[package]]
name = "thiserror"
version = "2.0.16"
version = "2.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0"
checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
dependencies = [
"thiserror-impl 2.0.16",
"thiserror-impl 2.0.17",
]
[[package]]
@@ -8073,9 +8062,9 @@ dependencies = [
[[package]]
name = "thiserror-impl"
version = "2.0.16"
version = "2.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960"
checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
dependencies = [
"proc-macro2",
"quote",
@@ -8242,9 +8231,9 @@ dependencies = [
[[package]]
name = "tokio-rustls"
version = "0.26.3"
version = "0.26.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05f63835928ca123f1bef57abbcd23bb2ba0ac9ae1235f1e65bda0d06e7786bd"
checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
dependencies = [
"rustls 0.23.32",
"tokio",
@@ -9627,9 +9616,9 @@ dependencies = [
[[package]]
name = "zeroize"
version = "1.8.1"
version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
dependencies = [
"zeroize_derive",
]

View File

@@ -101,8 +101,8 @@ async-compression = { version = "0.4.19" }
atomic_enum = "0.3.0"
aws-config = { version = "1.8.6" }
aws-sdk-s3 = { version = "1.106.0", default-features = false, features = ["sigv4a", "rustls", "rt-tokio"] }
axum = "0.8.4"
axum-extra = "0.10.1"
axum = "0.8.6"
axum-extra = "0.10.3"
axum-server = { version = "0.7.2", features = ["tls-rustls-no-provider"], default-features = false }
base64-simd = "0.8.0"
base64 = "0.22.1"
@@ -190,7 +190,7 @@ quick-xml = "0.38.3"
rand = "0.9.2"
rdkafka = { version = "0.38.0", features = ["tokio"] }
reed-solomon-simd = { version = "3.0.1" }
regex = { version = "1.11.2" }
regex = { version = "1.11.3" }
reqwest = { version = "0.12.23", default-features = false, features = [
"rustls-tls-webpki-roots",
"charset",
@@ -210,15 +210,15 @@ rustfs-rsc = "2025.506.1"
rustls = { version = "0.23.32", features = ["ring", "logging", "std", "tls12"], default-features = false }
rustls-pki-types = "1.12.0"
rustls-pemfile = "2.2.0"
s3s = { version = "0.12.0-rc.1", features = ["minio"] }
s3s = { version = "0.12.0-rc.2", features = ["minio"] }
schemars = "1.0.4"
serde = { version = "1.0.226", features = ["derive"] }
serde = { version = "1.0.228", features = ["derive"] }
serde_json = { version = "1.0.145", features = ["raw_value"] }
serde_urlencoded = "0.7.1"
serial_test = "3.2.0"
sha1 = "0.10.6"
sha2 = "0.10.9"
shadow-rs = { version = "1.3.0", default-features = false }
shadow-rs = { version = "1.4.0", default-features = false }
siphasher = "1.0.1"
smallvec = { version = "1.15.1", features = ["serde"] }
smartstring = "1.0.1"
@@ -226,12 +226,12 @@ snafu = "0.8.9"
snap = "1.1.1"
socket2 = "0.6.0"
strum = { version = "0.27.2", features = ["derive"] }
sysinfo = "0.37.0"
sysinfo = "0.37.1"
sysctl = "0.7.1"
tempfile = "3.23.0"
temp-env = "0.3.6"
test-case = "3.3.1"
thiserror = "2.0.16"
thiserror = "2.0.17"
time = { version = "0.3.44", features = [
"std",
"parsing",
@@ -240,7 +240,7 @@ time = { version = "0.3.44", features = [
"serde",
] }
tokio = { version = "1.47.1", features = ["fs", "rt-multi-thread"] }
tokio-rustls = { version = "0.26.3", default-features = false, features = ["logging", "tls12", "ring"] }
tokio-rustls = { version = "0.26.4", default-features = false, features = ["logging", "tls12", "ring"] }
tokio-stream = { version = "0.1.17" }
tokio-tar = "0.3.1"
tokio-test = "0.4.4"
@@ -266,7 +266,7 @@ uuid = { version = "1.18.1", features = [
vaultrs = { version = "0.7.4" }
walkdir = "2.5.0"
wildmatch = { version = "2.5.0", features = ["serde"] }
zeroize = { version = "1.8.1", features = ["derive"] }
zeroize = { version = "1.8.2", features = ["derive"] }
winapi = { version = "0.3.9" }
xxhash-rust = { version = "0.8.15", features = ["xxh64", "xxh3"] }
zip = "5.1.1"

View File

@@ -225,7 +225,7 @@ async fn set_bucket_lifecycle_transition(bucket_name: &str) -> Result<(), Box<dy
</Rule>
<Rule>
<ID>test-rule2</ID>
<Status>Desabled</Status>
<Status>Disabled</Status>
<Filter>
<Prefix>test/</Prefix>
</Filter>

View File

@@ -388,23 +388,11 @@ async fn test_bucket_default_encryption_multipart_upload() -> Result<(), Box<dyn
complete_multipart_response.ssekms_key_id()
);
// Verify: complete_multipart_upload response should contain encryption information
// KNOWN BUG: s3s library bug where CompleteMultipartUploadOutput encryption fields serialize as None
// even when properly set. Our server implementation is correct (see server logs above).
// TODO: Remove this workaround when s3s library is fixed
warn!("KNOWN BUG: s3s library - complete_multipart_upload response encryption fields return None even when set");
if complete_multipart_response.server_side_encryption().is_some() {
// If s3s library is fixed, verify the encryption info
assert_eq!(
complete_multipart_response.server_side_encryption(),
Some(&ServerSideEncryption::AwsKms),
"complete_multipart_upload response should contain SSE-KMS encryption information"
);
} else {
// Expected behavior due to s3s library bug - log and continue
warn!("Skipping assertion due to known s3s library bug - server logs confirm correct encryption handling");
}
assert_eq!(
complete_multipart_response.server_side_encryption(),
Some(&ServerSideEncryption::AwsKms),
"complete_multipart_upload response should contain SSE-KMS encryption information"
);
// Step 4: Download file and verify encryption status
info!("Downloading file and verifying encryption status");

View File

@@ -2312,7 +2312,11 @@ fn get_replication_action(oi1: &ObjectInfo, oi2: &HeadObjectOutput, op_type: Rep
let size = oi1.get_actual_size().unwrap_or_default();
if oi1.etag != oi2.e_tag
// Normalize ETags by removing quotes before comparison (PR #592 compatibility)
let oi1_etag = oi1.etag.as_ref().map(|e| rustfs_utils::path::trim_etag(e));
let oi2_etag = oi2.e_tag.as_ref().map(|e| rustfs_utils::path::trim_etag(e));
if oi1_etag != oi2_etag
|| oi1.version_id.map(|v| v.to_string()) != oi2.version_id
|| size != oi2.content_length.unwrap_or_default()
|| oi1.delete_marker != oi2.delete_marker.unwrap_or_default()

View File

@@ -5668,8 +5668,11 @@ impl StorageAPI for SetDisks {
}
return Err(to_object_err(ERR_METHOD_NOT_ALLOWED, vec![bucket, object]));
}*/
// Normalize ETags by removing quotes before comparison (PR #592 compatibility)
let transition_etag = rustfs_utils::path::trim_etag(&opts.transition.etag);
let stored_etag = rustfs_utils::path::trim_etag(&extract_etag(&fi.metadata));
if !opts.mod_time.expect("err").unix_timestamp() == fi.mod_time.as_ref().expect("err").unix_timestamp()
|| opts.transition.etag != extract_etag(&fi.metadata)
|| transition_etag != stored_etag
{
return Err(to_object_err(Error::from(DiskError::FileNotFound), vec![bucket, object]));
}
@@ -6598,10 +6601,13 @@ impl StorageAPI for SetDisks {
let ext_part = &curr_fi.parts[i];
tracing::info!(target:"rustfs_ecstore::set_disk", part_number = p.part_num, part_size = ext_part.size, part_actual_size = ext_part.actual_size, "Completing multipart part");
if p.etag != Some(ext_part.etag.clone()) {
// Normalize ETags by removing quotes before comparison (PR #592 compatibility)
let client_etag = p.etag.as_ref().map(|e| rustfs_utils::path::trim_etag(e));
let stored_etag = Some(rustfs_utils::path::trim_etag(&ext_part.etag));
if client_etag != stored_etag {
error!(
"complete_multipart_upload etag err {:?}, part_id={}, bucket={}, object={}",
p.etag, p.part_num, bucket, object
"complete_multipart_upload etag err client={:?}, stored={:?}, part_id={}, bucket={}, object={}",
p.etag, ext_part.etag, p.part_num, bucket, object
);
return Err(Error::InvalidPart(p.part_num, ext_part.etag.clone(), p.etag.clone().unwrap_or_default()));
}

View File

@@ -157,7 +157,7 @@ impl QueryStateMachine {
pub fn begin_optimize(&self) {
// TODO record time
self.translate_to(Box::new(QueryState::RUNNING(RUNNING::OPTMIZING)));
self.translate_to(Box::new(QueryState::RUNNING(RUNNING::OPTIMIZING)));
}
pub fn end_optimize(&self) {
@@ -222,7 +222,7 @@ impl AsRef<str> for QueryState {
pub enum RUNNING {
DISPATCHING,
ANALYZING,
OPTMIZING,
OPTIMIZING,
SCHEDULING,
}
@@ -231,7 +231,7 @@ impl AsRef<str> for RUNNING {
match self {
Self::DISPATCHING => "DISPATCHING",
Self::ANALYZING => "ANALYZING",
Self::OPTMIZING => "OPTMIZING",
Self::OPTIMIZING => "OPTIMIZING",
Self::SCHEDULING => "SCHEDULING",
}
}

View File

@@ -63,7 +63,7 @@ mod tests {
fn test_running_state_as_ref() {
assert_eq!(RUNNING::DISPATCHING.as_ref(), "DISPATCHING");
assert_eq!(RUNNING::ANALYZING.as_ref(), "ANALYZING");
assert_eq!(RUNNING::OPTMIZING.as_ref(), "OPTMIZING");
assert_eq!(RUNNING::OPTIMIZING.as_ref(), "OPTIMIZING");
assert_eq!(RUNNING::SCHEDULING.as_ref(), "SCHEDULING");
}

View File

@@ -276,6 +276,27 @@ pub fn trim_etag(etag: &str) -> String {
mod tests {
use super::*;
#[test]
fn test_trim_etag() {
// Test with quoted ETag
assert_eq!(trim_etag("\"abc123\""), "abc123");
// Test with unquoted ETag
assert_eq!(trim_etag("abc123"), "abc123");
// Test with empty string
assert_eq!(trim_etag(""), "");
// Test with only quotes
assert_eq!(trim_etag("\"\""), "");
// Test with MD5 hash
assert_eq!(trim_etag("\"2c7ab85a893283e98c931e9511add182\""), "2c7ab85a893283e98c931e9511add182");
// Test with multipart ETag format
assert_eq!(trim_etag("\"098f6bcd4621d373cade4e832627b4f6-2\""), "098f6bcd4621d373cade4e832627b4f6-2");
}
#[test]
fn test_base_dir_from_prefix() {
let a = "da/";