10和OpenSSL通过HTTPS下载文件

10和OpenSSL通过HTTPS下载文件

本文介绍了如何使用Indy 10和OpenSSL通过HTTPS下载文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时删除!!

我有以下任务:使用HTTPS和身份验证下载文件。 Indy似乎是走的路,但由于某种原因,它迄今为止没有起作用。我有以下的地方:

I have the following task: download a file using HTTPS and authentication. Indy seems the way to go but for some reason it doesn't work so far. I have the following in place:


  • 我用于下载的TIdHTTP组件

  • 一个TIdURI用于创建URL的组件

  • 应提供安全连接的TIdSSLIOHandlerSocketOpenSSL组件。所需的DLL位于二进制文件夹中。

该站点还需要身份验证,并将URL中的用户/ pass包含在下面的例子。总之,这是代码:

The site also requires authentication and I included the user/pass in the URL as in the example below. In short this is the code:

URI := TIdURI.Create('https://test.example.com/');
URI.Username := ParamUserName;
URI.Password := ParamPassword;

HTTP := TIdHTTP.Create(nil);
if URI.Protocol = 'https' then
begin
  IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  IOHandler.SSLOptions.Method := sslvSSLv3;
  HTTP.IOHandler := IOHandler;
end;

HTTP.Get(URI.GetFullURI([ofAuthInfo]), FileStream);

使用此代码,我得到一个读取超时EIdReadTimeout异常非常快。在浏览器中测试URL是没有问题的。任何关于什么缺失或错误的想法?

Using this code I get a "Read Timeout" EIdReadTimeout exception very fast. Testing the URL in a browser works without problem. Any ideas on what's missing or what I did wrong?

推荐答案

我终于放弃了Indy和OpenSSL,并使用WinInet进行下载。这是为我工作的代码:

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;

这篇关于如何使用Indy 10和OpenSSL通过HTTPS下载文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

1403页,肝出来的..

09-06 15:15