Esempio n. 1
0
        /// <summary>
        ///     First step at server side
        /// </summary>
        /// <param name="clientFrame"></param>
        /// <param name="serverName"></param>
        /// <returns></returns>
        public IFrame ServerNegotiate(HandshakeFrame clientFrame, string serverName)
        {
            var ourRequired = _registry.GetRequiredForHandshake();
            var missingExtensionsThatTheClientRequire =
                clientFrame.RequiredExtensions.Except(_registry.GetAllForHandshake(), new ExtensionNameComparer())
                .ToList();

            if (missingExtensionsThatTheClientRequire.Any())
            {
                return
                    (new ErrorFrame("Server to not support the following extensions: " +
                                    string.Join(", ", missingExtensionsThatTheClientRequire)));
            }

            var missingExtensionsThatTheServerRequire =
                ourRequired.Except(clientFrame.RequiredExtensions.Union(clientFrame.OptionalExtensions),
                                   new ExtensionNameComparer()).ToList();

            if (missingExtensionsThatTheServerRequire.Any())
            {
                return
                    (new ErrorFrame("Server requires the following extensions: " +
                                    string.Join(", ", missingExtensionsThatTheServerRequire)));
            }


            var required       = ourRequired.Union(clientFrame.RequiredExtensions).Distinct().ToList();
            var chosenOptional =
                _registry.GetOptionalForHandshake()
                .Union(clientFrame.OptionalExtensions)
                .Distinct()
                .Except(required, new ExtensionNameComparer());

            return(new HandshakeFrame
            {
                Identity = serverName,
                VersionMajor = SharpMessagingServer.Major,
                VersionMinor = SharpMessagingServer.Minor,
                OptionalExtensions = chosenOptional.ToArray(),
                RequiredExtensions = required.ToArray()
            });
        }