@Remy Lebeau: Насколько я понимаю, вы говорите: если сервер отправляет вам IAC DO ECHO, TIdTelnet жестко закодирован для отправки ответа IAC WILL ECHO, а затем запускает OnTelnetCommand( tncEcho ), чтобы сообщить вам, что нужно возвращать все, что вы получаете.
Это имеет смысл и согласуется с целью RFC857...
Однако в коде мы имеем:
procedure TIdTelnet.Negotiate;
...
TNC_DONT:
begin
b := IOHandler.ReadByte;
case b of
TNO_ECHO:
begin
DoTelnetCommand(tncEcho);
//DoStatus('ECHO'); {Do not Localize}
Reply := TNC_WONT;
end;
else
Reply := TNC_WONT;
end;
а также
TNC_DO:
begin
b := IOHandler.ReadByte;
case b of
TNO_ECHO:
begin
Reply := TNC_WILL;
DoTelnetCommand(tncLocalEcho);
end;
Наверняка этот код неверный? (в версии 10.6.0.497 Indy)
Я считаю, что это будет иметь больше смысла:
procedure TIdTelnet.Negotiate;
...
TNC_DONT:
begin
b := IOHandler.ReadByte;
case b of
TNO_ECHO:
begin
// Agree not to echo back everything received from server
// (This being the default - you shouldn't echo unless asked to)
Reply := TNC_WONT;
// Therefore only print locally what is sent to server
// (Again: this is the default behavior without negotiation)
DoTelnetCommand(tncLocalEcho);
end;
else
Reply := TNC_WONT;
end;
а также
TNC_DO:
begin
b := IOHandler.ReadByte;
case b of
TNO_ECHO:
begin
// Agree to echo back everything received from server
Reply := TNC_WILL;
DoTelnetCommand(tncEcho);
// Therefore you may still have to locally print what you send
// (i.e. local echo is usually still implicit in this)
end;
Другими словами, я считаю, что код в настоящее время изменен с того, каким он должен быть, а именно, что сервер, отправляющий DO ECHO, должен порождать токен tncEcho - это то, что вы сказали в приведенной выше цитате!
Как этот баг продержался так долго? (вероятно, потому что большинство серверов Telnet больше не утруждают себя согласованием эха RFC857)
К сожалению, на данный момент я вижу единственный способ «компенсировать» эту ошибку — создать копию файла IDTelnet.pas; свяжите это с вашим проектом в менеджере проектов; а затем внесите исправления в эту копию, как описано выше.
person
Alex T
schedule
14.08.2013