// As server private void processSecWebSocketExtensionsHeader(string value) { var buff = new StringBuilder(32); var compress = false; foreach (var extension in value.SplitHeaderValue(',')) { var trimed = extension.Trim(); var unprefixed = trimed.RemovePrefix("x-webkit-"); if (!compress && unprefixed.IsCompressionExtension(CompressionMethod.Deflate)) { _compression = CompressionMethod.Deflate; var str = _compression.ToExtensionString( "client_no_context_takeover", "server_no_context_takeover"); buff.AppendFormat("{0}, ", str); compress = true; } } var len = buff.Length; if (len > 0) { buff.Length = len - 2; _extensions = buff.ToString(); } }
internal static CompressionMethod ToCompressionMethod(this string value) { IEnumerator enumerator = Enum.GetValues(typeof(CompressionMethod)).GetEnumerator(); try { while (enumerator.MoveNext()) { object obj = enumerator.Current; CompressionMethod compressionMethod = (CompressionMethod)obj; if (compressionMethod.ToExtensionString() == value) { return(compressionMethod); } } } finally { IDisposable disposable; if ((disposable = (enumerator as IDisposable)) != null) { disposable.Dispose(); } } return(CompressionMethod.None); }
// As client private bool validateSecWebSocketExtensionsHeader(string value) { var compress = _compression != CompressionMethod.None; if (value == null || value.Length == 0) { if (compress) { _compression = CompressionMethod.None; } return(true); } if (!compress) { return(false); } foreach (var e in value.SplitHeaderValue(',')) { var ext = e.Trim(); if (ext.IsCompressionExtension(_compression)) { if (!ext.Contains("server_no_context_takeover")) { error("The server hasn't sent back 'server_no_context_takeover'."); return(false); } ////if (!ext.Contains("client_no_context_takeover")) //// _logger.Warn("The server hasn't sent back 'client_no_context_takeover'."); var method = _compression.ToExtensionString(); var invalid = ext.SplitHeaderValue(';').Contains( t => { t = t.Trim(); return(t != method && t != "server_no_context_takeover" && t != "client_no_context_takeover"); }); if (invalid) { return(false); } } else { return(false); } } _extensions = value; return(true); }
// As client private static string CreateExtensions(CompressionMethod compression) { var buff = new StringBuilder(80); if (compression != CompressionMethod.None) { var str = compression.ToExtensionString( "server_no_context_takeover", "client_no_context_takeover"); buff.AppendFormat("{0}, ", str); } var len = buff.Length; if (len <= 2) { return(null); } buff.Length = len - 2; return(buff.ToString()); }
internal static bool IsCompressionExtension(this string value, CompressionMethod method) { return(value.StartsWith(method.ToExtensionString())); }
// As server private void processSecWebSocketExtensionsHeader (string value) { var buff = new StringBuilder (80); var comp = false; foreach (var e in value.SplitHeaderValue (',')) { var ext = e.Trim (); if (!comp && ext.IsCompressionExtension (CompressionMethod.Deflate)) { _compression = CompressionMethod.Deflate; var str = _compression.ToExtensionString ( "client_no_context_takeover", "server_no_context_takeover"); buff.AppendFormat ("{0}, ", str); comp = true; } } var len = buff.Length; if (len > 2) { buff.Length = len - 2; _extensions = buff.ToString (); } }