public void RequestingSignalrHubsUrlWithJavaScriptProxiesDesabledDoesNotReturnProxy()
        {
            // Arrange
            var dispatcher = new HubDispatcher(new HubConfiguration()
            {
                EnableJavaScriptProxies = false
            });
            var    request     = GetRequestForUrl("http://something/signalr/hubs");
            var    response    = new Mock <IResponse>();
            string contentType = null;
            var    buffer      = new List <string>();

            response.SetupSet(m => m.ContentType = It.IsAny <string>()).Callback <string>(type => contentType = type);
            response.Setup(m => m.Write(It.IsAny <ArraySegment <byte> >())).Callback <ArraySegment <byte> >(data => buffer.Add(Encoding.UTF8.GetString(data.Array, data.Offset, data.Count)));
            response.Setup(m => m.End()).Returns(TaskAsyncHelper.Empty);

            // Act
            var context = new HostContext(request.Object, response.Object);

            dispatcher.Initialize(new DefaultDependencyResolver(), context);
            dispatcher.ProcessRequest(context).Wait();

            // Assert
            Assert.Equal("application/javascript; charset=UTF-8", contentType);
            Assert.Equal(1, buffer.Count);
            Assert.True(buffer[0].StartsWith("throw new Error("));
        }
        public void DetailedErrorsAreDisabledByDefault()
        {
            // Arrange
            var serviceProvider = CreateServiceProvider();
            var dispatcher      = new HubDispatcher(serviceProvider.GetRequiredService <IOptions <SignalROptions> >());
            var testContext     = new TestContext("/signalr/send", new Dictionary <string, string>
            {
                { "transport", "longPolling" },
                { "connectionToken", "0" },
                { "data", "{\"H\":\"ErrorHub\",\"M\":\"Error\",\"A\":[],\"I\":0}" }
            });

            // Act
            dispatcher.Initialize(serviceProvider);
            dispatcher.ProcessRequest(testContext.MockHttpContext.Object).Wait();

            var json = JsonSerializer.Create(new JsonSerializerSettings());

            // Assert
            Assert.Equal("application/json; charset=UTF-8", testContext.ResponseContentType);
            Assert.True(testContext.ResponseBuffer.Count > 0);

            using (var reader = new StringReader(String.Join(String.Empty, testContext.ResponseBuffer)))
            {
                var hubResponse = (HubResponse)json.Deserialize(reader, typeof(HubResponse));
                Assert.Contains("ErrorHub.Error", hubResponse.Error);
                Assert.DoesNotContain("Custom", hubResponse.Error);
            }
        }
Exemple #3
0
        public IServiceTransport CreateConnection(OpenConnectionMessage message, IServiceConnection serviceConnection)
        {
            var dispatcher = new HubDispatcher(_configuration);

            dispatcher.Initialize(_configuration.Resolver);

            var responseStream = new MemoryStream();
            var hostContext    = GetHostContext(message, responseStream, serviceConnection);

            if (dispatcher.Authorize(hostContext.Request))
            {
                // ProcessRequest checks if the connectionToken matches "{connectionid}:{userName}" format with context.User
                _ = dispatcher.ProcessRequest(hostContext);

                // TODO: check for errors written to the response
                if (hostContext.Response.StatusCode != 200)
                {
                    Log.ProcessRequestError(_logger, message.ConnectionId, hostContext.Request.QueryString.ToString());
                    Debug.Fail("Response StatusCode is " + hostContext.Response.StatusCode);
                    var errorResponse = GetContentAndDispose(responseStream);
                    throw new InvalidOperationException(errorResponse);
                }

                return((AzureTransport)hostContext.Environment[AspNetConstants.Context.AzureSignalRTransportKey]);
            }

            // This happens when hub is not found
            Debug.Fail("Unauthorized");
            throw new InvalidOperationException("Unable to authorize request");
        }
        public Task Invoke(HttpContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            var dispatcher = new HubDispatcher();

            dispatcher.Init(_resolver);
            return(dispatcher.ProcessRequest(context));
        }
        public void DetailedErrorsFromFaultedTasksCanBeEnabled()
        {
            // Arrange
            var dispatcher = new HubDispatcher(new HubConfiguration()
            {
                EnableDetailedErrors = true
            });

            var request = new Mock <IRequest>();

            request.Setup(m => m.Url).Returns(new Uri("http://something/signalr/send"));
            request.Setup(m => m.QueryString).Returns(new NameValueCollection()
            {
                { "transport", "longPolling" },
                { "connectionToken", "0" },
                { "data", "{\"H\":\"ErrorHub\",\"M\":\"ErrorTask\",\"A\":[],\"I\":0}" }
            });
            request.Setup(m => m.Form).Returns(new NameValueCollection());

            string contentType = null;
            var    buffer      = new List <string>();

            var response = new Mock <IResponse>();

            response.SetupGet(m => m.CancellationToken).Returns(CancellationToken.None);
            response.SetupSet(m => m.ContentType = It.IsAny <string>()).Callback <string>(type => contentType = type);
            response.Setup(m => m.Write(It.IsAny <ArraySegment <byte> >())).Callback <ArraySegment <byte> >(data => buffer.Add(Encoding.UTF8.GetString(data.Array, data.Offset, data.Count)));
            response.Setup(m => m.End()).Returns(TaskAsyncHelper.Empty);

            // Act
            var context  = new HostContext(request.Object, response.Object);
            var resolver = new DefaultDependencyResolver();

            resolver.Register(typeof(IProtectedData), () => new EmptyProtectedData());
            resolver.Register(typeof(ErrorHub), () => new ErrorHub());
            dispatcher.Initialize(resolver, context);

            dispatcher.ProcessRequest(context).Wait();

            var json = JsonSerializer.Create(new JsonSerializerSettings());


            // Assert
            Assert.Equal("application/json; charset=UTF-8", contentType);
            Assert.True(buffer.Count > 0);

            using (var reader = new StringReader(String.Join(String.Empty, buffer)))
            {
                var hubResponse = (HubResponse)json.Deserialize(reader, typeof(HubResponse));
                Assert.Equal("Custom Error from task.", hubResponse.Error);
            }
        }
        public void RequestingSignalrHubsUrlWithTrailingSlashReturnsProxy(string proxyUrl)
        {
            // Arrange
            var serviceProvider = CreateServiceProvider();
            var dispatcher = new HubDispatcher(serviceProvider.GetRequiredService<IOptions<SignalROptions>>());
            var testContext = new TestContext(proxyUrl + "/");

            // Act
            dispatcher.Initialize(serviceProvider);
            dispatcher.ProcessRequest(testContext.MockHttpContext.Object).Wait();

            // Assert
            Assert.Equal("application/javascript; charset=UTF-8", testContext.ResponseContentType);
            Assert.Equal(1, testContext.ResponseBuffer.Count);
            Assert.NotNull(testContext.ResponseBuffer[0]);
            Assert.False(testContext.ResponseBuffer[0].StartsWith("throw new Error("));
        }
        public void RequestingSignalrHubsUrlWithTrailingSlashReturnsProxy(string proxyUrl)
        {
            // Arrange
            var serviceProvider = CreateServiceProvider();
            var dispatcher      = new HubDispatcher(serviceProvider.GetRequiredService <IOptions <SignalROptions> >());
            var testContext     = new TestContext(proxyUrl + "/");

            // Act
            dispatcher.Initialize(serviceProvider);
            dispatcher.ProcessRequest(testContext.MockHttpContext.Object).Wait();

            // Assert
            Assert.Equal("application/javascript; charset=UTF-8", testContext.ResponseContentType);
            Assert.Equal(1, testContext.ResponseBuffer.Count);
            Assert.NotNull(testContext.ResponseBuffer[0]);
            Assert.False(testContext.ResponseBuffer[0].StartsWith("throw new Error("));
        }
        public override Task Invoke(IOwinContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (JsonUtility.TryRejectJSONPRequest(_configuration, context))
            {
                return(TaskAsyncHelper.Empty);
            }

            var dispatcher = new HubDispatcher(_configuration);

            dispatcher.Initialize(_configuration.Resolver);

            return(dispatcher.ProcessRequest(context.Environment));
        }
        public override Task Invoke(IOwinContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (JsonUtility.TryRejectJSONPRequest(_configuration, context))
            {
                return TaskAsyncHelper.Empty;
            }

            var dispatcher = new HubDispatcher(_configuration);

            dispatcher.Initialize(_configuration.Resolver);

            return dispatcher.ProcessRequest(context.Environment);
        }
        public void RequestingSignalrHubsUrlWithJavaScriptProxiesDesabledDoesNotReturnProxy(string proxyUrl)
        {
            // Arrange
            var serviceProvider = CreateServiceProvider();
            var optionsAccessor = serviceProvider.GetRequiredService<IOptions<SignalROptions>>();
            optionsAccessor.Options.Hubs.EnableJavaScriptProxies = false;
            var dispatcher = new HubDispatcher(optionsAccessor);
            var testContext = new TestContext(proxyUrl);

            // Act
            dispatcher.Initialize(serviceProvider);
            dispatcher.ProcessRequest(testContext.MockHttpContext.Object).Wait();

            // Assert
            Assert.Equal("application/javascript; charset=UTF-8", testContext.ResponseContentType);
            Assert.Equal(1, testContext.ResponseBuffer.Count);
            Assert.True(testContext.ResponseBuffer[0].StartsWith("throw new Error("));
        }
        public void RequestingSignalrHubsUrlWithJavaScriptProxiesDesabledDoesNotReturnProxy(string proxyUrl)
        {
            // Arrange
            var serviceProvider = CreateServiceProvider();
            var optionsAccessor = serviceProvider.GetRequiredService <IOptions <SignalROptions> >();

            optionsAccessor.Options.Hubs.EnableJavaScriptProxies = false;
            var dispatcher  = new HubDispatcher(optionsAccessor);
            var testContext = new TestContext(proxyUrl);

            // Act
            dispatcher.Initialize(serviceProvider);
            dispatcher.ProcessRequest(testContext.MockHttpContext.Object).Wait();

            // Assert
            Assert.Equal("application/javascript; charset=UTF-8", testContext.ResponseContentType);
            Assert.Equal(1, testContext.ResponseBuffer.Count);
            Assert.True(testContext.ResponseBuffer[0].StartsWith("throw new Error("));
        }
        public void RequestingSignalrHubsUrlWithTrailingSlashReturnsProxy(string proxyUrl)
        {
            // Arrange
            var dispatcher = new HubDispatcher(new HubConfiguration());
            var request = GetRequestForUrl(proxyUrl);
            var response = new Mock<IResponse>();
            string contentType = null;
            var buffer = new List<string>();
            response.SetupSet(m => m.ContentType = It.IsAny<string>()).Callback<string>(type => contentType = type);
            response.Setup(m => m.Write(It.IsAny<ArraySegment<byte>>())).Callback<ArraySegment<byte>>(data => buffer.Add(Encoding.UTF8.GetString(data.Array, data.Offset, data.Count)));

            // Act
            var context = new HostContext(request.Object, response.Object);
            dispatcher.Initialize(new DefaultDependencyResolver());
            dispatcher.ProcessRequest(context).Wait();

            // Assert
            Assert.Equal("application/javascript; charset=UTF-8", contentType);
            Assert.Equal(1, buffer.Count);
            Assert.NotNull(buffer[0]);
            Assert.False(buffer[0].StartsWith("throw new Error("));
        }
        public void RequestingSignalrHubsUrlWithJavaScriptProxiesDesabledDoesNotReturnProxy()
        {
            // Arrange
            var dispatcher = new HubDispatcher(new HubConfiguration() { EnableJavaScriptProxies = false });
            var request = GetRequestForUrl("http://something/signalr/hubs");
            var response = new Mock<IResponse>();
            string contentType = null;
            var buffer = new List<string>();
            response.SetupSet(m => m.ContentType = It.IsAny<string>()).Callback<string>(type => contentType = type);
            response.Setup(m => m.Write(It.IsAny<ArraySegment<byte>>())).Callback<ArraySegment<byte>>(data => buffer.Add(Encoding.UTF8.GetString(data.Array, data.Offset, data.Count)));
            response.Setup(m => m.End()).Returns(TaskAsyncHelper.Empty);

            // Act
            var context = new HostContext(request.Object, response.Object);
            dispatcher.Initialize(new DefaultDependencyResolver(), context);
            dispatcher.ProcessRequest(context).Wait();

            // Assert
            Assert.Equal("application/javascript; charset=UTF-8", contentType);
            Assert.Equal(1, buffer.Count);
            Assert.True(buffer[0].StartsWith("throw new Error("));
        }
Exemple #14
0
        public void RequestingSignalrHubsUrlWithTrailingSlashReturnsProxy()
        {
            // Arrange
            var dispatcher = new HubDispatcher("/signalr", enableJavaScriptProxies: true);
            var request = GetRequestForUrl("http://something/signalr/hubs/");
            var response = new Mock<IResponse>();
            string contentType = null;
            var buffer = new List<string>();
            response.SetupSet(m => m.ContentType = It.IsAny<string>()).Callback<string>(type => contentType = type);
            response.Setup(m => m.Write(It.IsAny<ArraySegment<byte>>())).Callback<ArraySegment<byte>>(data => buffer.Add(Encoding.UTF8.GetString(data.Array, data.Offset, data.Count)));
            response.Setup(m => m.End()).Returns(TaskAsyncHelper.Empty);

            // Act
            var context = new HostContext(request.Object, response.Object);
            dispatcher.Initialize(new DefaultDependencyResolver(), context);
            dispatcher.ProcessRequest(context).Wait();

            // Assert
            Assert.Equal("application/x-javascript", contentType);
            Assert.Equal(1, buffer.Count);
            Assert.NotNull(buffer[0]);
        }
Exemple #15
0
        public void RequestingSignalrHubsUrlWithTrailingSlashReturnsProxy(string proxyUrl)
        {
            // Arrange
            var    dispatcher  = new HubDispatcher(new HubConfiguration());
            var    request     = GetRequestForUrl(proxyUrl);
            var    response    = new Mock <IResponse>();
            string contentType = null;
            var    buffer      = new List <string>();

            response.SetupSet(m => m.ContentType = It.IsAny <string>()).Callback <string>(type => contentType = type);
            response.Setup(m => m.Write(It.IsAny <ArraySegment <byte> >())).Callback <ArraySegment <byte> >(data => buffer.Add(Encoding.UTF8.GetString(data.Array, data.Offset, data.Count)));

            // Act
            var context = new HostContext(request.Object, response.Object);

            dispatcher.Initialize(new DefaultDependencyResolver());
            dispatcher.ProcessRequest(context).Wait();

            // Assert
            Assert.Equal("application/javascript; charset=UTF-8", contentType);
            Assert.Equal(1, buffer.Count);
            Assert.NotNull(buffer[0]);
            Assert.False(buffer[0].StartsWith("throw new Error("));
        }
        public void DetailedErrorsAreDisabledByDefault()
        {
            // Arrange
            var serviceProvider = CreateServiceProvider();
            var dispatcher = new HubDispatcher(serviceProvider.GetRequiredService<IOptions<SignalROptions>>());
            var testContext = new TestContext("/signalr/send", new Dictionary<string, string>
            {
                {"transport", "longPolling"},
                {"connectionToken", "0"},
                {"data", "{\"H\":\"ErrorHub\",\"M\":\"Error\",\"A\":[],\"I\":0}"}
            });

            // Act
            dispatcher.Initialize(serviceProvider);
            dispatcher.ProcessRequest(testContext.MockHttpContext.Object).Wait();

            var json = JsonSerializer.Create(new JsonSerializerSettings());

            // Assert
            Assert.Equal("application/json; charset=UTF-8", testContext.ResponseContentType);
            Assert.True(testContext.ResponseBuffer.Count > 0);

            using (var reader = new StringReader(String.Join(String.Empty, testContext.ResponseBuffer)))
            {
                var hubResponse = (HubResponse)json.Deserialize(reader, typeof(HubResponse));
                Assert.Contains("ErrorHub.Error", hubResponse.Error);
                Assert.DoesNotContain("Custom", hubResponse.Error);
            }
        }
Exemple #17
0
        public void DetailedErrorsAreDisabledByDefault()
        {
            // Arrange
            var dispatcher = new HubDispatcher(new HubConfiguration());

            var request = new Mock<IRequest>();
            request.Setup(m => m.Url).Returns(new Uri("http://something/signalr/send"));
            request.Setup(m => m.QueryString).Returns(new NameValueCollection()
                                                      {
                                                          {"transport", "longPolling"},
                                                          {"connectionToken", "0"},
                                                          {"data", "{\"H\":\"ErrorHub\",\"M\":\"Error\",\"A\":[],\"I\":0}"}
                                                      });
            request.Setup(m => m.Form).Returns(new NameValueCollection());

            string contentType = null;
            var buffer = new List<string>();

            var response = new Mock<IResponse>();
            response.SetupGet(m => m.CancellationToken).Returns(CancellationToken.None);
            response.SetupSet(m => m.ContentType = It.IsAny<string>()).Callback<string>(type => contentType = type);
            response.Setup(m => m.Write(It.IsAny<ArraySegment<byte>>())).Callback<ArraySegment<byte>>(data => buffer.Add(Encoding.UTF8.GetString(data.Array, data.Offset, data.Count)));
            response.Setup(m => m.End()).Returns(TaskAsyncHelper.Empty);

            // Act
            var context = new HostContext(request.Object, response.Object);
            var resolver = new DefaultDependencyResolver();
            resolver.Register(typeof(IProtectedData), () => new EmptyProtectedData());
            resolver.Register(typeof(ErrorHub), () => new ErrorHub());
            dispatcher.Initialize(resolver, context);

            dispatcher.ProcessRequest(context).Wait();

            var json = JsonSerializer.Create(new JsonSerializerSettings());


            // Assert
            Assert.Equal("application/json; charset=UTF-8", contentType);
            Assert.Equal(1, buffer.Count);
            Assert.NotNull(buffer[0]);

            using (var reader = new StringReader(buffer[0]))
            {
                var hubResponse = (HubResponse)json.Deserialize(reader, typeof(HubResponse));
                Assert.Contains("ErrorHub.Error", hubResponse.Error);
                Assert.DoesNotContain("Custom", hubResponse.Error);
            }
        }
        public void DetailedErrorsFromFaultedTasksCanBeEnabled()
        {
            // Arrange
            var dispatcher = new HubDispatcher(new HubConfiguration() { EnableDetailedErrors = true });

            var request = GetRequestForUrl("http://something/signalr/send");
            request.Setup(m => m.QueryString).Returns(new NameValueCollectionWrapper(new NameValueCollection()
                                                      {
                                                          {"transport", "longPolling"},
                                                          {"connectionToken", "0"},
                                                          {"data", "{\"H\":\"ErrorHub\",\"M\":\"ErrorTask\",\"A\":[],\"I\":0}"}
                                                      }));

            request.Setup(m => m.ReadForm()).Returns(Task.FromResult<INameValueCollection>(new NameValueCollectionWrapper()));

            string contentType = null;
            var buffer = new List<string>();

            var response = new Mock<IResponse>();
            response.SetupGet(m => m.CancellationToken).Returns(CancellationToken.None);
            response.SetupSet(m => m.ContentType = It.IsAny<string>()).Callback<string>(type => contentType = type);
            response.Setup(m => m.Write(It.IsAny<ArraySegment<byte>>())).Callback<ArraySegment<byte>>(data => buffer.Add(Encoding.UTF8.GetString(data.Array, data.Offset, data.Count)));

            // Act
            var context = new HostContext(request.Object, response.Object);
            var resolver = new DefaultDependencyResolver();
            resolver.Register(typeof(IProtectedData), () => new EmptyProtectedData());
            resolver.Register(typeof(ErrorHub), () => new ErrorHub());
            dispatcher.Initialize(resolver);

            dispatcher.ProcessRequest(context).Wait();

            var json = JsonSerializer.Create(new JsonSerializerSettings());


            // Assert
            Assert.Equal("application/json; charset=UTF-8", contentType);
            Assert.True(buffer.Count > 0);

            using (var reader = new StringReader(String.Join(String.Empty, buffer)))
            {
                var hubResponse = (HubResponse)json.Deserialize(reader, typeof(HubResponse));
                Assert.Equal("Custom Error from task.", hubResponse.Error);
            }
        }