public void GetCorsPolicyProvider_Preflight_DisposesControllerAfterActionSelection()
        {
            // Arrange
            AttributeBasedPolicyProviderFactory providerFactory = new AttributeBasedPolicyProviderFactory();
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Options, "http://localhost/sample");

            request.Headers.Add("Origin", "http://localhost");
            request.Headers.Add(CorsConstants.AccessControlRequestMethod, "POST");
            HttpConfiguration     config            = new HttpConfiguration();
            HttpControllerContext controllerContext = null;
            var actionSelector = new Mock <IHttpActionSelector>();

            actionSelector.Setup(s => s.SelectAction(It.IsAny <HttpControllerContext>()))
            .Callback <HttpControllerContext>(context =>
            {
                Assert.False(((SampleController)context.Controller).Disposed);
                controllerContext = context;
            });
            config.Services.Replace(typeof(IHttpActionSelector), actionSelector.Object);
            request.SetConfiguration(config);
            IHttpRoute route = config.Routes.MapHttpRoute("default", "{controller}/{id}", new { id = RouteParameter.Optional });

            request.SetRouteData(route.GetRouteData("/", request));

            ICorsPolicyProvider provider = providerFactory.GetCorsPolicyProvider(request);

            // Assert
            Assert.True(((SampleController)controllerContext.Controller).Disposed);
        }
Example #2
0
        public void GetCorsPolicyProvider_Preflight_ReturnsExpectedPolicyProvider(
            string httpMethod,
            string path,
            Type expectedProviderType
            )
        {
            AttributeBasedPolicyProviderFactory providerFactory =
                new AttributeBasedPolicyProviderFactory();
            HttpRequestMessage request = new HttpRequestMessage(
                HttpMethod.Options,
                "http://localhost/sample" + path
                );

            request.Headers.Add("Origin", "http://localhost");
            request.Headers.Add(CorsConstants.AccessControlRequestMethod, httpMethod);
            HttpConfiguration config = new HttpConfiguration();

            request.SetConfiguration(config);
            IHttpRoute route = config.Routes.MapHttpRoute(
                "default",
                "{controller}/{id}",
                new { id = RouteParameter.Optional }
                );

            request.SetRouteData(route.GetRouteData("/", request));

            ICorsPolicyProvider provider = providerFactory.GetCorsPolicyProvider(request);

            Assert.True(request.GetCorsRequestContext().IsPreflight);
            Assert.IsType(expectedProviderType, provider);
        }
Example #3
0
        public void GetCorsPolicyProvider_Preflight_Throws_WhenNoDefaultPolicyProviderAndActionSelectionFails()
        {
            AttributeBasedPolicyProviderFactory providerFactory =
                new AttributeBasedPolicyProviderFactory();
            HttpRequestMessage request = new HttpRequestMessage(
                HttpMethod.Options,
                "http://localhost/sample"
                );

            request.Headers.Add("Origin", "http://localhost");
            request.Headers.Add(CorsConstants.AccessControlRequestMethod, "RandomMethod");
            HttpConfiguration config = new HttpConfiguration();

            request.SetConfiguration(config);
            IHttpRoute route = config.Routes.MapHttpRoute(
                "default",
                "{controller}/{id}",
                new { id = RouteParameter.Optional }
                );

            request.SetRouteData(route.GetRouteData("/", request));

            Assert.True(request.GetCorsRequestContext().IsPreflight);
            Assert.Throws <HttpResponseException>(
                () => providerFactory.GetCorsPolicyProvider(request)
                );
        }
Example #4
0
        public void GetCorsPolicyProvider_Preflight_ReturnsDefaultPolicyProvider_WhenActionSelectionFails()
        {
            AttributeBasedPolicyProviderFactory providerFactory =
                new AttributeBasedPolicyProviderFactory();
            ICorsPolicyProvider mockProvider = new Mock <ICorsPolicyProvider>().Object;

            providerFactory.DefaultPolicyProvider = mockProvider;
            HttpRequestMessage request = new HttpRequestMessage(
                HttpMethod.Options,
                "http://localhost/sample"
                );

            request.Headers.Add("Origin", "http://localhost");
            request.Headers.Add(CorsConstants.AccessControlRequestMethod, "RandomMethod");
            HttpConfiguration config = new HttpConfiguration();

            request.SetConfiguration(config);
            IHttpRoute route = config.Routes.MapHttpRoute(
                "default",
                "{controller}/{id}",
                new { id = RouteParameter.Optional }
                );

            request.SetRouteData(route.GetRouteData("/", request));

            ICorsPolicyProvider provider = providerFactory.GetCorsPolicyProvider(request);

            Assert.True(request.GetCorsRequestContext().IsPreflight);
            Assert.Same(mockProvider, provider);
        }
Example #5
0
        public void GetCorsPolicyProvider_Preflight_NoHttpConfiguration_Throws()
        {
            AttributeBasedPolicyProviderFactory providerFactory =
                new AttributeBasedPolicyProviderFactory();

            // No HttpConfiguration set on the request.
            HttpRequestMessage request = new HttpRequestMessage(
                HttpMethod.Options,
                "http://localhost/sample"
                );

            request.Headers.Add("Origin", "http://localhost");
            request.Headers.Add(CorsConstants.AccessControlRequestMethod, "GET");
            HttpConfiguration config = new HttpConfiguration();
            IHttpRoute        route  = config.Routes.MapHttpRoute(
                "default",
                "{controller}/{id}",
                new { id = RouteParameter.Optional }
                );

            request.SetRouteData(route.GetRouteData("/", request));

            Assert.Throws <InvalidOperationException>(
                () => providerFactory.GetCorsPolicyProvider(request),
                "The request does not have an associated configuration object."
                );
        }
Example #6
0
        protected void SetUpRequest(string routeName, HttpMethod method, string appRelativeUri)
        {
            var absoluteUri = "http://localhost/" + appRelativeUri;

            request = new HttpRequestMessage(method, absoluteUri);
            request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, configuration);
            request.RequestUri = new Uri(absoluteUri);

            route     = configuration.Routes[routeName];
            routeData = route.GetRouteData("/", request);

            Assert.That(routeData, Is.Not.Null, "The route name {0} does not match {1} request uri on {2}.", routeName, method, absoluteUri);

            request.Properties[HttpPropertyKeys.HttpRouteDataKey] = route.GetRouteData("/", request);

            controller.Request = request;
        }
        private static HttpRequestMessage CreateRequest(HttpConfiguration config, string requestUri)
        {
            IHttpRoute route   = config.Routes.MapHttpRoute("default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
            var        request = new HttpRequestMessage(HttpMethod.Get, requestUri);

            request.SetRouteData(route.GetRouteData("/", request));
            request.SetConfiguration(config);
            return(request);
        }
        public static IDictionary <string, object> GetRouteDataExtended(this IHttpRoute THIS, string virtualPathRoot, HttpRequestMessage request)
        {
            var routeData = THIS.GetRouteData(virtualPathRoot, request);

            if (routeData == null)
            {
                return(new Dictionary <string, object>());
            }
            var result = routeData.Values;

            foreach (var h in request.Headers)
            {
                result.Add(h.Key, h.Value.FirstOrDefault());
            }

            return(result);
        }
        public virtual IHttpRouteData GetRouteData(string virtualPathRoot, HttpRequestMessage request)
        {
            var result = _innerRoute.GetRouteData(virtualPathRoot, request);

            return(result == null ? null : new HttpRouteData(this, new HttpRouteValueDictionary(result.Values)));
        }