mirror of
https://github.com/rustfs/rustfs.git
synced 2026-07-28 00:58:59 +00:00
fix: preserve pagination when max keys exceed limit (#2943)
Co-authored-by: houseme <housemecn@gmail.com>
This commit is contained in:
@@ -23,6 +23,12 @@ use s3s::{S3Error, S3ErrorCode};
|
||||
use tracing::debug;
|
||||
use urlencoding::encode;
|
||||
|
||||
const S3_MAX_KEYS: i32 = 1000;
|
||||
|
||||
fn normalize_max_keys(max_keys: i32) -> i32 {
|
||||
max_keys.min(S3_MAX_KEYS)
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub(crate) struct ListObjectVersionsParams {
|
||||
pub prefix: String,
|
||||
@@ -92,10 +98,11 @@ pub(crate) fn parse_list_object_versions_params(
|
||||
let delimiter = delimiter.filter(|v| !v.is_empty());
|
||||
let key_marker = key_marker.filter(|v| !v.is_empty());
|
||||
let version_id_marker = version_id_marker.filter(|v| !v.is_empty());
|
||||
let max_keys = max_keys.unwrap_or(1000);
|
||||
let max_keys = max_keys.unwrap_or(S3_MAX_KEYS);
|
||||
if max_keys < 0 {
|
||||
return Err(S3Error::with_message(S3ErrorCode::InvalidArgument, "Invalid max keys".to_string()));
|
||||
}
|
||||
let max_keys = normalize_max_keys(max_keys);
|
||||
|
||||
Ok(ListObjectVersionsParams {
|
||||
prefix,
|
||||
@@ -120,10 +127,11 @@ pub(crate) fn parse_list_objects_v2_params(
|
||||
debug!("LIST objects with special characters in prefix: {:?}", prefix);
|
||||
}
|
||||
|
||||
let max_keys = max_keys.unwrap_or(1000);
|
||||
let max_keys = max_keys.unwrap_or(S3_MAX_KEYS);
|
||||
if max_keys < 0 {
|
||||
return Err(S3Error::with_message(S3ErrorCode::InvalidArgument, "Invalid max keys".to_string()));
|
||||
}
|
||||
let max_keys = normalize_max_keys(max_keys);
|
||||
|
||||
let delimiter = delimiter.filter(|v| !v.is_empty());
|
||||
|
||||
@@ -553,6 +561,20 @@ mod tests {
|
||||
assert_eq!(parsed.decoded_continuation_token, None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_list_objects_v2_params_caps_large_max_keys() {
|
||||
let parsed = parse_list_objects_v2_params(None, None, Some(1001), None, None).expect("parse should succeed");
|
||||
|
||||
assert_eq!(parsed.max_keys, 1000);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_list_object_versions_params_caps_large_max_keys() {
|
||||
let parsed = parse_list_object_versions_params(None, None, None, None, Some(1001)).expect("parse should succeed");
|
||||
|
||||
assert_eq!(parsed.max_keys, 1000);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_list_objects_v2_params_rejects_negative_max_keys() {
|
||||
let err =
|
||||
|
||||
Reference in New Issue
Block a user