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); } }
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(")); }
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]); }
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); } }
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); } }