From b4e808e7757fa1413a95ea48640a8eb302b15379 Mon Sep 17 00:00:00 2001 From: xRain Date: Mon, 17 Aug 2026 00:08:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20SimApiStorage=20=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E8=A1=A5=20x-amz-date=20=E7=AD=BE=E5=90=8D?= =?UTF-8?q?=E5=A4=B4=EF=BC=8CContent-Type=20=E7=A7=BB=E5=88=B0=20HttpConte?= =?UTF-8?q?nt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 直接请求(上传/桶检测/建桶)需带 x-amz-date 请求头并纳入签名(缺省会 400) - Content-Type 按 soulsoft_net_http 规则设在 ByteArrayContent.headers(不是 request.headers) - 已用 oss.anymemory.cn 实测:上传/预签名上传/预签名下载回读全部一致 --- src/helpers/SimApiStorage.cj | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/helpers/SimApiStorage.cj b/src/helpers/SimApiStorage.cj index ca1293a..fb9c2a2 100644 --- a/src/helpers/SimApiStorage.cj +++ b/src/helpers/SimApiStorage.cj @@ -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(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(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(0, repeat: 0)) let response = client.send(request)