Ejemplo n.º 1
0
        public virtual void ProcessRequest(HttpContextBase context)
        {
            ApiRequest request = null;
            MatchedRoute route = null;
            ApiResponse response = new ApiResponse();
            Type[] knownTypes = new Type[0];

            if (RequestPassesSslCheck(context))
            {
                try
                {
                    route = this.GetRequestRoute(context);
                    request = this.GetRequestReader(context, route, readers).ReadRequest(context, route.RouteType, response);

                    // Permitted?
                    IPermission failedOn;
                    if (context.EnsurePermitted(route.RouteType, out failedOn))
                    {
                        knownTypes = route.RouteType.GetCustomAttributes(typeof(KnownTypeAttribute), true)
                            .Cast<KnownTypeAttribute>()
                            .Select(a => a.Type)
                            .ToArray();

                        ApiResult valid = request.Validate();

                        if (valid.Success)
                        {
                            // Do it.
                            ApiActionResult result = request.Do();
                            response.Success = result.Success;
                            response.Reason = result.Reason;
                            response.Value = result.Value;
                        }
                        else
                        {
                            response.Success = false;
                            response.Reason = valid.Reason;
                        }
                    }
                    else
                    {
                        response.Success = false;
                        response.Reason = "Access denied.";
                        response.Allowed = false;
                        response.StatusCode = 401;
                    }
                }
                catch (InvalidRequestTypeException ex)
                {
                    response.Success = false;
                    response.Reason = ex.Message;
                    response.StatusCode = 400;
                }
                catch (Exception ex)
                {
                    response.Success = false;
                    response.StatusCode = 500;

                    if (context.Request.IsLocal)
                    {
                        response.Reason = String.Concat(ex.Message, "\n", ex.StackTrace);
                    }
                    else
                    {
                        response.Reason = "An internal server error occurred while processing your request.";
                    }
                }
            }
            else
            {
                response.Success = false;
                response.Reason = "A secure connection is required when making this request.";
                response.StatusCode = 403;
            }

            string id = context.Request.Headers["X-Request-Id"];
            id = !String.IsNullOrEmpty(id) ? id : "0";

            context.Response.AppendHeader("X-Response-Id", id);
            context.Response.StatusCode = response.StatusCode;

            this.GetResponseWriter(context, route, writers).WriteResponse(context, request, response, knownTypes);
        }