public void RegisterExtension(IWebSocketExtension extension)
        {
            if (extension == null)
                throw new ArgumentNullException("extension");

            if (_extensions.Contains(extension))
                throw new ArgumentException(ErrorMessages.ExtensionsAlreadyRegistered + extension.Name, "extension");

            var oldState = Interlocked.CompareExchange(ref _state, _state, _state);
            if (oldState != WebSocketState.Closed)
                throw new InvalidOperationException(ErrorMessages.InvalidState + _state);

            _extensions.Add(extension);
        }
Exemple #2
0
        public void RegisterExtension(IWebSocketExtension extension)
        {
            if (extension == null)
            {
                throw new ArgumentNullException("extension");
            }

            if (_extensions.Contains(extension))
            {
                throw new ArgumentException(ErrorMessages.ExtensionsAlreadyRegistered + extension.Name, "extension");
            }

            var oldState = Interlocked.CompareExchange(ref _state, _state, _state);

            if (oldState != WebSocketState.Closed)
            {
                throw new InvalidOperationException(ErrorMessages.InvalidState + _state);
            }

            _extensions.Add(extension);
        }
Exemple #3
0
        public void AddExtension(IWebSocketExtension extension)
        {
            if (extension == null)
            {
                throw new ArgumentNullException("extension");
            }

            var value = new StringBuilder(extension.Name);

            if (extension.Parameter != null)
            {
                value.AppendFormat("; {0}", extension.Parameter.Key);
                if (!string.IsNullOrWhiteSpace(extension.Parameter.Value))
                {
                    var param = extension.Parameter.Value;
                    var fmt   = param.IndexOfAny(Consts.ExtensionParmeterValueNeedQuotesChars) < 0 || param.StartsAndEndsWith("\"")
                        ? "={0}"
                        : "=\"{0}\"";
                    value.AppendFormat(fmt, param);
                }
            }
            this.AddHeader(Consts.HeaderSecWebSocketExtensions, value.ToString());
        }
Exemple #4
0
 public bool NegotiateAsServer(string offer, out string invalidParameter, out IWebSocketExtension negotiatedExtension)
 {
     return(Negotiate(offer, AgreeAsServer, out invalidParameter, out negotiatedExtension));
 }
Exemple #5
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);
        }
 public bool NegotiateAsServer(string offer, out string invalidParameter, out IWebSocketExtension negotiatedExtension)
 {
     return Negotiate(offer, AgreeAsServer, out invalidParameter, out negotiatedExtension);
 }
        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;
        }
        public void AddExtension(IWebSocketExtension extension)
        {
            if (extension == null)
                throw new ArgumentNullException("extension");

            var value = new StringBuilder(extension.Name);
            if (extension.Parameter != null)
            {
                value.AppendFormat("; {0}", extension.Parameter.Key);
                if (!string.IsNullOrWhiteSpace(extension.Parameter.Value))
                {
                    var param = extension.Parameter.Value;
                    var fmt = param.IndexOfAny(Consts.ExtensionParmeterValueNeedQuotesChars) < 0 || param.StartsAndEndsWith("\"")
                        ? "={0}"
                        : "=\"{0}\"";
                    value.AppendFormat(fmt, param);
                }
                    
            }
            this.AddHeader(Consts.HeaderSecWebSocketExtensions, value.ToString());
        }