Skip to content

Commit 7be7cc9

Browse files
committed
fix: Harden Content-Length handling for edge cases
- Only set explicit Content-Length when content_range.total > 0, avoiding a Content-Length: 0 regression when metadata.size is unknown. - Use response Content-Length (not metadata.size) in 206 fallback paths for GCS and S3 so Content-Length matches the body if Content-Range is missing from a 206 response.
1 parent d2dfe07 commit 7be7cc9

3 files changed

Lines changed: 10 additions & 6 deletions

File tree

objectstore-server/src/endpoints/objects.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,12 @@ async fn object_get(
110110
let mut response = (status, metadata_headers, Body::from_stream(stream)).into_response();
111111
let resp_headers = response.headers_mut();
112112
resp_headers.insert(http::header::ACCEPT_RANGES, "bytes".parse().unwrap());
113-
resp_headers.insert(
114-
http::header::CONTENT_LENGTH,
115-
content_range.len().to_string().parse().unwrap(),
116-
);
113+
if content_range.total > 0 {
114+
resp_headers.insert(
115+
http::header::CONTENT_LENGTH,
116+
content_range.len().to_string().parse().unwrap(),
117+
);
118+
}
117119
if !content_range.is_full() {
118120
resp_headers.insert(
119121
http::header::CONTENT_RANGE,

objectstore-service/src/backend/gcs.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -700,7 +700,9 @@ impl Backend for GcsBackend {
700700
.get(header::CONTENT_RANGE)
701701
.and_then(|v| v.to_str().ok())
702702
.and_then(ContentRange::parse)
703-
.unwrap_or_else(|| ContentRange::full(metadata.size.unwrap_or(0) as u64))
703+
.unwrap_or_else(|| {
704+
ContentRange::full(payload_response.content_length().unwrap_or(0))
705+
})
704706
} else {
705707
ContentRange::full(metadata.size.unwrap_or(0) as u64)
706708
};

objectstore-service/src/backend/s3_compatible.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ impl<T: TokenProvider> Backend for S3CompatibleBackend<T> {
326326
.get(reqwest::header::CONTENT_RANGE)
327327
.and_then(|v| v.to_str().ok())
328328
.and_then(ContentRange::parse)
329-
.unwrap_or_else(|| ContentRange::full(metadata.size.unwrap_or(0) as u64))
329+
.unwrap_or_else(|| ContentRange::full(response.content_length().unwrap_or(0)))
330330
} else {
331331
ContentRange::full(metadata.size.unwrap_or(0) as u64)
332332
};

0 commit comments

Comments
 (0)