Как загрузить файл по HTTPS с помощью Инди 10 и OpenSSL?

У меня есть следующая задача: загрузите файл с помощью HTTPS и аутентификации. Инди кажется способом пойти, но по некоторым причинам это не работает до сих пор. Я имею в распоряжении следующее:

  • компонент TIdHTTP, который я использую для загрузки
  • компонент TIdURI раньше создавал URL
  • компонент TIdSSLIOHandlerSocketOpenSSL, который должен обеспечить безопасное соединение. Необходимые DLLs находятся в двоичной папке.

Сайт также требует аутентификации, и среди меня был пользователь/передача в URL как в примере ниже. Короче говоря это - код:

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 в браузере работает без проблемы. Какие-либо идеи о том, что отсутствует или что я сделал неправильно?

9
задан Tihauan 11 February 2010 в 12:05
поделиться

3 ответа

Я окончательно отказался от Indy и OpenSSL и использовал для загрузки WinInet. Вот код, который у меня сработал:

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;
11
ответ дан 4 December 2019 в 19:33
поделиться

Я видел то же самое. Установка TIdHTTP.ReadTimeout на ноль решает проблему для меня.

...
HTTP.IOHandler := IOHandler;
HTTP.ReadTimeout := 0;
1
ответ дан 4 December 2019 в 19:33
поделиться

попробуйте

.insertAfter()

здесь

$(content).insertAfter('#bla');
-121--659434-

попробуйте использовать метод after () :

$('#bla').after('<div id="space"></div>');

Документация

-121--659433-

Все функции SSL, связанные с безопасными подключениями, завершатся ошибкой, если некоторые дополнительные библиотеки не будут установлены правильно.

1.) Загрузите библиотеки

2.) распакуйте и скопируйте обе DLL в папку проекта (или где-нибудь в PATH вашей системы)

с тем, чтобы ваш код из вопроса работал хорошо для меня.

-reinhard

0
ответ дан 4 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: