技术: Indy 10 的问题

翟二喜

用 Indy10.0.52 写 FTP Server


错误发现:


在 OnChangeDirectory 事件中,raise 自定义异常,在客户端看到错误消息,但命令反馈代码为 200,相当时客户端认为此命令正常执行。


错误研究:


原有程序 IdCommandHandlers.pas 第441行:
          if ExceptionReply.Code = '' then begin
            Reply.Assign(Self.ExceptionReply);
          end;
          // If still no go, from server
          // Can be nil though. Typically only servers pass it in
          if (ExceptionReply.Code = '') and (TIdCommandHandlers(Collection).FExceptionReply <> nil)
           then begin
            ExceptionReply.Assign(TIdCommandHandlers(Collection).FExceptionReply);
          end;
          if ExceptionReply.Code <> '' then
          begin
            Reply.Text.Add(E.Message);
            SendReply;
          end else begin
            raise;
          end;


当异常抛出后,ExceptionReply.Code 常为 550,而在此部分的运行中,SendReply必将一个没有定义过反馈代码的 Reply 发向客户端。


经分析,当 ExceptionReply.Code 为空字符串时,向 Reply 赋予 ExceptionReply 的值,显然是不何理的。而且异常发生时 ExceptionReply.Code 的值又常是 '550'。


怀疑是 Indy 的错误,所以将441行:
          if ExceptionReply.Code = '' then begin
改为:
          if ExceptionReply.Code <> '' then begin


可以解决发现的问题。(注释代码:{F34C2328-8505-4FFE-9A94-9D7F8E67E46D})


问题延伸:


这似乎是 Indy10.0.52 IdFTPServer 的一个bug(也不排除我对它的功能理解错误的情况),IdFTPServer.ExceptionReply 属性似乎在使用中没有用处。


先记录如上,暂时解决问题,以后有时间再深入研究。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: