Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Сетевое программирование > InternetOpenUrl работает с HTTP, но не работает с HTTPS


Автор: Nik36 28.11.18, 14:07
Код функции прекрасно работает если ему подсунуть http-ссылку
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    DownloadFile('http://host.test/1.zip', 'C:\1.zip');


Однако если использовать https-ссылку:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    DownloadFile('https://host.test/1.zip', 'C:\1.zip');


то в третьей строчке функции UrlHandle получает значение nil. В описании к InternetOpenUrl говорится что она работает с https. GetLastError даёт ошибку 12157 (The application experienced an internal error loading the SSL libraries.). Какого-то параметра не хватает или чего более?

В браузере, разумеется работают обе ссылки на файл.

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function tFormUpdate.DownloadFile(const Url: string; const FileName : string): Boolean;
    var
      NetHandle: HINTERNET;
      UrlHandle: HINTERNET;
      Buffer: array[0..1024] of char;
      BytesRead: cardinal;
      f : File;
    begin
      NetHandle := InternetOpen(PChar(ExtractFileName(Application.ExeName)), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
     
      if Assigned(NetHandle) then begin
        UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD , 0);
     
        if Assigned(UrlHandle) then begin
          AssignFile(f, FileName);
          Rewrite(F, 1);
          FillChar(Buffer, SizeOf(Buffer), 0);
          repeat
            FillChar(Buffer, SizeOf(Buffer), 0);
            InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
            pbUpload.Position := pbUpload.Position + Integer(BytesRead);
            Application.ProcessMessages;
            BlockWrite(f, Buffer, BytesRead);
          until BytesRead = 0;
          InternetCloseHandle(UrlHandle);
          CloseFile(F);
          REsult := true;
        end else begin
          Result := false;
        end;
        InternetCloseHandle(NetHandle);
      end else
        result := false;
    end;

Автор: ^D^ima 29.11.18, 08:23
попробуй libeay32.dll положить в папку с файлом

Автор: Nik36 29.11.18, 09:00
Цитата ^D^ima @
попробуй libeay32.dll положить в папку с файлом

Спасибо, но лежит такой файл. Через TIdHTTP с сайтом нормально обмен идет информацией, видимо придётся на него переделывать и загрузку файлов.

Оказалось что сервер не настроен на работу с Windows XP + IE8. https://www.ssllabs.com/ssltest/analyze.html показал только для этой пары: Server sent fatal alert: handshake_failure, с остальными браузерами и системами всё в порядке. Открыл IE8 (наверное впервые за 15 лет) и в нём действительно сайт и файлы с него не грузятся.

Автор: Fr0sT 30.11.18, 07:47
Дык. После хартблидов все начали версии ssl наращивать и старые убирать. Учитывая повсеместный переход на https, скоро без сторонних программ с XP вообще никуда не выйдешь

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)