fix: SimApiStorage 直接请求补 x-amz-date 签名头,Content-Type 移到 HttpContent

- 直接请求(上传/桶检测/建桶)需带 x-amz-date 请求头并纳入签名(缺省会 400)
- Content-Type 按 soulsoft_net_http 规则设在 ByteArrayContent.headers(不是 request.headers)
- 已用 oss.anymemory.cn 实测:上传/预签名上传/预签名下载回读全部一致
This commit is contained in:
2026-08-17 00:08:50 +08:00
parent eb488bcd5a
commit b4e808e775
+12 -8
View File
@@ -207,8 +207,8 @@ public class SimApiStorage {
let dateStamp = amzDate[0..8]
let payloadHash = toHexString(sha256Bytes(data))
let canonicalUri = "/${_bucket}/${uriEncode(object, false)}"
let canonicalHeaders = "host:${_host}\nx-amz-content-sha256:${payloadHash}\n"
let signedHeaders = "host;x-amz-content-sha256"
let canonicalHeaders = "host:${_host}\nx-amz-content-sha256:${payloadHash}\nx-amz-date:${amzDate}\n"
let signedHeaders = "host;x-amz-content-sha256;x-amz-date"
let canonicalRequest = "PUT\n${canonicalUri}\n\n${canonicalHeaders}\n${signedHeaders}\n${payloadHash}"
let stringToSign = "AWS4-HMAC-SHA256\n${amzDate}\n${dateStamp}/${_region}/s3/aws4_request\n" +
"${toHexString(sha256Bytes(canonicalRequest.toArray()))}"
@@ -218,9 +218,11 @@ public class SimApiStorage {
try {
let request = HttpRequestMessage(NetHttpMethod.Put, "${_endpoint}${canonicalUri}")
request.headers.add("x-amz-content-sha256", payloadHash)
request.headers.add("x-amz-date", amzDate)
request.headers.add("Authorization", authorization)
request.headers.add("Content-Type", contentType)
request.content = ByteArrayContent(data)
let content = ByteArrayContent(data)
content.headers.add("Content-Type", contentType)
request.content = content
let response = client.send(request)
try {
SimApiError.errorWhenFalse(response.isSuccessStatusCode, code: response.statusCode,
@@ -240,8 +242,8 @@ public class SimApiStorage {
let dateStamp = amzDate[0..8]
let payloadHash = toHexString(sha256Bytes(Array<Byte>(0, repeat: 0)))
let canonicalUri = "/${_bucket}"
let canonicalHeaders = "host:${_host}\nx-amz-content-sha256:${payloadHash}\n"
let signedHeaders = "host;x-amz-content-sha256"
let canonicalHeaders = "host:${_host}\nx-amz-content-sha256:${payloadHash}\nx-amz-date:${amzDate}\n"
let signedHeaders = "host;x-amz-content-sha256;x-amz-date"
let canonicalRequest = "HEAD\n${canonicalUri}\n\n${canonicalHeaders}\n${signedHeaders}\n${payloadHash}"
let stringToSign = "AWS4-HMAC-SHA256\n${amzDate}\n${dateStamp}/${_region}/s3/aws4_request\n" +
"${toHexString(sha256Bytes(canonicalRequest.toArray()))}"
@@ -251,6 +253,7 @@ public class SimApiStorage {
try {
let request = HttpRequestMessage(NetHttpMethod.Head, "${_endpoint}${canonicalUri}")
request.headers.add("x-amz-content-sha256", payloadHash)
request.headers.add("x-amz-date", amzDate)
request.headers.add("Authorization", authorization)
let response = client.send(request)
try {
@@ -270,8 +273,8 @@ public class SimApiStorage {
let dateStamp = amzDate[0..8]
let payloadHash = toHexString(sha256Bytes(Array<Byte>(0, repeat: 0)))
let canonicalUri = "/${_bucket}"
let canonicalHeaders = "host:${_host}\nx-amz-content-sha256:${payloadHash}\n"
let signedHeaders = "host;x-amz-content-sha256"
let canonicalHeaders = "host:${_host}\nx-amz-content-sha256:${payloadHash}\nx-amz-date:${amzDate}\n"
let signedHeaders = "host;x-amz-content-sha256;x-amz-date"
let canonicalRequest = "PUT\n${canonicalUri}\n\n${canonicalHeaders}\n${signedHeaders}\n${payloadHash}"
let stringToSign = "AWS4-HMAC-SHA256\n${amzDate}\n${dateStamp}/${_region}/s3/aws4_request\n" +
"${toHexString(sha256Bytes(canonicalRequest.toArray()))}"
@@ -281,6 +284,7 @@ public class SimApiStorage {
try {
let request = HttpRequestMessage(NetHttpMethod.Put, "${_endpoint}${canonicalUri}")
request.headers.add("x-amz-content-sha256", payloadHash)
request.headers.add("x-amz-date", amzDate)
request.headers.add("Authorization", authorization)
request.content = ByteArrayContent(Array<Byte>(0, repeat: 0))
let response = client.send(request)