Example #1
0
        /// <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()
            });
        }