public void DecompressTest() { var source = "hogefugapiyo"; byte[] destBytes; using (var stream = new MemoryStream()) { using (var deflate = new DeflateStream(stream, CompressionMode.Compress, true)) { var sourceBytes = Encoding.UTF8.GetBytes(source); deflate.Write(sourceBytes, 0, sourceBytes.Length); } destBytes = stream.ToArray(); } var builder = new WebSocketFrameBuilder(ProxyConfig.MaxByteArrayLength); var data = new byte[] { 0b11000010, 0b00001110, }; builder.TryAddData(data, 0, data.Length, out var readSize, out _).IsFalse(); readSize.Is(data.Length); builder.TryAddData(destBytes, 0, destBytes.Length, out readSize, out var frame).IsTrue(); readSize.Is(destBytes.Length); var ex = new PerMessageDeflateExtension(); var message = ex.Decompress(new WebSocketMessage(null, frame)); Encoding.UTF8.GetString(message.PayloadData).Is(source); }
public IWebSocketClientExtension HandshakeExtension(WebSocketExtensionData extensionData) { if (!PerMessageDeflateExtension.Equals(extensionData.Name)) { return(null); } bool succeed = true; int clientWindowSize = MaxWindowSize; int serverWindowSize = MaxWindowSize; bool serverNoContext = false; bool clientNoContext = false; foreach (KeyValuePair <string, string> parameter in extensionData.Parameters) { if (ClientMaxWindow.Equals(parameter.Key, StringComparison.OrdinalIgnoreCase)) { // allowed client_window_size_bits if (this.allowClientWindowSize) { clientWindowSize = int.Parse(parameter.Value); } else { succeed = false; } } else if (ServerMaxWindow.Equals(parameter.Key, StringComparison.OrdinalIgnoreCase)) { // acknowledged server_window_size_bits serverWindowSize = int.Parse(parameter.Value); if (clientWindowSize > MaxWindowSize || clientWindowSize < MinWindowSize) { succeed = false; } } else if (ClientNoContext.Equals(parameter.Key, StringComparison.OrdinalIgnoreCase)) { // allowed client_no_context_takeover if (this.allowClientNoContext) { clientNoContext = true; } else { succeed = false; } } else if (ServerNoContext.Equals(parameter.Key, StringComparison.OrdinalIgnoreCase)) { // acknowledged server_no_context_takeover if (this.requestedServerNoContext) { serverNoContext = true; } else { succeed = false; } } else { // unknown parameter succeed = false; } if (!succeed) { break; } } if ((this.requestedServerNoContext && !serverNoContext) || this.requestedServerWindowSize != serverWindowSize) { succeed = false; } if (succeed) { return(new WebSocketPermessageDeflateExtension(serverNoContext, serverWindowSize, clientNoContext, this.compressionLevel)); } else { return(null); } }