Skip to content

Cover more of S3 listing, and make its cases steer clients better - #5

Merged
tiptenbrink merged 1 commit into
masterfrom
s3-listing-coverage
Sep 27, 2026
Merged

tiptenbrink merged 1 commit into
masterfrom
s3-listing-coverage

Conversation

@tiptenbrink

Copy link
Copy Markdown
Collaborator

Makes the S3 listing cases say enough that a client can reach a correct and good implementation from the grading alone. Every S3 path is verified live against S3 and S3 Express.

New cases

  • list-entry-properties: an entry's last_modified (RFC 3339, UTC, whole seconds) and storage_class, with one object in STANDARD_IA.
  • list-fetch-owner: owner_id with fetch-owner=true. S3 honours only the literal true; the AWS C++ SDK sends 1 and fails.
  • list-start-after and list-start-after-delimited. On a directory bucket, start-after is answered 501 NotSupported.
  • list-all-pages, a walk over three pages, and list-over-1000, 1,001 keys at the default page size.
  • list-truncated-without-token: a truncated page without a token must be reported as an error. It is offline only.
  • list-prefix-special-characters: a prefix and a common prefix holding a space, +, &, =, % and é.
  • list-bucket-missing on Express: CreateSession's 404 NoSuchBucket, and nothing more.
  • list-other-delimiter now groups keys at -. Before, no key held a -, so a client that dropped the delimiter passed.

Grading changes

  • A request has raw_query, the query as sent, and a check may carry because, which a failure reports.
  • Every S3 profile fails a raw + in the query. S3 reads it as a space, so a continuation token or upload ID holding + breaks. The failure says to send %2B, or %20 for a space.
  • Every S3 XML fixture starts with the XML declaration and escapes ETag quotes as ", as S3 sends them.
  • The core s3/list-* cases accept encoding-type=url, as the operation cases do.
  • Each S3 listing purpose states its rule. list-encoded-names says to ask for encoding-type=url: without it S3 writes U+0001 as , which XML 1.0 forbids, and a CR in a key reads back as LF.

Checks

cargo test passes, including a new test for the raw + check and its reason.

New S3 and Express listing cases grade entry properties, fetch-owner, start-after, page walks, 1,001 keys, a truncated page without a token, special characters in prefixes and grouping at another delimiter. The grader exposes raw_query and a check's because, so the S3 profiles fail a raw + in a query with the reason; S3 XML fixtures carry the declaration and " ETags, and listing purposes state their rules.
The core S3 listing cases accept encoding-type=url, as the operation cases do.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@tiptenbrink
tiptenbrink merged commit cbb314a into master Sep 27, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant