gpt4 book ai didi

delphi - 使用 TAmazonStorageService.UploadObject 当 Content-type 为 'text/*' 时出现 SignatureDoesNotMatch 错误

转载 作者:行者123 更新时间:2023-12-03 15:01:22 26 4
gpt4 key购买 nike

使用以下 Delphi XE2(更新 4)代码:

var
ConInfo: TAmazonConnectionInfo;
RespInfo: TCloudResponseInfo;
Service: TAmazonStorageService;
Content: TBytes;
Headers: TStringList;
begin
ConInfo:=TAmazonConnectionInfo.Create(self);
ConInfo.AccountName:='YOUR ACCOUNT NAME';
ConInfo.AccountKey:='YOUR ACCOUNT KEY';
ConInfo.Protocol:='http';

Service:=TAmazonStorageService.Create(ConInfo);
RespInfo:=TCloudResponseInfo.Create;

SetLength(Content, 128);
FillMemory(@Content[0], 128, Byte('x'));

Headers:=TStringList.Create;
Headers.Values['Content-type']:='text/plain';
if not Service.UploadObject('YOUR BUCKET', 'test.txt', Content, TRUE, nil, Headers, amzbaPrivate, RespInfo) then
ShowMessage('Failed:' + RespInfo.StatusMessage);

我在调用 UploadObject 时总是遇到错误:

Failed:HTTP/1.1 403 Forbidden - The request signature we calculated does not match the signature you provided. Check your key and signing method. (SignatureDoesNotMatch)

仅当内容类型设置为“text/plain”、“text/html”或任何文本时才会发生这种情况。使用完全相同的代码,如果您只是将内容类型更改为任何其他内容类型,例如'video/3gpp',然后它按预期工作并且没有错误。上传对象的实际内容不相关,与是否出现错误无关。

我已经在 Delphi 中追踪了 Indy 代码,但我很困惑为什么文本内容类型总是给出这个错误。

有什么想法吗?

最佳答案

如果将“; charset=ISO-8859-1”附加到 Content-Type 字符串,则它可以工作:

Headers.Values['Content-type']:='text/plain; charset=ISO-8859-1';

单步执行代码,我看到 TIdEntityHeaderInfo.SetHeaders (IdHTTPHeaderInfo.pas) 中的 Content-Type 正在更改,该内容是从 TIdHTTPProtocol.BuildAndSendRequest (IdHTTP.pas) 调用的。

最终,问题似乎是 TIdEntityHeaderInfo.SetContentType (IdHTTPHeaderInfo.pas) 正在将字符集附加到内容类型(如果内容类型是“文本”且尚未有字符集)。在这些情况下不应该更改内容类型,因为内容类型是要签名的字符串的一部分,因此在签名后更改它会使签名无效。

关于delphi - 使用 TAmazonStorageService.UploadObject 当 Content-type 为 'text/*' 时出现 SignatureDoesNotMatch 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10329628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com