コード例 #1
0
        public async Task CanSendData()
        {
            var data = new byte[] { 1, 1, 2, 3, 5, 8 };

            var testHttpHandler = new TestHttpMessageHandler();

            var sendTcs     = new TaskCompletionSource <byte[]>();
            var longPollTcs = new TaskCompletionSource <HttpResponseMessage>();

            testHttpHandler.OnLongPoll(cancellationToken => longPollTcs.Task);

            testHttpHandler.OnSocketSend((buf, cancellationToken) =>
            {
                sendTcs.TrySetResult(buf);
                return(Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.Accepted)));
            });

            await WithConnectionAsync(
                CreateConnection(testHttpHandler),
                async (connection) =>
            {
                await connection.StartAsync().DefaultTimeout();

                await connection.Transport.Output.WriteAsync(data).DefaultTimeout();

                Assert.Equal(data, await sendTcs.Task.DefaultTimeout());

                longPollTcs.TrySetResult(ResponseUtils.CreateResponse(HttpStatusCode.NoContent));
            });
        }
コード例 #2
0
        public async Task CanReceiveData()
        {
            var testHttpHandler = new TestHttpMessageHandler();

            // Set the long poll up to return a single message over a few polls.
            var requestCount     = 0;
            var messageFragments = new[] { "This ", "is ", "a ", "test" };

            testHttpHandler.OnLongPoll(cancellationToken =>
            {
                if (requestCount >= messageFragments.Length)
                {
                    return(ResponseUtils.CreateResponse(HttpStatusCode.NoContent));
                }

                var resp      = ResponseUtils.CreateResponse(HttpStatusCode.OK, messageFragments[requestCount]);
                requestCount += 1;
                return(resp);
            });
            testHttpHandler.OnSocketSend((_, __) => ResponseUtils.CreateResponse(HttpStatusCode.Accepted));

            await WithConnectionAsync(
                CreateConnection(testHttpHandler),
                async (connection) =>
            {
                await connection.StartAsync().DefaultTimeout();
                Assert.Contains("This is a test", Encoding.UTF8.GetString(await connection.Transport.Input.ReadAllAsync()));
            });
        }
コード例 #3
0
        public async Task HttpConnectionFailsAfterFirstRetryFailsServerSentEvents()
        {
            var testHttpHandler      = new TestHttpMessageHandler(autoNegotiate: false);
            var accessTokenCallCount = 0;

            testHttpHandler.OnNegotiate((_, cancellationToken) =>
            {
                return(ResponseUtils.CreateResponse(HttpStatusCode.OK, ResponseUtils.CreateNegotiationContent()));
            });

            testHttpHandler.OnSocketSend((_, _) =>
            {
                return(ResponseUtils.CreateResponse(HttpStatusCode.Unauthorized));
            });

            var tcs    = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
            var stream = new BlockingStream(tcs);

            testHttpHandler.OnRequest((request, next, token) =>
            {
                return(Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.OK, new StreamContent(stream))));
            });

            Task <string> AccessTokenProvider()
            {
                accessTokenCallCount++;
                return(Task.FromResult(accessTokenCallCount.ToString(CultureInfo.InvariantCulture)));
            }

            await WithConnectionAsync(
                CreateConnection(testHttpHandler, transportType : HttpTransportType.ServerSentEvents, accessTokenProvider : AccessTokenProvider),
                async (connection) =>
            {
                await connection.StartAsync().DefaultTimeout();
                await connection.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes("Hello world 1"));
                await Assert.ThrowsAsync <HttpRequestException>(async() => await connection.Transport.Input.ReadAllAsync());
            });

            // 1 negotiate + 1 retry stream request
            Assert.Equal(2, accessTokenCallCount);
        }
コード例 #4
0
        public async Task TransportPipeIsCompletedWhenErrorOccursInTransport()
        {
            bool ExpectedErrors(WriteContext writeContext)
            {
                return(writeContext.LoggerName == typeof(LongPollingTransport).FullName &&
                       writeContext.EventId.Name == "ErrorSending");
            }

            using (StartVerifiableLog(expectedErrorsFilter: ExpectedErrors))
            {
                var httpHandler = new TestHttpMessageHandler();

                var longPollResult = new TaskCompletionSource <HttpResponseMessage>();
                httpHandler.OnLongPoll(cancellationToken =>
                {
                    cancellationToken.Register(() =>
                    {
                        longPollResult.TrySetResult(ResponseUtils.CreateResponse(HttpStatusCode.NoContent));
                    });
                    return(longPollResult.Task);
                });
                httpHandler.OnLongPollDelete(cancellationToken => ResponseUtils.CreateResponse(HttpStatusCode.NoContent));

                httpHandler.OnSocketSend((data, _) =>
                {
                    Assert.Collection(data, i => Assert.Equal(0x42, i));
                    return(Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.InternalServerError)));
                });

                await WithConnectionAsync(
                    CreateConnection(httpHandler, LoggerFactory),
                    async (connection) =>
                {
                    await connection.StartAsync().DefaultTimeout();
                    await connection.Transport.Output.WriteAsync(new byte[] { 0x42 }).DefaultTimeout();

                    await Assert.ThrowsAsync <HttpRequestException>(async() => await connection.Transport.Input.ReadAsync());
                });
            }
        }
コード例 #5
0
        public async Task HttpConnectionRetriesAccessTokenProviderWhenAuthFailsServerSentEvents()
        {
            var testHttpHandler      = new TestHttpMessageHandler(autoNegotiate: false);
            var requestsExecuted     = false;
            var accessTokenCallCount = 0;

            testHttpHandler.OnNegotiate((_, cancellationToken) =>
            {
                return(ResponseUtils.CreateResponse(HttpStatusCode.OK, ResponseUtils.CreateNegotiationContent()));
            });

            var sendRequestExecuted = false;
            var sendFinishedTcs     = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);

            testHttpHandler.OnSocketSend((_, _) =>
            {
                if (!sendRequestExecuted)
                {
                    sendRequestExecuted = true;
                    return(ResponseUtils.CreateResponse(HttpStatusCode.Unauthorized));
                }
                sendFinishedTcs.SetResult();
                return(ResponseUtils.CreateResponse(HttpStatusCode.OK));
            });

            var tcs    = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
            var stream = new BlockingStream(tcs);

            testHttpHandler.OnRequest((request, next, token) =>
            {
                if (!requestsExecuted)
                {
                    requestsExecuted = true;
                    return(Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.Unauthorized)));
                }

                Assert.Equal("Bearer", request.Headers.Authorization.Scheme);

                Assert.Equal(accessTokenCallCount.ToString(CultureInfo.InvariantCulture), request.Headers.Authorization.Parameter);

                return(Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.OK, new StreamContent(stream))));
            });

            Task <string> AccessTokenProvider()
            {
                accessTokenCallCount++;
                return(Task.FromResult(accessTokenCallCount.ToString(CultureInfo.InvariantCulture)));
            }

            await WithConnectionAsync(
                CreateConnection(testHttpHandler, transportType : HttpTransportType.ServerSentEvents, accessTokenProvider : AccessTokenProvider),
                async (connection) =>
            {
                await connection.StartAsync().DefaultTimeout();
                await connection.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes("Hello world 1"));
                await sendFinishedTcs.Task;
                tcs.TrySetResult();
                await connection.Transport.Input.ReadAllAsync();
            });

            // 1 negotiate + 1 retry stream request + 1 retry send
            Assert.Equal(3, accessTokenCallCount);
        }