Indy HttpClient.Post выдает ошибку проверки диапазона при сборке для выпуска, но не при отладке - почему? - PullRequest
0 голосов
/ 26 мая 2019

Я использую Delphi 2009, Indy ver 10.5498 вместе с libeay32.dll и ssleay32.dll из zip-файла openssl-1.0.2r-i386-win32 на https://indy.fulgan.com/SSL/. Проверка диапазона включена в параметрах проекта инигде не выключен.

Используя приведенный ниже код, который я сгенерировал с помощью Реми из этой публикации, я могу загружать данные в API на сервере через https при запуске в IDE с включенной отладкой или изскомпилированный exe, сгенерированный с настроенной отладкой.

Однако, если я создаю версию выпуска, тогда, если я запускаю ее через IDE или как exe, я получаю ошибку проверки диапазона в строке result := HttpClient.Post(THE_URL, FormData);

Список параметров просто содержитк теме, телу и т. д., и в списке имен файлов нет вложений, т.е. filenames.Count = 0. U_GeneralRoutines.TheFileStoreFolder - это просто папка внутри ProgramData, в которой хранятся SSL-библиотеки SSL.

Как отладчик не делалПоймав это, я вставил две строки сообщения до и после звонка.Когда построено как отладка, оба сообщения показываются, и сообщение успешно.При сборке как релиз отображается первый, а затем я получаю ошибку проверки диапазона.

Я не думаю, что в коде POST есть ошибка, что может быть не так?

function UploadToAPI(params, filenames: TStrings): string;
var
  HttpClient: TIdHttp;
  IdSSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
  FormData : TIdMultiPartFormDataStream;
  i : integer;
  PathToSSLlibraries : string;
begin
  FormData := TIdMultiPartFormDataStream.Create;
  HttpClient:= TIdHttp.Create;
  IdSSLIOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create;

  PathToSSLlibraries := IncludeTrailingPathDelimiter(U_GeneralRoutines.TheFileStoreFolder);
  IdOpenSSLSetLibPath(PathToSSLlibraries);  //set path to libeay32.dll and  ssleay32.dll in the common ProgramData folder

  HttpClient.IOHandler := IdSSLIOHandler;
  HttpClient.Request.CustomHeaders.FoldLines := true ; 

  try
    for i := 0 to params.Count - 1 do
      FormData.AddFormField(params.Names[i], params.ValueFromIndex[i]);

    for i := 0 to filenames.Count - 1 do
      FormData.AddFile('attachment', filenames[i]);   //works with ver 10.5498 but not with 10.2.5

    //add authorisation header
    HttpClient.Request.CustomHeaders.Add('Authorization:Basic ' + ATHORISATION_STR);  //byte64 encoding of the api key   

     HttpClient.ProtocolVersion := pv1_1;  //get the full server response which allows for just one try-except
     HttpClient.HTTPOptions := HttpClient.HTTPOptions + [hoKeepOrigProtocol, hoNoProtocolErrorException, hoWantProtocolErrorContent];

     try
     showmessage('about to post');
     result := HttpClient.Post(THE_URL, FormData);   //post to the api
     showmessage('posted');

     except
      on E: Exception do
      begin
      result := E.ClassName + ': ' + E.message;
      raise;
      end;
     end; //try
  finally
    FormData.Free;
    IdSSLIOHandler.free;
    HttpClient.free;
  end;

Я понимаю, что этот тип сценария часто вызывается неисключенными переменными вверсия выпуска, которая будет автоматически инициализирована в среде IDE / debug.Но все переменные в моей процедуре, похоже, инициализируются перед вызовом POST.

...