/// <summary> /// Final step client side. /// </summary> /// <param name="serverFrame"></param> /// <param name="clientName"></param> /// <returns></returns> public HandshakeFrame ClientConfirmExtensions(HandshakeFrame serverFrame, string clientName) { var extensions = _registry.GetRequiredForHandshake().ToList(); var required = new List <HandshakeExtension>(extensions); foreach (var extension in serverFrame.RequiredExtensions) { if (!extensions.Contains(extension)) { extensions.Add(extension); } if (!required.Contains(extension)) { required.Add(extension); } } //do not use optional extensions. // currently only use them to expose all extensions to the remote end point. //foreach (var extension in _registry.GetOptionalForHandshake()) //{ // if (!extensions.Contains(extension)) // extensions.Add(extension); //} //foreach (var extension in serverFrame.OptionalExtensions) //{ // if (!extensions.Contains(extension) && _registry.Exists(extension.Name)) // extensions.Add(extension); //} //var optional = _registry.GetOptionalForHandshake().Union(serverFrame.OptionalExtensions).Distinct(); _chosenExtensions = _registry.GetAll(extensions.Select(x => x.Name)); var negotiatedRequired = new List <HandshakeExtension>(); foreach (var handshakeExtension in required) { var serverExtension = serverFrame.RequiredExtensions.FirstOrDefault(x => x.IsSameExtension(handshakeExtension)); var clientExtension = _registry.Get(handshakeExtension.Name); var extension = clientExtension.Negotiate(serverExtension); negotiatedRequired.Add(extension); } return(new HandshakeFrame { Identity = clientName, VersionMajor = SharpMessagingServer.Major, VersionMinor = SharpMessagingServer.Minor, OptionalExtensions = new HandshakeExtension[0], RequiredExtensions = required.ToArray() }); }