Я использую 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.