public void Find_ParserList_Does_Not_Ignores_Types()
        {
            var resolver1 = TypeParserResolverCache.Find(new DateTime_Local_Parser());
            var resolver2 = TypeParserResolverCache.Find(new DateTimeOffset_Local_Parser());

            Assert.AreNotSame(resolver1, resolver2);
        }
        public void Find_ParserList_Accepts_Null()
        {
            var resolver1 = TypeParserResolverCache.Find((ITypeParser[])null);
            var resolver2 = TypeParserResolverCache.Find((ITypeParser[])null);

            Assert.IsNotNull(resolver1);
            Assert.AreSame(resolver1, resolver2);
        }
        public void Find_ParserList_Ignores_Order_Of_Types()
        {
            var resolver1 = TypeParserResolverCache.Find(new DateTime_Local_Parser(), new DateTimeOffset_Local_Parser());
            var resolver2 = TypeParserResolverCache.Find(new DateTimeOffset_Local_Parser(), new DateTime_Local_Parser());

            Assert.IsNotNull(resolver1);
            Assert.AreSame(resolver1, resolver2);
        }
        public void Find_ParserList_Returns_Existing_Resolver()
        {
            var resolver1 = TypeParserResolverCache.Find(new DateTime_Local_Parser());
            var resolver2 = TypeParserResolverCache.Find(new DateTime_Local_Parser());

            Assert.IsNotNull(resolver1);
            Assert.AreSame(resolver1, resolver2);
        }
        public void Clear_Empties_Cache()
        {
            var resolver1 = TypeParserResolverCache.Find(new DateTime_Local_Parser());

            TypeParserResolverCache.Clear();
            var resolver2 = TypeParserResolverCache.Find(new DateTime_Local_Parser());

            Assert.AreNotSame(resolver1, resolver2);
        }
Beispiel #6
0
        /// <summary>
        /// Returns a <see cref="TypeParserResolver"/> filled with the parsers from the <see cref="UseParserAttribute"/> attribute.
        /// </summary>
        /// <param name="useParser"></param>
        /// <param name="defaultResolver"></param>
        /// <returns></returns>
        public static TypeParserResolver ToTypeParserResolver(UseParserAttribute useParser, TypeParserResolver defaultResolver)
        {
            var result = defaultResolver;

            if (useParser?.IsValid ?? false)
            {
                result = result == null
                    ? TypeParserResolverCache.Find(useParser.Parsers)
                    : TypeParserResolverCache.Find(result.GetAugmentedParsers(useParser.Parsers));
            }

            return(result);
        }
Beispiel #7
0
        /// <summary>
        /// See interface docs.
        /// </summary>
        /// <param name="next"></param>
        /// <returns></returns>
        public AppFunc AppFuncBuilder(AppFunc next)
        {
            var controllerFinder = Factory.Resolve <IControllerFinder>();

            controllerFinder.DefaultTypeParserResolver    = TypeParserResolverCache.Find(DefaultParsers.ToArray());
            controllerFinder.DefaultTypeFormatterResolver = TypeFormatterResolverCache.Find(DefaultFormatters.ToArray());
            var controllerTypes = controllerFinder.DiscoverControllers();

            var routeFinder = Factory.Resolve <IRouteFinder>();
            var routes      = routeFinder.DiscoverRoutes(controllerTypes);

            var routeMapper = Factory.Resolve <IRouteMapper>();

            routeMapper.AreFormNamesCaseSensitive        = AreFormNamesCaseSensitive;
            routeMapper.AreQueryStringNamesCaseSensitive = AreQueryStringNamesCaseSensitive;
            routeMapper.Initialise(routes);

            var routeFilter = Factory.Resolve <IRouteFilter>();
            var routeCaller = Factory.Resolve <IRouteCaller>();
            var responder   = Factory.Resolve <IWebApiResponder>();

            return(async(IDictionary <string, object> environment) =>
            {
                var route = routeMapper.FindRouteForRequest(environment);
                if (route == null)
                {
                    await next(environment);
                }
                else
                {
                    environment[WebApiEnvironmentKey.Route] = route;
                    if (routeFilter.CanCallRoute(route, environment))
                    {
                        var parameters = routeMapper.BuildRouteParameters(route, environment);
                        if (!parameters.IsValid)
                        {
                            environment[EnvironmentKey.ResponseStatusCode] = 400;
                        }
                        else
                        {
                            var result = routeCaller.CallRoute(environment, route, parameters);
                            if (!route.IsVoidMethod)
                            {
                                if (result == null && (route.RouteAttribute?.NullStatusCode ?? 0) != 0)
                                {
                                    environment[EnvironmentKey.ResponseStatusCode] = route.RouteAttribute.NullStatusCode;
                                }
                                else
                                {
                                    responder.ReturnJsonObject(environment, result);
                                }
                            }
                        }

                        if (!environment.ContainsKey(EnvironmentKey.ResponseStatusCode))
                        {
                            environment[EnvironmentKey.ResponseStatusCode] = 200;
                        }
                    }
                }
            });
        }