コード例 #1
0
        public ExecutionResult Execute(object handler, RequestContext requestContext, HandlerData handlerData)
        {
            var result = new ExecutionResult();
            var httpVerb = requestContext.HttpContext.Request.HttpMethod.ToEnum<HttpVerb>();

            var before = getMethod(handler, "Before");
            var method = getMethod(handler, httpVerb);
            var after = getMethod(handler, "After");

            if (method == null)
            {
                throw new HttpException(HttpStatusCode.NotImplemented.CastInt(), "The request could not be completed because the resource does not support {0}".With(httpVerb.Name()));
            }

            if (before != null)
            {
                var beforeArgs = _argumentBuilder.BuildArguments(before.GetParameters(), requestContext, handlerData);
                result.BeforeResult = before.Invoke(handler, beforeArgs) as IResult;
            }

            var methodArgs = _argumentBuilder.BuildArguments(method.GetParameters(), requestContext, handlerData);
            result.Result = (IResult) method.Invoke(handler, methodArgs);

            if (after != null)
            {
                var afterArgs = _argumentBuilder.BuildArguments(after.GetParameters(), requestContext, handlerData);
                result.AfterResult = after.Invoke(handler, afterArgs) as IResult;
            }

            return result;
        }
コード例 #2
0
ファイル: ArgumentBuilder.cs プロジェクト: martinrue/Tinyweb
        public object[] BuildArguments(ParameterInfo[] parameters, RequestContext requestContext, HandlerData handlerData)
        {
            var argumentDictionary = new Dictionary<string, object>();

            foreach (var parameter in parameters)
            {
                if (argumentDictionary.ContainsKey(parameter.Name))
                {
                    continue;
                }

                if (parameter.ParameterType.IsValueType || parameter.ParameterType == typeof(String))
                {
                    var value = getValueFromRequest(requestContext, parameter.Name.ToLower(), parameter.ParameterType);

                    if (value != null)
                    {
                        argumentDictionary.Add(parameter.Name, value);
                    }
                }
                else if (parameter.ParameterType.IsArray)
                {
                    var value = getArrayValueFromRequest(requestContext, parameter.Name, parameter.ParameterType);

                    if (value != null)
                    {
                        argumentDictionary.Add(parameter.Name, value);
                    }
                }
                else if (parameter.ParameterType.IsClass)
                {
                    if (parameter.ParameterType == typeof(RequestContext))
                    {
                        argumentDictionary.Add(parameter.Name, requestContext);
                    }
                    else if (parameter.ParameterType == typeof(HandlerData))
                    {
                        argumentDictionary.Add(parameter.Name, handlerData);
                    }
                    else
                    {
                        var instance = createAndPopulateInstance(requestContext, parameter.Name, parameter.ParameterType);
                        argumentDictionary.Add(parameter.Name, instance);
                    }
                }

                if (!argumentDictionary.ContainsKey(parameter.Name))
                {
                    throw new Exception(String.Format("No argument was supplied for required parameter {0} ({1})", parameter.Name, parameter.ParameterType));
                }
            }

            return argumentDictionary.Select(p => p.Value).ToArray();
        }
コード例 #3
0
        private IResult executeFilterMethod(object filter, string filterMethod, RequestContext context, HandlerData handlerData)
        {
            var method = getMethod(filter, filterMethod);

            if (method != null)
            {
                var args = _argumentBuilder.BuildArguments(method.GetParameters(), context, handlerData);
                return method.Invoke(filter, args) as IResult;
            }

            return null;
        }
コード例 #4
0
 public IResult Before(RequestContext context, HandlerData data)
 {
     // Simple validate test but an more controllable example could be
     // implemented like so
     //
     //     bool granted = Auth.Test(context, data);
     //     if (!granted)
     //     {
     //         return Auth.OnAccessDenied(context, data);
     //     }
     //
     //     return Result.None();
     return Auth.Validate(context, data);
 }
コード例 #5
0
        void before_each()
        {
            // create the fakes
            data = new HandlerData() { Type = typeof(FakeHandler) };
            rc = A.Fake<RequestContext>();
            user = A.Fake<IPrincipal>();

            // setup default calls
            A.CallTo(() => user.Identity.IsAuthenticated).Returns(false);
            A.CallTo(() => user.IsInRole(""))
                .WithAnyArguments()
                .ReturnsLazily(o => new [] { "Role1", "Role2", "Role3" }.Contains(o.Arguments[0]));
            A.CallTo(() => rc.HttpContext.Request.RequestType).Returns("GET");
            A.CallTo(() => rc.HttpContext.User).Returns(user);
        }
コード例 #6
0
 public IResult RunBefore(object filter, RequestContext requestContext, HandlerData handlerData)
 {
     return executeFilterMethod(filter, "Before", requestContext, handlerData);
 }
コード例 #7
0
 public object Create(HandlerData handlerData)
 {
     return ObjectFactory.GetInstance(handlerData.Type);
 }
コード例 #8
0
 public object Create(HandlerData handlerData)
 {
     return Activator.CreateInstance(handlerData.Type);
 }
コード例 #9
0
ファイル: Tinyweb.cs プロジェクト: martinrue/Tinyweb
        private static void addRoute(HandlerData handler)
        {
            RouteTable.Routes.Add(new SWR.Route(handler.Uri.Trim('/'), new RouteValueDictionary(handler.DefaultRouteValues), new RouteHandler(handler)));

            if (AllowFormatExtensions)
            {
                var route = handler.Uri.Trim('/') + ".{format}";

                RouteTable.Routes.Add(new SWR.Route(route, new RouteValueDictionary(handler.DefaultRouteValues), new RouteHandler(handler)));
            }
        }
コード例 #10
0
ファイル: RouteHandler.cs プロジェクト: martinrue/Tinyweb
 public RouteHandler(HandlerData handlerData)
 {
     this.handlerData = handlerData;
 }
コード例 #11
0
ファイル: HttpHandler.cs プロジェクト: jmkelly/Tinyweb
        private void processAfterFilters(IEnumerable<object> filters, HttpContext context, HandlerData handlerData)
        {
            filters.ForEach(type =>
            {
                var result = FilterInvoker.Current.RunAfter(type, _requestContext, handlerData);

                if (result != null)
                {
                    result.ProcessResult(new DefaultRequestContext(_requestContext), new DefaultResponseContext(context));
                }
            });
        }
コード例 #12
0
ファイル: HttpHandler.cs プロジェクト: jmkelly/Tinyweb
 public HttpHandler(RequestContext requestContext, HandlerData handlerData)
 {
     _requestContext = requestContext;
     _handlerData = handlerData;
 }
コード例 #13
0
ファイル: HttpHandler.cs プロジェクト: martinrue/Tinyweb
        private void processAfterFilters(IEnumerable<FilterInstance> filters, HttpContext context, HandlerData handlerData)
        {
            filters.Where(filter => filter.AfterFilter).Select(filter => filter.Instance).ForEach(instance =>
            {
                var result = FilterInvoker.Current.RunAfter(instance, _requestContext, handlerData);

                if (result != null)
                {
                    result.ProcessResult(new DefaultRequestContext(_requestContext), new DefaultResponseContext(context));
                }
            });
        }
コード例 #14
0
 public IResult Get(RequestContext ctx, HandlerData data)
 {
     return Result.String("Access Denied");
 }