mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-27 15:37:02 +00:00
@@ -63,34 +63,31 @@ impl GetObjectReader {
|
|||||||
rs = HTTPRangeSpec::from_object_info(oi, part_number);
|
rs = HTTPRangeSpec::from_object_info(oi, part_number);
|
||||||
}
|
}
|
||||||
|
|
||||||
let logical_size = oi.get_actual_size()?;
|
// TODO:Encrypted
|
||||||
let encrypted_object = oi.user_defined.contains_key("x-rustfs-encryption-key")
|
|
||||||
|| oi
|
|
||||||
.user_defined
|
|
||||||
.contains_key("x-amz-server-side-encryption-customer-algorithm");
|
|
||||||
|
|
||||||
let (algo, is_compressed) = oi.is_compressed_ok()?;
|
let (algo, is_compressed) = oi.is_compressed_ok()?;
|
||||||
|
|
||||||
// TODO: check TRANSITION
|
// TODO: check TRANSITION
|
||||||
|
|
||||||
if is_compressed {
|
if is_compressed {
|
||||||
|
let actual_size = oi.get_actual_size()?;
|
||||||
let (off, length, dec_off, dec_length) = if let Some(rs) = rs {
|
let (off, length, dec_off, dec_length) = if let Some(rs) = rs {
|
||||||
// Support range requests for compressed objects
|
// Support range requests for compressed objects
|
||||||
let (dec_off, dec_length) = rs.get_offset_length(logical_size)?;
|
let (dec_off, dec_length) = rs.get_offset_length(actual_size)?;
|
||||||
(0, oi.size, dec_off, dec_length)
|
(0, oi.size, dec_off, dec_length)
|
||||||
} else {
|
} else {
|
||||||
(0, oi.size, 0, logical_size)
|
(0, oi.size, 0, actual_size)
|
||||||
};
|
};
|
||||||
|
|
||||||
let dec_reader = DecompressReader::new(reader, algo);
|
let dec_reader = DecompressReader::new(reader, algo);
|
||||||
|
|
||||||
let actual_size_usize = if logical_size > 0 {
|
let actual_size_usize = if actual_size > 0 {
|
||||||
logical_size as usize
|
actual_size as usize
|
||||||
} else {
|
} else {
|
||||||
return Err(Error::other(format!("invalid decompressed size {logical_size}")));
|
return Err(Error::other(format!("invalid decompressed size {actual_size}")));
|
||||||
};
|
};
|
||||||
|
|
||||||
let final_reader: Box<dyn AsyncRead + Unpin + Send + Sync> = if dec_off > 0 || dec_length != logical_size {
|
let final_reader: Box<dyn AsyncRead + Unpin + Send + Sync> = if dec_off > 0 || dec_length != actual_size {
|
||||||
// Use RangedDecompressReader for streaming range processing
|
// Use RangedDecompressReader for streaming range processing
|
||||||
// The new implementation supports any offset size by streaming and skipping data
|
// The new implementation supports any offset size by streaming and skipping data
|
||||||
match RangedDecompressReader::new(dec_reader, dec_off, dec_length, actual_size_usize) {
|
match RangedDecompressReader::new(dec_reader, dec_off, dec_length, actual_size_usize) {
|
||||||
@@ -125,19 +122,8 @@ impl GetObjectReader {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
if encrypted_object && rs.is_none() {
|
|
||||||
return Ok((
|
|
||||||
GetObjectReader {
|
|
||||||
stream: reader,
|
|
||||||
object_info: oi.clone(),
|
|
||||||
},
|
|
||||||
0,
|
|
||||||
oi.size,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(rs) = rs {
|
if let Some(rs) = rs {
|
||||||
let (off, length) = rs.get_offset_length(logical_size)?;
|
let (off, length) = rs.get_offset_length(oi.size)?;
|
||||||
|
|
||||||
Ok((
|
Ok((
|
||||||
GetObjectReader {
|
GetObjectReader {
|
||||||
@@ -154,7 +140,7 @@ impl GetObjectReader {
|
|||||||
object_info: oi.clone(),
|
object_info: oi.clone(),
|
||||||
},
|
},
|
||||||
0,
|
0,
|
||||||
logical_size,
|
oi.size,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user