2012-04-26 6 views
6

Usando la siguiente Delphi XE2 (actualización 4) Código:error SignatureDoesNotMatch cuando el tipo de contenido es 'text/*' utilizando 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); 

Siempre sale un error en la llamada a UploadObject:

Fallido: HTTP/1.1 403 Prohibido - La firma de la solicitud que calculamos no coincide con la firma que proporcionó. Verifique su clave y firme el método . (SignatureDoesNotMatch)

Esto solo ocurre cuando Content-type está configurado como 'text/plain', 'text/html' o texto. Usando exactamente el mismo código, si simplemente cambia el tipo de contenido a cualquier otro tipo de contenido, p. 'video/3gpp', luego funciona como se esperaba y sin error. El contenido real del objeto que se está cargando no es relevante y no tiene importancia para obtener el error o no.

He rastreado el código de Indy en Delphi, pero no sé por qué el tipo de contenido de texto siempre da este error.

¿Alguna idea?

Respuesta

4

Si añade "; charset = ISO-8859-1" a la cadena Content-Type, entonces funciona:

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

recorrer el código veo el tipo de contenido está siendo cambiado en TIdEntityHeaderInfo .SetHeaders (IdHTTPHeaderInfo.pas) que se llama desde TIdHTTPProtocol.BuildAndSendRequest (IdHTTP.pas).

En última instancia, parece que el problema es que TIdEntityHeaderInfo.SetContentType (IdHTTPHeaderInfo.pas) está agregando un conjunto de caracteres al tipo de contenido si es 'texto' y todavía no tiene uno. No debería cambiar el tipo de contenido en estas situaciones porque el tipo de contenido es parte de la cadena que se debe firmar, por lo que cambiarlo después de la firma hace que la firma no sea válida.

+0

Me alegro de que haya sido capaz de arreglarlo usted mismo. este mismo problema cuando intento cargar texto/html. En el momento en que recurrí solo a "html" - pero luego Internet Explorer tuvo problemas para ver los archivos. ¡Gracias por compartir! –

0

Tuve el mismo problema. También utilicé application/octet-stream como tipo de contenido, pero todavía tuve algunos problemas. Más tarde, descubrí que los nombres de los depósitos deben estar en minúsculas (en la región estándar de EE. UU., Amazon permite definir los depósitos con mayúsculas o mayúsculas y minúsculas; sin embargo, estos depósitos no son accesibles a través de la API HTTP (incluido TAmazonStorageService). mensaje no encontrado, todavía recibí el error 403 (usuario no autenticado). Sin embargo, uno cambié el nombre a todo en minúscula, funcionó bien. Espero que ayude

Cuestiones relacionadas