Esempio n. 1
0
        private bool Negotiate(string offer, Func <AgreedExtensionParameter, bool> agree, out string invalidParameter, out IWebSocketExtension negotiatedExtension)
        {
            invalidParameter    = null;
            negotiatedExtension = null;

            if (string.IsNullOrWhiteSpace(offer))
            {
                invalidParameter = offer;
                return(false);
            }

            var segements = offer.Replace('\r', ' ').Replace('\n', ' ').TrimStart(TrimableChars).TrimEnd(TrimableChars).Split(';');

            var offeredExtensionName = segements[0].TrimStart(TrimableChars).TrimEnd(TrimableChars);

            if (string.IsNullOrEmpty(offeredExtensionName))
            {
                invalidParameter = offer;
                return(false);
            }

            if (string.Compare(offeredExtensionName, PerMessageCompressionExtension.RegisteredToken, StringComparison.OrdinalIgnoreCase) != 0)
            {
                invalidParameter = offeredExtensionName;
                return(false);
            }

            if (segements.Length == 1)
            {
                negotiatedExtension = new PerMessageCompressionExtension();
                return(true);
            }

            // This set of elements MAY include multiple PMCEs with the same extension
            // name to offer the possibility to use the same algorithm with
            // different configuration parameters.
            for (int i = 1; i < segements.Length; i++)
            {
                var offeredParameter = segements[i];
                if (!PerMessageCompressionExtensionParameters.ValidateParameter(offeredParameter))
                {
                    invalidParameter = offeredParameter;
                    return(false);
                }
            }

            // The order of elements is important as it specifies the client's preference.
            // An element preceding another element has higher preference.  It is recommended
            // that a server accepts PMCEs with higher preference if the server supports them.
            var agreedSet = new SortedList <int, AgreedExtensionParameter>();

            for (int i = 1; i < segements.Length; i++)
            {
                var offeredParameter  = segements[i];
                var agreeingParameter = PerMessageCompressionExtensionParameters.ResolveParameter(offeredParameter);
                if (agree(agreeingParameter))
                {
                    agreedSet.Add(i, agreeingParameter);
                }
            }

            negotiatedExtension = new PerMessageCompressionExtension(agreedSet);
            return(true);
        }
        private bool Negotiate(string offer, Func<AgreedExtensionParameter, bool> agree, out string invalidParameter, out IWebSocketExtension negotiatedExtension)
        {
            invalidParameter = null;
            negotiatedExtension = null;

            if (string.IsNullOrWhiteSpace(offer))
            {
                invalidParameter = offer;
                return false;
            }

            var segements = offer.Replace('\r', ' ').Replace('\n', ' ').TrimStart(TrimableChars).TrimEnd(TrimableChars).Split(';');

            var offeredExtensionName = segements[0].TrimStart(TrimableChars).TrimEnd(TrimableChars);
            if (string.IsNullOrEmpty(offeredExtensionName))
            {
                invalidParameter = offer;
                return false;
            }

            if (string.Compare(offeredExtensionName, PerMessageCompressionExtension.RegisteredToken, StringComparison.OrdinalIgnoreCase) != 0)
            {
                invalidParameter = offeredExtensionName;
                return false;
            }

            if (segements.Length == 1)
            {
                negotiatedExtension = new PerMessageCompressionExtension();
                return true;
            }

            // This set of elements MAY include multiple PMCEs with the same extension
            // name to offer the possibility to use the same algorithm with
            // different configuration parameters.
            for (int i = 1; i < segements.Length; i++)
            {
                var offeredParameter = segements[i];
                if (!PerMessageCompressionExtensionParameters.ValidateParameter(offeredParameter))
                {
                    invalidParameter = offeredParameter;
                    return false;
                }
            }

            // The order of elements is important as it specifies the client's preference.  
            // An element preceding another element has higher preference.  It is recommended
            // that a server accepts PMCEs with higher preference if the server supports them.
            var agreedSet = new SortedList<int, AgreedExtensionParameter>();

            for (int i = 1; i < segements.Length; i++)
            {
                var offeredParameter = segements[i];
                var agreeingParameter = PerMessageCompressionExtensionParameters.ResolveParameter(offeredParameter);
                if (agree(agreeingParameter))
                {
                    agreedSet.Add(i, agreeingParameter);
                }
            }

            negotiatedExtension = new PerMessageCompressionExtension(agreedSet);
            return true;
        }