EIPHTTPProtocolExceptionPeer исключение, использующее PutBlock с массивом байтов, все установлены в ноль - PullRequest
2 голосов
/ 16 февраля 2012

Использование Delphi XE2 Update 3 У меня проблема с загрузкой блока нулевых байтов в Azure.Когда я говорю ноль байтов, я имею в виду массив байтов с каждым элементом, установленным на ноль (это не нулевая длина).

Например:

var
  ConInfo: TAzureConnectionInfo;
  RespInfo: TCloudResponseInfo;
  BlobService: TAzureBlobService;
  Content: TBytes;
  MD5: String;
  Hasher: TIdHashMessageDigest5;
begin
  ConInfo:=TAzureConnectionInfo.Create(self);
  ConInfo.AccountName:='YOUR ACCOUNT NAME';
  ConInfo.AccountKey:='YOUR ACCOUNT KEY';
  ConInfo.Protocol:='http';

  BlobService:=TAzureBlobService.Create(ConInfo);    
  RespInfo:=TCloudResponseInfo.Create;

  SetLength(Content, 1048576); // 1 MByte
  FillMemory(@Content[0], 1048576, 0); // << --- fill it with anything except 0 and it works

  Hasher:=TIdHashMessageDigest5.Create;
  MD5:=Data.Cloud.CloudAPI.EncodeBytes64(Hasher.HashBytes(Content));
  Hasher.Free;

  BlobService.PutBlock('CONTAINER NAME', 'BLOB NAME', MD5, Content, MD5, '', RespInfo);

Если приведенный выше код выполняется, тоВозникло исключение при вызове PutBlock:

Project Project1.exe поднял класс исключения EIPHTTPProtocolExceptionPeer с сообщением «HTTP / 1.1 403 Серверу не удалось аутентифицировать запрос.Убедитесь, что значение заголовка Authorization сформировано правильно, включая подпись. '.

Но если вы измените строку FillMemory так, чтобы она заполняла ее цифрами 1 (или чем угодно, кроме нуля)), то работает без ошибок.Почему?

Спасибо за любую помощь.

1 Ответ

1 голос
/ 17 февраля 2012

Невероятно, но кажется, что проблема заключается в значении идентификатора блока ttgbNgpWctgMJ0MPORU + LA ==

Если вы используете его в качестве идентификатора блока, вы получите эту ошибку.

...