From 164a7c71cb0edfe56c9bf221be8aab9a3877a77b Mon Sep 17 00:00:00 2001 From: weisd Date: Sat, 9 Nov 2024 20:44:16 +0800 Subject: [PATCH] fix put_object content-length empty --- Cargo.lock | 1 + ecstore/src/utils/path.rs | 2 +- ecstore/src/xhttp.rs | 1 + rustfs/Cargo.toml | 1 + rustfs/src/storage/ecfs.rs | 28 ++++++++++++++++++++++++++-- 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3e96b12b..c138585a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2135,6 +2135,7 @@ version = "0.1.0" dependencies = [ "admin", "async-trait", + "atoi", "axum", "bytes", "clap", diff --git a/ecstore/src/utils/path.rs b/ecstore/src/utils/path.rs index 573e75e2..b505bd72 100644 --- a/ecstore/src/utils/path.rs +++ b/ecstore/src/utils/path.rs @@ -1,4 +1,4 @@ -use std::path::{Path, PathBuf}; +use std::path::PathBuf; const GLOBAL_DIR_SUFFIX: &str = "__XLDIR__"; diff --git a/ecstore/src/xhttp.rs b/ecstore/src/xhttp.rs index b4a3a2b1..8c34d8c0 100644 --- a/ecstore/src/xhttp.rs +++ b/ecstore/src/xhttp.rs @@ -1,2 +1,3 @@ pub const AMZ_OBJECT_TAGGING: &str = "X-Amz-Tagging"; pub const AMZ_STORAGE_CLASS: &str = "x-amz-storage-class"; +pub const AMZ_DECODED_CONTENT_LENGTH: &str = "X-Amz-Decoded-Content-Length"; diff --git a/rustfs/Cargo.toml b/rustfs/Cargo.toml index 938cdf8f..ee30bf12 100644 --- a/rustfs/Cargo.toml +++ b/rustfs/Cargo.toml @@ -57,6 +57,7 @@ router = { version = "0.0.1", path = "../router" } matchit = "0.8.4" shadow-rs = "0.35.2" const-str = { version = "0.5.7", features = ["std", "proc"] } +atoi = "2.0.0" [build-dependencies] prost-build.workspace = true diff --git a/rustfs/src/storage/ecfs.rs b/rustfs/src/storage/ecfs.rs index 3334bda0..50da57f0 100644 --- a/rustfs/src/storage/ecfs.rs +++ b/rustfs/src/storage/ecfs.rs @@ -588,7 +588,19 @@ impl S3 for FS { let Some(body) = body else { return Err(s3_error!(IncompleteBody)) }; - let content_length = content_length.unwrap_or_default(); + let content_length = match content_length { + Some(c) => c, + None => { + if let Some(val) = req.headers.get(xhttp::AMZ_DECODED_CONTENT_LENGTH) { + match atoi::atoi::(val.as_bytes()) { + Some(x) => x, + None => return Err(s3_error!(UnexpectedContent)), + } + } else { + return Err(s3_error!(UnexpectedContent)); + } + } + }; let mut reader = PutObjReader::new(body, content_length as usize); @@ -677,7 +689,19 @@ impl S3 for FS { // let upload_id = let body = body.ok_or_else(|| s3_error!(IncompleteBody))?; - let content_length = content_length.unwrap_or_default(); + let content_length = match content_length { + Some(c) => c, + None => { + if let Some(val) = req.headers.get(xhttp::AMZ_DECODED_CONTENT_LENGTH) { + match atoi::atoi::(val.as_bytes()) { + Some(x) => x, + None => return Err(s3_error!(UnexpectedContent)), + } + } else { + return Err(s3_error!(UnexpectedContent)); + } + } + }; // mc cp step 4 let mut data = PutObjReader::new(body, content_length as usize);