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