test(e2e): tighten control character rejection oracle (#6561)

This commit is contained in:
Zhengchao An
2026-08-25 04:34:35 +08:00
committed by GitHub
parent 619f0fd9e8
commit 40f1356831
+22 -16
View File
@@ -28,6 +28,7 @@
mod tests { mod tests {
use crate::common::{RustFSTestEnvironment, init_logging, local_http_client}; use crate::common::{RustFSTestEnvironment, init_logging, local_http_client};
use aws_sdk_s3::Client; use aws_sdk_s3::Client;
use aws_sdk_s3::error::ProvideErrorMetadata;
use aws_sdk_s3::primitives::ByteStream; use aws_sdk_s3::primitives::ByteStream;
use http::StatusCode; use http::StatusCode;
use http::header::HOST; use http::header::HOST;
@@ -731,12 +732,7 @@ mod tests {
create_bucket(&client, bucket).await.expect("Failed to create bucket"); create_bucket(&client, bucket).await.expect("Failed to create bucket");
// Test that control characters are rejected // Test that control characters are rejected
let invalid_keys = vec![ let invalid_keys = ["file\0with\0null.txt", "file\nwith\nnewline.txt", "file\rwith\rcarriage.txt"];
"file\0with\0null.txt",
"file\nwith\nnewline.txt",
"file\rwith\rcarriage.txt",
"file\twith\ttab.txt", // Tab might be allowed, but let's test
];
for key in invalid_keys { for key in invalid_keys {
info!("Testing rejection of control character in key: {:?}", key); info!("Testing rejection of control character in key: {:?}", key);
@@ -747,17 +743,27 @@ mod tests {
.key(key) .key(key)
.body(ByteStream::from_static(b"test")) .body(ByteStream::from_static(b"test"))
.send() .send()
.await; .await
.expect_err("invalid control characters must be rejected by the server");
assert_eq!(
result.raw_response().map(|response| response.status().as_u16()),
Some(400),
"control character must return HTTP 400 for key {key:?}: {result:?}"
);
assert_eq!(
result.as_service_error().and_then(ProvideErrorMetadata::code),
Some("InvalidArgument"),
"control character must return InvalidArgument for key {key:?}: {result:?}"
);
}
// Note: The validation happens on the server side, so we expect an error let listed = client
// For null byte, newline, and carriage return .list_objects_v2()
if key.contains('\0') || key.contains('\n') || key.contains('\r') { .bucket(bucket)
assert!(result.is_err(), "Control character should be rejected for key: {key:?}"); .send()
if let Err(e) = result { .await
info!("✅ Control character correctly rejected: {:?}", e); .expect("server must remain healthy after rejected requests");
} assert!(listed.contents().is_empty(), "rejected requests must not create objects");
}
}
// Cleanup // Cleanup
env.stop_server(); env.stop_server();