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); }
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); }
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()); }
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 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()); }