9

次のタスクがあります: HTTPS と認証を使用してファイルをダウンロードします。Indy は進むべき道のようですが、何らかの理由で今のところうまくいきません。私は次のものを用意しています:

  • ダウンロードに使用する TIdHTTP コンポーネント
  • URL の作成に使用される TIdURI コンポーネント
  • 安全な接続を提供する TIdSSLIOHandlerSocketOpenSSL コンポーネント。必要な DLL はバイナリ フォルダーにあります。

このサイトには認証も必要です。以下の例のように、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 のテストは問題なく動作します。何が足りないのか、何が間違っていたのかについてのアイデアはありますか?

4

3 に答える 3

11

最終的には 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;
于 2010-02-11T12:48:57.273 に答える
2

私は同じことを見てきました。TIdHTTP.ReadTimeout をゼロに設定すると、問題が解決します。

...
HTTP.IOHandler := IOHandler;
HTTP.ReadTimeout := 0;
于 2010-02-11T13:40:32.547 に答える
1

いくつかの追加ライブラリが適切にインストールされていない限り、安全な接続のためのすべての SSL 関連機能は失敗します。

1.)ライブラリをダウンロードする

2.) 両方の DLL を解凍し、プロジェクト フォルダー (またはシステムの PATH のどこかに) にコピーします。

それで、質問からのあなたのコードは私にとってはうまくいきます。

--ラインハルト

于 2010-02-11T13:19:23.090 に答える