diff --git a/codegen/src/ops.rs b/codegen/src/ops.rs index 9c5e3846..fd71e35e 100644 --- a/codegen/src/ops.rs +++ b/codegen/src/ops.rs @@ -627,9 +627,11 @@ fn codegen_op_http_call(op: &Operation) { if op.name == "GetObject" { g!("resp.headers.extend(overrided_headers);"); + g!("super::get_object::merge_custom_headers(&mut resp, s3_resp.headers);"); + } else { + g!("resp.headers.extend(s3_resp.headers);"); } - g!("resp.headers.extend(s3_resp.headers);"); g!("resp.extensions.extend(s3_resp.extensions);"); g!("Ok(resp)"); diff --git a/crates/s3s/src/ops/generated.rs b/crates/s3s/src/ops/generated.rs index 0568aa33..f8092738 100644 --- a/crates/s3s/src/ops/generated.rs +++ b/crates/s3s/src/ops/generated.rs @@ -2558,7 +2558,7 @@ impl super::Operation for GetObject { }; let mut resp = Self::serialize_http(s3_resp.output)?; resp.headers.extend(overrided_headers); - resp.headers.extend(s3_resp.headers); + super::get_object::merge_custom_headers(&mut resp, s3_resp.headers); resp.extensions.extend(s3_resp.extensions); Ok(resp) } diff --git a/crates/s3s/src/ops/get_object.rs b/crates/s3s/src/ops/get_object.rs index aae79e85..2139d919 100644 --- a/crates/s3s/src/ops/get_object.rs +++ b/crates/s3s/src/ops/get_object.rs @@ -2,10 +2,13 @@ use crate::dto::GetObjectInput; use crate::dto::Timestamp; use crate::dto::TimestampFormat; use crate::header; +use crate::http::Response; use crate::utils::format::fmt_timestamp; use crate::S3Request; use crate::S3Result; +use hyper::header::CONTENT_LENGTH; +use hyper::header::TRANSFER_ENCODING; use hyper::http::HeaderName; use hyper::http::HeaderValue; use hyper::HeaderMap; @@ -42,3 +45,14 @@ fn add_ts(map: &mut HeaderMap, name: HeaderName, value: Option<&Tim } Ok(()) } + +pub fn merge_custom_headers(resp: &mut Response, headers: HeaderMap) { + resp.headers.extend(headers); + + // special case for https://github.com/Nugine/s3s/issues/80 + if let Some(val) = resp.headers.get(TRANSFER_ENCODING) { + if val.as_bytes() == b"chunked" { + resp.headers.remove(CONTENT_LENGTH); + } + } +}