Skip to content

feat: Add URL encoding for S3 object keys#1164

Closed
Tnirpps wants to merge 1 commit intouserver-framework:developfrom
Tnirpps:tnirpps-s3api-url-encode
Closed

feat: Add URL encoding for S3 object keys#1164
Tnirpps wants to merge 1 commit intouserver-framework:developfrom
Tnirpps:tnirpps-s3api-url-encode

Conversation

@Tnirpps
Copy link
Copy Markdown
Contributor

@Tnirpps Tnirpps commented Apr 3, 2026

S3 URL Encoding Fix

Problem

S3 API methods (GetObject, PutObject, etc.) failed with object keys containing special characters (spaces, Cyrillic, etc.) because they weren't being URL-encoded.
Bad URL, curl error: malformed input, url: https://mybucket.s3-some-site.awsornot.com/path/to/object with : spaces

Solution

Added two functions for proper S3 object key encoding, compatible with AWS SDK behavior:

  • UrlEncodePathSegment() - encodes a single path segment, preserving RFC 3986 unreserved chars (-, _, ., ~) and S3-safe chars ($, &, ,, :, =, @)
  • EncodeS3Key() - encodes S3 object key, preserving / as path separators

Implementation follows AWS SDK approach: aws-sdk-cpp/URI.cpp

Examples:

EncodeS3Key("folder/file with spaces.txt")  // → "folder/file%20with%20spaces.txt"
EncodeS3Key("folder/файл.txt")              // → "folder/%D1%84%D0%B0%D0%B9%D0%BB.txt"

Changes

  • universal/http/url.hpp, url.cpp: New encoding functions
  • universal/http/url_test.cpp: new tests
  • libraries/s3api/s3api_methods.cpp: Apply EncodeS3Key() to all S3 methods

@apolukhin
Copy link
Copy Markdown
Member

LGTM

@robot-magpie
Copy link
Copy Markdown

robot-magpie Bot commented Apr 6, 2026

Many thanks for the PR! @apolukhin is now importing your pull request into our internal upstream repository.

@robot-magpie
Copy link
Copy Markdown

robot-magpie Bot commented Apr 6, 2026

✅ This pull request is being closed because it has been successfully merged into our internal monorepository.
Your changes will be pushed to this repository soon. Thank you for your contribution!

@robot-magpie robot-magpie Bot closed this Apr 6, 2026
robot-piglet pushed a commit that referenced this pull request Apr 6, 2026
# S3 URL Encoding Fix

## Problem
S3 API methods (`GetObject`, `PutObject`, etc.) failed with object keys containing special characters (spaces, Cyrillic, etc.) because they weren't being URL-encoded.
`Bad URL, curl error: malformed input, url: https://mybucket.s3-some-site.awsornot.com/path/to/object with : spaces`

## Solution
Added two functions for proper S3 object key encoding, compatible with AWS SDK behavior:

- **`UrlEncodePathSegment()`** - encodes a single path segment, preserving RFC 3986 unreserved chars (`-`, `_`, `.`, `~`) and S3-safe chars (`$`, `&`, `,`, `:`, `=`, `@`)
- **`EncodeS3Key()`** - encodes S3 object key, preserving `/` as path separators

Implementation follows AWS SDK approach: [aws-sdk-cpp/URI.cpp](https://github.com/aws/aws-sdk-cpp/blob/master/aws-cpp-sdk-core/source/http/URI.cpp#L54-L60)

**Examples:**
```cpp
EncodeS3Key("folder/file with spaces.txt")  // → "folder/file%20with%20spaces.txt"
EncodeS3Key("folder/файл.txt")              // → "folder/%D1%84%D0%B0%D0%B9%D0%BB.txt"
```

## Changes
- **universal/http/url.hpp, url.cpp**: New encoding functions
- **universal/http/url_test.cpp**: new tests
- **libraries/s3api/s3api_methods.cpp**: Apply `EncodeS3Key()` to all S3 methods

Tests: протестировано CI

---

Pull Request resolved: #1164
commit_hash:04d0362e7803510b3923ebcfa43f9284b635a57c
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.

2 participants