Safari - 删除对象时错误的 MD5 内容
Safari - wrong MD5-Content when deleting object
当我尝试使用 Chrome 删除存储桶中的对象时,它运行良好。
当我尝试使用 Safari 时,出现此错误:The Content-MD5 you specified did not match what we received.
这是来自 Chrome 的 curl
字符串:
curl 'https://mybucket.s3.cloud/?delete' -H 'Connection: keep-alive' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache' -H 'X-Amz-User-Agent: aws-sdk-js/2.631.0 promise' -H 'Content-MD5: b0reU5O4x/fCQnk/W2oH4w==' -H 'Authorization: OK_STRING, SignedHeaders=content-md5;host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=OK_STRING' -H 'Content-Type: application/octet-stream; charset=UTF-8' -H 'X-Amz-Content-Sha256: UNSIGNED-PAYLOAD' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36' -H 'Sec-Fetch-Dest: empty' -H 'X-Amz-Date: 20200304T171137Z' -H 'Accept: */*' -H 'Origin: http://localhost:9000' -H 'Sec-Fetch-Site: cross-site' -H 'Sec-Fetch-Mode: cors' -H 'Referer: http://localhost:9000/myurl/explorer' -H 'Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7' --data-binary '<Delete xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Object><Key>Capture d’écran 2020-03-03 à 17.46.22.png</Key></Object></Delete>' --compressed
现在这是与 Safari 相同的文件和相同的操作:
curl 'https://mybucket.s3.cloud/?delete' \
-XPOST \
-H 'Content-Type: application/octet-stream; charset=UTF-8' \
-H 'Accept: */*' \
-H 'Authorization: OK_STRING, SignedHeaders=content-md5;host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=OK_STRING' \
-H 'Accept-Language: fr-fr' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'Host: mybucket.s3.cloud' \
-H 'Origin: http://localhost:9000' \
-H 'Content-Length: 138' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15' \
-H 'Referer: http://localhost:9000/' \
-H 'Connection: keep-alive' \
-H 'Content-MD5: b0reU5O4x/fCQnk/W2oH4w==' \
-H 'X-Amz-Date: 20200304T170853Z' \
-H 'X-Amz-User-Agent: aws-sdk-js/2.631.0 promise' \
-H 'X-Amz-Content-Sha256: UNSIGNED-PAYLOAD' \
--data-binary $'<Delete xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Object><Key>Capture d\u2019\xe9cran 2020-03-03 \xe0 17.46.22.png</Key></Object></Delete>'
生成这些调用的代码是:
s3({
method: 'deleteObject',
region: bucket.region,
params: {
Bucket: bucket.id,
Key: file.Key,
VersionId: file.VersionId,
},
})
s3
是实例 'aws-sdk/clients/s3'
有人知道会出什么问题吗?
看起来 Safari 正在根据 data-binary
对我的文件名进行编码。为什么?我怎样才能防止这种情况发生?还是在其他地方强制使用?
我找不到正确修复它的方法。但这与对象键中存在的一些特殊字符有关。这是 AWS 指南 https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html#object-key-guidelines
我意识到我没有检查对象键。
所以我创建了一个正则表达式测试来过滤掉所有有问题的对象键。
当我尝试使用 Chrome 删除存储桶中的对象时,它运行良好。
当我尝试使用 Safari 时,出现此错误:The Content-MD5 you specified did not match what we received.
这是来自 Chrome 的 curl
字符串:
curl 'https://mybucket.s3.cloud/?delete' -H 'Connection: keep-alive' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache' -H 'X-Amz-User-Agent: aws-sdk-js/2.631.0 promise' -H 'Content-MD5: b0reU5O4x/fCQnk/W2oH4w==' -H 'Authorization: OK_STRING, SignedHeaders=content-md5;host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=OK_STRING' -H 'Content-Type: application/octet-stream; charset=UTF-8' -H 'X-Amz-Content-Sha256: UNSIGNED-PAYLOAD' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36' -H 'Sec-Fetch-Dest: empty' -H 'X-Amz-Date: 20200304T171137Z' -H 'Accept: */*' -H 'Origin: http://localhost:9000' -H 'Sec-Fetch-Site: cross-site' -H 'Sec-Fetch-Mode: cors' -H 'Referer: http://localhost:9000/myurl/explorer' -H 'Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7' --data-binary '<Delete xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Object><Key>Capture d’écran 2020-03-03 à 17.46.22.png</Key></Object></Delete>' --compressed
现在这是与 Safari 相同的文件和相同的操作:
curl 'https://mybucket.s3.cloud/?delete' \
-XPOST \
-H 'Content-Type: application/octet-stream; charset=UTF-8' \
-H 'Accept: */*' \
-H 'Authorization: OK_STRING, SignedHeaders=content-md5;host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=OK_STRING' \
-H 'Accept-Language: fr-fr' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'Host: mybucket.s3.cloud' \
-H 'Origin: http://localhost:9000' \
-H 'Content-Length: 138' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15' \
-H 'Referer: http://localhost:9000/' \
-H 'Connection: keep-alive' \
-H 'Content-MD5: b0reU5O4x/fCQnk/W2oH4w==' \
-H 'X-Amz-Date: 20200304T170853Z' \
-H 'X-Amz-User-Agent: aws-sdk-js/2.631.0 promise' \
-H 'X-Amz-Content-Sha256: UNSIGNED-PAYLOAD' \
--data-binary $'<Delete xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Object><Key>Capture d\u2019\xe9cran 2020-03-03 \xe0 17.46.22.png</Key></Object></Delete>'
生成这些调用的代码是:
s3({
method: 'deleteObject',
region: bucket.region,
params: {
Bucket: bucket.id,
Key: file.Key,
VersionId: file.VersionId,
},
})
s3
是实例 'aws-sdk/clients/s3'
有人知道会出什么问题吗?
看起来 Safari 正在根据 data-binary
对我的文件名进行编码。为什么?我怎样才能防止这种情况发生?还是在其他地方强制使用?
我找不到正确修复它的方法。但这与对象键中存在的一些特殊字符有关。这是 AWS 指南 https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html#object-key-guidelines
我意识到我没有检查对象键。 所以我创建了一个正则表达式测试来过滤掉所有有问题的对象键。