示例#1
0
        public void ServerWindowSizeDisableThenFallback()
        {
            var ch = new EmbeddedChannel(new WebSocketServerExtensionHandler(
                                             new PerMessageDeflateServerExtensionHandshaker(6, false, 15, false, false)));

            IHttpRequest req = NewUpgradeRequest(
                PerMessageDeflateExtension + "; " + ServerMaxWindow + "=10, " +
                PerMessageDeflateExtension);

            ch.WriteInbound(req);

            IHttpResponse res = NewUpgradeResponse(null);

            ch.WriteOutbound(res);

            var res2 = ch.ReadOutbound <IHttpResponse>();

            Assert.True(res2.Headers.TryGet(HttpHeaderNames.SecWebsocketExtensions, out ICharSequence value));
            List <WebSocketExtensionData> exts = WebSocketExtensionUtil.ExtractExtensions(value.ToString());

            Assert.Equal(PerMessageDeflateExtension, exts[0].Name);
            Assert.Empty(exts[0].Parameters);
            Assert.NotNull(ch.Pipeline.Get <PerMessageDeflateDecoder>());
            Assert.NotNull(ch.Pipeline.Get <PerMessageDeflateEncoder>());
        }
        public void IsWebsocketUpgrade()
        {
            HttpHeaders headers = new DefaultHttpHeaders();

            Assert.False(WebSocketExtensionUtil.IsWebsocketUpgrade(headers));

            headers.Add(HttpHeaderNames.Upgrade, HttpHeaderValues.Websocket);
            Assert.False(WebSocketExtensionUtil.IsWebsocketUpgrade(headers));

            headers.Add(HttpHeaderNames.Connection, "Keep-Alive, Upgrade");
            Assert.True(WebSocketExtensionUtil.IsWebsocketUpgrade(headers));
        }
        public void FallbackSuccess()
        {
            this.mainHandshaker.Setup(x => x.NewRequestData())
            .Returns(new WebSocketExtensionData("main", new Dictionary <string, string>()));
            this.mainHandshaker.Setup(x => x.HandshakeExtension(It.IsAny <WebSocketExtensionData>()))
            .Returns(default(IWebSocketClientExtension));

            this.fallbackHandshaker.Setup(x => x.NewRequestData())
            .Returns(new WebSocketExtensionData("fallback", new Dictionary <string, string>()));
            this.fallbackHandshaker.Setup(x => x.HandshakeExtension(It.IsAny <WebSocketExtensionData>()))
            .Returns(this.fallbackExtension.Object);

            this.fallbackExtension.Setup(x => x.Rsv).Returns(WebSocketRsv.Rsv1);
            this.fallbackExtension.Setup(x => x.NewExtensionEncoder()).Returns(new DummyEncoder());
            this.fallbackExtension.Setup(x => x.NewExtensionDecoder()).Returns(new DummyDecoder());

            var ch = new EmbeddedChannel(
                new WebSocketClientExtensionHandler(
                    this.mainHandshaker.Object,
                    this.fallbackHandshaker.Object));

            IHttpRequest req = NewUpgradeRequest(null);

            ch.WriteOutbound(req);

            var req2 = ch.ReadOutbound <IHttpRequest>();

            Assert.True(req2.Headers.TryGet(HttpHeaderNames.SecWebsocketExtensions, out ICharSequence value));
            List <WebSocketExtensionData> reqExts = WebSocketExtensionUtil.ExtractExtensions(value.ToString());

            IHttpResponse res = NewUpgradeResponse("fallback");

            ch.WriteInbound(res);

            var res2 = ch.ReadInbound <IHttpResponse>();

            Assert.True(res2.Headers.TryGet(HttpHeaderNames.SecWebsocketExtensions, out value));
            List <WebSocketExtensionData> resExts = WebSocketExtensionUtil.ExtractExtensions(value.ToString());

            Assert.Equal(2, reqExts.Count);
            Assert.Equal("main", reqExts[0].Name);
            Assert.Equal("fallback", reqExts[1].Name);

            Assert.Single(resExts);
            Assert.Equal("fallback", resExts[0].Name);
            Assert.Empty(resExts[0].Parameters);
            Assert.NotNull(ch.Pipeline.Get <DummyDecoder>());
            Assert.NotNull(ch.Pipeline.Get <DummyEncoder>());

            this.fallbackExtension.Verify(x => x.Rsv, Times.AtLeastOnce);
        }
        public void MainAndFallbackUseRsv1WillFail()
        {
            this.mainHandshaker.Setup(x => x.NewRequestData())
            .Returns(new WebSocketExtensionData("main", new Dictionary <string, string>()));
            this.mainHandshaker.Setup(x => x.HandshakeExtension(
                                          It.Is <WebSocketExtensionData>(v => v.Name.Equals("main"))))
            .Returns(this.mainExtension.Object);
            this.mainHandshaker.Setup(x => x.HandshakeExtension(
                                          It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))))
            .Returns(default(IWebSocketClientExtension));
            this.fallbackHandshaker.Setup(x => x.NewRequestData())
            .Returns(new WebSocketExtensionData("fallback", new Dictionary <string, string>()));
            this.fallbackHandshaker.Setup(x => x.HandshakeExtension(
                                              It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))))
            .Returns(this.fallbackExtension.Object);
            this.mainExtension.Setup(x => x.Rsv).Returns(WebSocketRsv.Rsv1);
            this.fallbackExtension.Setup(x => x.Rsv).Returns(WebSocketRsv.Rsv1);

            var ch = new EmbeddedChannel(new WebSocketClientExtensionHandler(
                                             this.mainHandshaker.Object, this.fallbackHandshaker.Object));

            IHttpRequest req = NewUpgradeRequest(null);

            ch.WriteOutbound(req);

            var req2 = ch.ReadOutbound <IHttpRequest>();

            Assert.True(req2.Headers.TryGet(HttpHeaderNames.SecWebsocketExtensions, out ICharSequence value));
            List <WebSocketExtensionData> reqExts = WebSocketExtensionUtil.ExtractExtensions(value.ToString());

            IHttpResponse res = NewUpgradeResponse("main, fallback");

            Assert.Throws <CodecException>(() => ch.WriteInbound(res));

            Assert.Equal(2, reqExts.Count);
            Assert.Equal("main", reqExts[0].Name);
            Assert.Equal("fallback", reqExts[1].Name);

            this.mainHandshaker.Verify(x => x.HandshakeExtension(
                                           It.Is <WebSocketExtensionData>(v => v.Name.Equals("main"))), Times.AtLeastOnce);
            this.mainHandshaker.Verify(x => x.HandshakeExtension(
                                           It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))), Times.AtLeastOnce);

            this.fallbackHandshaker.Verify(x => x.HandshakeExtension(
                                               It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))), Times.AtLeastOnce);

            this.mainExtension.Verify(x => x.Rsv, Times.AtLeastOnce);
            this.fallbackExtension.Verify(x => x.Rsv, Times.AtLeastOnce);
        }
示例#5
0
        public void NormalSuccess()
        {
            var ch = new EmbeddedChannel(new WebSocketServerCompressionHandler());

            IHttpRequest req = NewUpgradeRequest(PerMessageDeflateExtension);

            ch.WriteInbound(req);

            IHttpResponse res = NewUpgradeResponse(null);

            ch.WriteOutbound(res);

            var res2 = ch.ReadOutbound <IHttpResponse>();

            Assert.True(res2.Headers.TryGet(HttpHeaderNames.SecWebsocketExtensions, out ICharSequence value));
            List <WebSocketExtensionData> exts = WebSocketExtensionUtil.ExtractExtensions(value.ToString());

            Assert.Equal(PerMessageDeflateExtension, exts[0].Name);
            Assert.Empty(exts[0].Parameters);
            Assert.NotNull(ch.Pipeline.Get <PerMessageDeflateDecoder>());
            Assert.NotNull(ch.Pipeline.Get <PerMessageDeflateEncoder>());
        }
        public void MainSuccess()
        {
            // initialize
            _mainHandshaker.Setup(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("main"))))
            .Returns(_mainExtension.Object);
            _mainHandshaker.Setup(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))))
            .Returns(default(IWebSocketServerExtension));

            _fallbackHandshaker.Setup(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))))
            .Returns(_fallbackExtension.Object);
            _fallbackHandshaker.Setup(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("main"))))
            .Returns(default(IWebSocketServerExtension));

            _mainExtension.Setup(x => x.Rsv).Returns(WebSocketRsv.Rsv1);
            _mainExtension.Setup(x => x.NewReponseData()).Returns(
                new WebSocketExtensionData("main", new Dictionary <string, string>()));
            _mainExtension.Setup(x => x.NewExtensionEncoder()).Returns(new DummyEncoder());
            _mainExtension.Setup(x => x.NewExtensionDecoder()).Returns(new DummyDecoder());

            _fallbackExtension.Setup(x => x.Rsv).Returns(WebSocketRsv.Rsv1);

            // execute
            WebSocketServerExtensionHandler extensionHandler =
                new WebSocketServerExtensionHandler(_mainHandshaker.Object, _fallbackHandshaker.Object);
            var ch = new EmbeddedChannel(extensionHandler);

            IHttpRequest req = NewUpgradeRequest("main, fallback");

            ch.WriteInbound(req);

            IHttpResponse res = NewUpgradeResponse(null);

            ch.WriteOutbound(res);

            var res2 = ch.ReadOutbound <IHttpResponse>();

            Assert.True(res2.Headers.TryGet(HttpHeaderNames.SecWebsocketExtensions, out ICharSequence value));
            List <WebSocketExtensionData> resExts = WebSocketExtensionUtil.ExtractExtensions(value.ToString());

            // test
            Assert.Null(ch.Pipeline.Context(extensionHandler));
            Assert.Single(resExts);
            Assert.Equal("main", resExts[0].Name);
            Assert.Empty(resExts[0].Parameters);
            Assert.NotNull(ch.Pipeline.Get <DummyDecoder>());
            Assert.NotNull(ch.Pipeline.Get <DummyEncoder>());

            _mainHandshaker.Verify(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("main"))),
                Times.AtLeastOnce);
            _mainHandshaker.Verify(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))),
                Times.AtLeastOnce);
            _fallbackHandshaker.Verify(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))),
                Times.AtLeastOnce);

            _mainExtension.Verify(x => x.Rsv, Times.AtLeastOnce);
            _mainExtension.Verify(x => x.NewReponseData());
            _mainExtension.Verify(x => x.NewExtensionEncoder());
            _mainExtension.Verify(x => x.NewExtensionDecoder());
            _fallbackExtension.Verify(x => x.Rsv, Times.AtLeastOnce);
        }
        public void CompatibleExtensionTogetherSuccess()
        {
            this.mainHandshaker.Setup(x => x.HandshakeExtension(
                                          It.Is <WebSocketExtensionData>(v => v.Name.Equals("main"))))
            .Returns(this.mainExtension.Object);
            this.mainHandshaker.Setup(x => x.HandshakeExtension(
                                          It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))))
            .Returns(default(IWebSocketServerExtension));

            this.fallbackHandshaker.Setup(x => x.HandshakeExtension(
                                              It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))))
            .Returns(this.fallbackExtension.Object);
            this.fallbackHandshaker.Setup(x => x.HandshakeExtension(
                                              It.Is <WebSocketExtensionData>(v => v.Name.Equals("main"))))
            .Returns(default(IWebSocketServerExtension));

            this.mainExtension.Setup(x => x.Rsv).Returns(WebSocketRsv.Rsv1);
            this.mainExtension.Setup(x => x.NewReponseData()).Returns(
                new WebSocketExtensionData("main", new Dictionary <string, string>()));
            this.mainExtension.Setup(x => x.NewExtensionEncoder()).Returns(new DummyEncoder());
            this.mainExtension.Setup(x => x.NewExtensionDecoder()).Returns(new DummyDecoder());

            this.fallbackExtension.Setup(x => x.Rsv).Returns(WebSocketRsv.Rsv2);
            this.fallbackExtension.Setup(x => x.NewReponseData()).Returns(
                new WebSocketExtensionData("fallback", new Dictionary <string, string>()));
            this.fallbackExtension.Setup(x => x.NewExtensionEncoder()).Returns(new Dummy2Encoder());
            this.fallbackExtension.Setup(x => x.NewExtensionDecoder()).Returns(new Dummy2Decoder());

            var ch = new EmbeddedChannel(new WebSocketServerExtensionHandler(
                                             this.mainHandshaker.Object, this.fallbackHandshaker.Object));

            IHttpRequest req = NewUpgradeRequest("main, fallback");

            ch.WriteInbound(req);

            IHttpResponse res = NewUpgradeResponse(null);

            ch.WriteOutbound(res);

            var res2 = ch.ReadOutbound <IHttpResponse>();

            Assert.True(res2.Headers.TryGet(HttpHeaderNames.SecWebsocketExtensions, out ICharSequence value));
            List <WebSocketExtensionData> resExts = WebSocketExtensionUtil.ExtractExtensions(value.ToString());

            Assert.Equal(2, resExts.Count);
            Assert.Equal("main", resExts[0].Name);
            Assert.Equal("fallback", resExts[1].Name);
            Assert.NotNull(ch.Pipeline.Get <DummyDecoder>());
            Assert.NotNull(ch.Pipeline.Get <DummyEncoder>());
            Assert.NotNull(ch.Pipeline.Get <Dummy2Decoder>());
            Assert.NotNull(ch.Pipeline.Get <Dummy2Encoder>());

            this.mainHandshaker.Verify(x => x.HandshakeExtension(
                                           It.Is <WebSocketExtensionData>(v => v.Name.Equals("main"))),
                                       Times.AtLeastOnce);
            this.mainHandshaker.Verify(x => x.HandshakeExtension(
                                           It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))),
                                       Times.AtLeastOnce);
            this.fallbackHandshaker.Verify(x => x.HandshakeExtension(
                                               It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))),
                                           Times.AtLeastOnce);

            this.mainExtension.Verify(x => x.Rsv, Times.Exactly(2));
            this.fallbackExtension.Verify(x => x.Rsv, Times.Exactly(2));
        }