Пример #1
0
        public void AbsoluteUpgradeUrlWithQuery()
        {
            var uri = new Uri("ws://localhost:9999/path%20with%20ws?a=b%20c");
            WebSocketClientHandshaker handshaker = NewHandshaker(uri, null, null, true);
            IFullHttpRequest          request    = handshaker.NewHandshakeRequest();

            try
            {
                Assert.Equal("ws://localhost:9999/path%20with%20ws?a=b%20c", request.Uri);
            }
            finally
            {
                request.Release();
            }
        }
Пример #2
0
        public void UpgradeUrl()
        {
            var uri = new Uri("ws://localhost:9999/path%20with%20ws");
            WebSocketClientHandshaker handshaker = this.NewHandshaker(uri);
            IFullHttpRequest          request    = handshaker.NewHandshakeRequest();

            try
            {
                Assert.Equal("/path%20with%20ws", request.Uri);
            }
            finally
            {
                request.Release();
            }
        }
Пример #3
0
        public void UpgradeUrlWithoutPathWithQuery()
        {
            Uri uri = new Uri("ws://localhost:9999?a=b%20c");
            WebSocketClientHandshaker handshaker = NewHandshaker(uri);
            IFullHttpRequest          request    = handshaker.NewHandshakeRequest();

            try
            {
                Assert.Equal("/?a=b%20c", request.Uri);
            }
            finally
            {
                request.Release();
            }
        }
Пример #4
0
        static void CheckContentBuffer(IFullHttpRequest aggregatedMessage)
        {
            var buffer = (CompositeByteBuffer)aggregatedMessage.Content;

            Assert.Equal(2, buffer.NumComponents);
            IList <IByteBuffer> buffers = buffer.Decompose(0, buffer.Capacity);

            Assert.Equal(2, buffers.Count);
            foreach (IByteBuffer buf in buffers)
            {
                // This should be false as we decompose the buffer before to not have deep hierarchy
                Assert.False(buf is CompositeByteBuffer);
            }
            aggregatedMessage.Release();
        }
Пример #5
0
        public void ExpectContinueResetHttpObjectDecoder()
        {
            // request with header "Expect: 100-continue" must be replied with one "100 Continue" response
            // case 5: Test that HttpObjectDecoder correctly resets its internal state after a failed expectation.
            var       decoder    = new HttpRequestDecoder();
            const int MaxBytes   = 10;
            var       aggregator = new HttpObjectAggregator(MaxBytes);

            var    testHandler = new TestHandler();
            var    channel     = new EmbeddedChannel(decoder, aggregator, testHandler);
            string req1        = "POST /1 HTTP/1.1\r\n" +
                                 "Content-Length: " + (MaxBytes + 1) + "\r\n" +
                                 "Expect: 100-continue\r\n" +
                                 "\r\n";

            Assert.False(channel.WriteInbound(Unpooled.WrappedBuffer(Encoding.ASCII.GetBytes(req1))));

            var resp = channel.ReadOutbound <IFullHttpResponse>();

            Assert.Equal(HttpStatusClass.ClientError, resp.Status.CodeClass);
            resp.Release();

            string req2 = "POST /2 HTTP/1.1\r\n" +
                          "Content-Length: " + MaxBytes + "\r\n" +
                          "Expect: 100-continue\r\n" +
                          "\r\n";

            Assert.False(channel.WriteInbound(Unpooled.WrappedBuffer(Encoding.ASCII.GetBytes(req2))));

            resp = channel.ReadOutbound <IFullHttpResponse>();
            Assert.Equal(100, resp.Status.Code);
            resp.Release();

            var content = new byte[MaxBytes];

            Assert.False(channel.WriteInbound(Unpooled.WrappedBuffer(content)));

            IFullHttpRequest req = testHandler.Request;

            Assert.NotNull(req);
            Assert.Equal("/2", req.Uri);
            Assert.Equal(10, req.Content.ReadableBytes);
            req.Release();

            AssertHasInboundMessages(channel, false);
            AssertHasOutboundMessages(channel, false);
            Assert.False(channel.Finish());
        }
Пример #6
0
        protected void HeaderDefaultHttp(string uri, AsciiString header, string expectedValue)
        {
            Assert.True(Uri.TryCreate(uri, UriKind.RelativeOrAbsolute, out Uri originalUri));
            WebSocketClientHandshaker handshaker = this.NewHandshaker(originalUri);
            IFullHttpRequest          request    = handshaker.NewHandshakeRequest();

            try
            {
                Assert.True(request.Headers.TryGet(header, out ICharSequence value));
                Assert.Equal(expectedValue, value.ToString(), true);
            }
            finally
            {
                request.Release();
            }
        }
Пример #7
0
        public void SetOriginFromCustomHeaders()
        {
            HttpHeaders customHeaders            = new DefaultHttpHeaders().Set(GetOriginHeaderName(), "http://example.com");
            WebSocketClientHandshaker handshaker = NewHandshaker(new Uri("ws://server.example.com/chat"), null,
                                                                 customHeaders, false);
            IFullHttpRequest request = handshaker.NewHandshakeRequest();

            try
            {
                Assert.Equal("http://example.com", request.Headers.Get(GetOriginHeaderName(), null));
            }
            finally
            {
                request.Release();
            }
        }
        public void HostHeaderPreserved()
        {
            Uri uri = new Uri("ws://localhost:9999");
            WebSocketClientHandshaker handshaker = NewHandshaker(uri, null,
                                                                 new DefaultHttpHeaders().Set(HttpHeaderNames.Host, "test.netty.io"), false);

            IFullHttpRequest request = handshaker.NewHandshakeRequest();

            try
            {
                Assert.Equal("/", request.Uri);
                Assert.Equal("test.netty.io", request.Headers.Get(HttpHeaderNames.Host, null));
            }
            finally
            {
                request.Release();
            }
        }
Пример #9
0
        void TestHttpResponseAndFrameInSameBuffer(bool codec)
        {
            string url = "ws://localhost:9999/ws";
            WebSocketClientHandshaker shaker = this.NewHandshaker(new Uri(url));
            var handshaker = new Handshaker(shaker);

            // use randomBytes helper from utils to check that it functions properly
            byte[] data = WebSocketUtil.RandomBytes(24);

            // Create a EmbeddedChannel which we will use to encode a BinaryWebsocketFrame to bytes and so use these
            // to test the actual handshaker.
            var factory = new WebSocketServerHandshakerFactory(url, null, false);
            IFullHttpRequest          request = shaker.NewHandshakeRequest();
            WebSocketServerHandshaker socketServerHandshaker = factory.NewHandshaker(request);

            request.Release();
            var websocketChannel = new EmbeddedChannel(socketServerHandshaker.NewWebSocketEncoder(),
                                                       socketServerHandshaker.NewWebsocketDecoder());

            Assert.True(websocketChannel.WriteOutbound(new BinaryWebSocketFrame(Unpooled.WrappedBuffer(data))));

            byte[] bytes = Encoding.ASCII.GetBytes("HTTP/1.1 101 Switching Protocols\r\nContent-Length: 0\r\n\r\n");

            CompositeByteBuffer compositeByteBuf = Unpooled.CompositeBuffer();

            compositeByteBuf.AddComponent(true, Unpooled.WrappedBuffer(bytes));
            for (; ;)
            {
                var frameBytes = websocketChannel.ReadOutbound <IByteBuffer>();
                if (frameBytes == null)
                {
                    break;
                }
                compositeByteBuf.AddComponent(true, frameBytes);
            }

            var ch = new EmbeddedChannel(new HttpObjectAggregator(int.MaxValue), new Handler(handshaker));

            if (codec)
            {
                ch.Pipeline.AddFirst(new HttpClientCodec());
            }
            else
            {
                ch.Pipeline.AddFirst(new HttpRequestEncoder(), new HttpResponseDecoder());
            }

            // We need to first write the request as HttpClientCodec will fail if we receive a response before a request
            // was written.
            shaker.HandshakeAsync(ch).Wait();
            for (; ;)
            {
                // Just consume the bytes, we are not interested in these.
                var buf = ch.ReadOutbound <IByteBuffer>();
                if (buf == null)
                {
                    break;
                }
                buf.Release();
            }
            Assert.True(ch.WriteInbound(compositeByteBuf));
            Assert.True(ch.Finish());

            var         frame  = ch.ReadInbound <BinaryWebSocketFrame>();
            IByteBuffer expect = Unpooled.WrappedBuffer(data);

            try
            {
                Assert.Equal(expect, frame.Content);
                Assert.True(frame.IsFinalFragment);
                Assert.Equal(0, frame.Rsv);
            }
            finally
            {
                expect.Release();
                frame.Release();
            }
        }