用 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 属性似乎在使用中没有用处。
先记录如上,暂时解决问题,以后有时间再深入研究。