0

我正在使用 Delphi 2009、Indy 版本 10.5498 以及来自https://indy.fulgan.com/SSL/的 zip 文件 openssl-1.0.2r-i386-win32 中的 libeay32.dll 和 ssleay32.dll 。范围检查在项目选项中打开,而不是在任何地方关闭。

使用下面的代码(我在 Remy 的帮助下从这篇文章中生成),我可以在打开调试的 IDE 中运行时通过 https 将数据上传到服务器上的 API,或者从打开调试时生成的已编译 exe 上传数据。

但是,如果我构建一个发布版本,那么无论我是通过 IDE 运行它还是作为 exe 运行它,我都会在线得到范围检查错误 result := HttpClient.Post(THE_URL, FormData);

参数列表仅包含收件人、发件人、主题、正文等,并且文件名列表中没有附件,即 filenames.Count = 0。U_GeneralRoutines.TheFileStoreFolder只是 ProgramData 中存储 SSL DLL 的文件夹。

由于调试器没有捕捉到这一点,我在调用前后添加了两条显示消息行。当构建为调试时,两条消息都会显示并且发布成功。当构建为发布时,第一个显示出来,然后我得到范围检查错误。

我不认为 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 / 调试时会自动初始化。但是我的程序中的所有变量似乎都在调用 POST 之前被初始化。

4

0 回答 0