Skip to content

🐛 修复带路径前缀的 S3 端点(如 Supabase)同步失败 - #1729

Open
CodFrm wants to merge 1 commit into
mainfrom
fix/s3-endpoint-path-prefix
Open

🐛 修复带路径前缀的 S3 端点(如 Supabase)同步失败#1729
CodFrm wants to merge 1 commit into
mainfrom
fix/s3-endpoint-path-prefix

Conversation

@CodFrm

@CodFrm CodFrm commented Sep 8, 2026

Copy link
Copy Markdown
Member

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

Description / 描述

close #1723

S3Client 解析 endpoint 后只使用 protocol / hostname / port,丢弃了 endpoint 自带的路径前缀:buildUrl() 与签名用的 getCanonicalUri() 都从 / 开始拼 bucket 与 key。对于把 S3 API 挂在子路径上的服务(Supabase Storage 的 https://<ref>.storage.supabase.co/storage/v1/s3),请求实际打到了服务根路径 https://<ref>.storage.supabase.co/<bucket>,服务端返回 404,verify() 将其映射为 NotFound —— 即 issue 中「云同步账号信息验证失败: NotFound」。MinIO、Wasabi、AWS 等端点没有路径前缀,因此不受影响,这解释了「其他支持 S3 的系统可以正常同步」。

修复:把请求 URL 路径与签名的 canonical URI 合并为单一的 getResourcePath(),统一带上 endpoint 的路径前缀(前缀来自 URL.pathname,已完成百分号编码,不再重复编码);getEndpointUrl() 同样返回含前缀的地址,使 getDirUrl() 不再给出错误链接。两者共用同一实现,也顺带消除了原先「URL 用未编码 bucket、签名用编码 bucket」的不一致。

验证:

  • 新增 5 个单测(packages/filesystem/s3/client.test.ts)覆盖带前缀 endpoint 的 path-style / virtual-hosted URL、末尾斜杠、以及签名 canonical URI。修复前 5 个全部失败,修复后通过。其中「相同绝对路径必须产出相同签名」的用例可挡住「URL 带前缀但签名不带」的半修复。
  • 使用 issue 报告者提供的真实 Supabase S3 端点(region ap-northeast-1)跑通完整链路:verifycreate/writelistreaddelete;修复前同一配置复现 Error: NotFound。测试对象已清理。
  • pnpm vitest run --no-coverage packages/filesystem 179 passed;pnpm run typecheckprettier --checkeslint 均通过。

Screenshots / 截图

N/A —— 无 UI 变更。

S3Client 只取 endpoint 的协议/主机/端口,丢掉了 endpoint 自带的路径前缀,
请求与签名的 canonical URI 都落在服务根路径上,Supabase 的
https://<ref>.storage.supabase.co/storage/v1/s3 因此在验证阶段返回 404 NotFound。

统一由 getResourcePath 生成请求路径与 canonical URI,保留 endpoint 路径前缀。

close #1723
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.

[BUG] Amazon S3 有些端点地址不兼容

1 participant