2009年9月3日

Indy10のTIdFTPコンポーネントのパッシブモードのGetメソッドの不具合

Delphi 2007またはそれ以前のバージョン用のIndy10の最新ナイトリ(Ver10.2.3 r3568)のTIdFTPのGetメソッドには、パッシブモードで呼び出したときにTransferTimeoutプロパティの値が使用されずに永久に受信待ちになってしまう不具合があります。
TIdFTP.InternalGetメソッド内でInitDataChannelを呼び出してFDataChannel.IOHandlerのReadTimeoutにTransferTimeoutを設定しているのですが、DataChannelのReadTimeoutがデフォルトの-1のままになっているため、LPasvCl.Connectの呼び出しの内部でDataChannel.IOHandler.ReadTimeoutにFDataChannel.ReadTimeoutを設定して結果的にTransferTimeoutの値が無視されてしまう、というのが原因と思われます。
回避策としてはOnDataChannelCreateイベントでDataChannel.ReadTimeoutにもTransferTimeoutを設定してしまう、という方法が考えられます。
procedure TDataModule1.IdFTP1DataChannelCreate(ASender: TObject;
                                               ADataChannel: TIdTCPConnection);
begin

  if (ASender <> nil) and (ASender is TIdFTP) then
  begin
    if (TIdFTP(ASender).Passive = True) and
       (ADataChannel <> nil) and (ADataChannel is TIdTCPClientCustom) then
    begin
      TIdTCPClientCustom(ADataChannel).ReadTimeout := TIdFTP(ASender).TransferTimeout;
    end;
  end;

end;

0 件のコメント: