How to download a file over HTTPS using Indy 10 and OpenSSL?

流过昼夜 提交于 2019-11-30 00:51:26

I finally abandoned Indy and OpenSSL and used WinInet for downloading. This is the code that worked for me:

function Download(URL, User, Pass, FileName: string): Boolean;
const
  BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array[1..BufferSize] of Byte;
  BufferLen: DWORD;
  F: File;
begin
   Result := False;
   hSession := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0) ;

   // Establish the secure connection
   InternetConnect (
     hSession,
     PChar(FullURL),
     INTERNET_DEFAULT_HTTPS_PORT,
     PChar(User),
     PChar(Pass),
     INTERNET_SERVICE_HTTP,
     0,
     0
   );

  try
    hURL := InternetOpenURL(hSession, PChar(URL), nil, 0, 0, 0) ;
    try
      AssignFile(f, FileName);
      Rewrite(f,1);
      try
        repeat
          InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen) ;
          BlockWrite(f, Buffer, BufferLen)
        until BufferLen = 0;
      finally
        CloseFile(f) ;
        Result := True;
      end;
    finally
      InternetCloseHandle(hURL)
    end
  finally
    InternetCloseHandle(hSession)
  end;
end;

I have seen the same thing. Setting the TIdHTTP.ReadTimeout to zero fixes the problem for me.

...
HTTP.IOHandler := IOHandler;
HTTP.ReadTimeout := 0;

All SSL related functions for secure connections will fail unless some additional libraries are installed properly.

1.) Download libraries

2.) unzip and copy both DLLs to your project folder (or somewhere in the PATH of your system)

with that your code from the question works fine for me.

--reinhard

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!