コード例 #1
0
        public override void ChannelRead(IChannelHandlerContext ctx, object msg)
        {
            if (msg is IHttpResponse response &&
                WebSocketExtensionUtil.IsWebsocketUpgrade(response.Headers))
            {
                string extensionsHeader = null;
                if (response.Headers.TryGet(HttpHeaderNames.SecWebsocketExtensions, out ICharSequence value))
                {
                    extensionsHeader = value.ToString();
                }

                var pipeline = ctx.Pipeline;
                if (extensionsHeader is object)
                {
                    List <WebSocketExtensionData> extensions =
                        WebSocketExtensionUtil.ExtractExtensions(extensionsHeader);
                    var validExtensions = new List <IWebSocketClientExtension>(extensions.Count);
                    int rsv             = 0;

                    foreach (WebSocketExtensionData extensionData in extensions)
                    {
                        IWebSocketClientExtension validExtension = null;
                        foreach (IWebSocketClientExtensionHandshaker extensionHandshaker in this.extensionHandshakers)
                        {
                            validExtension = extensionHandshaker.HandshakeExtension(extensionData);
                            if (validExtension is object)
                            {
                                break;
                            }
                        }

                        if (validExtension is object && 0u >= (uint)(validExtension.Rsv & rsv))
                        {
                            rsv = rsv | validExtension.Rsv;
                            validExtensions.Add(validExtension);
                        }
                        else
                        {
                            ThrowHelper.ThrowCodecException_InvalidWSExHandshake(extensionsHeader);
                        }
                    }

                    foreach (IWebSocketClientExtension validExtension in validExtensions)
                    {
                        WebSocketExtensionDecoder decoder = validExtension.NewExtensionDecoder();
                        WebSocketExtensionEncoder encoder = validExtension.NewExtensionEncoder();
                        _ = pipeline.AddAfter(ctx.Name, decoder.GetType().Name, decoder);
                        _ = pipeline.AddAfter(ctx.Name, encoder.GetType().Name, encoder);
                    }
                }

                _ = pipeline.Remove(ctx.Name);
            }

            base.ChannelRead(ctx, msg);
        }
コード例 #2
0
        public void NormalHandshake()
        {
            var handshaker = new PerMessageDeflateClientExtensionHandshaker();

            IWebSocketClientExtension extension = handshaker.HandshakeExtension(
                new WebSocketExtensionData(PerMessageDeflateExtension, new Dictionary <string, string>()));

            Assert.NotNull(extension);
            Assert.Equal(WebSocketRsv.Rsv1, extension.Rsv);
            Assert.IsType <PerMessageDeflateDecoder>(extension.NewExtensionDecoder());
            Assert.IsType <PerMessageDeflateEncoder>(extension.NewExtensionEncoder());
        }
        public void FailedHandshake()
        {
            var handshaker = new DeflateFrameClientExtensionHandshaker(false);

            var parameters = new Dictionary <string, string>
            {
                { "invalid", "12" }
            };
            IWebSocketClientExtension extension = handshaker.HandshakeExtension(
                new WebSocketExtensionData(DeflateFrameExtension, parameters));

            Assert.Null(extension);
        }
コード例 #4
0
        public void CustomHandshake()
        {
            var handshaker = new PerMessageDeflateClientExtensionHandshaker(6, true, 10, true, true);

            var parameters = new Dictionary <string, string>
            {
                { ClientMaxWindow, "12" },
                { ServerMaxWindow, "10" },
                { ClientNoContext, null },
                { ServerNoContext, null }
            };
            IWebSocketClientExtension extension = handshaker.HandshakeExtension(
                new WebSocketExtensionData(PerMessageDeflateExtension, parameters));

            Assert.NotNull(extension);
            Assert.Equal(WebSocketRsv.Rsv1, extension.Rsv);
            Assert.IsType <PerMessageDeflateDecoder>(extension.NewExtensionDecoder());
            Assert.IsType <PerMessageDeflateEncoder>(extension.NewExtensionEncoder());

            parameters = new Dictionary <string, string>
            {
                { ServerMaxWindow, "10" },
                { ServerNoContext, null }
            };
            extension = handshaker.HandshakeExtension(
                new WebSocketExtensionData(PerMessageDeflateExtension, parameters));

            Assert.NotNull(extension);
            Assert.Equal(WebSocketRsv.Rsv1, extension.Rsv);
            Assert.IsType <PerMessageDeflateDecoder>(extension.NewExtensionDecoder());
            Assert.IsType <PerMessageDeflateEncoder>(extension.NewExtensionEncoder());

            parameters = new Dictionary <string, string>();
            extension  = handshaker.HandshakeExtension(
                new WebSocketExtensionData(PerMessageDeflateExtension, parameters));

            Assert.Null(extension);
        }