public FtpConnection([NotNull] FtpServer server, [NotNull] ITcpSocketClient socket, [NotNull] Encoding encoding)
{
Server = server;
_socket = socket;
RemoteAddress = new Address(socket.RemoteAddress, socket.RemotePort);
SocketStream = OriginalStream = socket.GetStream();
Encoding = encoding;
Data = new FtpConnectionData(this);
var commandHandlers = Server.CommandsHandlerFactory.CreateCommandHandlers(this).ToList();
CommandHandlers = commandHandlers
.SelectMany(x => x.Names, (item, name) => new { Name = name, Item = item })
.ToDictionary(x => x.Name, x => x.Item, StringComparer.OrdinalIgnoreCase);
// Add stand-alone extensions
AddExtensions(Server.CommandsHandlerFactory.CreateCommandHandlerExtensions(this));
// Add extensions provided by command handlers
foreach (var commandHandler in commandHandlers)
AddExtensions(commandHandler.GetExtensions());
}