2012-04-26 7 views
6

Utilizzando il seguente Delphi XE2 (aggiornamento 4) Codice:errore SignatureDoesNotMatch quando Content-type è 'text/*' utilizzando TAmazonStorageService.UploadObject

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); 

ottengo sempre un errore sulla chiamata a UploadObject:

Errore: HTTP/1.1 403 Proibito: la firma della richiesta che abbiamo calcolato non corrisponde alla firma fornita. Controlla la tua chiave e firma il metodo . (SignatureDoesNotMatch)

Questo accade solo quando il tipo di contenuto è impostato su "testo/semplice", "testo/html" o testo. Usando esattamente lo stesso codice, se si modifica il tipo di contenuto in qualsiasi altro tipo di contenuto, ad es. 'video/3gpp', quindi funziona come previsto e senza errori. Il contenuto effettivo dell'oggetto caricato non è rilevante e non ha alcuna rilevanza nell'ottenere l'errore o meno.

Ho tracciato il codice di Indy in Delphi, ma sono perplesso sul motivo per cui il tipo di contenuto del testo dà sempre questo errore.

Qualche idea?

risposta

4

Se si aggiunge "; charset = ISO-8859-1" alla stringa Content-Type, allora funziona:

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

Facendo un passo attraverso il codice vedo il Content-Type viene modificata in TIdEntityHeaderInfo .SetHeaders (IdHTTPHeaderInfo.pas) che viene chiamato da TIdHTTPProtocol.BuildAndSendRequest (IdHTTP.pas).

In definitiva, sembra che il problema sia che TIdEntityHeaderInfo.SetContentType (IdHTTPHeaderInfo.pas) aggiunge un set di caratteri al tipo di contenuto se è "testo" e non ne ha già uno. Non dovrebbe cambiare il tipo di contenuto in queste situazioni perché il tipo di contenuto fa parte della stringa da firmare, quindi modificarlo dopo la firma rende la firma non valida.

+0

Contento che sei riuscito a sistemarlo da solo. questo stesso identico problema quando provo ad aggiornare il testo/html. Nel momento in cui ho fatto ricorso a solo "html" - ma poi Internet Explorer ha avuto problemi nella visualizzazione dei file. Grazie per aver condiviso !!!!! –

0

Ho avuto lo stesso problema. Ho anche usato application/octet-stream come tipo di contenuto, ma ho ancora avuto qualche problema. In seguito, ho scoperto che i nomi dei bucket devono essere in minuscolo (In US Standard Region, Amazon consente di definire i bucket con maiuscole o nomi di maiuscole e minuscole, tuttavia questi bucket non sono accessibili tramite l'API HTTP (incluso TAmazonStorageService). messaggio non trovato, ho ancora ricevuto l'errore 403 (utente non autenticato) Tuttavia, uno ho cambiato il nome in minuscolo, ha funzionato bene Spero che sia utile